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