blob: 64cada9b7792f41057d8d9542c439e339bdcd762 [file] [log] [blame]
#ifndef _GL4CSPARSETEXTURE2TESTS_HPP
#define _GL4CSPARSETEXTURE2TESTS_HPP
/*-------------------------------------------------------------------------
* OpenGL Conformance Test Suite
* -----------------------------
*
* Copyright (c) 2016 The Khronos Group Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/ /*!
* \file
* \brief
*/ /*-------------------------------------------------------------------*/
/**
*/ /*!
* \file gl4cSparseTexture2Tests.hpp
* \brief Conformance tests for the GL_ARB_sparse_texture2 functionality.
*/ /*-------------------------------------------------------------------*/
#include "glcTestCase.hpp"
#include "glwDefs.hpp"
#include "glwEnums.hpp"
#include "tcuDefs.hpp"
#include <map>
#include <set>
#include <vector>
#include "gl4cSparseTextureTests.hpp"
#include "gluDrawUtil.hpp"
#include "gluShaderProgram.hpp"
#include "gluTextureUtil.hpp"
#include "tcuTextureUtil.hpp"
using namespace glw;
using namespace glu;
namespace gl4cts
{
struct PageSizeStruct
{
GLint xSize;
GLint ySize;
GLint zSize;
PageSizeStruct() : xSize(0), ySize(0), zSize(0)
{
}
PageSizeStruct(GLint x, GLint y, GLint z) : xSize(x), ySize(y), zSize(z)
{
}
};
typedef std::pair<GLint, PageSizeStruct> PageSizePair;
/** Test verifies if extension is available for GLSL
**/
class ShaderExtensionTestCase : public deqp::TestCase
{
public:
/* Public methods */
ShaderExtensionTestCase(deqp::Context& context, const std::string extension);
tcu::TestNode::IterateResult iterate();
private:
/* Private members */
std::string mExtension;
};
/** Test verifies if values returned by GetInternalFormat* query matches Standard Virtual Page Sizes for <pname>:
* - VIRTUAL_PAGE_SIZE_X_ARB,
* - VIRTUAL_PAGE_SIZE_Y_ARB,
* - VIRTUAL_PAGE_SIZE_Z_ARB.
**/
class StandardPageSizesTestCase : public deqp::TestCase
{
public:
/* Public methods */
StandardPageSizesTestCase(deqp::Context& context);
void init();
tcu::TestNode::IterateResult iterate();
private:
/* Private methods */
std::vector<GLint> mSupportedTargets;
std::map<GLint, PageSizeStruct> mStandardVirtualPageSizesTable;
/* Private members */
};
/** Test verifies glTexStorage* functionality added by ARB_sparse_texture2 extension
**/
class SparseTexture2AllocationTestCase : public SparseTextureAllocationTestCase
{
public:
/* Public methods */
SparseTexture2AllocationTestCase(deqp::Context& context);
virtual void init();
virtual tcu::TestNode::IterateResult iterate();
private:
/* Private methods */
};
/** Test verifies glTexPageCommitmentARB functionality added by ARB_sparse_texture2 extension
**/
class SparseTexture2CommitmentTestCase : public SparseTextureCommitmentTestCase
{
public:
/* Public methods */
SparseTexture2CommitmentTestCase(deqp::Context& context);
SparseTexture2CommitmentTestCase(deqp::Context& context, const char* name, const char* description);
virtual void init();
virtual tcu::TestNode::IterateResult iterate();
protected:
/* Protected members */
struct TokenStrings
{
std::string format;
std::string pointType;
std::string pointDef;
std::string outputType;
std::string inputType;
std::string returnType;
std::string resultExpected;
std::string resultDefault;
std::string epsilon;
std::string sampleDef;
};
/* Protected methods */
TokenStrings createShaderTokens(GLint target, GLint format, GLint sample, const std::string outputBase = "image",
const std::string inputBase = "image");
virtual bool caseAllowed(GLint target, GLint format);
virtual bool sparseAllocateTexture(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint levels);
virtual bool allocateTexture(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint levels);
virtual bool writeDataToTexture(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level);
virtual bool verifyTextureData(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level);
};
/** Test verifies if access to uncommitted regions of sparse texture works as expected
**/
class UncommittedRegionsAccessTestCase : public SparseTexture2CommitmentTestCase
{
public:
/* Public methods */
UncommittedRegionsAccessTestCase(deqp::Context& context);
virtual void init();
virtual tcu::TestNode::IterateResult iterate();
private:
/* Private members */
GLuint mFramebuffer;
GLuint mRenderbuffer;
/* Private methods */
bool readsAllowed(GLint target, GLint format, bool shaderOnly = false);
bool atomicAllowed(GLint target, GLint format);
bool depthStencilAllowed(GLint target, GLint format);
bool UncommittedReads(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level);
bool UncommittedAtomicOperations(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level);
bool UncommittedDepthStencil(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level);
void prepareDepthStencilFramebuffer(const Functions& gl, GLint width, GLint height);
void cleanupDepthStencilFramebuffer(const Functions& gl);
bool verifyTextureDataExtended(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level,
bool shaderOnly = false);
bool verifyAtomicOperations(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level);
bool verifyStencilTest(const Functions& gl, ShaderProgram& program, GLint width, GLint height,
GLint widthCommitted);
bool verifyDepthTest(const Functions& gl, ShaderProgram& program, GLint width, GLint height, GLint widthCommitted);
bool verifyDepthBoundsTest(const Functions& gl, ShaderProgram& program, GLint width, GLint height,
GLint widthCommitted);
};
/** Test verifies if sparse texture lookup functions for GLSL works as expected
**/
class SparseTexture2LookupTestCase : public SparseTexture2CommitmentTestCase
{
public:
/* Public methods */
SparseTexture2LookupTestCase(deqp::Context& context);
SparseTexture2LookupTestCase(deqp::Context& context, const char* name, const char* description);
void init();
tcu::TestNode::IterateResult iterate();
protected:
/* Protected types */
struct FunctionToken
{
std::string name;
std::string arguments;
std::set<GLint> allowedTargets;
FunctionToken()
{
}
FunctionToken(std::string fname, std::string fargs) : name(fname), arguments(fargs)
{
}
};
struct TokenStringsExt : public TokenStrings
{
std::string formatDef;
std::string sizeDef;
std::string lod;
std::string lodDef;
std::string coordType;
std::string iCoordType;
std::string coordDef;
std::string cubeMapCoordDef;
std::string refZDef;
std::string cubeMapArrayRefZDef;
std::string offsetDim;
std::string offsetType;
std::string nOffsetType;
std::string componentDef;
std::string offsetArrayDef;
std::string pointCoord;
};
/* Protected members */
std::vector<FunctionToken> mFunctions;
/* Protected methods */
TokenStringsExt createLookupShaderTokens(GLint target, GLint format, GLint level, GLint sample,
FunctionToken& funcToken);
virtual bool caseAllowed(GLint target, GLint format);
virtual bool funcAllowed(GLint target, GLint format, FunctionToken& funcToken);
virtual bool writeDataToTexture(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level);
virtual void setupDepthMode(const Functions& gl, GLint target, GLuint& texture);
virtual bool verifyLookupTextureData(const Functions& gl, GLint target, GLint format, GLuint& texture, GLint level,
FunctionToken& funcToken);
};
/** Test group which encapsulates all sparse texture conformance tests */
class SparseTexture2Tests : public deqp::TestCaseGroup
{
public:
/* Public methods */
SparseTexture2Tests(deqp::Context& context);
void init();
private:
SparseTexture2Tests(const SparseTexture2Tests& other);
SparseTexture2Tests& operator=(const SparseTexture2Tests& other);
};
void replaceToken(const GLchar* token, const GLchar* text, std::string& string);
} /* glcts namespace */
#endif // _GL4CSPARSETEXTURE2TESTS_HPP