1*35238bceSAndroid Build Coastguard Worker #ifndef _GLSSHADEREXECUTIL_HPP
2*35238bceSAndroid Build Coastguard Worker #define _GLSSHADEREXECUTIL_HPP
3*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL (ES) Module
5*35238bceSAndroid Build Coastguard Worker * -----------------------------------------------
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
8*35238bceSAndroid Build Coastguard Worker *
9*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
10*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
11*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
14*35238bceSAndroid Build Coastguard Worker *
15*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
16*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
17*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
19*35238bceSAndroid Build Coastguard Worker * limitations under the License.
20*35238bceSAndroid Build Coastguard Worker *
21*35238bceSAndroid Build Coastguard Worker *//*!
22*35238bceSAndroid Build Coastguard Worker * \file
23*35238bceSAndroid Build Coastguard Worker * \brief Shader execution utilities.
24*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
25*35238bceSAndroid Build Coastguard Worker
26*35238bceSAndroid Build Coastguard Worker #include "tcuDefs.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluVarType.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "gluShaderUtil.hpp"
29*35238bceSAndroid Build Coastguard Worker
30*35238bceSAndroid Build Coastguard Worker namespace tcu
31*35238bceSAndroid Build Coastguard Worker {
32*35238bceSAndroid Build Coastguard Worker class TestLog;
33*35238bceSAndroid Build Coastguard Worker }
34*35238bceSAndroid Build Coastguard Worker
35*35238bceSAndroid Build Coastguard Worker namespace glu
36*35238bceSAndroid Build Coastguard Worker {
37*35238bceSAndroid Build Coastguard Worker class RenderContext;
38*35238bceSAndroid Build Coastguard Worker }
39*35238bceSAndroid Build Coastguard Worker
40*35238bceSAndroid Build Coastguard Worker namespace deqp
41*35238bceSAndroid Build Coastguard Worker {
42*35238bceSAndroid Build Coastguard Worker namespace gls
43*35238bceSAndroid Build Coastguard Worker {
44*35238bceSAndroid Build Coastguard Worker namespace ShaderExecUtil
45*35238bceSAndroid Build Coastguard Worker {
46*35238bceSAndroid Build Coastguard Worker
47*35238bceSAndroid Build Coastguard Worker //! Shader input / output variable declaration.
48*35238bceSAndroid Build Coastguard Worker struct Symbol
49*35238bceSAndroid Build Coastguard Worker {
50*35238bceSAndroid Build Coastguard Worker std::string name; //!< Symbol name.
51*35238bceSAndroid Build Coastguard Worker glu::VarType varType; //!< Symbol type.
52*35238bceSAndroid Build Coastguard Worker
Symboldeqp::gls::ShaderExecUtil::Symbol53*35238bceSAndroid Build Coastguard Worker Symbol(void)
54*35238bceSAndroid Build Coastguard Worker {
55*35238bceSAndroid Build Coastguard Worker }
Symboldeqp::gls::ShaderExecUtil::Symbol56*35238bceSAndroid Build Coastguard Worker Symbol(const std::string &name_, const glu::VarType &varType_) : name(name_), varType(varType_)
57*35238bceSAndroid Build Coastguard Worker {
58*35238bceSAndroid Build Coastguard Worker }
59*35238bceSAndroid Build Coastguard Worker };
60*35238bceSAndroid Build Coastguard Worker
61*35238bceSAndroid Build Coastguard Worker //! Complete shader specification.
62*35238bceSAndroid Build Coastguard Worker struct ShaderSpec
63*35238bceSAndroid Build Coastguard Worker {
64*35238bceSAndroid Build Coastguard Worker glu::GLSLVersion version; //!< Shader version.
65*35238bceSAndroid Build Coastguard Worker std::vector<Symbol> inputs;
66*35238bceSAndroid Build Coastguard Worker std::vector<Symbol> outputs;
67*35238bceSAndroid Build Coastguard Worker std::string
68*35238bceSAndroid Build Coastguard Worker globalDeclarations; //!< These are placed into global scope. Can contain uniform declarations for example.
69*35238bceSAndroid Build Coastguard Worker std::string source; //!< Source snippet to be executed.
70*35238bceSAndroid Build Coastguard Worker
ShaderSpecdeqp::gls::ShaderExecUtil::ShaderSpec71*35238bceSAndroid Build Coastguard Worker ShaderSpec(void) : version(glu::GLSL_VERSION_300_ES)
72*35238bceSAndroid Build Coastguard Worker {
73*35238bceSAndroid Build Coastguard Worker }
74*35238bceSAndroid Build Coastguard Worker };
75*35238bceSAndroid Build Coastguard Worker
76*35238bceSAndroid Build Coastguard Worker //! Base class for shader executor.
77*35238bceSAndroid Build Coastguard Worker class ShaderExecutor
78*35238bceSAndroid Build Coastguard Worker {
79*35238bceSAndroid Build Coastguard Worker public:
80*35238bceSAndroid Build Coastguard Worker virtual ~ShaderExecutor(void);
81*35238bceSAndroid Build Coastguard Worker
82*35238bceSAndroid Build Coastguard Worker //! Check if executor can be used.
83*35238bceSAndroid Build Coastguard Worker virtual bool isOk(void) const = 0;
84*35238bceSAndroid Build Coastguard Worker
85*35238bceSAndroid Build Coastguard Worker //! Log executor details (program etc.).
86*35238bceSAndroid Build Coastguard Worker virtual void log(tcu::TestLog &log) const = 0;
87*35238bceSAndroid Build Coastguard Worker
88*35238bceSAndroid Build Coastguard Worker //! Get program.
89*35238bceSAndroid Build Coastguard Worker virtual uint32_t getProgram(void) const = 0;
90*35238bceSAndroid Build Coastguard Worker
91*35238bceSAndroid Build Coastguard Worker //! Set this shader program current in context. Must be called before execute().
92*35238bceSAndroid Build Coastguard Worker virtual void useProgram(void);
93*35238bceSAndroid Build Coastguard Worker
94*35238bceSAndroid Build Coastguard Worker //! Execute active program. useProgram() must be called before this.
95*35238bceSAndroid Build Coastguard Worker virtual void execute(int numValues, const void *const *inputs, void *const *outputs) = 0;
96*35238bceSAndroid Build Coastguard Worker
97*35238bceSAndroid Build Coastguard Worker protected:
98*35238bceSAndroid Build Coastguard Worker ShaderExecutor(const glu::RenderContext &renderCtx, const ShaderSpec &shaderSpec);
99*35238bceSAndroid Build Coastguard Worker
100*35238bceSAndroid Build Coastguard Worker const glu::RenderContext &m_renderCtx;
101*35238bceSAndroid Build Coastguard Worker
102*35238bceSAndroid Build Coastguard Worker std::vector<Symbol> m_inputs;
103*35238bceSAndroid Build Coastguard Worker std::vector<Symbol> m_outputs;
104*35238bceSAndroid Build Coastguard Worker };
105*35238bceSAndroid Build Coastguard Worker
operator <<(tcu::TestLog & log,const ShaderExecutor * executor)106*35238bceSAndroid Build Coastguard Worker inline tcu::TestLog &operator<<(tcu::TestLog &log, const ShaderExecutor *executor)
107*35238bceSAndroid Build Coastguard Worker {
108*35238bceSAndroid Build Coastguard Worker executor->log(log);
109*35238bceSAndroid Build Coastguard Worker return log;
110*35238bceSAndroid Build Coastguard Worker }
operator <<(tcu::TestLog & log,const ShaderExecutor & executor)111*35238bceSAndroid Build Coastguard Worker inline tcu::TestLog &operator<<(tcu::TestLog &log, const ShaderExecutor &executor)
112*35238bceSAndroid Build Coastguard Worker {
113*35238bceSAndroid Build Coastguard Worker executor.log(log);
114*35238bceSAndroid Build Coastguard Worker return log;
115*35238bceSAndroid Build Coastguard Worker }
116*35238bceSAndroid Build Coastguard Worker
117*35238bceSAndroid Build Coastguard Worker bool executorSupported(glu::ShaderType shaderType);
118*35238bceSAndroid Build Coastguard Worker ShaderExecutor *createExecutor(const glu::RenderContext &renderCtx, glu::ShaderType shaderType,
119*35238bceSAndroid Build Coastguard Worker const ShaderSpec &shaderSpec);
120*35238bceSAndroid Build Coastguard Worker
121*35238bceSAndroid Build Coastguard Worker } // namespace ShaderExecUtil
122*35238bceSAndroid Build Coastguard Worker } // namespace gls
123*35238bceSAndroid Build Coastguard Worker } // namespace deqp
124*35238bceSAndroid Build Coastguard Worker
125*35238bceSAndroid Build Coastguard Worker #endif // _GLSSHADEREXECUTIL_HPP
126