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