xref: /aosp_15_r20/external/deqp/external/openglcts/modules/common/glcShaderLibraryCase.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1 #ifndef _GLCSHADERLIBRARYCASE_HPP
2 #define _GLCSHADERLIBRARYCASE_HPP
3 /*-------------------------------------------------------------------------
4  * OpenGL Conformance Test Suite
5  * -----------------------------
6  *
7  * Copyright (c) 2016 Google Inc.
8  * Copyright (c) 2016 The Khronos Group Inc.
9  *
10  * Licensed under the Apache License, Version 2.0 (the "License");
11  * you may not use this file except in compliance with the License.
12  * You may obtain a copy of the License at
13  *
14  *      http://www.apache.org/licenses/LICENSE-2.0
15  *
16  * Unless required by applicable law or agreed to in writing, software
17  * distributed under the License is distributed on an "AS IS" BASIS,
18  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19  * See the License for the specific language governing permissions and
20  * limitations under the License.
21  *
22  */ /*!
23  * \file
24  * \brief Shader test case.
25  */ /*-------------------------------------------------------------------*/
26 
27 #include "glcTestCase.hpp"
28 #include "gluDefs.hpp"
29 #include "gluRenderContext.hpp"
30 #include "gluShaderUtil.hpp"
31 #include "tcuSurface.hpp"
32 
33 #include <string>
34 #include <vector>
35 
36 namespace deqp
37 {
38 namespace sl
39 {
40 
41 // ShaderCase node.
42 
43 class ShaderCase : public tcu::TestCase
44 {
45 public:
46     enum CaseType
47     {
48         CASETYPE_COMPLETE = 0,  //!< Has both shaders.
49         CASETYPE_VERTEX_ONLY,   //!< Has only vertex shader.
50         CASETYPE_FRAGMENT_ONLY, //!< Has only fragment shader.
51 
52         CASETYPE_LAST
53     };
54 
55     enum ExpectResult
56     {
57         EXPECT_PASS = 0,
58         EXPECT_COMPILE_FAIL,
59         EXPECT_LINK_FAIL,
60 
61         EXPECT_LAST
62     };
63 
64     struct Value
65     {
66         enum StorageType
67         {
68             STORAGE_UNIFORM,
69             STORAGE_INPUT,
70             STORAGE_OUTPUT,
71 
72             STORAGE_LAST
73         };
74 
75         /* \todo [2010-03-31 petri] Replace with another vector to allow a) arrays, b) compact representation */
76         union Element
77         {
78             float float32;
79             int32_t int32;
80             int32_t bool32;
81         };
82 
83         StorageType storageType;
84         std::string valueName;
85         glu::DataType dataType;
86         int arrayLength;               // Number of elements in array (currently always 1).
87         std::vector<Element> elements; // Scalar values (length dataType.scalarSize * arrayLength).
88     };
89 
90     struct ValueBlock
91     {
92         int arrayLength; // Combined array length of each value (lengths must be same, or one).
93         std::vector<Value> values;
ValueBlockdeqp::sl::ShaderCase::ValueBlock94         ValueBlock(void)
95         {
96             arrayLength = 0;
97         }
98     };
99 
100     // Methods.
101     ShaderCase(tcu::TestContext &testCtx, glu::RenderContext &renderCtx, const char *caseName, const char *description,
102                ExpectResult expectResult, const std::vector<ValueBlock> &valueBlocks, glu::GLSLVersion targetVersion,
103                const char *vertexSource, const char *fragmentSource);
104 
105     virtual ~ShaderCase(void);
106 
getCaseType(void) const107     CaseType getCaseType(void) const
108     {
109         return m_caseType;
110     }
getValueBlocks(void) const111     const std::vector<ValueBlock> &getValueBlocks(void) const
112     {
113         return m_valueBlocks;
114     }
getVertexSource(void) const115     const char *getVertexSource(void) const
116     {
117         return m_vertexSource.c_str();
118     }
getFragmentSource(void) const119     const char *getFragmentSource(void) const
120     {
121         return m_fragmentSource.c_str();
122     }
123 
124     bool execute(void);
125     IterateResult iterate(void);
126 
127 private:
128     ShaderCase(const ShaderCase &);            // not allowed!
129     ShaderCase &operator=(const ShaderCase &); // not allowed!
130 
131     std::string genVertexShader(const ValueBlock &valueBlock);
132     std::string genFragmentShader(const ValueBlock &valueBlock);
133     std::string specializeVertexShader(const char *src, const ValueBlock &valueBlock);
134     std::string specializeFragmentShader(const char *src, const ValueBlock &valueBlock);
135 
136     void specializeShaders(const char *vertexSource, const char *fragmentSource, std::string &outVertexSource,
137                            std::string &outFragmentSource, const ValueBlock &valueBlock);
138 
139     void dumpValues(const ValueBlock &valueBlock, int arrayNdx);
140 
141     bool checkPixels(tcu::Surface &surface, int minX, int maxX, int minY, int maxY);
142 
143     // Member variables.
144     glu::RenderContext &m_renderCtx;
145     CaseType m_caseType;
146     ExpectResult m_expectResult;
147     std::vector<ValueBlock> m_valueBlocks;
148     glu::GLSLVersion m_targetVersion;
149     std::string m_vertexSource;
150     std::string m_fragmentSource;
151 };
152 
153 } // namespace sl
154 } // namespace deqp
155 
156 #endif // _GLCSHADERLIBRARYCASE_HPP
157