1b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley/*-------------------------------------------------------------------------
2b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley * drawElements Quality Program OpenGL ES 3.1 Module
3b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley * -------------------------------------------------
4b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley *
5b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley * Copyright 2017 The Android Open Source Project
6b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley *
7b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley * Licensed under the Apache License, Version 2.0 (the "License");
8b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley * you may not use this file except in compliance with the License.
9b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley * You may obtain a copy of the License at
10b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley *
11b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley *      http://www.apache.org/licenses/LICENSE-2.0
12b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley *
13b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley * Unless required by applicable law or agreed to in writing, software
14b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley * distributed under the License is distributed on an "AS IS" BASIS,
15b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley * See the License for the specific language governing permissions and
17b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley * limitations under the License.
18b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley *
19b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley *//*!
20b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley * \file
21b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley * \brief Texture format tests.
22b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley *//*--------------------------------------------------------------------*/
23b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
24b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley#include "es31fSRGBDecodeTests.hpp"
25b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley#include "gluContextInfo.hpp"
26b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley#include "gluCallLogWrapper.hpp"
27b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley#include "gluRenderContext.hpp"
28b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley#include "gluTexture.hpp"
29b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley#include "glsTextureTestUtil.hpp"
30b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley#include "tcuPixelFormat.hpp"
31b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley#include "tcuTestContext.hpp"
32b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley#include "tcuRenderTarget.hpp"
33b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley#include "gluTextureUtil.hpp"
34b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley#include "tcuTextureUtil.hpp"
35b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley#include "glwFunctions.hpp"
36b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley#include "gluDefs.hpp"
37b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley#include "glwEnums.hpp"
38b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley#include "deUniquePtr.hpp"
39b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley#include "gluPixelTransfer.hpp"
40b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley#include "tcuDefs.hpp"
41b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley#include "tcuVectorUtil.hpp"
42b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley#include "gluObjectWrapper.hpp"
43b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley#include "gluStrUtil.hpp"
44b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley#include "tcuTestLog.hpp"
45102cfe8b1147c7bada5ed5bcb0430743fc1a1a63Alexander Galazin#include "deStringUtil.hpp"
46b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
47b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleynamespace deqp
48b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
49b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleynamespace gles31
50b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
51b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleynamespace Functional
52b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
53b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleynamespace
54b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
55b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
56b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyusing glu::TextureTestUtil::TEXTURETYPE_2D;
57b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
58b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyenum SRGBDecode
59b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
60b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	SRGBDECODE_SKIP_DECODE		= 0,
61b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	SRGBDECODE_DECODE,
62b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	SRGBDECODE_DECODE_DEFAULT
63b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
64b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
65b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyenum ShaderOutputs
66b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
67b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	SHADEROUTPUTS_ONE	= 1,
68b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	SHADEROUTPUTS_TWO,
69b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
70b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
71b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyenum ShaderUniforms
72b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
73b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	SHADERUNIFORMS_ONE	= 1,
74b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	SHADERUNIFORMS_TWO,
75b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
76b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
77b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyenum ShaderSamplingGroup
78b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
79b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	SHADERSAMPLINGGROUP_TEXTURE		= 0,
80b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	SHADERSAMPLINGGROUP_TEXEL_FETCH
81b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
82b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
83b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyenum ShaderSamplingType
84b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
85b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	TEXTURESAMPLING_TEXTURE													= 0,
86b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	TEXTURESAMPLING_TEXTURE_LOD,
87b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	TEXTURESAMPLING_TEXTURE_GRAD,
88b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	TEXTURESAMPLING_TEXTURE_OFFSET,
89b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	TEXTURESAMPLING_TEXTURE_PROJ,
90b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	TEXTURESAMPLING_TEXELFETCH,
91b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	TEXTURESAMPLING_TEXELFETCH_OFFSET,
92b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
93b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// ranges required for looping mechanism in a case nodes iteration function
94b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	TEXTURESAMPLING_TEXTURE_START		= TEXTURESAMPLING_TEXTURE,
95b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	TEXTURESAMPLING_TEXTURE_END			= TEXTURESAMPLING_TEXTURE_PROJ		+ 1,
96b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	TEXTURESAMPLING_TEXELFETCH_START	= TEXTURESAMPLING_TEXELFETCH,
97b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	TEXTURESAMPLING_TEXELFETCH_END		= TEXTURESAMPLING_TEXELFETCH_OFFSET	+ 1
98b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
99b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
100b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyenum FunctionParameters
101b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
102b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	FUNCTIONPARAMETERS_ONE = 1,
103b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	FUNCTIONPARAMETERS_TWO
104b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
105b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
106b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyenum Blending
107b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
108b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	BLENDING_REQUIRED		= 0,
109b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	BLENDING_NOT_REQUIRED
110b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
111b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
112b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyenum Toggling
113b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
114b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	TOGGLING_REQUIRED		= 0,
115b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	TOGGLING_NOT_REQUIRED
116b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
117b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
118b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleytcu::Vec4 getColorReferenceLinear (void)
119b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
120b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return tcu::Vec4(0.2f, 0.3f, 0.4f, 1.0f);
121b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
122b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
123b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleytcu::Vec4 getColorReferenceSRGB (void)
124b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
125b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return tcu::linearToSRGB(tcu::Vec4(0.2f, 0.3f, 0.4f, 1.0f));
126b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
127b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
128b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleytcu::Vec4 getColorGreenPass (void)
129b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
130b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return tcu::Vec4(0.0f, 1.0f, 0.0f, 1.0f);
131b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
132b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
133b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleynamespace TestDimensions
134b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
135b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const int WIDTH		= 128;
136b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const int HEIGHT	= 128;
137b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley} // global test texture dimensions
138b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
139b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleynamespace TestSamplingPositions
140b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
141b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const int X_POS = 0;
142b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const int Y_POS = 0;
143b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley} // global test sampling positions
144b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
145b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyconst char* getFunctionDefinitionSRGBToLinearCheck (void)
146b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
147b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	static const char* functionDefinition =
148b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"mediump vec4 srgbToLinearCheck(in mediump vec4 texelSRGBA, in mediump vec4 texelLinear) \n"
149b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"{ \n"
150b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"	const int NUM_CHANNELS = 4;"
151b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"	mediump vec4 texelSRGBAConverted; \n"
152b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"	mediump vec4 epsilonErr = vec4(0.005); \n"
153b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"	mediump vec4 testResult; \n"
154b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"	for (int idx = 0; idx < NUM_CHANNELS; idx++) \n"
155b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"	{ \n"
156b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"		texelSRGBAConverted[idx] = pow( (texelSRGBA[idx] + 0.055) / 1.055, 1.0 / 0.4116); \n"
157b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"	} \n"
158b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"	if ( all(lessThan(abs(texelSRGBAConverted - texelLinear), epsilonErr)) || all(equal(texelSRGBAConverted, texelLinear)) ) \n"
159b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"	{ \n"
160b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"		return testResult = vec4(0.0, 1.0, 0.0, 1.0); \n"
161b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"	} \n"
162b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"	else \n"
163b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"	{ \n"
164b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"		return testResult = vec4(1.0, 0.0, 0.0, 1.0); \n"
165b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"	} \n"
166b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"} \n";
167b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
168b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return functionDefinition;
169b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
170b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
171b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyconst char* getFunctionDefinitionEqualCheck (void)
172b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
173b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	static const char* functionDefinition =
174b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"mediump vec4 colorsEqualCheck(in mediump vec4 colorA, in mediump vec4 colorB) \n"
175b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"{ \n"
176b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"	mediump vec4 epsilonErr = vec4(0.005); \n"
177b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"	mediump vec4 testResult; \n"
178b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"	if ( all(lessThan(abs(colorA - colorB), epsilonErr)) || all(equal(colorA, colorB)) ) \n"
179b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"	{ \n"
180b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"		return testResult = vec4(0.0, 1.0, 0.0, 1.0); \n"
181b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"	} \n"
182b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"	else \n"
183b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"	{ \n"
184b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"		return testResult = vec4(1.0, 0.0, 0.0, 1.0); \n"
185b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"	} \n"
186b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			"} \n";
187b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
188b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return functionDefinition;
189b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
190b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
191b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleynamespace EpsilonError
192b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
193b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const float CPU = 0.005f;
194b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
195b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
196b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleystruct TestGroupConfig
197b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
198b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	TestGroupConfig			(const char* groupName, const char* groupDescription, const tcu::TextureFormat groupInternalFormat)
199b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		: name				(groupName)
200b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		, description		(groupDescription)
201b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		, internalFormat	(groupInternalFormat) {}
202b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
203b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	~TestGroupConfig		(void) {};
204b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
205b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const char*					name;
206b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const char*					description;
207b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const tcu::TextureFormat	internalFormat;
208b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
209b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
210b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleystruct UniformData
211b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
212b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	UniformData			(glw::GLuint uniformLocation, const std::string& uniformName)
213b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		: location		(uniformLocation)
214b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		, name			(uniformName)
215b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		, toggleDecode	(false) {}
216b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
217b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	~UniformData		(void) {}
218b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
219b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	glw::GLuint	location;
220b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::string	name;
221b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	bool		toggleDecode;
222b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
223b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
224b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleystruct UniformToToggle
225b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
226b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	UniformToToggle		(const int uniformProgramIdx, const std::string& uniformName)
227b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		: programIdx	(uniformProgramIdx)
228b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		, name			(uniformName) {}
229b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
230b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	~UniformToToggle	(void) {}
231b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
232b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	int			programIdx;
233b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::string	name;
234b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
235b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
236b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleystruct ComparisonFunction
237b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
238b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	ComparisonFunction		(const std::string& funcName, const FunctionParameters funcParameters, const std::string& funcImplementation)
239b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		: name				(funcName)
240b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		, parameters		(funcParameters)
241b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		, implementation	(funcImplementation) {}
242b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
243b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	~ComparisonFunction		(void) {}
244b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
245b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::string			name;
246b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	FunctionParameters	parameters;
247b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::string			implementation;
248b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
249b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
250b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleystruct FragmentShaderParameters
251b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
252b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	FragmentShaderParameters	(const ShaderOutputs	outputTotal,
253b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley								 const ShaderUniforms	uniformTotal,
254b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley								 ComparisonFunction*	comparisonFunction,
255b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley								 Blending				blendRequired,
256b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley								 Toggling				toggleRequired);
257b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
258b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	~FragmentShaderParameters	(void);
259b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
260b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	ShaderOutputs				outputTotal;
261b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	ShaderUniforms				uniformTotal;
262b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	ShaderSamplingType			samplingType;
263b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::string					functionName;
264b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	FunctionParameters			functionParameters;
265b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::string					functionImplementation;
266b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	bool						hasFunction;
267b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	Blending					blendRequired;
268b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	Toggling					toggleRequired;
269b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::vector<std::string>	uniformsToToggle;
270b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
271b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
272b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael HadleyFragmentShaderParameters::FragmentShaderParameters	(const ShaderOutputs	paramsOutputTotal,
273b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley													 const ShaderUniforms	paramsUniformTotal,
274b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley													 ComparisonFunction*	paramsComparisonFunction,
275b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley													 Blending				paramsBlendRequired,
276b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley													 Toggling				paramsToggleRequired)
277b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	: outputTotal									(paramsOutputTotal)
278b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, uniformTotal									(paramsUniformTotal)
279b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, blendRequired									(paramsBlendRequired)
280b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, toggleRequired								(paramsToggleRequired)
281b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
282b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	if (paramsComparisonFunction != DE_NULL)
283b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
284b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		functionName			= paramsComparisonFunction->name;
285b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		functionParameters		= paramsComparisonFunction->parameters;
286b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		functionImplementation	= paramsComparisonFunction->implementation;
287b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
288b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		hasFunction = true;
289b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
290b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	else
291b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
292b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		hasFunction = false;
293b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
294b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
295b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
296b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael HadleyFragmentShaderParameters::~FragmentShaderParameters (void)
297b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
298b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
299b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
300b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyclass SRGBTestSampler
301b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
302b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleypublic:
303b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				SRGBTestSampler		(Context&						context,
304b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const tcu::Sampler::WrapMode	wrapS,
305b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const tcu::Sampler::WrapMode	wrapT,
306b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const tcu::Sampler::FilterMode	minFilter,
307b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const tcu::Sampler::FilterMode	magFilter,
308b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const SRGBDecode				decoding);
309b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				~SRGBTestSampler	(void);
310b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
311b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void		setDecode			(const SRGBDecode decoding);
312b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void		setTextureUnit		(const deUint32 textureUnit);
313b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void		setIsActive			(const bool isActive);
314b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
315b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	deUint32	getHandle			(void) const;
316b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	bool		getIsActive			(void) const;
317b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
318b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void		bindToTexture		(void);
319b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void		unbindFromTexture	(void);
320b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
321b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyprivate:
322b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const glw::Functions*		m_gl;
323b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	deUint32					m_samplerHandle;
324b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Sampler::WrapMode		m_wrapS;
325b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Sampler::WrapMode		m_wrapT;
326b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Sampler::FilterMode	m_minFilter;
327b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Sampler::FilterMode	m_magFilter;
328b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	SRGBDecode					m_decoding;
329b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	deUint32					m_textureUnit;
330b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	bool						m_isActive;
331b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
332b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
333b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael HadleySRGBTestSampler::SRGBTestSampler	(Context&						context,
334b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const tcu::Sampler::WrapMode	wrapS,
335b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const tcu::Sampler::WrapMode	wrapT,
336b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const tcu::Sampler::FilterMode	minFilter,
337b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const tcu::Sampler::FilterMode	magFilter,
338b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const SRGBDecode				decoding)
339b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	: m_gl							(&context.getRenderContext().getFunctions())
340b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_wrapS						(wrapS)
341b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_wrapT						(wrapT)
342b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_minFilter					(minFilter)
343b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_magFilter					(magFilter)
344b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_isActive					(false)
345b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
346b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_gl->genSamplers(1, &m_samplerHandle);
347b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
348b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_gl->samplerParameteri(m_samplerHandle, GL_TEXTURE_WRAP_S, glu::getGLWrapMode(m_wrapS));
349b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_gl->samplerParameteri(m_samplerHandle, GL_TEXTURE_WRAP_T, glu::getGLWrapMode(m_wrapT));
350b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_gl->samplerParameteri(m_samplerHandle, GL_TEXTURE_MIN_FILTER, glu::getGLFilterMode(m_minFilter));
351b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_gl->samplerParameteri(m_samplerHandle, GL_TEXTURE_MAG_FILTER, glu::getGLFilterMode(m_magFilter));
352b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
353b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->setDecode(decoding);
354b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
355b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
356b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael HadleySRGBTestSampler::~SRGBTestSampler (void)
357b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
358ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	m_gl->deleteSamplers(1, &m_samplerHandle);
359b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
360b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
361b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestSampler::setDecode (const SRGBDecode decoding)
362b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
363b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	if (decoding == SRGBDECODE_SKIP_DECODE)
364b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
365b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		m_gl->samplerParameteri(m_samplerHandle, GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT);
366b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		GLU_EXPECT_NO_ERROR(m_gl->getError(), "samplerParameteri(m_samplerID, GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT)");
367b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
368b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	else if (decoding == SRGBDECODE_DECODE)
369b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
370b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		m_gl->samplerParameteri(m_samplerHandle, GL_TEXTURE_SRGB_DECODE_EXT, GL_DECODE_EXT);
371b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		GLU_EXPECT_NO_ERROR(m_gl->getError(), "samplerParameteri(m_samplerID, GL_TEXTURE_SRGB_DECODE_EXT, GL_DECODE_EXT)");
372b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
373b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	else
374b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
375b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		DE_FATAL("sRGB texture sampler must have either GL_SKIP_DECODE_EXT or GL_DECODE_EXT settings");
376b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
377b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
378b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_decoding = decoding;
379b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
380b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
381b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestSampler::setTextureUnit (const deUint32 textureUnit)
382b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
383b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_textureUnit = textureUnit;
384b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
385b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
386b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestSampler::setIsActive (const bool isActive)
387b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
388b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_isActive = isActive;
389b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
390b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
391b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael HadleydeUint32 SRGBTestSampler::getHandle (void) const
392b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
393b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return m_samplerHandle;
394b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
395b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
396b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleybool SRGBTestSampler::getIsActive (void) const
397b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
398b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return m_isActive;
399b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
400b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
401b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestSampler::bindToTexture (void)
402b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
403b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_gl->bindSampler(m_textureUnit, m_samplerHandle);
404b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
405b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
406b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestSampler::unbindFromTexture (void)
407b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
408b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_gl->bindSampler(m_textureUnit, 0);
409b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
410b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
411b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyclass SRGBTestTexture
412b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
413b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleypublic:
414b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				SRGBTestTexture		(Context&									context,
415b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const glu::TextureTestUtil::TextureType	targetType,
416b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const tcu::TextureFormat					internalFormat,
417b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const int									width,
418b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const int									height,
419b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const tcu::Vec4							color,
420b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const tcu::Sampler::WrapMode				wrapS,
421b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const tcu::Sampler::WrapMode				wrapT,
422b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const tcu::Sampler::FilterMode				minFilter,
423b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const tcu::Sampler::FilterMode				magFilter,
424b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const SRGBDecode							decoding);
425b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				~SRGBTestTexture	(void);
426b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
427b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void		setParameters		(void);
428b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void		setDecode			(const SRGBDecode decoding);
429b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void		setHasSampler		(const bool hasSampler);
430b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
431b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	deUint32	getHandle			(void) const;
432b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	deUint32	getGLTargetType		(void) const;
433b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	SRGBDecode	getDecode			(void) const;
434b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	bool		getHasSampler		(void) const;
435b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
436b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void		upload				(void);
437b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
438b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyprivate:
439b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void		setColor			(void);
440b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
441b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	Context&							m_context;
442b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	glu::Texture2D						m_source;
443b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	glu::TextureTestUtil::TextureType	m_targetType;
444b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const tcu::TextureFormat			m_internalFormat;
445b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const int							m_width;
446b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const int							m_height;
447b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Vec4							m_color;
448b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Sampler::WrapMode				m_wrapS;
449b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Sampler::WrapMode				m_wrapT;
450b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Sampler::FilterMode			m_minFilter;
451b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Sampler::FilterMode			m_magFilter;
452b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	SRGBDecode							m_decoding;
453b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	bool								m_hasSampler;
454b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
455b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
456b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael HadleySRGBTestTexture::SRGBTestTexture	(Context&									context,
457b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const glu::TextureTestUtil::TextureType	targetType,
458b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const tcu::TextureFormat					internalFormat,
459b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const int									width,
460b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const int									height,
461b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const tcu::Vec4							color,
462b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const tcu::Sampler::WrapMode				wrapS,
463b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const tcu::Sampler::WrapMode				wrapT,
464b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const tcu::Sampler::FilterMode				minFilter,
465b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 const tcu::Sampler::FilterMode				magFilter,
466b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									 SRGBDecode									decoding)
467b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	: m_context						(context)
468b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_source						(context.getRenderContext(), glu::getInternalFormat(internalFormat), width, height)
469b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_targetType					(targetType)
470b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_internalFormat				(internalFormat)
471b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_width						(width)
472b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_height						(height)
473b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_color						(color)
474b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_wrapS						(wrapS)
475b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_wrapT						(wrapT)
476b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_minFilter					(minFilter)
477b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_magFilter					(magFilter)
478b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_decoding					(decoding)
479b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_hasSampler					(false)
480b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
481b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->setColor();
482b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
483b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
484b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael HadleySRGBTestTexture::~SRGBTestTexture (void)
485b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
486b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
487b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
488b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestTexture::setParameters (void)
489b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
490b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
491b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
492b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindTexture(this->getGLTargetType(), this->getHandle());
493b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
494b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.texParameteri(this->getGLTargetType(), GL_TEXTURE_WRAP_S, glu::getGLWrapMode(m_wrapS));
495b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.texParameteri(this->getGLTargetType(), GL_TEXTURE_WRAP_T, glu::getGLWrapMode(m_wrapT));
496b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.texParameteri(this->getGLTargetType(), GL_TEXTURE_MIN_FILTER, glu::getGLFilterMode(m_minFilter));
497b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.texParameteri(this->getGLTargetType(), GL_TEXTURE_MAG_FILTER, glu::getGLFilterMode(m_magFilter));
498b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
499b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindTexture(this->getGLTargetType(), 0);
500b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
501b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	setDecode(m_decoding);
502b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
503b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
504b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestTexture::setDecode (const SRGBDecode decoding)
505b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
506b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
507b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
508b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindTexture(this->getGLTargetType(), this->getHandle());
509b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
510b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	switch (decoding)
511b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
512b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		case SRGBDECODE_SKIP_DECODE:
513b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
514b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			gl.texParameteri(this->getGLTargetType(), GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT);
515b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			GLU_EXPECT_NO_ERROR(gl.getError(), "glTexParameteri(this->getGLTargetType(), GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT)");
516b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			break;
517b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
518b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		case SRGBDECODE_DECODE:
519b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
520b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			gl.texParameteri(this->getGLTargetType(), GL_TEXTURE_SRGB_DECODE_EXT, GL_DECODE_EXT);
521b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			GLU_EXPECT_NO_ERROR(gl.getError(), "glTexParameteri(this->getGLTargetType(), GL_TEXTURE_SRGB_DECODE_EXT, GL_DECODE_EXT)");
522b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			break;
523b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
524b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		case SRGBDECODE_DECODE_DEFAULT:
525b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
526b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			// do not use srgb decode options. Set to default
527b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			break;
528b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
529b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		default:
530b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			DE_FATAL("Error: Decoding option not recognised");
531b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
532b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
533b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindTexture(this->getGLTargetType(), 0);
534b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
535b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_decoding = decoding;
536b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
537b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
538b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestTexture::setHasSampler (const bool hasSampler)
539b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
540b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_hasSampler = hasSampler;
541b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
542b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
543b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael HadleydeUint32 SRGBTestTexture::getHandle (void) const
544b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
545b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return m_source.getGLTexture();
546b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
547b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
548b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael HadleydeUint32 SRGBTestTexture::getGLTargetType (void) const
549b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
550b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	switch (m_targetType)
551b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
552b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		case TEXTURETYPE_2D:
553b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
554b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			return GL_TEXTURE_2D;
555b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
556b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		default:
557b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
558b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			DE_FATAL("Error: Target type not recognised");
559b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			return -1;
560b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
561b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
562b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
563b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
564b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael HadleySRGBDecode SRGBTestTexture::getDecode (void) const
565b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
566b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return m_decoding;
567b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
568b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
569b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleybool SRGBTestTexture::getHasSampler (void) const
570b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
571b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return m_hasSampler;
572b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
573b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
574b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestTexture::upload (void)
575b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
576b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_source.upload();
577b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
578b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
579b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestTexture::setColor (void)
580b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
581b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
582b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
583b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindTexture(this->getGLTargetType(), this->getHandle());
584b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
585b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_source.getRefTexture().allocLevel(0);
586b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
587b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (int py = 0; py < m_height; py++)
588b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
589b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		for (int px = 0; px < m_width; px++)
590b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
591b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			m_source.getRefTexture().getLevel(0).setPixel(m_color, px, py);
592b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
593b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
594b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
595b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindTexture(this->getGLTargetType(), 0);
596b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
597b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
598b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyclass SRGBTestProgram
599b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
600b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleypublic:
601b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									SRGBTestProgram			(Context& context, const FragmentShaderParameters& shaderParameters);
602b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley									~SRGBTestProgram		(void);
603b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
604b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void							setBlendRequired		(bool blendRequired);
605b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void							setToggleRequired		(bool toggleRequired);
606b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void							setUniformToggle		(int location, bool toggleDecodeValue);
607b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
608b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	int								getUniformTotal			(void) const;
609b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const std::vector<UniformData>&	getUniformDataList		(void) const;
610b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const UniformData&				getUniformAtLocation	(int location) const;
611b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	int								getUniformLocation		(const std::string& name);
612b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	deUint32						getHandle				(void) const;
613b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	bool							getBlendRequired		(void) const;
614b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	bool							getToggleRequired		(void) const;
615b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const std::string&				getFragmentShader		(void) const;
616b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
617b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyprivate:
618b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::string						genFunctionCall			(ShaderSamplingType samplingType, const int uniformIdx);
619b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void							genFragmentShader		(void);
620b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
621b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	Context&						m_context;
622b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	de::MovePtr<glu::ShaderProgram>	m_program;
623b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	FragmentShaderParameters		m_shaderFragmentParameters;
624b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::string						m_shaderVertex;
625b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::string						m_shaderFragment;
626b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::vector<UniformData>		m_uniformDataList;
627b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	bool							m_blendRequired;
628b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	bool							m_toggleRequired;
629b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
630b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
631b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael HadleySRGBTestProgram::SRGBTestProgram	(Context& context, const FragmentShaderParameters& shaderParameters)
632b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	: m_context						(context)
633b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_shaderFragmentParameters	(shaderParameters)
634b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_blendRequired				(false)
635b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_toggleRequired				(false)
636b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
637b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const glw::Functions&	gl					= m_context.getRenderContext().getFunctions();
638b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::TestLog&			log					= m_context.getTestContext().getLog();
639b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	glu::ShaderProgramInfo	buildInfo;
640b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const int				totalShaderStages	= 2;
641b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
642b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// default vertex shader used in all tests
643b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_shaderVertex =	"#version 310 es \n"
644b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						"layout (location = 0) in mediump vec3 aPosition; \n"
645b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						"layout (location = 1) in mediump vec2 aTexCoord; \n"
646b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						"out mediump vec2 vs_aTexCoord; \n"
647b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						"void main () \n"
648b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						"{ \n"
649b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						"	gl_Position = vec4(aPosition, 1.0); \n"
650b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						"	vs_aTexCoord = aTexCoord; \n"
651b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						"} \n";
652b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
653b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->genFragmentShader();
654b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
655b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_program = de::MovePtr<glu::ShaderProgram>(new glu::ShaderProgram(m_context.getRenderContext(), glu::makeVtxFragSources(m_shaderVertex, m_shaderFragment)));
656b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
657b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	if (!m_program->isOk())
658b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
659b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		TCU_FAIL("Failed to compile shaders and link program");
660b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
661b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
662b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	glw::GLint activeUniforms, maxLen;
663b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	glw::GLint size, location;
664b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	glw::GLenum type;
665b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
666b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.getProgramiv(this->getHandle(), GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxLen);
667b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.getProgramiv(this->getHandle(), GL_ACTIVE_UNIFORMS, &activeUniforms);
668b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
669b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::vector<glw::GLchar> uniformName(static_cast<int>(maxLen));
670b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (int idx = 0; idx < activeUniforms; idx++)
671b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
672b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		gl.getActiveUniform(this->getHandle(), idx, maxLen, NULL, &size, &type, &uniformName[0]);
673e05b3a9c94805e90d54fab7d43fd7080a757f034Sunny Sun		location = gl.getUniformLocation(this->getHandle(), &uniformName[0]);
674b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
675b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		UniformData uniformData(location, std::string(&uniformName[0], strlen(&uniformName[0])));
676b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		m_uniformDataList.push_back(uniformData);
677b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
678b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
679b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// log shader program info. Only vertex and fragment shaders included
680b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	buildInfo.program = m_program->getProgramInfo();
681b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (int shaderIdx = 0; shaderIdx < totalShaderStages; shaderIdx++)
682b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
683b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		glu::ShaderInfo shaderInfo = m_program->getShaderInfo(static_cast<glu::ShaderType>(static_cast<int>(glu::SHADERTYPE_VERTEX) + static_cast<int>(shaderIdx)), 0);
684b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		buildInfo.shaders.push_back(shaderInfo);
685b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
686b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
687b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	log << buildInfo;
688b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
689b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
690b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael HadleySRGBTestProgram::~SRGBTestProgram (void)
691b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
692b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_program	= de::MovePtr<glu::ShaderProgram>(DE_NULL);
693b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
694b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
695b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestProgram::setBlendRequired (bool blendRequired)
696b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
697b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_blendRequired = blendRequired;
698b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
699b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
700b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestProgram::setToggleRequired (bool toggleRequired)
701b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
702b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_toggleRequired = toggleRequired;
703b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
704b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
705b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestProgram::setUniformToggle (int location, bool toggleDecodeValue)
706b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
707b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	if ( (m_uniformDataList.empty() == false) && (location >= 0) && (location <= (int)m_uniformDataList.size()) )
708b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
709b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		m_uniformDataList[location].toggleDecode = toggleDecodeValue;
710b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
711b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	else
712b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
713b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		TCU_THROW(TestError, "Error: Uniform location not found. glGetActiveUniforms returned uniforms incorrectly ");
714b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
715b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
716b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
717b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyint SRGBTestProgram::getUniformTotal (void) const
718b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
719b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return (int)m_uniformDataList.size();
720b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
721b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
722b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyconst std::vector<UniformData>& SRGBTestProgram::getUniformDataList (void) const
723b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
724b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return m_uniformDataList;
725b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
726b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
727b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyconst UniformData& SRGBTestProgram::getUniformAtLocation (int location) const
728b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
729b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return m_uniformDataList[location];
730b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
731b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
732b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyint SRGBTestProgram::getUniformLocation (const std::string& name)
733b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
734b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (std::size_t idx = 0; idx < m_uniformDataList.size(); idx++)
735b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
736b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		if (m_uniformDataList[idx].name == name)
737b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
738b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			return m_uniformDataList[idx].location;
739b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
740b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
741b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
742b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	TCU_THROW(TestError, "Error: If name correctly requested then glGetActiveUniforms() returned active uniform data incorrectly");
743b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return -1;
744b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
745b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
746b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyglw::GLuint SRGBTestProgram::getHandle (void) const
747b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
748b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return m_program->getProgram();
749b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
750b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
751b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleybool SRGBTestProgram::getBlendRequired (void) const
752b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
753b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return m_blendRequired;
754b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
755b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
756b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleybool SRGBTestProgram::getToggleRequired (void) const
757b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
758b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return m_toggleRequired;
759b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
760b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
761b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyconst std::string& SRGBTestProgram::getFragmentShader (void) const
762b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
763b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return m_shaderFragment;
764b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
765b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
766b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleystd::string SRGBTestProgram::genFunctionCall (ShaderSamplingType samplingType, const int uniformIdx)
767b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
768b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::ostringstream functionCall;
769b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
770b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	functionCall << "	mediump vec4 texelColor" << uniformIdx << " = ";
771b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
772b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	switch (samplingType)
773b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
774b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			case TEXTURESAMPLING_TEXTURE:
775b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			{
776b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				functionCall << "texture(uTexture" << uniformIdx << ", vs_aTexCoord); \n";
777b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				break;
778b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			}
779b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			case TEXTURESAMPLING_TEXTURE_LOD:
780b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			{
781b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				functionCall << "textureLod(uTexture" << uniformIdx << ", vs_aTexCoord, 0.0); \n";
782b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				break;
783b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			}
784b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			case TEXTURESAMPLING_TEXTURE_GRAD:
785b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			{
786b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				functionCall << "textureGrad(uTexture" << uniformIdx << ", vs_aTexCoord, vec2(0.0, 0.0), vec2(0.0, 0.0)); \n";
787b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				break;
788b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			}
789b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			case TEXTURESAMPLING_TEXTURE_OFFSET:
790b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			{
791b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				functionCall << "textureOffset(uTexture" << uniformIdx << ", vs_aTexCoord, ivec2(0.0, 0.0)); \n";
792b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				break;
793b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			}
794b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			case TEXTURESAMPLING_TEXTURE_PROJ:
795b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			{
796b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				functionCall << "textureProj(uTexture" << uniformIdx << ", vec3(vs_aTexCoord, 1.0)); \n";
797b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				break;
798b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			}
799b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			case TEXTURESAMPLING_TEXELFETCH:
800b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			{
801b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				functionCall << "texelFetch(uTexture" << uniformIdx << ", ivec2(vs_aTexCoord), 0); \n";
802b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				break;
803b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			}
804b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			case TEXTURESAMPLING_TEXELFETCH_OFFSET:
805b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			{
806b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				functionCall << "texelFetchOffset(uTexture" << uniformIdx << ", ivec2(vs_aTexCoord), 0, ivec2(0.0, 0.0)); \n";
807b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				break;
808b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			}
809b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			default:
810b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			{
811b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				DE_FATAL("Error: Sampling type not recognised");
812b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			}
813b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
814b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
815b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return functionCall.str();
816b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
817b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
818b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestProgram::genFragmentShader (void)
819b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
820b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::ostringstream source;
821b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::ostringstream sampleTexture;
822b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::ostringstream functionParameters;
823b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::ostringstream shaderOutputs;
824b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
825b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// if comparison function is present resulting shader requires precisely one output
826b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	DE_ASSERT( !(m_shaderFragmentParameters.hasFunction && (static_cast<int>(m_shaderFragmentParameters.outputTotal) != static_cast<int>(SHADEROUTPUTS_ONE))) );
827b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
828b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// function parameters must equal the number of uniforms i.e. textures passed into the function
829b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	DE_ASSERT( !(m_shaderFragmentParameters.hasFunction && (static_cast<int>(m_shaderFragmentParameters.uniformTotal) != static_cast<int>(m_shaderFragmentParameters.functionParameters))) );
830b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
831b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// fragment shader cannot contain more outputs than the number of texture uniforms
832b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	DE_ASSERT( !(static_cast<int>(m_shaderFragmentParameters.outputTotal) > static_cast<int>(m_shaderFragmentParameters.uniformTotal)) ) ;
833b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
834b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	source << "#version 310 es \n"
835b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		<< "in mediump vec2 vs_aTexCoord; \n";
836b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
837b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (int output = 0; output < m_shaderFragmentParameters.outputTotal; output++)
838b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
839b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		source << "layout (location = " << output << ") out mediump vec4 fs_aColor" << output << "; \n";
840b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
841b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
842b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (int uniform = 0; uniform < m_shaderFragmentParameters.uniformTotal; uniform++)
843b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
844b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		source << "uniform sampler2D uTexture" << uniform << "; \n";
845b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
846b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
847b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	if (m_shaderFragmentParameters.hasFunction == true)
848b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
849b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		source << m_shaderFragmentParameters.functionImplementation;
850b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
851b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
852b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	source << "void main () \n"
853b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		<< "{ \n";
854b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
855b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (int uniformIdx = 0; uniformIdx < m_shaderFragmentParameters.uniformTotal; uniformIdx++)
856b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
857b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		source << this->genFunctionCall(m_shaderFragmentParameters.samplingType, uniformIdx);
858b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
859b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
860b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	if (m_shaderFragmentParameters.hasFunction == true)
861b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
862b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		switch ( static_cast<FunctionParameters>(m_shaderFragmentParameters.functionParameters) )
863b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
864b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			case FUNCTIONPARAMETERS_ONE:
865b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			{
866b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				functionParameters << "(texelColor0)";
867b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				break;
868b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			}
869b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			case FUNCTIONPARAMETERS_TWO:
870b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			{
871b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				functionParameters << "(texelColor0, texelColor1)";
872b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				break;
873b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			}
874b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			default:
875b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			{
876b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				DE_FATAL("Error: Number of comparison function parameters invalid");
877b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			}
878b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
879b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
880b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		shaderOutputs << "	fs_aColor0 = " << m_shaderFragmentParameters.functionName << functionParameters.str() << "; \n";
881b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
882b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	else
883b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
884b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		for (int output = 0; output < m_shaderFragmentParameters.outputTotal; output++)
885b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
886b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			shaderOutputs << "	fs_aColor" << output << " = texelColor" << output << "; \n";
887b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
888b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
889b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
890b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	source << shaderOutputs.str();
891b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	source << "} \n";
892b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
893b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_shaderFragment = source.str();
894b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
895b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
896b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyclass SRGBTestCase : public TestCase
897b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
898b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleypublic:
899b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley							SRGBTestCase					(Context& context, const char* name, const char* description, const tcu::TextureFormat internalFormat);
900b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley							~SRGBTestCase					(void);
901b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
902b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void					init							(void);
903b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void					deinit							(void);
904b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	virtual IterateResult	iterate							(void);
905b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
906b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void					setSamplingGroup				(const ShaderSamplingGroup samplingGroup);
907b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void					setSamplingLocations			(const int px, const int py);
908b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void					setShaderProgramBlendRequired	(const int programIdx, const bool blend);
909b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void					setShaderProgramToggleRequired	(const int programIdx, const bool toggle);
910b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void					setUniformToggle				(const int programIdx, const std::string& uniformName, bool toggleDecode);
911b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
912b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	deUint32				getShaderProgramHandle			(const int programIdx) const;
913b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	deUint32				getTextureHandle				(const int textureIdx) const;
914b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
915b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void					addTexture						(const glu::TextureTestUtil::TextureType	targetType,
916b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley															 const int									width,
917b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley															 const int									height,
918b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley															 const tcu::Vec4							color,
919b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley															 const tcu::Sampler::WrapMode				wrapS,
920b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley															 const tcu::Sampler::WrapMode				wrapT,
921b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley															 const tcu::Sampler::FilterMode				minFilter,
922b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley															 const tcu::Sampler::FilterMode				magFilter,
923b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley															 const SRGBDecode							decoding);
924b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void					addSampler						(const tcu::Sampler::WrapMode	wrapS,
925b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley															 const tcu::Sampler::WrapMode	wrapT,
926b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley															 const tcu::Sampler::FilterMode	minFilter,
927b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley															 const tcu::Sampler::FilterMode	magFilter,
928b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley															 const SRGBDecode				decoding);
929b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void					addShaderProgram				(const FragmentShaderParameters& shaderParameters);
930b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
931b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void					genShaderPrograms				(ShaderSamplingType samplingType);
932b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void					deleteShaderPrograms			(void);
933b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
934b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void					readResultTextures				(void);
935b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void					storeResultPixels				(std::vector<tcu::Vec4>& resultPixelData);
936b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
937b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void					toggleDecode					(const std::vector<UniformData>& uniformDataList);
938b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void					bindSamplerToTexture			(const int samplerIdx, const int textureIdx, const deUint32 textureUnit);
939b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void					activateSampler					(const int samplerIdx, const bool active);
940b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void					logColor						(const std::string& colorLogMessage, int colorIdx, tcu::Vec4 color) const;
941b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Vec4				formatReferenceColor			(tcu::Vec4 referenceColor);
942b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
943b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// render function has a default implentation. Can be overriden for special cases
944b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	virtual void			render							(void);
945b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
946b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// following functions must be overidden to perform individual test cases
947b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	virtual void			setupTest						(void) = 0;
948b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	virtual bool			verifyResult					(void) = 0;
949b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
950b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyprotected:
951b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	de::MovePtr<glu::Framebuffer>			m_framebuffer;
952b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::vector<SRGBTestTexture*>			m_textureSourceList;
953ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	std::vector<SRGBTestSampler*>			m_samplerList;
954b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::vector<glw::GLuint>				m_renderBufferList;
955b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const tcu::Vec4							m_epsilonError;
956b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::vector<tcu::TextureLevel>			m_textureResultList;
957b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	int										m_resultOutputTotal;
958b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::TextureFormat						m_resultTextureFormat;
959b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	glw::GLuint								m_vaoID;
960ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	glw::GLuint								m_vertexDataID;
961b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::vector<FragmentShaderParameters>	m_shaderParametersList;
962b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::vector<SRGBTestProgram*>			m_shaderProgramList;
963b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	ShaderSamplingGroup						m_samplingGroup;
964b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	int										m_px;
965b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	int										m_py;
966b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const tcu::TextureFormat				m_internalFormat;
967b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
968b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyprivate:
969b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void			uploadTextures	(void);
970b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void			initFrameBuffer	(void);
971b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void			initVertexData	(void);
972b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
973b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley					SRGBTestCase	(const SRGBTestCase&);
974b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	SRGBTestCase&	operator=		(const SRGBTestCase&);
975b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
976b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
977b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael HadleySRGBTestCase::SRGBTestCase	(Context& context, const char* name, const char* description, const tcu::TextureFormat internalFormat)
978b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	: TestCase				(context, name, description)
979b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_epsilonError		(EpsilonError::CPU)
980b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_resultTextureFormat	(tcu::TextureFormat(tcu::TextureFormat::sRGBA, tcu::TextureFormat::UNORM_INT8))
981ab0a5da69ee6c41ff7b752c14761cd991cee87cfPyry Haulos	, m_vaoID				(0)
982ab0a5da69ee6c41ff7b752c14761cd991cee87cfPyry Haulos	, m_vertexDataID		(0)
983b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_samplingGroup		(SHADERSAMPLINGGROUP_TEXTURE)
984b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	, m_internalFormat		(internalFormat)
985b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
986b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
987b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
988b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael HadleySRGBTestCase::~SRGBTestCase (void)
989b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
990ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	deinit();
991b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
992b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
993b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::init (void)
994b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
995b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// extension requirements for test
996b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	if ( (glu::getInternalFormat(m_internalFormat) == GL_SRGB8_ALPHA8) && !m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_sRGB_decode") )
997b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
998b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		throw tcu::NotSupportedError("Test requires GL_EXT_texture_sRGB_decode extension");
999b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1000b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1001b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	if ( (glu::getInternalFormat(m_internalFormat) == GL_SR8_EXT) && !(m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_sRGB_R8")) )
1002b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1003b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		throw tcu::NotSupportedError("Test requires GL_EXT_texture_sRGB_R8 extension");
1004b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1005b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1006b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_framebuffer = de::MovePtr<glu::Framebuffer>(new glu::Framebuffer(m_context.getRenderContext()));
1007b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1008b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1009b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::deinit (void)
1010b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1011ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
1012ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams
1013ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	m_framebuffer	= de::MovePtr<glu::Framebuffer>(DE_NULL);
1014ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams
1015ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	for (std::size_t renderBufferIdx = 0; renderBufferIdx < m_renderBufferList.size(); renderBufferIdx++)
1016ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	{
1017ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams		gl.deleteRenderbuffers(1, &m_renderBufferList[renderBufferIdx]);
1018ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	}
1019ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	m_renderBufferList.clear();
1020ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams
1021ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	for (std::size_t textureSourceIdx = 0; textureSourceIdx < m_textureSourceList.size(); textureSourceIdx++)
1022ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	{
1023ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams		delete m_textureSourceList[textureSourceIdx];
1024ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	}
1025ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	m_textureSourceList.clear();
1026ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams
1027ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	for (std::size_t samplerIdx = 0; samplerIdx < m_samplerList.size(); samplerIdx++)
1028ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	{
1029ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams		delete m_samplerList[samplerIdx];
1030ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	}
1031ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	m_samplerList.clear();
1032ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams
1033ab0a5da69ee6c41ff7b752c14761cd991cee87cfPyry Haulos	if (m_vaoID != 0)
1034ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	{
1035ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams		gl.deleteVertexArrays(1, &m_vaoID);
1036ab0a5da69ee6c41ff7b752c14761cd991cee87cfPyry Haulos		m_vaoID = 0;
1037ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	}
1038ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams
1039ab0a5da69ee6c41ff7b752c14761cd991cee87cfPyry Haulos	if (m_vertexDataID != 0)
1040ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	{
1041ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams		gl.deleteBuffers(1, &m_vertexDataID);
1042ab0a5da69ee6c41ff7b752c14761cd991cee87cfPyry Haulos		m_vertexDataID = 0;
1043ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	}
1044b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1045b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1046b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael HadleySRGBTestCase::IterateResult SRGBTestCase::iterate (void)
1047b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1048b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	bool	result;
1049b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	int		startIdx	= -1;
1050b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	int		endIdx		= -1;
1051b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1052b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->setupTest();
1053b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1054b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	if (m_samplingGroup == SHADERSAMPLINGGROUP_TEXTURE)
1055b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1056b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		startIdx	= static_cast<int>(TEXTURESAMPLING_TEXTURE_START);
1057b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		endIdx		= static_cast<int>(TEXTURESAMPLING_TEXTURE_END);
1058b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1059b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	else if (m_samplingGroup == SHADERSAMPLINGGROUP_TEXEL_FETCH)
1060b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1061b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		startIdx	= static_cast<int>(TEXTURESAMPLING_TEXELFETCH_START);
1062b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		endIdx		= static_cast<int>(TEXTURESAMPLING_TEXELFETCH_END);
1063b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1064b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	else
1065b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1066b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		DE_FATAL("Error: Sampling group not defined");
1067b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1068b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1069ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	this->initVertexData();
1070ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	this->initFrameBuffer();
1071ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams
1072b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// loop through all sampling types in the required sampling group, performing individual tests for each
1073b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (int samplingTypeIdx = startIdx; samplingTypeIdx < endIdx; samplingTypeIdx++)
1074b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1075b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		this->genShaderPrograms(static_cast<ShaderSamplingType>(samplingTypeIdx));
1076b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		this->uploadTextures();
1077b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		this->render();
1078b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1079b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		result = this->verifyResult();
1080b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1081b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		this->deleteShaderPrograms();
1082b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1083b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		if (result == true)
1084b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
1085b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1086b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
1087b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		else
1088b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
1089b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Result verification failed");
1090b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			return STOP;
1091b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
1092b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1093b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1094b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return STOP;
1095b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1096b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1097b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::setSamplingGroup (const ShaderSamplingGroup samplingGroup)
1098b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1099b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_samplingGroup = samplingGroup;
1100b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1101b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1102b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::setSamplingLocations (const int px, const int py)
1103b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1104b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_px = px;
1105b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_py = py;
1106b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1107b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1108b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::setShaderProgramBlendRequired (const int programIdx, const bool blend)
1109b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1110b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_shaderProgramList[programIdx]->setBlendRequired(blend);
1111b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1112b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1113b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::setShaderProgramToggleRequired (const int programIdx, const bool toggle)
1114b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1115b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_shaderProgramList[programIdx]->setToggleRequired(toggle);
1116b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1117b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1118b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::setUniformToggle (const int programIdx, const std::string& uniformName, bool toggleDecodeValue)
1119b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1120b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	int uniformLocation = m_shaderProgramList[programIdx]->getUniformLocation(uniformName);
1121b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_shaderProgramList[programIdx]->setUniformToggle(uniformLocation, toggleDecodeValue);
1122b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1123b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1124b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael HadleydeUint32 SRGBTestCase::getShaderProgramHandle (const int programIdx) const
1125b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1126b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return m_shaderProgramList[programIdx]->getHandle();
1127b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1128b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1129b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael HadleydeUint32 SRGBTestCase::getTextureHandle (const int textureIdx) const
1130b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1131b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	return m_textureSourceList[textureIdx]->getHandle();
1132b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1133b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1134b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::addTexture (	const glu::TextureTestUtil::TextureType	targetType,
1135b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley								const int								width,
1136b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley								const int								height,
1137b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley								const tcu::Vec4							color,
1138b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley								const tcu::Sampler::WrapMode			wrapS,
1139b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley								const tcu::Sampler::WrapMode			wrapT,
1140b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley								const tcu::Sampler::FilterMode			minFilter,
1141b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley								const tcu::Sampler::FilterMode			magFilter,
1142b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley								const SRGBDecode						decoding)
1143b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1144b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	SRGBTestTexture* texture = new SRGBTestTexture(m_context, targetType, m_internalFormat, width, height, color, wrapS, wrapT, minFilter, magFilter, decoding);
1145b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_textureSourceList.push_back(texture);
1146b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1147b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1148b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::addSampler (	const tcu::Sampler::WrapMode	wrapS,
1149b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley								const tcu::Sampler::WrapMode	wrapT,
1150b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley								const tcu::Sampler::FilterMode	minFilter,
1151b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley								const tcu::Sampler::FilterMode	magFilter,
1152b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley								const SRGBDecode				decoding)
1153b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1154ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	SRGBTestSampler *sampler = new SRGBTestSampler(m_context, wrapS, wrapT, minFilter, magFilter, decoding);
1155b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_samplerList.push_back(sampler);
1156b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1157b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1158b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::addShaderProgram (const FragmentShaderParameters& shaderParameters)
1159b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1160b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_shaderParametersList.push_back(shaderParameters);
1161b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_resultOutputTotal = shaderParameters.outputTotal;
1162b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1163b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1164b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::genShaderPrograms (ShaderSamplingType samplingType)
1165b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1166b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (int shaderParamsIdx = 0; shaderParamsIdx < (int)m_shaderParametersList.size(); shaderParamsIdx++)
1167b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1168b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		m_shaderParametersList[shaderParamsIdx].samplingType = samplingType;
1169b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		SRGBTestProgram* shaderProgram = new SRGBTestProgram(m_context, m_shaderParametersList[shaderParamsIdx]);
1170b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1171b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		if (m_shaderParametersList[shaderParamsIdx].blendRequired == BLENDING_REQUIRED)
1172b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
1173b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			shaderProgram->setBlendRequired(true);
1174b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
1175b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1176b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		if (m_shaderParametersList[shaderParamsIdx].toggleRequired == TOGGLING_REQUIRED)
1177b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
1178b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			shaderProgram->setToggleRequired(true);
1179b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			std::vector<std::string> uniformsToToggle = m_shaderParametersList[shaderParamsIdx].uniformsToToggle;
1180b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1181b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			for (int uniformNameIdx = 0; uniformNameIdx < (int)uniformsToToggle.size(); uniformNameIdx++)
1182b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			{
1183b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				shaderProgram->setUniformToggle(shaderProgram->getUniformLocation(uniformsToToggle[uniformNameIdx]), true);
1184b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			}
1185b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
1186b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1187b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		m_shaderProgramList.push_back(shaderProgram);
1188b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1189b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1190b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1191b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::deleteShaderPrograms (void)
1192b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1193b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (std::size_t idx = 0; idx < m_shaderProgramList.size(); idx++)
1194b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1195b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		delete m_shaderProgramList[idx];
1196b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1197b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_shaderProgramList.clear();
1198b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1199b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1200b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::readResultTextures (void)
1201b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1202b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const glw::Functions&	gl		= m_context.getRenderContext().getFunctions();
1203b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	int						width	= m_context.getRenderContext().getRenderTarget().getWidth();
1204b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	int						height	= m_context.getRenderContext().getRenderTarget().getHeight();
1205b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1206b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindFramebuffer(GL_FRAMEBUFFER, **m_framebuffer);
1207b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1208b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_textureResultList.resize(m_renderBufferList.size());
1209b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1210b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (std::size_t renderBufferIdx = 0; renderBufferIdx < m_renderBufferList.size(); renderBufferIdx++)
1211b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1212b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		gl.readBuffer(GL_COLOR_ATTACHMENT0 + (glw::GLenum)renderBufferIdx);
1213b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		m_textureResultList[renderBufferIdx].setStorage(m_resultTextureFormat, width, height);
1214b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		glu::readPixels(m_context.getRenderContext(), 0, 0, m_textureResultList[renderBufferIdx].getAccess());
1215b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels()");
1216b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1217b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1218b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindFramebuffer(GL_FRAMEBUFFER, 0);
1219b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1220b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1221b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::storeResultPixels (std::vector<tcu::Vec4>& resultPixelData)
1222b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1223b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::TestLog&		log			= m_context.getTestContext().getLog();
1224b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::ostringstream	message;
1225b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	int					width		= m_context.getRenderContext().getRenderTarget().getWidth();
1226b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	int					height		= m_context.getRenderContext().getRenderTarget().getHeight();
1227b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1228b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// ensure result sampling coordinates are within range of the result color attachment
1229b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	DE_ASSERT((m_px >= 0) && (m_px < width));
1230b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	DE_ASSERT((m_py >= 0) && (m_py < height));
1231b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	DE_UNREF(width && height);
1232b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1233b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (int idx = 0; idx < (int)m_textureResultList.size(); idx++)
1234b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1235b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		resultPixelData.push_back(m_textureResultList[idx].getAccess().getPixel(m_px, m_py));
1236b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		this->logColor(std::string("Result color: "), idx, resultPixelData[idx]);
1237b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1238b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1239b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// log error rate (threshold)
1240b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	message << m_epsilonError;
1241b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	log << tcu::TestLog::Message << std::string("Epsilon error: ") << message.str() << tcu::TestLog::EndMessage;
1242b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1243b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1244b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::toggleDecode (const std::vector<UniformData>& uniformDataList)
1245b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1246b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	DE_ASSERT( uniformDataList.size() <= m_textureSourceList.size() );
1247b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1248b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (int uniformIdx = 0; uniformIdx < (int)uniformDataList.size(); uniformIdx++)
1249b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1250b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		if (uniformDataList[uniformIdx].toggleDecode == true)
1251b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
1252b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			if (m_textureSourceList[uniformIdx]->getDecode() == SRGBDECODE_DECODE_DEFAULT)
1253b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			{
1254b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				// cannot toggle default
1255b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				continue;
1256b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			}
1257b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1258b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			// toggle sRGB decode values (ignoring value if set to default)
1259b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			m_textureSourceList[uniformIdx]->setDecode((SRGBDecode)((m_textureSourceList[uniformIdx]->getDecode() + 1) % SRGBDECODE_DECODE_DEFAULT));
1260b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
1261b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1262b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1263b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1264b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::bindSamplerToTexture (const int samplerIdx, const int textureIdx, const deUint32 textureUnit)
1265b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1266b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	deUint32 enumConversion = textureUnit - GL_TEXTURE0;
1267b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	m_textureSourceList[textureIdx]->setHasSampler(true);
1268ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	m_samplerList[samplerIdx]->setTextureUnit(enumConversion);
1269b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1270b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1271b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::activateSampler (const int samplerIdx, const bool active)
1272b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1273ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	m_samplerList[samplerIdx]->setIsActive(active);
1274b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1275b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1276b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::logColor (const std::string& colorLogMessage, int colorIdx, tcu::Vec4 color) const
1277b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1278b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::TestLog&			log		= m_context.getTestContext().getLog();
1279b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::ostringstream		message;
1280b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1281b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	message << colorLogMessage << colorIdx << " = (" << color.x() << ", " << color.y() << ", " << color.z() << ", " << color.w() << ")";
1282b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	log << tcu::TestLog::Message << message.str() << tcu::TestLog::EndMessage;
1283b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1284b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1285b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleytcu::Vec4 SRGBTestCase::formatReferenceColor (tcu::Vec4 referenceColor)
1286b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1287b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	switch (glu::getInternalFormat(m_internalFormat))
1288b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1289b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		case GL_SRGB8_ALPHA8:
1290b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
1291b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			return referenceColor;
1292b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
1293b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		case GL_SR8_EXT:
1294b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
1295b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			// zero unwanted color channels
1296b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			referenceColor.y() = 0;
1297b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			referenceColor.z() = 0;
1298b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			return referenceColor;
1299b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
1300b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		default:
1301b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
1302b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			DE_FATAL("Error: Internal format not recognised");
1303b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			return referenceColor;
1304b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
1305b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1306b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1307b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1308b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::render (void)
1309b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1310b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
1311b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1312b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// default rendering only uses one program
1313b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindFramebuffer(GL_FRAMEBUFFER, **m_framebuffer);
1314b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindVertexArray(m_vaoID);
1315b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1316b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.useProgram(m_shaderProgramList[0]->getHandle());
1317b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1318b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (int textureSourceIdx = 0; textureSourceIdx < (int)m_textureSourceList.size(); textureSourceIdx++)
1319b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1320b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		gl.activeTexture(GL_TEXTURE0 + (glw::GLenum)textureSourceIdx);
1321b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		gl.bindTexture(m_textureSourceList[textureSourceIdx]->getGLTargetType(), m_textureSourceList[textureSourceIdx]->getHandle());
1322102cfe8b1147c7bada5ed5bcb0430743fc1a1a63Alexander Galazin		glw::GLuint samplerUniformLocationID = gl.getUniformLocation(m_shaderProgramList[0]->getHandle(), (std::string("uTexture") + de::toString(textureSourceIdx)).c_str());
1323b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		TCU_CHECK(samplerUniformLocationID != (glw::GLuint)-1);
1324b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		gl.uniform1i(samplerUniformLocationID, (glw::GLenum)textureSourceIdx);
1325b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1326b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1327b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (int samplerIdx = 0; samplerIdx < (int)m_samplerList.size(); samplerIdx++)
1328b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1329ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams		if (m_samplerList[samplerIdx]->getIsActive() == true)
1330b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
1331ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams			m_samplerList[samplerIdx]->bindToTexture();
1332b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
1333b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1334b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1335b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.drawArrays(GL_TRIANGLES, 0, 6);
1336b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1337b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (std::size_t textureSourceIdx = 0; textureSourceIdx < m_textureSourceList.size(); textureSourceIdx++)
1338b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1339b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		gl.bindTexture(m_textureSourceList[textureSourceIdx]->getGLTargetType(), 0);
1340b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1341b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindFramebuffer(GL_FRAMEBUFFER, 0);
1342b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindVertexArray(0);
1343b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindBuffer(GL_ARRAY_BUFFER, 0);
1344b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1345b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1346b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::uploadTextures (void)
1347b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1348b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (std::size_t idx = 0; idx < m_textureSourceList.size(); idx++)
1349b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1350b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		m_textureSourceList[idx]->upload();
1351b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		m_textureSourceList[idx]->setParameters();
1352b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1353b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1354b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1355b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::initFrameBuffer (void)
1356b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1357b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const glw::Functions&	gl		= m_context.getRenderContext().getFunctions();
1358b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	int						width	= m_context.getRenderContext().getRenderTarget().getWidth();
1359b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	int						height	= m_context.getRenderContext().getRenderTarget().getHeight();
1360b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1361b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	if (m_resultOutputTotal == 0)
1362b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1363b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		throw std::invalid_argument("SRGBTestExecutor must have at least 1 rendered result");
1364b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1365b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1366b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindFramebuffer(GL_FRAMEBUFFER, **m_framebuffer);
1367b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1368ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	DE_ASSERT(m_renderBufferList.empty());
1369ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	for (int outputIdx = 0; outputIdx < m_resultOutputTotal; outputIdx++)
1370b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1371ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams		glw::GLuint renderBuffer = -1;
1372ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams		m_renderBufferList.push_back(renderBuffer);
1373b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1374b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1375b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (std::size_t renderBufferIdx = 0; renderBufferIdx < m_renderBufferList.size(); renderBufferIdx++)
1376b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1377b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		gl.genRenderbuffers(1, &m_renderBufferList[renderBufferIdx]);
1378b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		gl.bindRenderbuffer(GL_RENDERBUFFER, m_renderBufferList[renderBufferIdx]);
1379b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		gl.renderbufferStorage(GL_RENDERBUFFER, glu::getInternalFormat(m_resultTextureFormat), width, height);
1380b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		gl.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + (glw::GLenum)renderBufferIdx, GL_RENDERBUFFER, m_renderBufferList[renderBufferIdx]);
1381b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		GLU_EXPECT_NO_ERROR(gl.getError(), "Create and setup renderbuffer object");
1382b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1383b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	TCU_CHECK(gl.checkFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
1384b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1385b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::vector<glw::GLenum> renderBufferTargets(m_renderBufferList.size());
1386b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (std::size_t renderBufferIdx = 0; renderBufferIdx < m_renderBufferList.size(); renderBufferIdx++)
1387b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1388b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		renderBufferTargets[renderBufferIdx] = GL_COLOR_ATTACHMENT0 + (glw::GLenum)renderBufferIdx;
1389b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1390b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.drawBuffers((glw::GLsizei)renderBufferTargets.size(), &renderBufferTargets[0]);
1391b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	GLU_EXPECT_NO_ERROR(gl.getError(), "glDrawBuffer()");
1392b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1393b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindFramebuffer(GL_FRAMEBUFFER, 0);
1394b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1395b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1396b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBTestCase::initVertexData (void)
1397b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1398b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const glw::Functions&	gl				= m_context.getRenderContext().getFunctions();
1399b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1400b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	static const glw::GLfloat squareVertexData[] =
1401b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1402b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		// position				// texcoord
1403b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		-1.0f, -1.0f, 0.0f,		0.0f, 0.0f, // bottom left corner
1404b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		 1.0f, -1.0f, 0.0f,		1.0f, 0.0f, // bottom right corner
1405b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		 1.0f,  1.0f, 0.0f,		1.0f, 1.0f, // Top right corner
1406b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1407b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		-1.0f,  1.0f, 0.0f,		0.0f, 1.0f, // top left corner
1408b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		 1.0f,  1.0f, 0.0f,		1.0f, 1.0f, // Top right corner
1409b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		-1.0f, -1.0f, 0.0f,		0.0f, 0.0f  // bottom left corner
1410b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	};
1411b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1412ab0a5da69ee6c41ff7b752c14761cd991cee87cfPyry Haulos	DE_ASSERT(m_vaoID == 0);
1413b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.genVertexArrays(1, &m_vaoID);
1414b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindVertexArray(m_vaoID);
1415b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1416ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	gl.genBuffers(1, &m_vertexDataID);
1417ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams	gl.bindBuffer(GL_ARRAY_BUFFER, m_vertexDataID);
1418b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bufferData(GL_ARRAY_BUFFER, (glw::GLsizei)sizeof(squareVertexData), squareVertexData, GL_STATIC_DRAW);
1419b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1420b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.vertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * (glw::GLsizei)sizeof(GL_FLOAT), (glw::GLvoid *)0);
1421b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.enableVertexAttribArray(0);
1422b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.vertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * (glw::GLsizei)sizeof(GL_FLOAT), (glw::GLvoid *)(3 * sizeof(GL_FLOAT)));
1423b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.enableVertexAttribArray(1);
1424b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1425b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindVertexArray(0);
1426b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindBuffer(GL_ARRAY_BUFFER, 0);
1427b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1428b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1429b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyclass TextureDecodeSkippedCase : public SRGBTestCase
1430b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1431b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleypublic:
1432b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			TextureDecodeSkippedCase	(Context& context, const char* name, const char* description, const tcu::TextureFormat internalFormat)
1433b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				: SRGBTestCase			(context, name, description, internalFormat) {}
1434b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1435b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			~TextureDecodeSkippedCase	(void) {}
1436b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1437b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void	setupTest					(void);
1438b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	bool	verifyResult				(void);
1439b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
1440b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1441b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid TextureDecodeSkippedCase::setupTest (void)
1442b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1443b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// TEST STEPS:
1444b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- create and set texture to DECODE_SKIP_EXT
1445b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- store texture on GPU
1446b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- in fragment shader, sample the texture using texture*() and render texel values to a color attachment in the FBO
1447b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- on the host, read back the pixel values into a tcu::TextureLevel
1448b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- analyse the texel values, expecting them in sRGB format i.e. linear space decoding was skipped
1449b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1450b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	FragmentShaderParameters shaderParameters(SHADEROUTPUTS_ONE, SHADERUNIFORMS_ONE, NULL, BLENDING_NOT_REQUIRED, TOGGLING_NOT_REQUIRED);
1451b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1452b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->addTexture(	TEXTURETYPE_2D,
1453b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						TestDimensions::WIDTH,
1454b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						TestDimensions::HEIGHT,
1455b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						getColorReferenceLinear(),
1456b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::MIRRORED_REPEAT_GL,
1457b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::MIRRORED_REPEAT_GL,
1458b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1459b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1460b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						SRGBDECODE_SKIP_DECODE);
1461b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1462b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->addShaderProgram(shaderParameters);
1463b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->setSamplingLocations(TestSamplingPositions::X_POS, TestSamplingPositions::Y_POS);
1464b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1465b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->setSamplingGroup(SHADERSAMPLINGGROUP_TEXTURE);
1466b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1467b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1468b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleybool TextureDecodeSkippedCase::verifyResult (void)
1469b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1470b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::TestLog&			log				= m_context.getTestContext().getLog();
1471b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const int				resultColorIdx	= 0;
1472b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::vector<tcu::Vec4>	pixelResultList;
1473b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Vec4				pixelConverted;
1474b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Vec4				pixelReference;
1475b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Vec4				pixelExpected;
1476b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1477b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->readResultTextures();
1478b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->storeResultPixels(pixelResultList);
1479b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1480b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	pixelConverted = tcu::sRGBToLinear(pixelResultList[resultColorIdx]);
1481b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	pixelReference = this->formatReferenceColor(getColorReferenceLinear());
1482b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	pixelExpected = this->formatReferenceColor(getColorReferenceSRGB());
1483b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1484b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->formatReferenceColor(pixelReference);
1485b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->logColor(std::string("Expected color: "), resultColorIdx, pixelExpected);
1486b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1487b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// result color 0 should be sRGB. Compare with linear reference color
1488b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	if ( (tcu::boolAll(tcu::lessThan(tcu::abs(pixelConverted - pixelReference), m_epsilonError))) || (tcu::boolAll(tcu::equal(pixelConverted, pixelReference))) )
1489b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1490b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		log << tcu::TestLog::Message << std::string("sRGB as expected") << tcu::TestLog::EndMessage;
1491b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		return true;
1492b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1493b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	else
1494b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1495b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		log << tcu::TestLog::Message << std::string("not sRGB as expected") << tcu::TestLog::EndMessage;
1496b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		return false;
1497b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1498b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1499b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1500b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyclass TextureDecodeEnabledCase : public SRGBTestCase
1501b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1502b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleypublic:
1503b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		TextureDecodeEnabledCase	(Context& context, const char* name, const char* description, const tcu::TextureFormat internalFormat)
1504b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			: SRGBTestCase			(context, name, description, internalFormat) {}
1505b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1506b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		~TextureDecodeEnabledCase	(void) {}
1507b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1508b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		void	setupTest			(void);
1509b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		bool	verifyResult		(void);
1510b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
1511b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1512b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid TextureDecodeEnabledCase::setupTest (void)
1513b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1514b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// TEST STEPS:
1515b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- create and set texture to DECODE_EXT
1516b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- store texture on GPU
1517b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- in fragment shader, sample the texture using texture*() and render texel values to a color attachment in the FBO
1518b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- on the host, read back the pixel values into a tcu::TextureLevel
1519b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- analyse the texel values, expecting them in lRGB format i.e. linear space decoding was enabled
1520b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1521b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	FragmentShaderParameters shaderParameters(SHADEROUTPUTS_ONE, SHADERUNIFORMS_ONE, NULL, BLENDING_NOT_REQUIRED, TOGGLING_NOT_REQUIRED);
1522b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1523b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->addTexture(	TEXTURETYPE_2D,
1524b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						TestDimensions::WIDTH,
1525b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						TestDimensions::HEIGHT,
1526b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						getColorReferenceLinear(),
1527b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::MIRRORED_REPEAT_GL,
1528b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::MIRRORED_REPEAT_GL,
1529b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1530b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1531b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						SRGBDECODE_DECODE);
1532b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1533b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->addShaderProgram(shaderParameters);
1534b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1535b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->setSamplingLocations(TestSamplingPositions::X_POS, TestSamplingPositions::Y_POS);
1536b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1537b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->setSamplingGroup(SHADERSAMPLINGGROUP_TEXTURE);
1538b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1539b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1540b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleybool TextureDecodeEnabledCase::verifyResult (void)
1541b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1542b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::TestLog&			log				= m_context.getTestContext().getLog();
1543b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const int				resultColorIdx	= 0;
1544b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::vector<tcu::Vec4>	pixelResultList;
1545b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Vec4				pixelConverted;
1546b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Vec4				pixelReference;
1547b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Vec4				pixelExpected;
1548b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1549b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->readResultTextures();
1550b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->storeResultPixels(pixelResultList);
1551b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1552b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	pixelConverted = tcu::linearToSRGB(pixelResultList[resultColorIdx]);
1553b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	pixelReference = this->formatReferenceColor(getColorReferenceSRGB());
1554b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	pixelExpected = this->formatReferenceColor(getColorReferenceLinear());
1555b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1556b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->logColor(std::string("Expected color: "), resultColorIdx, pixelExpected);
1557b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1558b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// result color 0 should be SRGB. Compare with sRGB reference color
1559b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	if ( (tcu::boolAll(tcu::lessThan(tcu::abs(pixelConverted - pixelReference), m_epsilonError))) || (tcu::boolAll(tcu::equal(pixelConverted, pixelReference))) )
1560b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1561b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		log << tcu::TestLog::Message << std::string("linear as expected") << tcu::TestLog::EndMessage;
1562b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		return true;
1563b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1564b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	else
1565b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1566b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		log << tcu::TestLog::Message << std::string("not linear as expected") << tcu::TestLog::EndMessage;
1567b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		return false;
1568b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1569b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1570b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1571b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyclass TexelFetchDecodeSkippedcase : public SRGBTestCase
1572b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1573b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleypublic:
1574b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			TexelFetchDecodeSkippedcase		(Context& context, const char* name, const char* description, const tcu::TextureFormat internalFormat)
1575b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				: SRGBTestCase				(context, name, description, internalFormat) {}
1576b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1577b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			~TexelFetchDecodeSkippedcase	(void) {}
1578b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1579b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void	setupTest						(void);
1580b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	bool	verifyResult					(void);
1581b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
1582b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1583b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid TexelFetchDecodeSkippedcase::setupTest (void)
1584b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1585b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// TEST STEPS:
1586b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- create and set texture to DECODE_SKIP_EXT
1587b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- store texture on GPU
1588b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- in fragment shader, sample the texture using texelFetch*() and render texel values to a color attachment in the FBO
1589b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- on the host, read back the pixel values into a tcu::TextureLevel
1590b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- analyse the texel values, expecting them in lRGB format i.e. linear space decoding is always enabled with texelFetch*()
1591b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1592b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	FragmentShaderParameters shaderParameters(SHADEROUTPUTS_ONE, SHADERUNIFORMS_ONE, NULL, BLENDING_NOT_REQUIRED, TOGGLING_NOT_REQUIRED);
1593b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1594b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->addTexture(	TEXTURETYPE_2D,
1595b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						TestDimensions::WIDTH,
1596b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						TestDimensions::HEIGHT,
1597b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						getColorReferenceLinear(),
1598b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::MIRRORED_REPEAT_GL,
1599b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::MIRRORED_REPEAT_GL,
1600b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1601b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1602b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						SRGBDECODE_SKIP_DECODE);
1603b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1604b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->addShaderProgram(shaderParameters);
1605b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1606b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->setSamplingLocations(TestSamplingPositions::X_POS, TestSamplingPositions::Y_POS);
1607b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1608b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->setSamplingGroup(SHADERSAMPLINGGROUP_TEXEL_FETCH);
1609b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1610b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1611b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleybool TexelFetchDecodeSkippedcase::verifyResult (void)
1612b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1613b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::TestLog&			log				= m_context.getTestContext().getLog();
1614b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const int				resultColorIdx	= 0;
1615b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::vector<tcu::Vec4>	pixelResultList;
1616b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Vec4				pixelReference;
1617b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Vec4				pixelExpected;
1618b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1619b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->readResultTextures();
1620b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->storeResultPixels(pixelResultList);
1621b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1622b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	pixelReference = pixelExpected = this->formatReferenceColor(getColorReferenceLinear());
1623b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1624b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->logColor(std::string("Expected color: "), resultColorIdx, pixelExpected);
1625b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1626b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// result color 0 should be linear due to automatic conversion via texelFetch*(). Compare with linear reference color
1627b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	if ( (tcu::boolAll(tcu::lessThan(tcu::abs(pixelResultList[0] - pixelReference), m_epsilonError))) || (tcu::boolAll(tcu::equal(pixelResultList[0], pixelReference))) )
1628b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1629b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		log << tcu::TestLog::Message << std::string("linear as expected") << tcu::TestLog::EndMessage;
1630b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		return true;
1631b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1632b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	else
1633b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1634b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		log << tcu::TestLog::Message << std::string("not linear as expected") << tcu::TestLog::EndMessage;
1635b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		return false;
1636b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1637b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1638b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1639b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyclass GPUConversionDecodeEnabledCase : public SRGBTestCase
1640b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1641b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleypublic:
1642b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			GPUConversionDecodeEnabledCase	(Context& context, const char* name, const char* description, const tcu::TextureFormat internalFormat)
1643b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				: SRGBTestCase				(context, name, description, internalFormat) {}
1644b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1645b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			~GPUConversionDecodeEnabledCase	(void) {}
1646b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1647b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void	setupTest						(void);
1648b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	bool	verifyResult					(void);
1649b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
1650b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1651b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid GPUConversionDecodeEnabledCase::setupTest (void)
1652b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1653b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// TEST STEPS:
1654b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- create and set texture_a to DECODE_SKIP_EXT and texture_b to default
1655b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- store textures on GPU
1656b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- in fragment shader, sample both textures using texture*() and manually perform sRGB to lRGB conversion on texture_b
1657b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- in fragment shader, compare converted texture_b with texture_a
1658b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- render green image for pass or red for fail
1659b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1660b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	ComparisonFunction comparisonFunction("srgbToLinearCheck", FUNCTIONPARAMETERS_TWO, getFunctionDefinitionSRGBToLinearCheck());
1661b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1662b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	FragmentShaderParameters shaderParameters(SHADEROUTPUTS_ONE, SHADERUNIFORMS_TWO, &comparisonFunction, BLENDING_NOT_REQUIRED, TOGGLING_NOT_REQUIRED);
1663b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1664b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->addTexture(	TEXTURETYPE_2D,
1665b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						TestDimensions::WIDTH,
1666b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						TestDimensions::HEIGHT,
1667b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						getColorReferenceLinear(),
1668b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::MIRRORED_REPEAT_GL,
1669b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::MIRRORED_REPEAT_GL,
1670b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1671b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1672b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						SRGBDECODE_SKIP_DECODE);
1673b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1674b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->addTexture(	TEXTURETYPE_2D,
1675b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						TestDimensions::WIDTH,
1676b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						TestDimensions::HEIGHT,
1677b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						getColorReferenceLinear(),
1678b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::MIRRORED_REPEAT_GL,
1679b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::MIRRORED_REPEAT_GL,
1680b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1681b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1682b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						SRGBDECODE_DECODE_DEFAULT);
1683b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1684b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->addShaderProgram(shaderParameters);
1685b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1686b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->setSamplingLocations(TestSamplingPositions::X_POS, TestSamplingPositions::Y_POS);
1687b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1688b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->setSamplingGroup(SHADERSAMPLINGGROUP_TEXTURE);
1689b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1690b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1691b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleybool GPUConversionDecodeEnabledCase::verifyResult (void)
1692b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1693b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::TestLog&			log				= m_context.getTestContext().getLog();
1694b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const int				resultColorIdx	= 0;
1695b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::vector<tcu::Vec4>	pixelResultList;
1696b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1697b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->readResultTextures();
1698b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->storeResultPixels(pixelResultList);
1699b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->logColor(std::string("Expected color: "), resultColorIdx, getColorGreenPass());
1700b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1701b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// result color returned from GPU is either green (pass) or fail (red)
1702b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	if ( tcu::boolAll(tcu::equal(pixelResultList[resultColorIdx], getColorGreenPass())) )
1703b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1704b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		log << tcu::TestLog::Message << std::string("returned pass color from GPU") << tcu::TestLog::EndMessage;
1705b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		return true;
1706b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1707b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	else
1708b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1709b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		log << tcu::TestLog::Message << std::string("returned fail color from GPU") << tcu::TestLog::EndMessage;
1710b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		return false;
1711b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1712b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1713b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1714b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyclass DecodeToggledCase : public SRGBTestCase
1715b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1716b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleypublic:
1717b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			DecodeToggledCase	(Context& context, const char* name, const char* description, const tcu::TextureFormat internalFormat)
1718b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				: SRGBTestCase	(context, name, description, internalFormat) {}
1719b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1720b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			~DecodeToggledCase	(void) {}
1721b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1722b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void	render				(void);
1723b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void	setupTest			(void);
1724b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	bool	verifyResult		(void);
1725b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
1726b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1727b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid DecodeToggledCase::render (void)
1728b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1729b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// override the base SRGBTestCase render function with the purpose of switching between shader programs,
1730b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// toggling texture sRGB decode state between draw calls
1731b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
1732b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1733b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindFramebuffer(GL_FRAMEBUFFER, **m_framebuffer);
1734b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindVertexArray(m_vaoID);
1735b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1736b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (std::size_t programIdx = 0; programIdx < m_shaderProgramList.size(); programIdx++)
1737b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1738b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		gl.useProgram(m_shaderProgramList[programIdx]->getHandle());
1739b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1740b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		this->toggleDecode(m_shaderProgramList[programIdx]->getUniformDataList());
1741b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1742b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		for (int textureSourceIdx = 0; textureSourceIdx < (int)m_textureSourceList.size(); textureSourceIdx++)
1743b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
1744b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			gl.activeTexture(GL_TEXTURE0 + (glw::GLenum)textureSourceIdx);
1745b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			gl.bindTexture(m_textureSourceList[textureSourceIdx]->getGLTargetType(), m_textureSourceList[textureSourceIdx]->getHandle());
1746102cfe8b1147c7bada5ed5bcb0430743fc1a1a63Alexander Galazin			glw::GLuint samplerUniformLocationID = gl.getUniformLocation(m_shaderProgramList[programIdx]->getHandle(), (std::string("uTexture") + de::toString(textureSourceIdx)).c_str());
1747b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			TCU_CHECK(samplerUniformLocationID != (glw::GLuint) - 1);
1748b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			gl.uniform1i(samplerUniformLocationID, (glw::GLenum)textureSourceIdx);
1749b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
1750b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1751b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		for (int samplerIdx = 0; samplerIdx < (int)m_samplerList.size(); samplerIdx++)
1752b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
1753ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams			if (m_samplerList[samplerIdx]->getIsActive() == true)
1754b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			{
1755ac1e4ff92f8293af704ac32076eb1f4fc1d71810Mark Adams				m_samplerList[samplerIdx]->bindToTexture();
1756b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			}
1757b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
1758b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1759b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		if (m_shaderProgramList[programIdx]->getBlendRequired() == true)
1760b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
1761b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			gl.enable(GL_BLEND);
1762b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			gl.blendEquation(GL_MAX);
1763b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			gl.blendFunc(GL_ONE, GL_ONE);
1764b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
1765b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		else
1766b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		{
1767b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			gl.disable(GL_BLEND);
1768b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		}
1769b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1770b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		gl.drawArrays(GL_TRIANGLES, 0, 6);
1771b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1772b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		// reset sRGB decode state on textures
1773b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		this->toggleDecode(m_shaderProgramList[programIdx]->getUniformDataList());
1774b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1775b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1776b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (std::size_t textureSourceIdx = 0; textureSourceIdx < m_textureSourceList.size(); textureSourceIdx++)
1777b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1778b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		gl.bindTexture(m_textureSourceList[textureSourceIdx]->getGLTargetType(), 0);
1779b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1780b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindFramebuffer(GL_FRAMEBUFFER, 0);
1781b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindVertexArray(0);
1782b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	gl.bindBuffer(GL_ARRAY_BUFFER, 0);
1783b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1784b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1785b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid DecodeToggledCase::setupTest (void)
1786b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1787b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// TEST STEPS:
1788b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- create and set texture_a to DECODE_SKIP_EXT and texture_b to DECODE_EXT
1789b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- create and use two seperate shader programs, program_a and program_b, each using different fragment shaders
1790b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- store texture_a and texture_b on GPU
1791b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// FIRST PASS:
1792b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- use program_a
1793b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- in fragment shader, sample both textures using texture*() and manually perform sRGB to lRGB conversion on texture_a
1794b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- in fragment shader, test converted texture_a value with texture_b
1795b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- render green image for pass or red for fail
1796b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- store result in a color attachement 0
1797b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// TOGGLE STAGE
1798b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- during rendering, toggle texture_a from DECODE_SKIP_EXT to DECODE_EXT
1799b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// SECOND PASS:
1800b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- use program_b
1801b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- in fragment shader, sample both textures using texture*() and manually perform equality check. Both should be linear
1802b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- blend first pass result with second pass. Anything but a green result equals fail
1803b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1804b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	ComparisonFunction srgbToLinearFunction("srgbToLinearCheck", FUNCTIONPARAMETERS_TWO, getFunctionDefinitionSRGBToLinearCheck());
1805b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	ComparisonFunction colorsEqualFunction("colorsEqualCheck", FUNCTIONPARAMETERS_TWO, getFunctionDefinitionEqualCheck());
1806b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1807b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	FragmentShaderParameters shaderParametersA(SHADEROUTPUTS_ONE, SHADERUNIFORMS_TWO, &srgbToLinearFunction, BLENDING_NOT_REQUIRED, TOGGLING_NOT_REQUIRED);
1808b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	FragmentShaderParameters shaderParametersB(SHADEROUTPUTS_ONE, SHADERUNIFORMS_TWO, &colorsEqualFunction, BLENDING_REQUIRED, TOGGLING_REQUIRED);
1809b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1810b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// need to specify which texture uniform to toggle DECODE_EXT/SKIP_DECODE_EXT
1811b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	shaderParametersB.uniformsToToggle.push_back("uTexture0");
1812b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1813b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->addTexture(	TEXTURETYPE_2D,
1814b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						TestDimensions::WIDTH,
1815b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						TestDimensions::HEIGHT,
1816b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						getColorReferenceLinear(),
1817b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::MIRRORED_REPEAT_GL,
1818b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::MIRRORED_REPEAT_GL,
1819b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1820b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1821b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						SRGBDECODE_SKIP_DECODE);
1822b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1823b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->addTexture(	TEXTURETYPE_2D,
1824b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						TestDimensions::WIDTH,
1825b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						TestDimensions::HEIGHT,
1826b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						getColorReferenceLinear(),
1827b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::MIRRORED_REPEAT_GL,
1828b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::MIRRORED_REPEAT_GL,
1829b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1830b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1831b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						SRGBDECODE_DECODE);
1832b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1833b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->addShaderProgram(shaderParametersA);
1834b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->addShaderProgram(shaderParametersB);
1835b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1836b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->setSamplingLocations(TestSamplingPositions::X_POS, TestSamplingPositions::Y_POS);
1837b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->setSamplingGroup(SHADERSAMPLINGGROUP_TEXTURE);
1838b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1839b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1840b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleybool DecodeToggledCase::verifyResult (void)
1841b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1842b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::TestLog&			log				= m_context.getTestContext().getLog();
1843b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const int				resultColorIdx	= 0;
1844b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::vector<tcu::Vec4>	pixelResultList;
1845b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1846b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->readResultTextures();
1847b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->storeResultPixels(pixelResultList);
1848b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->logColor(std::string("Expected color: "), resultColorIdx, getColorGreenPass());
1849b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1850b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	result color is either green (pass) or fail (red)
1851b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	if ( tcu::boolAll(tcu::equal(pixelResultList[resultColorIdx], getColorGreenPass())) )
1852b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1853b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		log << tcu::TestLog::Message << std::string("returned pass color from GPU") << tcu::TestLog::EndMessage;
1854b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		return true;
1855b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1856b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	else
1857b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1858b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		log << tcu::TestLog::Message << std::string("returned fail color from GPU") << tcu::TestLog::EndMessage;
1859b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		return false;
1860b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1861b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1862b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1863b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyclass DecodeMultipleTexturesCase : public SRGBTestCase
1864b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1865b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleypublic:
1866b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			DecodeMultipleTexturesCase	(Context& context, const char* name, const char* description, const tcu::TextureFormat internalFormat)
1867b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				: SRGBTestCase			(context, name, description, internalFormat) {}
1868b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1869b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			~DecodeMultipleTexturesCase	(void) {}
1870b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1871b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void	setupTest					(void);
1872b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	bool	verifyResult				(void);
1873b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
1874b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1875b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid DecodeMultipleTexturesCase::setupTest (void)
1876b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1877b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// TEST STEPS:
1878b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- create and set texture_a to DECODE_SKIP_EXT and texture_b to DECODE_EXT
1879b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- upload textures to the GPU and bind to seperate uniform variables
1880b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- sample both textures using texture*()
1881b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- read texel values back to the CPU
1882b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- compare the texel values, both should be different from each other
1883b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1884b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	FragmentShaderParameters shaderParameters(SHADEROUTPUTS_TWO, SHADERUNIFORMS_TWO, NULL,  BLENDING_NOT_REQUIRED, TOGGLING_NOT_REQUIRED);
1885b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1886b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->addTexture(	TEXTURETYPE_2D,
1887b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						TestDimensions::WIDTH,
1888b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						TestDimensions::HEIGHT,
1889b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						getColorReferenceLinear(),
1890b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::MIRRORED_REPEAT_GL,
1891b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::MIRRORED_REPEAT_GL,
1892b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1893b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1894b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						SRGBDECODE_SKIP_DECODE);
1895b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1896b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->addTexture(	TEXTURETYPE_2D,
1897b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						TestDimensions::WIDTH,
1898b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						TestDimensions::HEIGHT,
1899b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						getColorReferenceLinear(),
1900b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::MIRRORED_REPEAT_GL,
1901b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::MIRRORED_REPEAT_GL,
1902b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1903b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1904b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						SRGBDECODE_DECODE);
1905b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1906b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->addShaderProgram(shaderParameters);
1907b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1908b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->setSamplingLocations(TestSamplingPositions::X_POS, TestSamplingPositions::Y_POS);
1909b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->setSamplingGroup(SHADERSAMPLINGGROUP_TEXTURE);
1910b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1911b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1912b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleybool DecodeMultipleTexturesCase::verifyResult (void)
1913b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1914b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::TestLog&			log				= m_context.getTestContext().getLog();
1915b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const int				resultColorIdx	= 0;
1916b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::vector<tcu::Vec4>	pixelResultList;
1917b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Vec4				pixelExpected0;
1918b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Vec4				pixelExpected1;
1919b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1920b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->readResultTextures();
1921b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->storeResultPixels(pixelResultList);
1922b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1923b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	pixelExpected0 = this->formatReferenceColor(getColorReferenceSRGB());
1924b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	pixelExpected1 = this->formatReferenceColor(getColorReferenceLinear());
1925b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1926b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->logColor(std::string("Expected color: "), resultColorIdx, pixelExpected0);
1927b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->logColor(std::string("Expected color: "), resultColorIdx +1, pixelExpected1);
1928b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1929b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	check if the two textures have different values i.e. uTexture0 = sRGB and uTexture1 = linear
1930b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	if ( !(tcu::boolAll(tcu::equal(pixelResultList[resultColorIdx], pixelResultList[resultColorIdx +1]))) )
1931b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1932b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		log << tcu::TestLog::Message << std::string("texel values are different") << tcu::TestLog::EndMessage;
1933b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		return true;
1934b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1935b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	else
1936b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
1937b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		log << tcu::TestLog::Message << std::string("texel values are equal") << tcu::TestLog::EndMessage;
1938b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		return false;
1939b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
1940b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1941b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1942b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyclass DecodeSamplerCase : public SRGBTestCase
1943b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1944b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleypublic:
1945b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			DecodeSamplerCase	(Context& context, const char* name, const char* description, const tcu::TextureFormat internalFormat)
1946b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley				: SRGBTestCase	(context, name, description, internalFormat) {}
1947b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1948b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley			~DecodeSamplerCase	(void) {}
1949b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1950b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	void	setupTest			(void);
1951b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	bool	verifyResult		(void);
1952b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley};
1953b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1954b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid DecodeSamplerCase::setupTest (void)
1955b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1956b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// TEST STEPS:
1957b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- create and set texture_a to DECODE_SKIP_EXT
1958b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- upload texture to the GPU and bind to sampler
1959b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- sample texture using texture*()
1960b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- read texel values back to the CPU
1961b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	- compare the texel values, should be in sampler format (linear)
1962b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1963b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	FragmentShaderParameters shaderParameters(SHADEROUTPUTS_ONE, SHADERUNIFORMS_ONE, NULL, BLENDING_NOT_REQUIRED, TOGGLING_NOT_REQUIRED);
1964b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1965b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->addTexture(	TEXTURETYPE_2D,
1966b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						TestDimensions::WIDTH,
1967b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						TestDimensions::HEIGHT,
1968b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						getColorReferenceLinear(),
1969b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::MIRRORED_REPEAT_GL,
1970b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::MIRRORED_REPEAT_GL,
1971b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1972b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1973b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						SRGBDECODE_SKIP_DECODE);
1974b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1975b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->addSampler(	tcu::Sampler::MIRRORED_REPEAT_GL,
1976b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::MIRRORED_REPEAT_GL,
1977b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1978b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						tcu::Sampler::LINEAR,
1979b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley						SRGBDECODE_DECODE);
1980b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1981b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->addShaderProgram(shaderParameters);
1982b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1983b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->bindSamplerToTexture(0, 0, GL_TEXTURE0);
1984b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->activateSampler(0, true);
1985b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1986b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->setSamplingLocations(TestSamplingPositions::X_POS, TestSamplingPositions::Y_POS);
1987b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->setSamplingGroup(SHADERSAMPLINGGROUP_TEXTURE);
1988b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
1989b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1990b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleybool DecodeSamplerCase::verifyResult (void)
1991b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
1992b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::TestLog&			log				= m_context.getTestContext().getLog();
1993b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const int				resultColorIdx	= 0;
1994b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	std::vector<tcu::Vec4>	pixelResultList;
1995b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Vec4				pixelConverted;
1996b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Vec4				pixelReference;
1997b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	tcu::Vec4				pixelExpected;
1998b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
1999b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->readResultTextures();
2000b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->storeResultPixels(pixelResultList);
2001b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
2002b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	pixelConverted = tcu::linearToSRGB(pixelResultList[resultColorIdx]);
2003b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	pixelReference = this->formatReferenceColor(getColorReferenceSRGB());
2004b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	pixelExpected = this->formatReferenceColor(getColorReferenceLinear());
2005b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
2006b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	this->logColor(std::string("Expected color: "), resultColorIdx, pixelExpected);
2007b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
2008b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	//	texture was rendered using a sampler object with setting DECODE_EXT, therefore, results should be linear
2009b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	if ( (tcu::boolAll(tcu::lessThan(tcu::abs(pixelConverted - pixelReference), m_epsilonError))) || (tcu::boolAll(tcu::equal(pixelConverted, pixelReference))) )
2010b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
2011b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		log << tcu::TestLog::Message << std::string("linear as expected") << tcu::TestLog::EndMessage;
2012b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		return true;
2013b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
2014b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	else
2015b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
2016b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		log << tcu::TestLog::Message << std::string("not linear as expected") << tcu::TestLog::EndMessage;
2017b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		return false;
2018b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
2019b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
2020b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
2021b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley} // anonymous
2022b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
2023b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael HadleySRGBDecodeTests::SRGBDecodeTests	(Context& context)
2024b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	: TestCaseGroup					(context, "skip_decode", "sRGB skip decode tests")
2025b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
2026b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
2027b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
2028b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael HadleySRGBDecodeTests::~SRGBDecodeTests (void)
2029b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
2030b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
2031b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
2032b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadleyvoid SRGBDecodeTests::init (void)
2033b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley{
2034b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	const TestGroupConfig testGroupConfigList[] =
2035b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
2036b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		TestGroupConfig("srgba8",	"srgb decode tests using srgba internal format",	tcu::TextureFormat(tcu::TextureFormat::sRGBA, tcu::TextureFormat::UNORM_INT8)),
2037b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		TestGroupConfig("sr8",		"srgb decode tests using sr8 internal format",		tcu::TextureFormat(tcu::TextureFormat::sR, tcu::TextureFormat::UNORM_INT8))
2038b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	};
2039b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
2040b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	// create groups for all desired internal formats, adding test cases to each
2041b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	for (std::size_t idx = 0; idx < DE_LENGTH_OF_ARRAY(testGroupConfigList); idx++)
2042b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	{
2043b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		tcu::TestCaseGroup* const testGroup = new tcu::TestCaseGroup(m_testCtx, testGroupConfigList[idx].name, testGroupConfigList[idx].description);
2044b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		tcu::TestNode::addChild(testGroup);
2045b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
2046b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		testGroup->addChild(new TextureDecodeSkippedCase		(m_context, "skipped",			"testing for sRGB color values with sRGB texture decoding skipped",		testGroupConfigList[idx].internalFormat));
2047b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		testGroup->addChild(new TextureDecodeEnabledCase		(m_context, "enabled",			"testing for linear color values with sRGB texture decoding enabled",	testGroupConfigList[idx].internalFormat));
2048b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		testGroup->addChild(new TexelFetchDecodeSkippedcase		(m_context, "texel_fetch",		"testing for linear color values with sRGB texture decoding skipped",	testGroupConfigList[idx].internalFormat));
2049b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		testGroup->addChild(new GPUConversionDecodeEnabledCase	(m_context, "conversion_gpu",	"sampling linear values and performing conversion on the gpu",			testGroupConfigList[idx].internalFormat));
2050b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		testGroup->addChild(new DecodeToggledCase				(m_context, "toggled",			"toggle the sRGB decoding between draw calls",							testGroupConfigList[idx].internalFormat));
2051b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		testGroup->addChild(new DecodeMultipleTexturesCase		(m_context, "multiple_textures","upload multiple textures with different sRGB decode values and sample",testGroupConfigList[idx].internalFormat));
2052b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley		testGroup->addChild(new DecodeSamplerCase				(m_context, "using_sampler",	"testing that sampler object takes priority over texture state",		testGroupConfigList[idx].internalFormat));
2053b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley	}
2054b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley}
2055b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley
2056b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley} // Functional
2057b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley} // gles31
2058b4d41f1ef041179f927a6a04a8fd5913cdf590bbMichael Hadley} // deqp
2059