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