Home | History | Annotate | Download | only in gl
      1 #ifndef _GL4CSPARSETEXTURE2TESTS_HPP
      2 #define _GL4CSPARSETEXTURE2TESTS_HPP
      3 /*-------------------------------------------------------------------------
      4  * OpenGL Conformance Test Suite
      5  * -----------------------------
      6  *
      7  * Copyright (c) 2016 The Khronos Group Inc.
      8  *
      9  * Licensed under the Apache License, Version 2.0 (the "License");
     10  * you may not use this file except in compliance with the License.
     11  * You may obtain a copy of the License at
     12  *
     13  *      http://www.apache.org/licenses/LICENSE-2.0
     14  *
     15  * Unless required by applicable law or agreed to in writing, software
     16  * distributed under the License is distributed on an "AS IS" BASIS,
     17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     18  * See the License for the specific language governing permissions and
     19  * limitations under the License.
     20  *
     21  */ /*!
     22  * \file
     23  * \brief
     24  */ /*-------------------------------------------------------------------*/
     25 
     26 /**
     27  */ /*!
     28  * \file  gl4cSparseTexture2Tests.hpp
     29  * \brief Conformance tests for the GL_ARB_sparse_texture2 functionality.
     30  */ /*-------------------------------------------------------------------*/
     31 
     32 #include "glcTestCase.hpp"
     33 #include "glwDefs.hpp"
     34 #include "glwEnums.hpp"
     35 #include "tcuDefs.hpp"
     36 #include <map>
     37 #include <set>
     38 #include <vector>
     39 
     40 #include "gl4cSparseTextureTests.hpp"
     41 #include "gluDrawUtil.hpp"
     42 #include "gluShaderProgram.hpp"
     43 #include "gluTextureUtil.hpp"
     44 #include "tcuTextureUtil.hpp"
     45 
     46 using namespace glw;
     47 using namespace glu;
     48 
     49 namespace gl4cts
     50 {
     51 
     52 struct PageSizeStruct
     53 {
     54 	GLint xSize;
     55 	GLint ySize;
     56 	GLint zSize;
     57 
     58 	PageSizeStruct() : xSize(0), ySize(0), zSize(0)
     59 	{
     60 	}
     61 	PageSizeStruct(GLint x, GLint y, GLint z) : xSize(x), ySize(y), zSize(z)
     62 	{
     63 	}
     64 };
     65 
     66 typedef std::pair<GLint, PageSizeStruct> PageSizePair;
     67 
     68 /** Test verifies if extension is available for GLSL
     69  **/
     70 class ShaderExtensionTestCase : public deqp::TestCase
     71 {
     72 public:
     73 	/* Public methods */
     74 	ShaderExtensionTestCase(deqp::Context& context, const std::string extension);
     75 
     76 	tcu::TestNode::IterateResult iterate();
     77 
     78 private:
     79 	/* Private members */
     80 	std::string mExtension;
     81 };
     82 
     83 /** Test verifies if values returned by GetInternalFormat* query matches Standard Virtual Page Sizes for <pname>:
     84  *   - VIRTUAL_PAGE_SIZE_X_ARB,
     85  *   - VIRTUAL_PAGE_SIZE_Y_ARB,
     86  *   - VIRTUAL_PAGE_SIZE_Z_ARB.
     87  **/
     88 class StandardPageSizesTestCase : public deqp::TestCase
     89 {
     90 public:
     91 	/* Public methods */
     92 	StandardPageSizesTestCase(deqp::Context& context);
     93 
     94 	void						 init();
     95 	tcu::TestNode::IterateResult iterate();
     96 
     97 private:
     98 	/* Private methods */
     99 	std::vector<GLint> mSupportedTargets;
    100 	std::map<GLint, PageSizeStruct> mStandardVirtualPageSizesTable;
    101 
    102 	/* Private members */
    103 };
    104 
    105 /** Test verifies glTexStorage* functionality added by ARB_sparse_texture2 extension
    106  **/
    107 class SparseTexture2AllocationTestCase : public SparseTextureAllocationTestCase
    108 {
    109 public:
    110 	/* Public methods */
    111 	SparseTexture2AllocationTestCase(deqp::Context& context);
    112 
    113 	virtual void						 init();
    114 	virtual tcu::TestNode::IterateResult iterate();
    115 
    116 private:
    117 	/* Private methods */
    118 };
    119 
    120 /** Test verifies glTexPageCommitmentARB functionality added by ARB_sparse_texture2 extension
    121  **/
    122 class SparseTexture2CommitmentTestCase : public SparseTextureCommitmentTestCase
    123 {
    124 public:
    125 	/* Public methods */
    126 	SparseTexture2CommitmentTestCase(deqp::Context& context);
    127 
    128 	SparseTexture2CommitmentTestCase(deqp::Context& context, const char* name, const char* description);
    129 
    130 	virtual void						 init();
    131 	virtual tcu::TestNode::IterateResult iterate();
    132 
    133 protected:
    134 	/* Protected members */
    135 	struct TokenStrings
    136 	{
    137 		std::string format;
    138 		std::string pointType;
    139 		std::string pointDef;
    140 		std::string outputType;
    141 		std::string inputType;
    142 		std::string returnType;
    143 		std::string resultExpected;
    144 		std::string resultDefault;
    145 		std::string epsilon;
    146 		std::string sampleDef;
    147 	};
    148 
    149 	/* Protected methods */
    150 	TokenStrings createShaderTokens(GLint target, GLint format, GLint sample, const std::string outputBase = "image",
    151 									const std::string inputBase = "image");
    152 
    153 	virtual bool caseAllowed(GLint target, GLint format);
    154 
    155 	virtual bool sparseAllocateTexture(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint levels);
    156 	virtual bool allocateTexture(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint levels);
    157 	virtual bool writeDataToTexture(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level);
    158 	virtual bool verifyTextureData(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level);
    159 };
    160 
    161 /** Test verifies if access to uncommitted regions of sparse texture works as expected
    162  **/
    163 class UncommittedRegionsAccessTestCase : public SparseTexture2CommitmentTestCase
    164 {
    165 public:
    166 	/* Public methods */
    167 	UncommittedRegionsAccessTestCase(deqp::Context& context);
    168 
    169 	virtual void						 init();
    170 	virtual tcu::TestNode::IterateResult iterate();
    171 
    172 private:
    173 	/* Private members */
    174 	GLuint mFramebuffer;
    175 	GLuint mRenderbuffer;
    176 
    177 	/* Private methods */
    178 	bool readsAllowed(GLint target, GLint format, bool shaderOnly = false);
    179 	bool atomicAllowed(GLint target, GLint format);
    180 	bool depthStencilAllowed(GLint target, GLint format);
    181 
    182 	bool UncommittedReads(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level);
    183 	bool UncommittedAtomicOperations(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level);
    184 	bool UncommittedDepthStencil(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level);
    185 
    186 	void prepareDepthStencilFramebuffer(const Functions& gl, GLint width, GLint height);
    187 	void cleanupDepthStencilFramebuffer(const Functions& gl);
    188 	bool verifyTextureDataExtended(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level,
    189 								   bool shaderOnly = false);
    190 	bool verifyAtomicOperations(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level);
    191 	bool verifyStencilTest(const Functions& gl, ShaderProgram& program, GLint width, GLint height,
    192 						   GLint widthCommitted);
    193 	bool verifyDepthTest(const Functions& gl, ShaderProgram& program, GLint width, GLint height, GLint widthCommitted);
    194 	bool verifyDepthBoundsTest(const Functions& gl, ShaderProgram& program, GLint width, GLint height,
    195 							   GLint widthCommitted);
    196 };
    197 
    198 /** Test verifies if sparse texture lookup functions for GLSL works as expected
    199  **/
    200 class SparseTexture2LookupTestCase : public SparseTexture2CommitmentTestCase
    201 {
    202 public:
    203 	/* Public methods */
    204 	SparseTexture2LookupTestCase(deqp::Context& context);
    205 
    206 	SparseTexture2LookupTestCase(deqp::Context& context, const char* name, const char* description);
    207 
    208 	void						 init();
    209 	tcu::TestNode::IterateResult iterate();
    210 
    211 protected:
    212 	/* Protected types */
    213 	struct FunctionToken
    214 	{
    215 		std::string name;
    216 		std::string arguments;
    217 
    218 		std::set<GLint> allowedTargets;
    219 
    220 		FunctionToken()
    221 		{
    222 		}
    223 
    224 		FunctionToken(std::string fname, std::string fargs) : name(fname), arguments(fargs)
    225 		{
    226 		}
    227 	};
    228 
    229 	struct TokenStringsExt : public TokenStrings
    230 	{
    231 		std::string formatDef;
    232 		std::string sizeDef;
    233 		std::string lod;
    234 		std::string lodDef;
    235 		std::string coordType;
    236 		std::string iCoordType;
    237 		std::string coordDef;
    238 		std::string cubeMapCoordDef;
    239 		std::string refZDef;
    240 		std::string cubeMapArrayRefZDef;
    241 		std::string offsetDim;
    242 		std::string offsetType;
    243 		std::string nOffsetType;
    244 		std::string componentDef;
    245 		std::string offsetArrayDef;
    246 		std::string pointCoord;
    247 	};
    248 
    249 	/* Protected members */
    250 	std::vector<FunctionToken> mFunctions;
    251 
    252 	/* Protected methods */
    253 	TokenStringsExt createLookupShaderTokens(GLint target, GLint format, GLint level, GLint sample,
    254 											 FunctionToken& funcToken);
    255 
    256 	virtual bool caseAllowed(GLint target, GLint format);
    257 	virtual bool funcAllowed(GLint target, GLint format, FunctionToken& funcToken);
    258 
    259 	virtual bool writeDataToTexture(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level);
    260 
    261 	virtual void setupDepthMode(const Functions& gl, GLint target, GLuint& texture);
    262 	virtual bool verifyLookupTextureData(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level,
    263 										 FunctionToken& funcToken);
    264 };
    265 
    266 /** Test group which encapsulates all sparse texture conformance tests */
    267 class SparseTexture2Tests : public deqp::TestCaseGroup
    268 {
    269 public:
    270 	/* Public methods */
    271 	SparseTexture2Tests(deqp::Context& context);
    272 
    273 	void init();
    274 
    275 private:
    276 	SparseTexture2Tests(const SparseTexture2Tests& other);
    277 	SparseTexture2Tests& operator=(const SparseTexture2Tests& other);
    278 };
    279 
    280 void replaceToken(const GLchar* token, const GLchar* text, std::string& string);
    281 
    282 } /* glcts namespace */
    283 
    284 #endif // _GL4CSPARSETEXTURE2TESTS_HPP
    285