1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program OpenGL ES Utilities
3  * ------------------------------------------------
4  *
5  * Copyright 2014 The Android Open Source Project
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  *//*!
20  * \file
21  * \brief OpenGL value to string utilities.
22  *//*--------------------------------------------------------------------*/
23 
24 #include "gluStrUtil.hpp"
25 #include "glwEnums.hpp"
26 
27 namespace glu
28 {
29 
30 namespace detail
31 {
32 
operator <<(std::ostream & str,const BooleanPointerFmt & fmt)33 std::ostream& operator<< (std::ostream& str, const BooleanPointerFmt& fmt)
34 {
35 	if (fmt.value)
36 	{
37 		str << "{ ";
38 		for (deUint32 ndx = 0; ndx < fmt.size; ndx++)
39 		{
40 			if (ndx != 0)
41 				str << ", ";
42 			str << getBooleanStr(fmt.value[ndx]);
43 		}
44 		str << " }";
45 		return str;
46 	}
47 	else
48 		return str << "(null)";
49 }
50 
51 
operator <<(std::ostream & str,const EnumPointerFmt & fmt)52 std::ostream& operator<< (std::ostream& str, const EnumPointerFmt& fmt)
53 {
54 	if (fmt.value)
55 	{
56 		str << "{ ";
57 		for (deUint32 ndx = 0; ndx < fmt.size; ndx++)
58 		{
59 			if (ndx != 0)
60 				str << ", ";
61 			// use storage size (4) as print width for clarity
62 			str << tcu::Format::Enum<int, 4>(fmt.getName, fmt.value[ndx]);
63 		}
64 		str << " }";
65 		return str;
66 	}
67 	else
68 		return str << "(null)";
69 }
70 
operator <<(std::ostream & str,const TextureUnitStr & unitStr)71 std::ostream& operator<< (std::ostream& str, const TextureUnitStr& unitStr)
72 {
73 	int unitNdx = unitStr.texUnit - GL_TEXTURE0;
74 	if (unitNdx >= 0)
75 		return str << "GL_TEXTURE" << unitNdx;
76 	else
77 		return str << tcu::toHex(unitStr.texUnit);
78 }
79 
operator <<(std::ostream & str,const TextureParameterValueStr & valueStr)80 std::ostream& operator<< (std::ostream& str, const TextureParameterValueStr& valueStr)
81 {
82 	switch (valueStr.param)
83 	{
84 		case GL_TEXTURE_WRAP_S:
85 		case GL_TEXTURE_WRAP_T:
86 		case GL_TEXTURE_WRAP_R:
87 			return str << getTextureWrapModeStr(valueStr.value);
88 
89 		case GL_TEXTURE_BASE_LEVEL:
90 		case GL_TEXTURE_MAX_LEVEL:
91 		case GL_TEXTURE_MAX_LOD:
92 		case GL_TEXTURE_MIN_LOD:
93 			return str << valueStr.value;
94 
95 		case GL_TEXTURE_COMPARE_MODE:
96 			return str << getTextureCompareModeStr(valueStr.value);
97 
98 		case GL_TEXTURE_COMPARE_FUNC:
99 			return str << getCompareFuncStr(valueStr.value);
100 
101 		case GL_TEXTURE_SWIZZLE_R:
102 		case GL_TEXTURE_SWIZZLE_G:
103 		case GL_TEXTURE_SWIZZLE_B:
104 		case GL_TEXTURE_SWIZZLE_A:
105 			return str << getTextureSwizzleStr(valueStr.value);
106 
107 		case GL_TEXTURE_MIN_FILTER:
108 		case GL_TEXTURE_MAG_FILTER:
109 			return str << getTextureFilterStr(valueStr.value);
110 
111 		case GL_DEPTH_STENCIL_TEXTURE_MODE:
112 			return str << getTextureDepthStencilModeStr(valueStr.value);
113 
114 		default:
115 			return str << tcu::toHex(valueStr.value);
116 	}
117 }
118 
119 } // detail
120 
getInvalidateAttachmentStr(const deUint32 * attachments,int numAttachments)121 detail::EnumPointerFmt getInvalidateAttachmentStr (const deUint32* attachments, int numAttachments)
122 {
123 	return detail::EnumPointerFmt(attachments, (deUint32)numAttachments, getInvalidateAttachmentName);
124 }
125 
operator <<(std::ostream & str,ApiType apiType)126 std::ostream& operator<< (std::ostream& str, ApiType apiType)
127 {
128 	str << "OpenGL ";
129 
130 	if (apiType.getProfile() == PROFILE_ES)
131 		str << "ES ";
132 
133 	str << apiType.getMajorVersion() << "." << apiType.getMinorVersion();
134 
135 	if (apiType.getProfile() == PROFILE_CORE)
136 		str << " core profile";
137 	else if (apiType.getProfile() == PROFILE_COMPATIBILITY)
138 		str << " compatibility profile";
139 	else if (apiType.getProfile() != PROFILE_ES)
140 		str << " (unknown profile)";
141 
142 	return str;
143 }
144 
operator <<(std::ostream & str,ContextType contextType)145 std::ostream& operator<< (std::ostream& str, ContextType contextType)
146 {
147 	str << contextType.getAPI();
148 
149 	if (contextType.getFlags() != ContextFlags(0))
150 	{
151 		static const struct
152 		{
153 			ContextFlags	flag;
154 			const char*		desc;
155 		} s_descs[] =
156 		{
157 			{ CONTEXT_DEBUG,				"debug"					},
158 			{ CONTEXT_FORWARD_COMPATIBLE,	"forward-compatible"	},
159 			{ CONTEXT_ROBUST,				"robust"				}
160 		};
161 		ContextFlags	flags	= contextType.getFlags();
162 
163 		str << " (";
164 
165 		for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_descs) && flags != 0; ndx++)
166 		{
167 			if ((flags & s_descs[ndx].flag) != 0)
168 			{
169 				if (flags != contextType.getFlags())
170 					str << ", ";
171 
172 				str << s_descs[ndx].desc;
173 				flags = flags & ~s_descs[ndx].flag;
174 			}
175 		}
176 
177 		if (flags != 0)
178 		{
179 			// Unresolved
180 			if (flags != contextType.getFlags())
181 				str << ", ";
182 			str << tcu::toHex(flags);
183 		}
184 
185 		str << ")";
186 	}
187 
188 	return str;
189 }
190 
191 #include "gluStrUtil.inl"
192 
193 } // glu
194