blob: 90bb6b078252ec36b98e971ef88fbb7d851fb19c [file] [log] [blame]
#ifndef _ES31CARRAYOFARRAYSTESTS_HPP
#define _ES31CARRAYOFARRAYSTESTS_HPP
/*-------------------------------------------------------------------------
* OpenGL Conformance Test Suite
* -----------------------------
*
* Copyright (c) 2014-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
*/ /*-------------------------------------------------------------------*/
#include <map>
#include "glcTestCase.hpp"
#include "glwDefs.hpp"
#include "glwEnums.hpp"
#include "tcuDefs.hpp"
#include "tes31TestCase.hpp"
namespace glcts
{
typedef enum {
VAR_TYPE_BOOL,
VAR_TYPE_INT,
VAR_TYPE_UINT,
VAR_TYPE_FLOAT,
VAR_TYPE_VEC2,
VAR_TYPE_VEC3,
VAR_TYPE_VEC4,
VAR_TYPE_BVEC2,
VAR_TYPE_BVEC3,
VAR_TYPE_BVEC4,
VAR_TYPE_IVEC2,
VAR_TYPE_IVEC3,
VAR_TYPE_IVEC4,
VAR_TYPE_UVEC2,
VAR_TYPE_UVEC3,
VAR_TYPE_UVEC4,
VAR_TYPE_MAT2,
VAR_TYPE_MAT3,
VAR_TYPE_MAT4,
VAR_TYPE_MAT2X2,
VAR_TYPE_MAT2X3,
VAR_TYPE_MAT2X4,
VAR_TYPE_MAT3X2,
VAR_TYPE_MAT3X3,
VAR_TYPE_MAT3X4,
VAR_TYPE_MAT4X2,
VAR_TYPE_MAT4X3,
VAR_TYPE_MAT4X4,
/** List of all supported interface resource types. */
VAR_TYPE_IMAGEBUFFER,
VAR_TYPE_IIMAGEBUFFER,
VAR_TYPE_UIMAGEBUFFER,
VAR_TYPE_SAMPLERBUFFER,
VAR_TYPE_ISAMPLERBUFFER,
VAR_TYPE_USAMPLERBUFFER,
/** List of all supported opaque types. */
//Floating Point Sampler Types (opaque)
VAR_TYPE_SAMPLER2D,
VAR_TYPE_SAMPLER3D,
VAR_TYPE_SAMPLERCUBE,
VAR_TYPE_SAMPLERCUBESHADOW,
VAR_TYPE_SAMPLER2DSHADOW,
VAR_TYPE_SAMPLER2DARRAY,
VAR_TYPE_SAMPLER2DARRAYSHADOW,
//Signed Integer Sampler Types (opaque)
VAR_TYPE_ISAMPLER2D,
VAR_TYPE_ISAMPLER3D,
VAR_TYPE_ISAMPLERCUBE,
VAR_TYPE_ISAMPLER2DARRAY,
//Unsigned Integer Sampler Types (opaque)
VAR_TYPE_USAMPLER2D,
VAR_TYPE_USAMPLER3D,
VAR_TYPE_USAMPLERCUBE,
VAR_TYPE_USAMPLER2DARRAY,
/* Double types */
VAR_TYPE_DOUBLE,
VAR_TYPE_DMAT2,
VAR_TYPE_DMAT3,
VAR_TYPE_DMAT4,
VAR_TYPE_DMAT2X2,
VAR_TYPE_DMAT2X3,
VAR_TYPE_DMAT2X4,
VAR_TYPE_DMAT3X2,
VAR_TYPE_DMAT3X3,
VAR_TYPE_DMAT3X4,
VAR_TYPE_DMAT4X2,
VAR_TYPE_DMAT4X3,
VAR_TYPE_DMAT4X4,
} test_var_type;
struct var_descriptor
{
std::string type;
std::string precision;
std::string initializer_with_ones;
std::string initializer_with_zeroes;
std::string iterator_initialization;
std::string iterator_type;
std::string specific_element;
std::string variable_type_initializer1;
std::string variable_type_initializer2;
std::string coord_param_for_texture_function;
std::string type_of_result_of_texture_function;
};
// This iterator and map are used to simplify the lookup of type names, initialisation
// values, etc., associated with each of the types used within the array tests
typedef std::map<glcts::test_var_type, var_descriptor> _supported_variable_types_map;
typedef _supported_variable_types_map::const_iterator _supported_variable_types_map_const_iterator;
/* Groups all tests that verify "arrays of arrays" functionality */
class ArrayOfArraysTestGroup : public glcts::TestCaseGroup
{
public:
/* Public methods */
ArrayOfArraysTestGroup(Context& context);
virtual void init(void);
};
/* Groups all tests that verify "arrays of arrays" functionality */
class ArrayOfArraysTestGroupGL : public glcts::TestCaseGroup
{
public:
/* Public methods */
ArrayOfArraysTestGroupGL(Context& context);
virtual void init(void);
};
namespace ArraysOfArrays
{
namespace Interface
{
/** Represents ES 3.1 core capabilities **/
struct ES
{
enum
{
ALLOW_UNSIZED_DECLARATION = 0
};
enum
{
ALLOW_A_OF_A_ON_INTERFACE_BLOCKS = 0
};
enum
{
ALLOW_IN_OUT_INTERFACE_BLOCKS = 0
};
enum
{
USE_ALL_SHADER_STAGES = 0
};
enum
{
USE_ATOMIC = 0
};
enum
{
USE_DOUBLE = 0
};
enum
{
USE_SUBROUTINE = 0
};
enum
{
USE_STORAGE_BLOCK = 0
};
static const size_t MAX_ARRAY_DIMENSIONS;
static const test_var_type* var_types;
static const size_t n_var_types;
static const char* shader_version_gpu5;
static const char* shader_version;
static const char* test_group_name;
};
/** Represents GL 4.3 core capabilities **/
struct GL
{
enum
{
ALLOW_UNSIZED_DECLARATION = 1
};
enum
{
ALLOW_A_OF_A_ON_INTERFACE_BLOCKS = 1
};
enum
{
ALLOW_IN_OUT_INTERFACE_BLOCKS = 1
};
enum
{
USE_ALL_SHADER_STAGES = 1
};
enum
{
USE_ATOMIC = 1
};
enum
{
USE_DOUBLE = 1
};
enum
{
USE_SUBROUTINE = 1
};
enum
{
USE_STORAGE_BLOCK = 1
};
static const size_t MAX_ARRAY_DIMENSIONS;
static const test_var_type* var_types;
static const size_t n_var_types;
static const char* shader_version_gpu5;
static const char* shader_version;
};
} /* Interface */
/** Base test class for all arrays_of_arrays tests
**/
template <class API>
class TestCaseBase : public tcu::TestCase
{
public:
TestCaseBase(Context& context, const char* name, const char* description);
virtual ~TestCaseBase(void)
{
}
virtual void deinit(void);
virtual void delete_objects(void);
virtual tcu::TestNode::IterateResult iterate();
protected:
/* Protected declarations */
enum TestShaderType
{
FRAGMENT_SHADER_TYPE,
VERTEX_SHADER_TYPE,
COMPUTE_SHADER_TYPE,
GEOMETRY_SHADER_TYPE,
TESSELATION_CONTROL_SHADER_TYPE,
TESSELATION_EVALUATION_SHADER_TYPE,
/* */
SHADER_TYPE_LAST
};
/* Protected methods */
virtual std::string extend_string(std::string base_string, std::string sub_script, size_t number_of_elements);
virtual glw::GLint compile_shader_and_get_compilation_result(
const std::string& tested_snippet, typename TestCaseBase<API>::TestShaderType tested_shader_type,
bool require_gpu_shader5 = false);
virtual tcu::TestNode::IterateResult execute_negative_test(
typename TestCaseBase<API>::TestShaderType tested_shader_type, const std::string& shader_source);
virtual tcu::TestNode::IterateResult execute_positive_test(const std::string& vertex_shader_source,
const std::string& fragment_shader_source,
bool delete_generated_objects, bool require_gpu_shader5);
virtual tcu::TestNode::IterateResult execute_positive_test(const std::string& vertex_shader_source,
const std::string& tess_ctrl_shader_source,
const std::string& tess_eval_shader_source,
const std::string& geometry_shader_source,
const std::string& fragment_shader_source,
const std::string& compute_shader_source,
bool delete_generated_objects, bool require_gpu_shader5);
virtual void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type) = 0;
/* Protected fields */
Context& context_id;
glw::GLint program_object_id;
private:
/* Private fields */
glw::GLint compute_shader_object_id;
glw::GLint fragment_shader_object_id;
glw::GLint geometry_shader_object_id;
glw::GLint tess_ctrl_shader_object_id;
glw::GLint tess_eval_shader_object_id;
glw::GLint vertex_shader_object_id;
};
template <class API>
class SizedDeclarationsPrimitive : public TestCaseBase<API>
{
public:
/* Public methods */
SizedDeclarationsPrimitive(Context& context)
: TestCaseBase<API>(context, "SizedDeclarationsPrimitive",
" Verify that declarations of variables containing between 2 and 8\n"
" sized dimensions of each primitive type are permitted.\n")
{
/* Left empty on purpose */
}
virtual ~SizedDeclarationsPrimitive()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class SizedDeclarationsStructTypes1 : public TestCaseBase<API>
{
public:
/* Public methods */
SizedDeclarationsStructTypes1(Context& context)
: TestCaseBase<API>(context, "SizedDeclarationsStructTypes1",
" Declare a structure type containing both ints and floats, and verify\n"
" that variables having between 2 and 8 sized dimensions of this type\n"
" can be declared.\n")
{
/* Left empty on purpose */
}
virtual ~SizedDeclarationsStructTypes1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class SizedDeclarationsStructTypes2 : public TestCaseBase<API>
{
public:
/* Public methods */
SizedDeclarationsStructTypes2(Context& context)
: TestCaseBase<API>(context, "SizedDeclarationsStructTypes2",
" Verify that a single declaration containing multiple\n"
" variables with different numbers of array dimensions is accepted,\n"
" e.g. float [2][2] x2, x3[2], x4[2][2], etc) with each variable\n"
" having between two and eight dimensions when there are\n"
" declarations within the structure body.\n")
{
/* Left empty on purpose */
}
virtual ~SizedDeclarationsStructTypes2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class SizedDeclarationsStructTypes3 : public TestCaseBase<API>
{
public:
/* Public methods */
SizedDeclarationsStructTypes3(Context& context)
: TestCaseBase<API>(context, "SizedDeclarationsStructTypes3",
" Declare a structure type containing both ints and floats, and verify\n"
" that variables having between 2 and 8 sized dimensions of this type\n"
" can be declared, with a structure containing an array.\n")
{
/* Left empty on purpose */
}
virtual ~SizedDeclarationsStructTypes3()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class SizedDeclarationsStructTypes4 : public TestCaseBase<API>
{
public:
/* Public methods */
SizedDeclarationsStructTypes4(Context& context)
: TestCaseBase<API>(context, "SizedDeclarationsStructTypes4",
" Declare a structure type containing an array, and verify\n"
" that variables having between 2 and 8 sized dimensions of this type\n"
" can be declared when the structure definition is included in the \n"
" variable definition.\n")
{
/* Left empty on purpose */
}
virtual ~SizedDeclarationsStructTypes4()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class SizedDeclarationsTypenameStyle1 : public TestCaseBase<API>
{
public:
/* Public methods */
SizedDeclarationsTypenameStyle1(Context& context)
: TestCaseBase<API>(context, "SizedDeclarationsTypenameStyle1",
" Verify that an 8-dimensional array of floats can be declared with\n"
" any placement of the brackets (e.g. float[2]\n"
" x[2][2][2][2][2][2][2], float [2][2] x [2][2][2][2][2][2], etc) (9\n"
" cases).\n")
{
/* Left empty on purpose */
}
virtual ~SizedDeclarationsTypenameStyle1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class SizedDeclarationsTypenameStyle2 : public TestCaseBase<API>
{
public:
/* Public methods */
SizedDeclarationsTypenameStyle2(Context& context)
: TestCaseBase<API>(context, "SizedDeclarationsTypenameStyle2",
" Verify that a single declaration containing multiple\n"
" variables with different numbers of array dimensions is accepted,\n"
" e.g. float [2][2] x2, x3[2], x4[2][2], etc) with each variable\n"
" having between two and eight dimensions. Repeat these tests for\n"
" declarations within a structure body.\n")
{
/* Left empty on purpose */
}
virtual ~SizedDeclarationsTypenameStyle2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class SizedDeclarationsTypenameStyle3 : public TestCaseBase<API>
{
public:
/* Public methods */
SizedDeclarationsTypenameStyle3(Context& context)
: TestCaseBase<API>(context, "SizedDeclarationsTypenameStyle3",
" Verify that a single declaration, within a structure body,\n"
" is accepted when it contains multiple variables with different\n"
" numbers of array dimensions, \n"
" e.g. float [2][2] x2, x3[2], x4[2][2], etc), with each variable\n"
" having between two and eight dimensions.\n"
" The variables should be declared within a structure body.\n")
{
/* Left empty on purpose */
}
virtual ~SizedDeclarationsTypenameStyle3()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class SizedDeclarationsTypenameStyle4 : public TestCaseBase<API>
{
public:
/* Public methods */
SizedDeclarationsTypenameStyle4(Context& context)
: TestCaseBase<API>(context, "SizedDeclarationsTypenameStyle4",
" Verify that an 8-dimensional array of floats can be declared with\n"
" any placement of the brackets (e.g. float[2]\n"
" x[2][2][2][2][2][2][2], float [2][2] x [2][2][2][2][2][2], etc) (9\n"
" cases) within a structure body.\n")
{
/* Left empty on purpose */
}
virtual ~SizedDeclarationsTypenameStyle4()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class SizedDeclarationsTypenameStyle5 : public TestCaseBase<API>
{
public:
/* Public methods */
SizedDeclarationsTypenameStyle5(Context& context)
: TestCaseBase<API>(context, "SizedDeclarationsTypenameStyle5",
" Verify that a single declaration containing multiple\n"
" variables with different numbers of array dimensions is accepted,\n"
" within a structure body\n"
" e.g. float [2][2] x2, x3[2], x4[2][2], etc) with each variable\n"
" having between two and eight dimensions.\n")
{
/* Left empty on purpose */
}
virtual ~SizedDeclarationsTypenameStyle5()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class SizedDeclarationsFunctionParams : public TestCaseBase<API>
{
public:
/* Public methods */
SizedDeclarationsFunctionParams(Context& context)
: TestCaseBase<API>(context, "SizedDeclarationsFunctionParams",
" Declare a function having eight parameters, each a float array\n"
" with a different number of dimensions between 1 and 8, and verify\n"
" that the compiler accepts this. Declare a variable with matching\n"
" shape for each parameter, and verify that the function can be\n"
" called with these variables as arguments. Interchange each pair\n"
" of arguments and verify that the shader is correctly rejected due\n"
" to mismatched arguments (28 total cases).\n")
{
/* Left empty on purpose */
}
virtual ~SizedDeclarationsFunctionParams()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class sized_declarations_invalid_sizes1 : public TestCaseBase<API>
{
public:
/* Public methods */
sized_declarations_invalid_sizes1(Context& context)
: TestCaseBase<API>(context, "sized_declarations_invalid_sizes1",
" Correctly reject variable declarations, having 4 dimensions, for\n"
" which any combination of dimensions are declared with zero-size\n"
" (16 cases).\n")
{
/* Left empty on purpose */
}
virtual ~sized_declarations_invalid_sizes1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class sized_declarations_invalid_sizes2 : public TestCaseBase<API>
{
public:
/* Public methods */
sized_declarations_invalid_sizes2(Context& context)
: TestCaseBase<API>(context, "sized_declarations_invalid_sizes2",
" Correctly reject variable declarations, having 4 dimensions, for\n"
" which any combination of dimensions are declared with size -1\n"
" (16 cases).\n")
{
/* Left empty on purpose */
}
virtual ~sized_declarations_invalid_sizes2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class sized_declarations_invalid_sizes3 : public TestCaseBase<API>
{
public:
/* Public methods */
sized_declarations_invalid_sizes3(Context& context)
: TestCaseBase<API>(context, "sized_declarations_invalid_sizes3",
" Correctly reject variable declarations, having 4 dimensions, for\n"
" which any combination of dimensions are declared with a\n"
" non-constant (16 cases).\n")
{
/* Left empty on purpose */
}
virtual ~sized_declarations_invalid_sizes3()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class sized_declarations_invalid_sizes4 : public TestCaseBase<API>
{
public:
/* Public methods */
sized_declarations_invalid_sizes4(Context& context)
: TestCaseBase<API>(context, "sized_declarations_invalid_sizes4",
" Correctly reject modifications of a variable declaration of\n"
" 4 dimensions (e.g. float x[2][2][2][2]), in which\n"
" each adjacent pair '][' is replaced by the sequence operator\n"
" (e.g. float x[2,2][2][2]) (6 cases).\n")
{
/* Left empty on purpose */
}
virtual ~sized_declarations_invalid_sizes4()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ConstructorsAndUnsizedDeclConstructors1 : public TestCaseBase<API>
{
public:
/* Public methods */
ConstructorsAndUnsizedDeclConstructors1(Context& context)
: TestCaseBase<API>(context, "ConstructorsAndUnsizedDeclConstructors1",
" Verifies that constructors for arrays of between 2 and 8 dimensions\n"
" are accepted as isolated expressions for each non-opaque primitive\n"
" type (7 cases per primitive type).\n")
{
/* Left empty on purpose */
}
virtual ~ConstructorsAndUnsizedDeclConstructors1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
std::string recursively_initialise(std::string var_type, size_t dimension_index, std::string init_string);
};
template <class API>
class ConstructorsAndUnsizedDeclConstructors2 : public TestCaseBase<API>
{
public:
/* Public methods */
ConstructorsAndUnsizedDeclConstructors2(Context& context)
: TestCaseBase<API>(context, "ConstructorsAndUnsizedDeclConstructors2",
" Correctly reject any attempt to pass arguments to a\n"
" 2 dimensional float array constructor which has matching scalar\n"
" count, but different array shape or dimensionality to the array's\n"
" indexed type e.g. float[2][2](float[4](1,2,3,4)),\n"
" float[2][2](float[1][4](float[4](1,2,3,4))) (2 cases).\n")
{
/* Left empty on purpose */
}
virtual ~ConstructorsAndUnsizedDeclConstructors2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ConstructorsAndUnsizedDeclUnsizedConstructors : public TestCaseBase<API>
{
public:
/* Public methods */
ConstructorsAndUnsizedDeclUnsizedConstructors(Context& context)
: TestCaseBase<API>(context, "ConstructorsAndUnsizedDeclUnsizedConstructors",
" Verifies that any of the array dimensions, or any combination of\n"
" dimensions, may be omitted for a 4-dimensional float array\n"
" constructor (the sizes on its nested constructors may be\n"
" consistently omitted or present, and need not be manipulated\n"
" between cases) (e.g. float[][][2][](float[][][](float[][] etc))\n"
" (16 cases).\n")
{
/* Left empty on purpose */
}
virtual ~ConstructorsAndUnsizedDeclUnsizedConstructors()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ConstructorsAndUnsizedDeclConst : public TestCaseBase<API>
{
public:
/* Public methods */
ConstructorsAndUnsizedDeclConst(Context& context)
: TestCaseBase<API>(context, "ConstructorsAndUnsizedDeclConst",
" Verifies that multi-dimensional arrays can be declared as const\n"
" using nested constructors to initialize inner dimensions\n"
" e.g. const float[2][2] x = float[2][2](float[2](1,2),float[2](3,4)).\n")
{
/* Left empty on purpose */
}
virtual ~ConstructorsAndUnsizedDeclConst()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ConstructorsAndUnsizedDeclInvalidConstructors1 : public TestCaseBase<API>
{
public:
/* Public methods */
ConstructorsAndUnsizedDeclInvalidConstructors1(Context& context)
: TestCaseBase<API>(context, "ConstructorsAndUnsizedDeclInvalidConstructors1",
" Correctly reject any attempt to call array constructors for\n"
" 2-dimensional arrays of any opaque type.\n")
{
/* Left empty on purpose */
}
virtual ~ConstructorsAndUnsizedDeclInvalidConstructors1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ConstructorsAndUnsizedDeclInvalidConstructors2 : public TestCaseBase<API>
{
public:
/* Public methods */
ConstructorsAndUnsizedDeclInvalidConstructors2(Context& context)
: TestCaseBase<API>(context, "ConstructorsAndUnsizedDeclInvalidConstructors2",
" Correctly reject 3-dimensional int array constructor calls\n"
" for which any dimension or combination of dimensions is\n"
" given as zero (see sec(i) - 8 cases).\n")
{
/* Left empty on purpose */
}
virtual ~ConstructorsAndUnsizedDeclInvalidConstructors2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ConstructorsAndUnsizedDeclInvalidConstructors3 : public TestCaseBase<API>
{
public:
/* Public methods */
ConstructorsAndUnsizedDeclInvalidConstructors3(Context& context)
: TestCaseBase<API>(context, "ConstructorsAndUnsizedDeclInvalidConstructors3",
" Correctly reject 3-dimensional int array constructor calls\n"
" for which any dimension or combination of dimensions is\n"
" given as -1 (see sec(i) - 8 cases).\n")
{
/* Left empty on purpose */
}
virtual ~ConstructorsAndUnsizedDeclInvalidConstructors3()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ConstructorsAndUnsizedDeclInvalidConstructors4 : public TestCaseBase<API>
{
public:
/* Public methods */
ConstructorsAndUnsizedDeclInvalidConstructors4(Context& context)
: TestCaseBase<API>(context, "ConstructorsAndUnsizedDeclInvalidConstructors4",
" Correctly reject 3-dimensional int array constructor calls\n"
" for which any dimension or combination of dimensions is\n"
" given by a non-constant variable (8 cases).\n")
{
/* Left empty on purpose */
}
virtual ~ConstructorsAndUnsizedDeclInvalidConstructors4()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ConstructorsAndUnsizedDeclConstructorSizing1 : public TestCaseBase<API>
{
public:
/* Public methods */
ConstructorsAndUnsizedDeclConstructorSizing1(Context& context)
: TestCaseBase<API>(context, "ConstructorsAndUnsizedDeclConstructorSizing1",
" Verifies that arrays of 4 dimensions can be declared with any\n"
" combination of dimension sizes omitted, provided a valid\n"
" constructor is used as an initializer (15 cases per non-opaque\n"
" primitive type).\n")
{
/* Left empty on purpose */
}
virtual ~ConstructorsAndUnsizedDeclConstructorSizing1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ConstructorsAndUnsizedDeclConstructorSizing2 : public TestCaseBase<API>
{
public:
/* Public methods */
ConstructorsAndUnsizedDeclConstructorSizing2(Context& context)
: TestCaseBase<API>(context, "ConstructorsAndUnsizedDeclConstructorSizing2",
" Verifies that a sequence of arrays from 2 to 8 dimensions can\n"
" be declared in a single statement\n"
" (e.g. float[] x=float[](4,5), y[]=float[][](float[](4)), z[][]...).\n"
" The size of the dimensions should vary between the cases\n"
" of this test (e.g. in the previous case, we have\n"
" float x[2] and float y[1][1]).\n")
{
/* Left empty on purpose */
}
virtual ~ConstructorsAndUnsizedDeclConstructorSizing2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ConstructorsAndUnsizedDeclStructConstructors : public TestCaseBase<API>
{
public:
/* Public methods */
ConstructorsAndUnsizedDeclStructConstructors(Context& context)
: TestCaseBase<API>(context, "ConstructorsAndUnsizedDeclStructConstructors",
" Declare a user type (struct) and verify that arrays of between 2\n"
" and 8 dimensions can be declared without explicit sizes, and\n"
" initialized from constructors (7 cases).\n")
{
/* Left empty on purpose */
}
virtual ~ConstructorsAndUnsizedDeclStructConstructors()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
std::string recursively_initialise(std::string var_type, size_t dimension_index, std::string init_string);
};
template <class API>
class ConstructorsAndUnsizedDeclUnsizedArrays1 : public TestCaseBase<API>
{
public:
/* Public methods */
ConstructorsAndUnsizedDeclUnsizedArrays1(Context& context)
: TestCaseBase<API>(context, "ConstructorsAndUnsizedDeclUnsizedArrays1",
" Correctly reject unsized declarations of variables between 2 and 8\n"
" dimensions for which an initializer is not present.\n")
{
/* Left empty on purpose */
}
virtual ~ConstructorsAndUnsizedDeclUnsizedArrays1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ConstructorsAndUnsizedDeclUnsizedArrays2 : public TestCaseBase<API>
{
public:
/* Public methods */
ConstructorsAndUnsizedDeclUnsizedArrays2(Context& context)
: TestCaseBase<API>(context, "ConstructorsAndUnsizedDeclUnsizedArrays2",
" Correctly reject unsized declarations where some elements are\n"
" lacking initializers (e.g. float[] x=float[](1), y).\n")
{
/* Left empty on purpose */
}
virtual ~ConstructorsAndUnsizedDeclUnsizedArrays2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ConstructorsAndUnsizedDeclUnsizedArrays3 : public TestCaseBase<API>
{
public:
/* Public methods */
ConstructorsAndUnsizedDeclUnsizedArrays3(Context& context)
: TestCaseBase<API>(context, "ConstructorsAndUnsizedDeclUnsizedArrays3",
" Correctly reject a declaration which initializes a\n"
" multi-dimensional array from a matrix type,\n"
" e.g. (float[][] x = mat4(0)).\n")
{
/* Left empty on purpose */
}
virtual ~ConstructorsAndUnsizedDeclUnsizedArrays3()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ConstructorsAndUnsizedDeclUnsizedArrays4 : public TestCaseBase<API>
{
public:
/* Public methods */
ConstructorsAndUnsizedDeclUnsizedArrays4(Context& context)
: TestCaseBase<API>(context, "ConstructorsAndUnsizedDeclUnsizedArrays4",
" Declare a user type containing an unsized array\n"
" (e.g. struct foo { float[][] x; }) and verify that the shader is\n"
" correctly rejected.\n")
{
/* Left empty on purpose */
}
virtual ~ConstructorsAndUnsizedDeclUnsizedArrays4()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ExpressionsAssignment1 : public TestCaseBase<API>
{
public:
/* Public methods */
ExpressionsAssignment1(Context& context)
: TestCaseBase<API>(context, "ExpressionsAssignment1",
" Declare two variables of matching array size, having between 2 and\n"
" 8 dimensions, and verify that the value of one can be assigned to\n"
" the other without error (7 cases).\n")
{
/* Left empty on purpose */
}
virtual ~ExpressionsAssignment1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
std::string recursively_initialise(std::string var_type, size_t dimension_index, std::string init_string);
};
template <class API>
class ExpressionsAssignment2 : public TestCaseBase<API>
{
public:
/* Public methods */
ExpressionsAssignment2(Context& context)
: TestCaseBase<API>(context, "ExpressionsAssignment2",
" Correctly reject assignment of variables of differing numbers of array\n"
" dimensions (between 1 and 4) to one another (6 cases).\n")
{
/* Left empty on purpose */
}
virtual ~ExpressionsAssignment2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ExpressionsAssignment3 : public TestCaseBase<API>
{
public:
/* Public methods */
ExpressionsAssignment3(Context& context)
: TestCaseBase<API>(context, "ExpressionsAssignment3",
" Correctly reject assignment of variables of 4 dimensions and differing\n"
" array size to one another, where all combinations of each dimension\n"
" matching or not matching are tested (15 cases).\n")
{
/* Left empty on purpose */
}
virtual ~ExpressionsAssignment3()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ExpressionsTypeRestrictions1 : public TestCaseBase<API>
{
public:
/* Public methods */
ExpressionsTypeRestrictions1(Context& context)
: TestCaseBase<API>(context, "ExpressionsTypeRestrictions1",
" Declare two 2-dimensional arrays of a sampler type and verify that\n"
" one cannot be assigned to the other.\n"
" Repeat the test for each opaque type.\n")
{
/* Left empty on purpose */
}
virtual ~ExpressionsTypeRestrictions1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ExpressionsTypeRestrictions2 : public TestCaseBase<API>
{
public:
/* Public methods */
ExpressionsTypeRestrictions2(Context& context)
: TestCaseBase<API>(context, "ExpressionsTypeRestrictions2",
" For each opaque type, verify that structures containing \n"
" two 2-dimensional arrays of that sampler type\n"
" cannot be assigned to each other.\n")
{
/* Left empty on purpose */
}
virtual ~ExpressionsTypeRestrictions2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ExpressionsIndexingScalar1 : public TestCaseBase<API>
{
public:
/* Public methods */
ExpressionsIndexingScalar1(Context& context)
: TestCaseBase<API>(context, "ExpressionsIndexingScalar1",
" Assign to each scalar element of a 4 dimensional array\n"
" float x[1][2][3][4] (24 cases).\n")
{
/* Left empty on purpose */
}
virtual ~ExpressionsIndexingScalar1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ExpressionsIndexingScalar2 : public TestCaseBase<API>
{
public:
/* Public methods */
ExpressionsIndexingScalar2(Context& context)
: TestCaseBase<API>(context, "ExpressionsIndexingScalar2",
" Correctly reject indexing the array with any combination\n"
" of indices given as -1 (15 cases).\n")
{
/* Left empty on purpose */
}
virtual ~ExpressionsIndexingScalar2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ExpressionsIndexingScalar3 : public TestCaseBase<API>
{
public:
/* Public methods */
ExpressionsIndexingScalar3(Context& context)
: TestCaseBase<API>(context, "ExpressionsIndexingScalar3",
" Correctly reject indexing the array with any combination\n"
" of indices given as 4 (15 cases).\n")
{
/* Left empty on purpose */
}
virtual ~ExpressionsIndexingScalar3()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ExpressionsIndexingScalar4 : public TestCaseBase<API>
{
public:
/* Public methods */
ExpressionsIndexingScalar4(Context& context)
: TestCaseBase<API>(context, "ExpressionsIndexingScalar4",
" Correctly reject any attempt to index a 4-dimensional array with\n"
" any combination of missing array index expressions\n"
" (e.g. x[][0][0][]) - (15 cases).\n")
{
/* Left empty on purpose */
}
virtual ~ExpressionsIndexingScalar4()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ExpressionsIndexingArray1 : public TestCaseBase<API>
{
public:
/* Public methods */
ExpressionsIndexingArray1(Context& context)
: TestCaseBase<API>(context, "ExpressionsIndexingArray1",
" Assign to each dimension of an 8 dimensional, single-element array\n"
" with an appropriate constructor (e.g. float\n"
" x[1][1][1][1][1][1][1][1];\n"
" x[0] = float[1][1][1][1][1][1][1](1);\n"
" x[0][0] = etc) - (8 cases).\n")
{
/* Left empty on purpose */
}
virtual ~ExpressionsIndexingArray1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ExpressionsIndexingArray2 : public TestCaseBase<API>
{
public:
/* Public methods */
ExpressionsIndexingArray2(Context& context)
: TestCaseBase<API>(context, "ExpressionsIndexingArray2",
" Declare two 8 dimensional, single-element arrays, and assign to\n"
" each dimension of one from the matching sub_scripting of the other\n"
" (e.g. x[0] = y[0]; x[0][0] = y[0][0]; etc.) (8 cases).\n")
{
/* Left empty on purpose */
}
virtual ~ExpressionsIndexingArray2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
std::string recursively_initialise(std::string var_type, size_t dimension_index, std::string init_string);
};
template <class API>
class ExpressionsIndexingArray3 : public TestCaseBase<API>
{
public:
/* Public methods */
ExpressionsIndexingArray3(Context& context)
: TestCaseBase<API>(context, "ExpressionsIndexingArray3",
" Correctly reject use of ivecn to index an n-dimensional array -\n"
" e.g. float x[2][2][2][2]; x[ivec4(0)] = 1; (3 cases).\n")
{
/* Left empty on purpose */
}
virtual ~ExpressionsIndexingArray3()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ExpressionsDynamicIndexing1 : public TestCaseBase<API>
{
public:
/* Public methods */
ExpressionsDynamicIndexing1(Context& context)
: TestCaseBase<API>(context, "ExpressionsDynamicIndexing1",
" Verifies that any mixture of constant, uniform and dynamic expressions\n"
" can be used as the array index expression, in any combination, for\n"
" each dimension of a 2 dimensional array (16 cases).\n")
{
/* Left empty on purpose */
}
virtual ~ExpressionsDynamicIndexing1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ExpressionsDynamicIndexing2 : public TestCaseBase<API>
{
public:
/* Public methods */
ExpressionsDynamicIndexing2(Context& context)
: TestCaseBase<API>(context, "ExpressionsDynamicIndexing2",
" Correctly reject any attempt to index 4-dimensional arrays of opaque\n"
" types with any combination of non-constant expressions\n"
" (e.g. x[0][y][0][y] etc for non-const y) - (15 cases per type).\n")
{
/* Left empty on purpose */
}
virtual ~ExpressionsDynamicIndexing2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ExpressionsEquality1 : public TestCaseBase<API>
{
public:
/* Public methods */
ExpressionsEquality1(Context& context)
: TestCaseBase<API>(context, "ExpressionsEquality1",
" Verifies that two 4-dimensional arrays of matching primitive\n"
" type can be correctly compared for equality and inequality, when\n"
" they differ independently in each component or combination of\n"
" components (e.g. x = float[][](float[](1,1), float[](1,1)); y =\n"
" float[][](float[](2,1), float[](1,1)); return x == y;) - (16\n"
" cases per primitive type).\n")
{
/* Left empty on purpose */
}
virtual ~ExpressionsEquality1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ExpressionsEquality2 : public TestCaseBase<API>
{
public:
/* Public methods */
ExpressionsEquality2(Context& context)
: TestCaseBase<API>(context, "ExpressionsEquality2",
" Verifies that two 4-dimensional arrays of matching user (struct)\n"
" types can be correctly compared for equality and inequality, when\n"
" they differ independently in each component or combination of\n"
" components - (16 cases per primitive type).\n")
{
/* Left empty on purpose */
}
virtual ~ExpressionsEquality2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ExpressionsLength1 : public TestCaseBase<API>
{
public:
/* Public methods */
ExpressionsLength1(Context& context, const glw::GLchar* name, const glw::GLchar* description)
: TestCaseBase<API>(context, name, description)
{
/* Left empty on purpose */
}
ExpressionsLength1(Context& context)
: TestCaseBase<API>(context, "ExpressionsLength1",
" For a 4-dimensional array declared as int x[4][3][2][1], verify that\n"
" x.length returns the integer 4, x[0].length the integer 3, and so\n"
" forth (4 cases).\n")
{
/* Left empty on purpose */
}
virtual ~ExpressionsLength1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void execute_dispatch_test(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& tested_declaration, const std::string& tested_snippet);
void execute_draw_test(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& tested_declaration, const std::string& tested_snippet);
std::string prepare_compute_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& tested_declaration, const std::string& tested_snippet);
std::string prepare_fragment_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& tested_declaration, const std::string& tested_snippet);
std::string prepare_geometry_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& tested_declaration, const std::string& tested_snippet);
std::string prepare_tess_ctrl_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& tested_declaration, const std::string& tested_snippet);
std::string prepare_tess_eval_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& tested_declaration, const std::string& tested_snippet);
std::string prepare_vertex_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& tested_declaration, const std::string& tested_snippet);
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ExpressionsLength2 : public ExpressionsLength1<API>
{
public:
/* Public methods */
ExpressionsLength2(Context& context)
: ExpressionsLength1<API>(context, "ExpressionsLength2",
" For a 4-dimensional array declared as int x[1][2][3][4], verify that\n"
" x.length returns the integer 1, x[0].length the integer 2, and so\n"
" forth (4 cases).\n")
{
/* Left empty on purpose */
}
virtual ~ExpressionsLength2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ExpressionsLength3 : public ExpressionsLength1<API>
{
public:
/* Public methods */
ExpressionsLength3(Context& context)
: ExpressionsLength1<API>(context, "ExpressionsLength3",
" Correctly reject any use of the length method on elements of a\n"
" 4-dimensional array x[1][1][1][1] for which the index\n"
" expression is omitted, e.g. x[].length, x[][].length etc (3 cases).\n")
{
/* Left empty on purpose */
}
virtual ~ExpressionsLength3()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ExpressionsInvalid1 : public TestCaseBase<API>
{
public:
/* Public methods */
ExpressionsInvalid1(Context& context)
: TestCaseBase<API>(context, "ExpressionsInvalid1", " Correctly reject an assignment of a 2 dimensional\n"
" array x[2][2] to a variable y of type mat2.\n")
{
/* Left empty on purpose */
}
virtual ~ExpressionsInvalid1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class ExpressionsInvalid2 : public TestCaseBase<API>
{
public:
/* Public methods */
ExpressionsInvalid2(Context& context)
: TestCaseBase<API>(context, "ExpressionsInvalid2",
" For 8-dimensional arrays x,y, correctly reject any attempt\n"
" to apply the relational operators other than equality and\n"
" inequality (4 cases per non-opaque primitive type).\n")
{
/* Left empty on purpose */
}
virtual ~ExpressionsInvalid2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class InteractionFunctionCalls1 : public TestCaseBase<API>
{
public:
/* Public methods */
InteractionFunctionCalls1(Context& context, const glw::GLchar* name, const glw::GLchar* description)
: TestCaseBase<API>(context, name, description)
{
/* Left empty on purpose */
}
InteractionFunctionCalls1(Context& context)
: TestCaseBase<API>(context, "InteractionFunctionCalls1",
" Declare a function returning an 8-dimensional 64-element array as\n"
" an out parameter, which places a unique integer in each\n"
" element.\n"
" Verifies that the values are returned as expected when this function\n"
" is called.\n"
" Repeat for the following primitive types: int, float,\n"
" ivec2, ivec3, ivec4, vec2, vec3, vec4, mat2, mat3, mat4.\n")
{
/* Left empty on purpose */
}
virtual ~InteractionFunctionCalls1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void execute_dispatch_test(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& function_definition, const std::string& function_use,
const std::string& verification);
void execute_draw_test(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& function_definition, const std::string& function_use,
const std::string& verification);
std::string prepare_compute_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& function_definition, const std::string& function_use,
const std::string& verification);
std::string prepare_fragment_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& function_definition, const std::string& function_use,
const std::string& verification);
std::string prepare_geometry_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& function_definition, const std::string& function_use,
const std::string& verification);
std::string prepare_tess_ctrl_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& function_definition, const std::string& function_use,
const std::string& verification);
std::string prepare_tess_eval_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& function_definition, const std::string& function_use,
const std::string& verification);
std::string prepare_vertex_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& function_definition, const std::string& function_use,
const std::string& verification);
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class InteractionFunctionCalls2 : public InteractionFunctionCalls1<API>
{
public:
/* Public methods */
InteractionFunctionCalls2(Context& context)
: InteractionFunctionCalls1<API>(context, "InteractionFunctionCalls2",
" Declare a function taking an inout parameter,\n"
" which multiplies each element by a different prime.\n"
" Verifies that the results after returning are again as expected.\n"
" Repeat for the following primitive types: int, float,\n"
" ivec2, ivec3, ivec4, vec2, vec3, vec4, mat2, mat3, mat4.\n")
{
/* Left empty on purpose */
}
virtual ~InteractionFunctionCalls2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class InteractionArgumentAliasing1 : public InteractionFunctionCalls1<API>
{
public:
/* Public methods */
InteractionArgumentAliasing1(Context& context)
: InteractionFunctionCalls1<API>(context, "InteractionArgumentAliasing1",
" Declare a function taking two 8-dimensional, 64-element parameters\n"
" (e.g. void g(int x[2][2][2][2][2][2][2][2], int\n"
" y[2][2][2][2][2][2][2][2]) and verify that after calling g(z,z),\n"
" and overwriting x with a constant value, the original values of z\n"
" are accessible through y.\n"
" Repeat for float and mat4 types.\n")
{
/* Left empty on purpose */
}
virtual ~InteractionArgumentAliasing1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class InteractionArgumentAliasing2 : public InteractionFunctionCalls1<API>
{
public:
/* Public methods */
InteractionArgumentAliasing2(Context& context)
: InteractionFunctionCalls1<API>(context, "InteractionArgumentAliasing2",
" Declare a function taking two 8-dimensional, 64-element parameters\n"
" (e.g. void g(int x[2][2][2][2][2][2][2][2], int\n"
" y[2][2][2][2][2][2][2][2]) and verify that after calling g(z,z),\n"
" and overwriting y with a constant value, the original values of z\n"
" are accessible through x.\n"
" Repeat for float and mat4 types.\n")
{
/* Left empty on purpose */
}
virtual ~InteractionArgumentAliasing2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class InteractionArgumentAliasing3 : public InteractionFunctionCalls1<API>
{
public:
/* Public methods */
InteractionArgumentAliasing3(Context& context)
: InteractionFunctionCalls1<API>(context, "InteractionArgumentAliasing3",
" Declare a function taking two 8-dimensional, 64-element parameters\n"
" (e.g. void g(int x[2][2][2][2][2][2][2][2], int\n"
" y[2][2][2][2][2][2][2][2]) and verify that after calling g(z,z),\n"
" and overwriting y with a constant value, the original values of z\n"
" are accessible through x, where x is an out parameter.\n"
" Repeat for float and mat4 types.\n")
{
/* Left empty on purpose */
}
virtual ~InteractionArgumentAliasing3()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class InteractionArgumentAliasing4 : public InteractionFunctionCalls1<API>
{
public:
/* Public methods */
InteractionArgumentAliasing4(Context& context)
: InteractionFunctionCalls1<API>(context, "InteractionArgumentAliasing4",
" Declare a function taking two 8-dimensional, 64-element parameters\n"
" (e.g. void g(int x[2][2][2][2][2][2][2][2], int\n"
" y[2][2][2][2][2][2][2][2]) and verify that after calling g(z,z),\n"
" and overwriting x with a constant value, the original values of z\n"
" are accessible through y, where y is an out parameter.\n"
" Repeat for float and mat4 types.\n")
{
/* Left empty on purpose */
}
virtual ~InteractionArgumentAliasing4()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class InteractionArgumentAliasing5 : public InteractionFunctionCalls1<API>
{
public:
/* Public methods */
InteractionArgumentAliasing5(Context& context)
: InteractionFunctionCalls1<API>(context, "InteractionArgumentAliasing5",
" Declare a function taking two 8-dimensional, 64-element parameters\n"
" (e.g. void g(int x[2][2][2][2][2][2][2][2], int\n"
" y[2][2][2][2][2][2][2][2]) and verify that after calling g(z,z),\n"
" and overwriting y with a constant value, the original values of z\n"
" are accessible through x, where x is an inout parameter.\n"
" Repeat for float and mat4 types.\n")
{
/* Left empty on purpose */
}
virtual ~InteractionArgumentAliasing5()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class InteractionArgumentAliasing6 : public InteractionFunctionCalls1<API>
{
public:
/* Public methods */
InteractionArgumentAliasing6(Context& context)
: InteractionFunctionCalls1<API>(context, "InteractionArgumentAliasing6",
" Declare a function taking two 8-dimensional, 64-element parameters\n"
" (e.g. void g(int x[2][2][2][2][2][2][2][2], int\n"
" y[2][2][2][2][2][2][2][2]) and verify that after calling g(z,z),\n"
" and overwriting x with a constant value, the original values of z\n"
" are accessible through y, where y is an inout parameter.\n"
" Repeat for float and mat4 types.\n")
{
/* Left empty on purpose */
}
virtual ~InteractionArgumentAliasing6()
{
/* Left empty on purpose */
}
public:
//AL protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class InteractionUniforms1 : public TestCaseBase<API>
{
public:
/* Public methods */
InteractionUniforms1(Context& context, const glw::GLchar* name, const glw::GLchar* description)
: TestCaseBase<API>(context, name, description)
{
/* Left empty on purpose */
}
InteractionUniforms1(Context& context)
: TestCaseBase<API>(context, "InteractionUniforms1",
" Declare a 4-dimensional uniform array and verify that it can be\n"
" initialized with user data correctly using the API.\n")
{
/* Left empty on purpose */
}
virtual ~InteractionUniforms1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
std::string prepare_compute_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& uniform_definition, const std::string& uniform_use);
std::string prepare_fragment_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& uniform_definition, const std::string& uniform_use);
std::string prepare_geometry_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& uniform_definition, const std::string& uniform_use);
std::string prepare_tess_ctrl_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& uniform_definition, const std::string& uniform_use);
std::string prepare_tess_eval_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& uniform_definition, const std::string& uniform_use);
std::string prepare_vertex_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& uniform_definition, const std::string& uniform_use);
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class InteractionUniforms2 : public TestCaseBase<API>
{
public:
/* Public methods */
InteractionUniforms2(Context& context)
: TestCaseBase<API>(context, "InteractionUniforms2",
" Correctly reject 4-dimensional uniform arrays with any unsized\n"
" dimension, with or without an initializer (30 cases).\n")
{
/* Left empty on purpose */
}
virtual ~InteractionUniforms2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class InteractionUniformBuffers1 : public TestCaseBase<API>
{
public:
/* Public methods */
InteractionUniformBuffers1(Context& context)
: TestCaseBase<API>(context, "InteractionUniformBuffers1",
" Declare a uniform block containing a 6-dimensional array and verify\n"
" that the resulting shader compiles.\n"
" Repeat for ints and uints.\n")
{
/* Left empty on purpose */
}
virtual ~InteractionUniformBuffers1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class InteractionUniformBuffers2 : public InteractionUniforms1<API>
{
public:
/* Public methods */
InteractionUniformBuffers2(Context& context)
: InteractionUniforms1<API>(context, "InteractionUniformBuffers2",
" Declare a 4-dimensional uniform float array x[2][2][2][2] within a\n"
" uniform block, and verify that it can be initialized correctly with user\n"
" data via the API.\n"
" Repeat for ints and uints.\n")
{
/* Left empty on purpose */
}
virtual ~InteractionUniformBuffers2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void execute_dispatch_test();
void execute_draw_test(typename TestCaseBase<API>::TestShaderType tested_shader_type);
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class InteractionUniformBuffers3 : public TestCaseBase<API>
{
public:
/* Public methods */
InteractionUniformBuffers3(Context& context)
: TestCaseBase<API>(context, "InteractionUniformBuffers3",
" Correctly reject 4-dimensional uniform arrays with a uniform block\n"
" with any dimension unsized, with or without an initializer (30 cases).\n"
" Repeat for ints and uints.\n")
{
/* Left empty on purpose */
}
virtual ~InteractionUniformBuffers3()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class InteractionStorageBuffers1 : public TestCaseBase<API>
{
public:
/* Public methods */
InteractionStorageBuffers1(Context& context)
: TestCaseBase<API>(context, "InteractionStorageBuffers1",
" Declare a storage block containing a 6-dimensional array and verify\n"
" that the resulting shader compiles.\n"
" Repeat for ints and uints.\n")
{
/* Left empty on purpose */
}
virtual ~InteractionStorageBuffers1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class InteractionStorageBuffers2 : public InteractionUniforms1<API>
{
public:
/* Public methods */
InteractionStorageBuffers2(Context& context)
: InteractionUniforms1<API>(context, "InteractionStorageBuffers2",
" Declare a 4-dimensional float array x[2][2][2][2] within a\n"
" storage block, and verify that it can be initialized correctly with user\n"
" data via the API.\n"
" Repeat for ints and uints.\n")
{
/* Left empty on purpose */
}
virtual ~InteractionStorageBuffers2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void execute_dispatch_test();
void execute_draw_test(typename TestCaseBase<API>::TestShaderType tested_shader_type);
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class InteractionStorageBuffers3 : public TestCaseBase<API>
{
public:
/* Public methods */
InteractionStorageBuffers3(Context& context)
: TestCaseBase<API>(context, "InteractionStorageBuffers3",
" Correctly reject 4-dimensional uniform arrays with a uniform block\n"
" with any dimension unsized, with or without an initializer (30 cases).\n"
" Repeat for ints and uints.\n")
{
/* Left empty on purpose */
}
virtual ~InteractionStorageBuffers3()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class InteractionInterfaceArrays1 : public TestCaseBase<API>
{
public:
/* Public methods */
InteractionInterfaceArrays1(Context& context)
: TestCaseBase<API>(context, "InteractionInterfaceArrays1", " Verifies that 2-dimensional arrays of shader\n"
" storage buffer objects are correctly rejected.\n")
{
/* Left empty on purpose */
}
virtual ~InteractionInterfaceArrays1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class InteractionInterfaceArrays2 : public TestCaseBase<API>
{
public:
/* Public methods */
InteractionInterfaceArrays2(Context& context, const glw::GLchar* name, const glw::GLchar* description)
: TestCaseBase<API>(context, name, description)
{
/* Left empty on purpose */
}
InteractionInterfaceArrays2(Context& context)
: TestCaseBase<API>(context, "InteractionInterfaceArrays2",
" Verifies that 2-dimensional arrays of input and output variables\n"
" are correctly rejected.\n")
{
/* Left empty on purpose */
}
virtual ~InteractionInterfaceArrays2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
const typename TestCaseBase<API>::TestShaderType get_output_shader_type(
const typename TestCaseBase<API>::TestShaderType& input_shader_type);
const std::string prepare_fragment_shader(const typename TestCaseBase<API>::TestShaderType& input_shader_type,
const std::string& input_source, const std::string& output_source);
const std::string prepare_geometry_shader(const typename TestCaseBase<API>::TestShaderType& input_shader_type,
const std::string& input_source, const std::string& output_source);
const std::string prepare_tess_ctrl_shader_source(
const typename TestCaseBase<API>::TestShaderType& input_shader_type, const std::string& input_source,
const std::string& output_source);
const std::string prepare_tess_eval_shader_source(
const typename TestCaseBase<API>::TestShaderType& input_shader_type, const std::string& input_source,
const std::string& output_source);
const std::string prepare_vertex_shader(const typename TestCaseBase<API>::TestShaderType& input_shader_type,
const std::string& input_source, const std::string& output_source);
void prepare_sources(const typename TestCaseBase<API>::TestShaderType& input_shader_type,
const typename TestCaseBase<API>::TestShaderType& output_shader_type,
const std::string* input_shader_source, const std::string* output_shader_source,
std::string& input_source, std::string& output_source);
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType input_shader_type);
};
template <class API>
class InteractionInterfaceArrays3 : public TestCaseBase<API>
{
public:
/* Public methods */
InteractionInterfaceArrays3(Context& context)
: TestCaseBase<API>(context, "InteractionInterfaceArrays3",
" Verifies that 2-dimensional arrays of uniform interface blocks\n"
" are correctly rejected.\n")
{
/* Left empty on purpose */
}
virtual ~InteractionInterfaceArrays3()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class InteractionInterfaceArrays4 : public InteractionInterfaceArrays2<API>
{
public:
/* Public methods */
InteractionInterfaceArrays4(Context& context)
: InteractionInterfaceArrays2<API>(context, "InteractionInterfaceArrays4",
" Verifies that 2-dimensional arrays of input and output interface blocks\n"
" are correctly rejected.\n")
{
/* Left empty on purpose */
}
virtual ~InteractionInterfaceArrays4()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType input_shader_type);
};
/** Implements test AtomicDeclaration, desription follows:
*
* Prepare a shader that declares "bar", a multidimensional array of atomic
* counters. Shader should increment all entries of "bar". It is expected that
* building of program will:
* - pass when number of entries in "bar" is equal to a value of the
* corresponding MAX_*_ATOMIC_COUNTERS constant,
* - fail when number of entries in "bar" exceeds limit.
* Test all supported shader stages separately.
**/
template <class API>
class AtomicDeclarationTest : public TestCaseBase<API>
{
public:
/* Public methods */
AtomicDeclarationTest(Context& context)
: TestCaseBase<API>(context, "AtomicDeclaration",
" Verifies that atomic counters can be grouped in multidimensional arrays\n")
{
/* Left empty on purpose */
}
virtual ~AtomicDeclarationTest()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
/** Implements test AtomicUsage, desription follows:
*
* Prepare a program like in "valid" case of AtomicDeclaration test, but use
* layout qualifier with last binding and specific offset. Bind a buffer so all
* entries in "bar" have unique values assigned. Select offset and size of
* "bar" as follows:
* - offset is 0, "bar" fills entire allowed space;
* - offset is not 0, "bar" does not exceed any limit.
* Test pass if buffer contents are correctly modified by execution of the
* program.
* Test all supported shader stages separately.
**/
template <class API>
class AtomicUsageTest : public TestCaseBase<API>
{
public:
/* Public methods */
AtomicUsageTest(Context& context)
: TestCaseBase<API>(context, "AtomicUsage",
" Verifies that atomic counters grouped in multidimensional arrays can be used\n")
{
/* Left empty on purpose */
}
virtual ~AtomicUsageTest()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
private:
void execute(typename TestCaseBase<API>::TestShaderType tested_shader_type, glw::GLuint binding, glw::GLuint offset,
glw::GLuint n_entries);
};
/** Implements "out" case of SubRoutineCalls test, description follows:
*
* Modify "function-calls" test in the following aspects:
* - provide two subroutines instead of each function;
* - "new" "out" subroutine should use different pattern of values;
* - "new" "inout" subroutine should use division instead of multiplication;
* - it is expected that "original" set will pass, while "new" set will fail.
**/
template <class API>
class SubroutineFunctionCalls1 : public TestCaseBase<API>
{
public:
/* Public methods */
SubroutineFunctionCalls1(Context& context, const glw::GLchar* name, const glw::GLchar* description)
: TestCaseBase<API>(context, name, description)
{
/* Left empty on purpose */
}
SubroutineFunctionCalls1(Context& context)
: TestCaseBase<API>(context, "SubroutineFunctionCalls1",
" Declare two subroutines returning an 8-dimensional 64-element array as\n"
" an out parameter, filled with unique values.\n"
" Verifies that the values are returned as expected when this function\n"
" is called.\n"
" Repeat for the following primitive types: int, float,\n"
" ivec2, ivec3, ivec4, vec2, vec3, vec4, mat2, mat3, mat4.\n")
{
/* Left empty on purpose */
}
virtual ~SubroutineFunctionCalls1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void execute_dispatch_test(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& function_definition, const std::string& function_use,
const std::string& verification, bool use_original, bool expect_invalid_result);
void execute_draw_test(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& function_definition, const std::string& function_use,
const std::string& verification, bool use_original, bool expect_invalid_result);
std::string prepare_compute_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& function_definition, const std::string& function_use,
const std::string& verification);
std::string prepare_fragment_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& function_definition, const std::string& function_use,
const std::string& verification);
std::string prepare_geometry_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& function_definition, const std::string& function_use,
const std::string& verification);
std::string prepare_tess_ctrl_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& function_definition, const std::string& function_use,
const std::string& verification);
std::string prepare_tess_eval_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& function_definition, const std::string& function_use,
const std::string& verification);
std::string prepare_vertex_shader(typename TestCaseBase<API>::TestShaderType tested_shader_type,
const std::string& function_definition, const std::string& function_use,
const std::string& verification);
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
/** Implements "inout" case of SubRoutineCalls test, description follows:
*
* Modify "function-calls" test in the following aspects:
* - provide two subroutines instead of each function;
* - "new" "out" subroutine should use different pattern of values;
* - "new" "inout" subroutine should use division instead of multiplication;
* - it is expected that "original" set will pass, while "new" set will fail.
**/
template <class API>
class SubroutineFunctionCalls2 : public SubroutineFunctionCalls1<API>
{
public:
/* Public methods */
SubroutineFunctionCalls2(Context& context)
: SubroutineFunctionCalls1<API>(context, "SubroutineFunctionCalls2",
" Declare two subroutines taking an inout parameter,\n"
" which modifies each element in a unique way.\n"
" Verifies that the results after returning are as expected.\n"
" Repeat for the following primitive types: int, float,\n"
" ivec2, ivec3, ivec4, vec2, vec3, vec4, mat2, mat3, mat4.\n")
{
/* Left empty on purpose */
}
virtual ~SubroutineFunctionCalls2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class SubroutineArgumentAliasing1 : public SubroutineFunctionCalls1<API>
{
public:
/* Public methods */
SubroutineArgumentAliasing1(Context& context)
: SubroutineFunctionCalls1<API>(
context, "SubroutineArgumentAliasing1",
" Declare a function taking two 8-dimensional, 64-element parameters\n"
" (e.g. void g(int x[2][2][2][2][2][2][2][2], int\n"
" y[2][2][2][2][2][2][2][2]) and verify that after calling g(z,z),\n"
" and overwriting one parameter with a constant value, the original values of z\n"
" are accessible through the second parameter.\n"
" Repeat for float and mat4 types.\n")
{
/* Left empty on purpose */
}
virtual ~SubroutineArgumentAliasing1()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class SubroutineArgumentAliasing2 : public SubroutineFunctionCalls1<API>
{
public:
/* Public methods */
SubroutineArgumentAliasing2(Context& context)
: SubroutineFunctionCalls1<API>(
context, "SubroutineArgumentAliasing2",
" Declare two subroutines taking two 8-dimensional, 64-element parameters\n"
" (e.g. void g(int x[2][2][2][2][2][2][2][2], int\n"
" y[2][2][2][2][2][2][2][2]) and verify that after calling g(z,z),\n"
" and overwriting one parameter with a constant value, the original values of z\n"
" are accessible through the second inout parameter.\n"
" Repeat for float and mat4 types.\n")
{
/* Left empty on purpose */
}
virtual ~SubroutineArgumentAliasing2()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class SubroutineArgumentAliasing3 : public SubroutineFunctionCalls1<API>
{
public:
/* Public methods */
SubroutineArgumentAliasing3(Context& context)
: SubroutineFunctionCalls1<API>(
context, "SubroutineArgumentAliasing3",
" Declare two subroutines taking two 8-dimensional, 64-element parameters\n"
" (e.g. void g(int x[2][2][2][2][2][2][2][2], int\n"
" y[2][2][2][2][2][2][2][2]) and verify that after calling g(z,z),\n"
" and overwriting x, out, parameter with a constant value, the original values of z\n"
" are accessible through the y parameter.\n"
" Repeat for float and mat4 types.\n")
{
/* Left empty on purpose */
}
virtual ~SubroutineArgumentAliasing3()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
template <class API>
class SubroutineArgumentAliasing4 : public SubroutineFunctionCalls1<API>
{
public:
/* Public methods */
SubroutineArgumentAliasing4(Context& context)
: SubroutineFunctionCalls1<API>(
context, "SubroutineArgumentAliasing4",
" Declare two subroutines taking two 8-dimensional, 64-element parameters\n"
" (e.g. void g(int x[2][2][2][2][2][2][2][2], int\n"
" y[2][2][2][2][2][2][2][2]) and verify that after calling g(z,z),\n"
" and overwriting y, out, parameter with a constant value, the original values of z\n"
" are accessible through the x parameter.\n"
" Repeat for float and mat4 types.\n")
{
/* Left empty on purpose */
}
virtual ~SubroutineArgumentAliasing4()
{
/* Left empty on purpose */
}
protected:
/* Protected methods */
void test_shader_compilation(typename TestCaseBase<API>::TestShaderType tested_shader_type);
};
} /* ArraysOfArrays */
} /* glcts */
#endif // _ES31CARRAYOFARRAYSTESTS_HPP