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