xref: /aosp_15_r20/external/deqp/framework/opengl/gluShaderProgram.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker #ifndef _GLUSHADERPROGRAM_HPP
2*35238bceSAndroid Build Coastguard Worker #define _GLUSHADERPROGRAM_HPP
3*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES Utilities
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 and Program helpers.
24*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "gluDefs.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluShaderUtil.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "qpTestLog.h"
30*35238bceSAndroid Build Coastguard Worker 
31*35238bceSAndroid Build Coastguard Worker #include <string>
32*35238bceSAndroid Build Coastguard Worker #include <vector>
33*35238bceSAndroid Build Coastguard Worker 
34*35238bceSAndroid Build Coastguard Worker namespace tcu
35*35238bceSAndroid Build Coastguard Worker {
36*35238bceSAndroid Build Coastguard Worker class TestLog;
37*35238bceSAndroid Build Coastguard Worker }
38*35238bceSAndroid Build Coastguard Worker 
39*35238bceSAndroid Build Coastguard Worker namespace glu
40*35238bceSAndroid Build Coastguard Worker {
41*35238bceSAndroid Build Coastguard Worker 
42*35238bceSAndroid Build Coastguard Worker class RenderContext;
43*35238bceSAndroid Build Coastguard Worker 
44*35238bceSAndroid Build Coastguard Worker typedef std::vector<uint32_t> ShaderBinaryDataType;
45*35238bceSAndroid Build Coastguard Worker 
46*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
47*35238bceSAndroid Build Coastguard Worker  * \brief Shader information (compile status, log, etc.).
48*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
49*35238bceSAndroid Build Coastguard Worker struct ShaderInfo
50*35238bceSAndroid Build Coastguard Worker {
51*35238bceSAndroid Build Coastguard Worker     ShaderType type;        //!< Shader type.
52*35238bceSAndroid Build Coastguard Worker     std::string source;     //!< Shader source.
53*35238bceSAndroid Build Coastguard Worker     std::string infoLog;    //!< Compile info log.
54*35238bceSAndroid Build Coastguard Worker     bool compileOk;         //!< Did compilation succeed?
55*35238bceSAndroid Build Coastguard Worker     uint64_t compileTimeUs; //!< Compile time in microseconds (us).
56*35238bceSAndroid Build Coastguard Worker 
ShaderInfoglu::ShaderInfo57*35238bceSAndroid Build Coastguard Worker     ShaderInfo(void) : type(SHADERTYPE_LAST), compileOk(false), compileTimeUs(0)
58*35238bceSAndroid Build Coastguard Worker     {
59*35238bceSAndroid Build Coastguard Worker     }
60*35238bceSAndroid Build Coastguard Worker };
61*35238bceSAndroid Build Coastguard Worker 
62*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
63*35238bceSAndroid Build Coastguard Worker  * \brief Program information (link status, log).
64*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
65*35238bceSAndroid Build Coastguard Worker struct ProgramInfo
66*35238bceSAndroid Build Coastguard Worker {
67*35238bceSAndroid Build Coastguard Worker     std::string infoLog; //!< Link info log.
68*35238bceSAndroid Build Coastguard Worker     bool linkOk;         //!< Did link succeed?
69*35238bceSAndroid Build Coastguard Worker     uint64_t linkTimeUs; //!< Link time in microseconds (us).
70*35238bceSAndroid Build Coastguard Worker 
ProgramInfoglu::ProgramInfo71*35238bceSAndroid Build Coastguard Worker     ProgramInfo(void) : linkOk(false), linkTimeUs(0)
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 /*--------------------------------------------------------------------*//*!
77*35238bceSAndroid Build Coastguard Worker  * \brief Combined shader compilation and program linking info.
78*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
79*35238bceSAndroid Build Coastguard Worker struct ShaderProgramInfo
80*35238bceSAndroid Build Coastguard Worker {
81*35238bceSAndroid Build Coastguard Worker     glu::ProgramInfo program;
82*35238bceSAndroid Build Coastguard Worker     std::vector<glu::ShaderInfo> shaders;
83*35238bceSAndroid Build Coastguard Worker };
84*35238bceSAndroid Build Coastguard Worker 
85*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
86*35238bceSAndroid Build Coastguard Worker  * \brief Shader object.
87*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
88*35238bceSAndroid Build Coastguard Worker class Shader
89*35238bceSAndroid Build Coastguard Worker {
90*35238bceSAndroid Build Coastguard Worker public:
91*35238bceSAndroid Build Coastguard Worker     Shader(const glw::Functions &gl, ShaderType shaderType);
92*35238bceSAndroid Build Coastguard Worker     Shader(const RenderContext &renderCtx, ShaderType shaderType);
93*35238bceSAndroid Build Coastguard Worker     ~Shader(void);
94*35238bceSAndroid Build Coastguard Worker 
95*35238bceSAndroid Build Coastguard Worker     void setSources(int numSourceStrings, const char *const *sourceStrings, const int *lengths);
96*35238bceSAndroid Build Coastguard Worker     void compile(void);
97*35238bceSAndroid Build Coastguard Worker     void specialize(const char *entryPoint, glw::GLuint numSpecializationConstants, const glw::GLuint *constantIndex,
98*35238bceSAndroid Build Coastguard Worker                     const glw::GLuint *constantValue);
99*35238bceSAndroid Build Coastguard Worker 
getShader(void) const100*35238bceSAndroid Build Coastguard Worker     uint32_t getShader(void) const
101*35238bceSAndroid Build Coastguard Worker     {
102*35238bceSAndroid Build Coastguard Worker         return m_shader;
103*35238bceSAndroid Build Coastguard Worker     }
getInfo(void) const104*35238bceSAndroid Build Coastguard Worker     const ShaderInfo &getInfo(void) const
105*35238bceSAndroid Build Coastguard Worker     {
106*35238bceSAndroid Build Coastguard Worker         return m_info;
107*35238bceSAndroid Build Coastguard Worker     }
108*35238bceSAndroid Build Coastguard Worker 
getType(void) const109*35238bceSAndroid Build Coastguard Worker     glu::ShaderType getType(void) const
110*35238bceSAndroid Build Coastguard Worker     {
111*35238bceSAndroid Build Coastguard Worker         return getInfo().type;
112*35238bceSAndroid Build Coastguard Worker     }
getCompileStatus(void) const113*35238bceSAndroid Build Coastguard Worker     bool getCompileStatus(void) const
114*35238bceSAndroid Build Coastguard Worker     {
115*35238bceSAndroid Build Coastguard Worker         return getInfo().compileOk;
116*35238bceSAndroid Build Coastguard Worker     }
getSource(void) const117*35238bceSAndroid Build Coastguard Worker     const std::string &getSource(void) const
118*35238bceSAndroid Build Coastguard Worker     {
119*35238bceSAndroid Build Coastguard Worker         return getInfo().source;
120*35238bceSAndroid Build Coastguard Worker     }
getInfoLog(void) const121*35238bceSAndroid Build Coastguard Worker     const std::string &getInfoLog(void) const
122*35238bceSAndroid Build Coastguard Worker     {
123*35238bceSAndroid Build Coastguard Worker         return getInfo().infoLog;
124*35238bceSAndroid Build Coastguard Worker     }
125*35238bceSAndroid Build Coastguard Worker 
operator *(void) const126*35238bceSAndroid Build Coastguard Worker     uint32_t operator*(void) const
127*35238bceSAndroid Build Coastguard Worker     {
128*35238bceSAndroid Build Coastguard Worker         return getShader();
129*35238bceSAndroid Build Coastguard Worker     }
130*35238bceSAndroid Build Coastguard Worker 
131*35238bceSAndroid Build Coastguard Worker private:
132*35238bceSAndroid Build Coastguard Worker     Shader(const Shader &other);
133*35238bceSAndroid Build Coastguard Worker     Shader &operator=(const Shader &other);
134*35238bceSAndroid Build Coastguard Worker 
135*35238bceSAndroid Build Coastguard Worker     const glw::Functions &m_gl;
136*35238bceSAndroid Build Coastguard Worker     uint32_t m_shader; //!< Shader handle.
137*35238bceSAndroid Build Coastguard Worker     ShaderInfo m_info; //!< Client-side clone of state for debug / perf reasons.
138*35238bceSAndroid Build Coastguard Worker };
139*35238bceSAndroid Build Coastguard Worker 
140*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
141*35238bceSAndroid Build Coastguard Worker  * \brief Program object.
142*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
143*35238bceSAndroid Build Coastguard Worker class Program
144*35238bceSAndroid Build Coastguard Worker {
145*35238bceSAndroid Build Coastguard Worker public:
146*35238bceSAndroid Build Coastguard Worker     Program(const glw::Functions &gl);
147*35238bceSAndroid Build Coastguard Worker     Program(const RenderContext &renderCtx);
148*35238bceSAndroid Build Coastguard Worker     Program(const RenderContext &renderCtx, uint32_t program);
149*35238bceSAndroid Build Coastguard Worker     ~Program(void);
150*35238bceSAndroid Build Coastguard Worker 
151*35238bceSAndroid Build Coastguard Worker     void attachShader(uint32_t shader);
152*35238bceSAndroid Build Coastguard Worker     void detachShader(uint32_t shader);
153*35238bceSAndroid Build Coastguard Worker 
154*35238bceSAndroid Build Coastguard Worker     void bindAttribLocation(uint32_t location, const char *name);
155*35238bceSAndroid Build Coastguard Worker     void transformFeedbackVaryings(int count, const char *const *varyings, uint32_t bufferMode);
156*35238bceSAndroid Build Coastguard Worker 
157*35238bceSAndroid Build Coastguard Worker     void link(void);
158*35238bceSAndroid Build Coastguard Worker 
getProgram(void) const159*35238bceSAndroid Build Coastguard Worker     uint32_t getProgram(void) const
160*35238bceSAndroid Build Coastguard Worker     {
161*35238bceSAndroid Build Coastguard Worker         return m_program;
162*35238bceSAndroid Build Coastguard Worker     }
getInfo(void) const163*35238bceSAndroid Build Coastguard Worker     const ProgramInfo &getInfo(void) const
164*35238bceSAndroid Build Coastguard Worker     {
165*35238bceSAndroid Build Coastguard Worker         return m_info;
166*35238bceSAndroid Build Coastguard Worker     }
167*35238bceSAndroid Build Coastguard Worker 
getLinkStatus(void) const168*35238bceSAndroid Build Coastguard Worker     bool getLinkStatus(void) const
169*35238bceSAndroid Build Coastguard Worker     {
170*35238bceSAndroid Build Coastguard Worker         return getInfo().linkOk;
171*35238bceSAndroid Build Coastguard Worker     }
getInfoLog(void) const172*35238bceSAndroid Build Coastguard Worker     const std::string &getInfoLog(void) const
173*35238bceSAndroid Build Coastguard Worker     {
174*35238bceSAndroid Build Coastguard Worker         return getInfo().infoLog;
175*35238bceSAndroid Build Coastguard Worker     }
176*35238bceSAndroid Build Coastguard Worker 
177*35238bceSAndroid Build Coastguard Worker     bool isSeparable(void) const;
178*35238bceSAndroid Build Coastguard Worker     void setSeparable(bool separable);
179*35238bceSAndroid Build Coastguard Worker 
180*35238bceSAndroid Build Coastguard Worker     int getUniformLocation(const std::string &name);
181*35238bceSAndroid Build Coastguard Worker 
operator *(void) const182*35238bceSAndroid Build Coastguard Worker     uint32_t operator*(void) const
183*35238bceSAndroid Build Coastguard Worker     {
184*35238bceSAndroid Build Coastguard Worker         return getProgram();
185*35238bceSAndroid Build Coastguard Worker     }
186*35238bceSAndroid Build Coastguard Worker 
187*35238bceSAndroid Build Coastguard Worker private:
188*35238bceSAndroid Build Coastguard Worker     Program(const Program &other);
189*35238bceSAndroid Build Coastguard Worker     Program &operator=(const Program &other);
190*35238bceSAndroid Build Coastguard Worker 
191*35238bceSAndroid Build Coastguard Worker     const glw::Functions &m_gl;
192*35238bceSAndroid Build Coastguard Worker     uint32_t m_program;
193*35238bceSAndroid Build Coastguard Worker     ProgramInfo m_info;
194*35238bceSAndroid Build Coastguard Worker };
195*35238bceSAndroid Build Coastguard Worker 
196*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
197*35238bceSAndroid Build Coastguard Worker  * \brief Program pipeline object.
198*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
199*35238bceSAndroid Build Coastguard Worker class ProgramPipeline
200*35238bceSAndroid Build Coastguard Worker {
201*35238bceSAndroid Build Coastguard Worker public:
202*35238bceSAndroid Build Coastguard Worker     ProgramPipeline(const RenderContext &renderCtx);
203*35238bceSAndroid Build Coastguard Worker     ProgramPipeline(const glw::Functions &gl);
204*35238bceSAndroid Build Coastguard Worker     ~ProgramPipeline(void);
205*35238bceSAndroid Build Coastguard Worker 
getPipeline(void) const206*35238bceSAndroid Build Coastguard Worker     uint32_t getPipeline(void) const
207*35238bceSAndroid Build Coastguard Worker     {
208*35238bceSAndroid Build Coastguard Worker         return m_pipeline;
209*35238bceSAndroid Build Coastguard Worker     }
210*35238bceSAndroid Build Coastguard Worker     void useProgramStages(uint32_t stages, uint32_t program);
211*35238bceSAndroid Build Coastguard Worker     void activeShaderProgram(uint32_t program);
212*35238bceSAndroid Build Coastguard Worker     bool isValid(void);
213*35238bceSAndroid Build Coastguard Worker 
214*35238bceSAndroid Build Coastguard Worker private:
215*35238bceSAndroid Build Coastguard Worker     ProgramPipeline(const ProgramPipeline &other);
216*35238bceSAndroid Build Coastguard Worker     ProgramPipeline &operator=(const ProgramPipeline &other);
217*35238bceSAndroid Build Coastguard Worker 
218*35238bceSAndroid Build Coastguard Worker     const glw::Functions &m_gl;
219*35238bceSAndroid Build Coastguard Worker     uint32_t m_pipeline;
220*35238bceSAndroid Build Coastguard Worker };
221*35238bceSAndroid Build Coastguard Worker 
222*35238bceSAndroid Build Coastguard Worker struct ProgramSources;
223*35238bceSAndroid Build Coastguard Worker struct ProgramBinaries;
224*35238bceSAndroid Build Coastguard Worker 
225*35238bceSAndroid Build Coastguard Worker /*--------------------------------------------------------------------*//*!
226*35238bceSAndroid Build Coastguard Worker  * \brief Shader program manager.
227*35238bceSAndroid Build Coastguard Worker  *
228*35238bceSAndroid Build Coastguard Worker  * ShaderProgram manages both Shader and Program objects, and provides
229*35238bceSAndroid Build Coastguard Worker  * convenient API for constructing such programs.
230*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
231*35238bceSAndroid Build Coastguard Worker class ShaderProgram
232*35238bceSAndroid Build Coastguard Worker {
233*35238bceSAndroid Build Coastguard Worker public:
234*35238bceSAndroid Build Coastguard Worker     ShaderProgram(const glw::Functions &gl, const ProgramSources &sources);
235*35238bceSAndroid Build Coastguard Worker     ShaderProgram(const glw::Functions &gl, const ProgramBinaries &binaries);
236*35238bceSAndroid Build Coastguard Worker     ShaderProgram(const RenderContext &renderCtx, const ProgramSources &sources);
237*35238bceSAndroid Build Coastguard Worker     ShaderProgram(const RenderContext &renderCtx, const ProgramBinaries &binaries);
238*35238bceSAndroid Build Coastguard Worker     ~ShaderProgram(void);
239*35238bceSAndroid Build Coastguard Worker 
isOk(void) const240*35238bceSAndroid Build Coastguard Worker     bool isOk(void) const
241*35238bceSAndroid Build Coastguard Worker     {
242*35238bceSAndroid Build Coastguard Worker         return m_program.getLinkStatus();
243*35238bceSAndroid Build Coastguard Worker     }
getProgram(void) const244*35238bceSAndroid Build Coastguard Worker     uint32_t getProgram(void) const
245*35238bceSAndroid Build Coastguard Worker     {
246*35238bceSAndroid Build Coastguard Worker         return m_program.getProgram();
247*35238bceSAndroid Build Coastguard Worker     }
248*35238bceSAndroid Build Coastguard Worker 
hasShader(glu::ShaderType shaderType) const249*35238bceSAndroid Build Coastguard Worker     bool hasShader(glu::ShaderType shaderType) const
250*35238bceSAndroid Build Coastguard Worker     {
251*35238bceSAndroid Build Coastguard Worker         return !m_shaders[shaderType].empty();
252*35238bceSAndroid Build Coastguard Worker     }
getShader(glu::ShaderType shaderType,int shaderNdx=0) const253*35238bceSAndroid Build Coastguard Worker     Shader *getShader(glu::ShaderType shaderType, int shaderNdx = 0) const
254*35238bceSAndroid Build Coastguard Worker     {
255*35238bceSAndroid Build Coastguard Worker         return m_shaders[shaderType][shaderNdx];
256*35238bceSAndroid Build Coastguard Worker     }
getNumShaders(glu::ShaderType shaderType) const257*35238bceSAndroid Build Coastguard Worker     int getNumShaders(glu::ShaderType shaderType) const
258*35238bceSAndroid Build Coastguard Worker     {
259*35238bceSAndroid Build Coastguard Worker         return (int)m_shaders[shaderType].size();
260*35238bceSAndroid Build Coastguard Worker     }
getShaderInfo(glu::ShaderType shaderType,int shaderNdx=0) const261*35238bceSAndroid Build Coastguard Worker     const ShaderInfo &getShaderInfo(glu::ShaderType shaderType, int shaderNdx = 0) const
262*35238bceSAndroid Build Coastguard Worker     {
263*35238bceSAndroid Build Coastguard Worker         return m_shaders[shaderType][shaderNdx]->getInfo();
264*35238bceSAndroid Build Coastguard Worker     }
getProgramInfo(void) const265*35238bceSAndroid Build Coastguard Worker     const ProgramInfo &getProgramInfo(void) const
266*35238bceSAndroid Build Coastguard Worker     {
267*35238bceSAndroid Build Coastguard Worker         return m_program.getInfo();
268*35238bceSAndroid Build Coastguard Worker     }
269*35238bceSAndroid Build Coastguard Worker 
270*35238bceSAndroid Build Coastguard Worker private:
271*35238bceSAndroid Build Coastguard Worker     ShaderProgram(const ShaderProgram &other);
272*35238bceSAndroid Build Coastguard Worker     ShaderProgram &operator=(const ShaderProgram &other);
273*35238bceSAndroid Build Coastguard Worker     void init(const glw::Functions &gl, const ProgramSources &sources);
274*35238bceSAndroid Build Coastguard Worker     void init(const glw::Functions &gl, const ProgramBinaries &binaries);
275*35238bceSAndroid Build Coastguard Worker     void setBinary(const glw::Functions &gl, std::vector<Shader *> &shaders, glw::GLenum binaryFormat,
276*35238bceSAndroid Build Coastguard Worker                    const void *binaryData, const int length);
277*35238bceSAndroid Build Coastguard Worker 
278*35238bceSAndroid Build Coastguard Worker     std::vector<Shader *> m_shaders[SHADERTYPE_LAST];
279*35238bceSAndroid Build Coastguard Worker     Program m_program;
280*35238bceSAndroid Build Coastguard Worker };
281*35238bceSAndroid Build Coastguard Worker 
282*35238bceSAndroid Build Coastguard Worker // Utilities.
283*35238bceSAndroid Build Coastguard Worker 
284*35238bceSAndroid Build Coastguard Worker uint32_t getGLShaderType(ShaderType shaderType);
285*35238bceSAndroid Build Coastguard Worker uint32_t getGLShaderTypeBit(ShaderType shaderType);
286*35238bceSAndroid Build Coastguard Worker qpShaderType getLogShaderType(ShaderType shaderType);
287*35238bceSAndroid Build Coastguard Worker 
288*35238bceSAndroid Build Coastguard Worker tcu::TestLog &operator<<(tcu::TestLog &log, const ShaderInfo &shaderInfo);
289*35238bceSAndroid Build Coastguard Worker tcu::TestLog &operator<<(tcu::TestLog &log, const ShaderProgramInfo &shaderProgramInfo);
290*35238bceSAndroid Build Coastguard Worker tcu::TestLog &operator<<(tcu::TestLog &log, const ProgramSources &sources);
291*35238bceSAndroid Build Coastguard Worker tcu::TestLog &operator<<(tcu::TestLog &log, const Shader &shader);
292*35238bceSAndroid Build Coastguard Worker tcu::TestLog &operator<<(tcu::TestLog &log, const ShaderProgram &program);
293*35238bceSAndroid Build Coastguard Worker 
294*35238bceSAndroid Build Coastguard Worker // ProgramSources utilities and implementation.
295*35238bceSAndroid Build Coastguard Worker 
296*35238bceSAndroid Build Coastguard Worker struct AttribLocationBinding
297*35238bceSAndroid Build Coastguard Worker {
298*35238bceSAndroid Build Coastguard Worker     std::string name;
299*35238bceSAndroid Build Coastguard Worker     uint32_t location;
300*35238bceSAndroid Build Coastguard Worker 
AttribLocationBindingglu::AttribLocationBinding301*35238bceSAndroid Build Coastguard Worker     AttribLocationBinding(void) : location(0)
302*35238bceSAndroid Build Coastguard Worker     {
303*35238bceSAndroid Build Coastguard Worker     }
AttribLocationBindingglu::AttribLocationBinding304*35238bceSAndroid Build Coastguard Worker     AttribLocationBinding(const std::string &name_, uint32_t location_) : name(name_), location(location_)
305*35238bceSAndroid Build Coastguard Worker     {
306*35238bceSAndroid Build Coastguard Worker     }
307*35238bceSAndroid Build Coastguard Worker };
308*35238bceSAndroid Build Coastguard Worker 
309*35238bceSAndroid Build Coastguard Worker struct TransformFeedbackMode
310*35238bceSAndroid Build Coastguard Worker {
311*35238bceSAndroid Build Coastguard Worker     uint32_t mode;
312*35238bceSAndroid Build Coastguard Worker 
TransformFeedbackModeglu::TransformFeedbackMode313*35238bceSAndroid Build Coastguard Worker     TransformFeedbackMode(void) : mode(0)
314*35238bceSAndroid Build Coastguard Worker     {
315*35238bceSAndroid Build Coastguard Worker     }
TransformFeedbackModeglu::TransformFeedbackMode316*35238bceSAndroid Build Coastguard Worker     TransformFeedbackMode(uint32_t mode_) : mode(mode_)
317*35238bceSAndroid Build Coastguard Worker     {
318*35238bceSAndroid Build Coastguard Worker     }
319*35238bceSAndroid Build Coastguard Worker };
320*35238bceSAndroid Build Coastguard Worker 
321*35238bceSAndroid Build Coastguard Worker struct TransformFeedbackVarying
322*35238bceSAndroid Build Coastguard Worker {
323*35238bceSAndroid Build Coastguard Worker     std::string name;
324*35238bceSAndroid Build Coastguard Worker 
TransformFeedbackVaryingglu::TransformFeedbackVarying325*35238bceSAndroid Build Coastguard Worker     explicit TransformFeedbackVarying(const std::string &name_) : name(name_)
326*35238bceSAndroid Build Coastguard Worker     {
327*35238bceSAndroid Build Coastguard Worker     }
328*35238bceSAndroid Build Coastguard Worker };
329*35238bceSAndroid Build Coastguard Worker 
330*35238bceSAndroid Build Coastguard Worker struct ProgramSeparable
331*35238bceSAndroid Build Coastguard Worker {
332*35238bceSAndroid Build Coastguard Worker     bool separable;
ProgramSeparableglu::ProgramSeparable333*35238bceSAndroid Build Coastguard Worker     explicit ProgramSeparable(bool separable_) : separable(separable_)
334*35238bceSAndroid Build Coastguard Worker     {
335*35238bceSAndroid Build Coastguard Worker     }
336*35238bceSAndroid Build Coastguard Worker };
337*35238bceSAndroid Build Coastguard Worker 
338*35238bceSAndroid Build Coastguard Worker template <typename Iterator>
339*35238bceSAndroid Build Coastguard Worker struct TransformFeedbackVaryings
340*35238bceSAndroid Build Coastguard Worker {
341*35238bceSAndroid Build Coastguard Worker     Iterator begin;
342*35238bceSAndroid Build Coastguard Worker     Iterator end;
343*35238bceSAndroid Build Coastguard Worker 
TransformFeedbackVaryingsglu::TransformFeedbackVaryings344*35238bceSAndroid Build Coastguard Worker     TransformFeedbackVaryings(Iterator begin_, Iterator end_) : begin(begin_), end(end_)
345*35238bceSAndroid Build Coastguard Worker     {
346*35238bceSAndroid Build Coastguard Worker     }
347*35238bceSAndroid Build Coastguard Worker };
348*35238bceSAndroid Build Coastguard Worker 
349*35238bceSAndroid Build Coastguard Worker struct ShaderSource
350*35238bceSAndroid Build Coastguard Worker {
351*35238bceSAndroid Build Coastguard Worker     ShaderType shaderType;
352*35238bceSAndroid Build Coastguard Worker     std::string source;
353*35238bceSAndroid Build Coastguard Worker 
ShaderSourceglu::ShaderSource354*35238bceSAndroid Build Coastguard Worker     ShaderSource(void) : shaderType(SHADERTYPE_LAST)
355*35238bceSAndroid Build Coastguard Worker     {
356*35238bceSAndroid Build Coastguard Worker     }
ShaderSourceglu::ShaderSource357*35238bceSAndroid Build Coastguard Worker     ShaderSource(glu::ShaderType shaderType_, const std::string &source_) : shaderType(shaderType_), source(source_)
358*35238bceSAndroid Build Coastguard Worker     {
359*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(!source_.empty());
360*35238bceSAndroid Build Coastguard Worker     }
361*35238bceSAndroid Build Coastguard Worker };
362*35238bceSAndroid Build Coastguard Worker 
363*35238bceSAndroid Build Coastguard Worker struct VertexSource : public ShaderSource
364*35238bceSAndroid Build Coastguard Worker {
VertexSourceglu::VertexSource365*35238bceSAndroid Build Coastguard Worker     VertexSource(const std::string &source_) : ShaderSource(glu::SHADERTYPE_VERTEX, source_)
366*35238bceSAndroid Build Coastguard Worker     {
367*35238bceSAndroid Build Coastguard Worker     }
368*35238bceSAndroid Build Coastguard Worker };
369*35238bceSAndroid Build Coastguard Worker 
370*35238bceSAndroid Build Coastguard Worker struct FragmentSource : public ShaderSource
371*35238bceSAndroid Build Coastguard Worker {
FragmentSourceglu::FragmentSource372*35238bceSAndroid Build Coastguard Worker     FragmentSource(const std::string &source_) : ShaderSource(glu::SHADERTYPE_FRAGMENT, source_)
373*35238bceSAndroid Build Coastguard Worker     {
374*35238bceSAndroid Build Coastguard Worker     }
375*35238bceSAndroid Build Coastguard Worker };
376*35238bceSAndroid Build Coastguard Worker 
377*35238bceSAndroid Build Coastguard Worker struct GeometrySource : public ShaderSource
378*35238bceSAndroid Build Coastguard Worker {
GeometrySourceglu::GeometrySource379*35238bceSAndroid Build Coastguard Worker     GeometrySource(const std::string &source_) : ShaderSource(glu::SHADERTYPE_GEOMETRY, source_)
380*35238bceSAndroid Build Coastguard Worker     {
381*35238bceSAndroid Build Coastguard Worker     }
382*35238bceSAndroid Build Coastguard Worker };
383*35238bceSAndroid Build Coastguard Worker 
384*35238bceSAndroid Build Coastguard Worker struct ComputeSource : public ShaderSource
385*35238bceSAndroid Build Coastguard Worker {
ComputeSourceglu::ComputeSource386*35238bceSAndroid Build Coastguard Worker     ComputeSource(const std::string &source_) : ShaderSource(glu::SHADERTYPE_COMPUTE, source_)
387*35238bceSAndroid Build Coastguard Worker     {
388*35238bceSAndroid Build Coastguard Worker     }
389*35238bceSAndroid Build Coastguard Worker };
390*35238bceSAndroid Build Coastguard Worker 
391*35238bceSAndroid Build Coastguard Worker struct TessellationControlSource : public ShaderSource
392*35238bceSAndroid Build Coastguard Worker {
TessellationControlSourceglu::TessellationControlSource393*35238bceSAndroid Build Coastguard Worker     TessellationControlSource(const std::string &source_) : ShaderSource(glu::SHADERTYPE_TESSELLATION_CONTROL, source_)
394*35238bceSAndroid Build Coastguard Worker     {
395*35238bceSAndroid Build Coastguard Worker     }
396*35238bceSAndroid Build Coastguard Worker };
397*35238bceSAndroid Build Coastguard Worker 
398*35238bceSAndroid Build Coastguard Worker struct TessellationEvaluationSource : public ShaderSource
399*35238bceSAndroid Build Coastguard Worker {
TessellationEvaluationSourceglu::TessellationEvaluationSource400*35238bceSAndroid Build Coastguard Worker     TessellationEvaluationSource(const std::string &source_)
401*35238bceSAndroid Build Coastguard Worker         : ShaderSource(glu::SHADERTYPE_TESSELLATION_EVALUATION, source_)
402*35238bceSAndroid Build Coastguard Worker     {
403*35238bceSAndroid Build Coastguard Worker     }
404*35238bceSAndroid Build Coastguard Worker };
405*35238bceSAndroid Build Coastguard Worker 
406*35238bceSAndroid Build Coastguard Worker struct RaygenSource : public ShaderSource
407*35238bceSAndroid Build Coastguard Worker {
RaygenSourceglu::RaygenSource408*35238bceSAndroid Build Coastguard Worker     RaygenSource(const std::string &source_) : ShaderSource(glu::SHADERTYPE_RAYGEN, source_)
409*35238bceSAndroid Build Coastguard Worker     {
410*35238bceSAndroid Build Coastguard Worker     }
411*35238bceSAndroid Build Coastguard Worker };
412*35238bceSAndroid Build Coastguard Worker 
413*35238bceSAndroid Build Coastguard Worker struct AnyHitSource : public ShaderSource
414*35238bceSAndroid Build Coastguard Worker {
AnyHitSourceglu::AnyHitSource415*35238bceSAndroid Build Coastguard Worker     AnyHitSource(const std::string &source_) : ShaderSource(glu::SHADERTYPE_ANY_HIT, source_)
416*35238bceSAndroid Build Coastguard Worker     {
417*35238bceSAndroid Build Coastguard Worker     }
418*35238bceSAndroid Build Coastguard Worker };
419*35238bceSAndroid Build Coastguard Worker 
420*35238bceSAndroid Build Coastguard Worker struct ClosestHitSource : public ShaderSource
421*35238bceSAndroid Build Coastguard Worker {
ClosestHitSourceglu::ClosestHitSource422*35238bceSAndroid Build Coastguard Worker     ClosestHitSource(const std::string &source_) : ShaderSource(glu::SHADERTYPE_CLOSEST_HIT, source_)
423*35238bceSAndroid Build Coastguard Worker     {
424*35238bceSAndroid Build Coastguard Worker     }
425*35238bceSAndroid Build Coastguard Worker };
426*35238bceSAndroid Build Coastguard Worker 
427*35238bceSAndroid Build Coastguard Worker struct MissSource : public ShaderSource
428*35238bceSAndroid Build Coastguard Worker {
MissSourceglu::MissSource429*35238bceSAndroid Build Coastguard Worker     MissSource(const std::string &source_) : ShaderSource(glu::SHADERTYPE_MISS, source_)
430*35238bceSAndroid Build Coastguard Worker     {
431*35238bceSAndroid Build Coastguard Worker     }
432*35238bceSAndroid Build Coastguard Worker };
433*35238bceSAndroid Build Coastguard Worker 
434*35238bceSAndroid Build Coastguard Worker struct IntersectionSource : public ShaderSource
435*35238bceSAndroid Build Coastguard Worker {
IntersectionSourceglu::IntersectionSource436*35238bceSAndroid Build Coastguard Worker     IntersectionSource(const std::string &source_) : ShaderSource(glu::SHADERTYPE_INTERSECTION, source_)
437*35238bceSAndroid Build Coastguard Worker     {
438*35238bceSAndroid Build Coastguard Worker     }
439*35238bceSAndroid Build Coastguard Worker };
440*35238bceSAndroid Build Coastguard Worker 
441*35238bceSAndroid Build Coastguard Worker struct CallableSource : public ShaderSource
442*35238bceSAndroid Build Coastguard Worker {
CallableSourceglu::CallableSource443*35238bceSAndroid Build Coastguard Worker     CallableSource(const std::string &source_) : ShaderSource(glu::SHADERTYPE_CALLABLE, source_)
444*35238bceSAndroid Build Coastguard Worker     {
445*35238bceSAndroid Build Coastguard Worker     }
446*35238bceSAndroid Build Coastguard Worker };
447*35238bceSAndroid Build Coastguard Worker 
448*35238bceSAndroid Build Coastguard Worker struct TaskSource : public ShaderSource
449*35238bceSAndroid Build Coastguard Worker {
TaskSourceglu::TaskSource450*35238bceSAndroid Build Coastguard Worker     TaskSource(const std::string &source_) : ShaderSource(glu::SHADERTYPE_TASK, source_)
451*35238bceSAndroid Build Coastguard Worker     {
452*35238bceSAndroid Build Coastguard Worker     }
453*35238bceSAndroid Build Coastguard Worker };
454*35238bceSAndroid Build Coastguard Worker 
455*35238bceSAndroid Build Coastguard Worker struct MeshSource : public ShaderSource
456*35238bceSAndroid Build Coastguard Worker {
MeshSourceglu::MeshSource457*35238bceSAndroid Build Coastguard Worker     MeshSource(const std::string &source_) : ShaderSource(glu::SHADERTYPE_MESH, source_)
458*35238bceSAndroid Build Coastguard Worker     {
459*35238bceSAndroid Build Coastguard Worker     }
460*35238bceSAndroid Build Coastguard Worker };
461*35238bceSAndroid Build Coastguard Worker 
462*35238bceSAndroid Build Coastguard Worker struct ProgramSources
463*35238bceSAndroid Build Coastguard Worker {
464*35238bceSAndroid Build Coastguard Worker     std::vector<std::string> sources[SHADERTYPE_LAST];
465*35238bceSAndroid Build Coastguard Worker     std::vector<AttribLocationBinding> attribLocationBindings;
466*35238bceSAndroid Build Coastguard Worker 
467*35238bceSAndroid Build Coastguard Worker     uint32_t transformFeedbackBufferMode; //!< TF buffer mode, or GL_NONE.
468*35238bceSAndroid Build Coastguard Worker     std::vector<std::string> transformFeedbackVaryings;
469*35238bceSAndroid Build Coastguard Worker     bool separable;
470*35238bceSAndroid Build Coastguard Worker 
ProgramSourcesglu::ProgramSources471*35238bceSAndroid Build Coastguard Worker     ProgramSources(void) : transformFeedbackBufferMode(0), separable(false)
472*35238bceSAndroid Build Coastguard Worker     {
473*35238bceSAndroid Build Coastguard Worker     }
474*35238bceSAndroid Build Coastguard Worker 
operator <<glu::ProgramSources475*35238bceSAndroid Build Coastguard Worker     ProgramSources &operator<<(const AttribLocationBinding &binding)
476*35238bceSAndroid Build Coastguard Worker     {
477*35238bceSAndroid Build Coastguard Worker         attribLocationBindings.push_back(binding);
478*35238bceSAndroid Build Coastguard Worker         return *this;
479*35238bceSAndroid Build Coastguard Worker     }
operator <<glu::ProgramSources480*35238bceSAndroid Build Coastguard Worker     ProgramSources &operator<<(const TransformFeedbackMode &mode)
481*35238bceSAndroid Build Coastguard Worker     {
482*35238bceSAndroid Build Coastguard Worker         transformFeedbackBufferMode = mode.mode;
483*35238bceSAndroid Build Coastguard Worker         return *this;
484*35238bceSAndroid Build Coastguard Worker     }
operator <<glu::ProgramSources485*35238bceSAndroid Build Coastguard Worker     ProgramSources &operator<<(const TransformFeedbackVarying &varying)
486*35238bceSAndroid Build Coastguard Worker     {
487*35238bceSAndroid Build Coastguard Worker         transformFeedbackVaryings.push_back(varying.name);
488*35238bceSAndroid Build Coastguard Worker         return *this;
489*35238bceSAndroid Build Coastguard Worker     }
operator <<glu::ProgramSources490*35238bceSAndroid Build Coastguard Worker     ProgramSources &operator<<(const ShaderSource &shaderSource)
491*35238bceSAndroid Build Coastguard Worker     {
492*35238bceSAndroid Build Coastguard Worker         sources[shaderSource.shaderType].push_back(shaderSource.source);
493*35238bceSAndroid Build Coastguard Worker         return *this;
494*35238bceSAndroid Build Coastguard Worker     }
operator <<glu::ProgramSources495*35238bceSAndroid Build Coastguard Worker     ProgramSources &operator<<(const ProgramSeparable &progSeparable)
496*35238bceSAndroid Build Coastguard Worker     {
497*35238bceSAndroid Build Coastguard Worker         separable = progSeparable.separable;
498*35238bceSAndroid Build Coastguard Worker         return *this;
499*35238bceSAndroid Build Coastguard Worker     }
500*35238bceSAndroid Build Coastguard Worker 
501*35238bceSAndroid Build Coastguard Worker     template <typename Iterator>
502*35238bceSAndroid Build Coastguard Worker     ProgramSources &operator<<(const TransformFeedbackVaryings<Iterator> &varyings);
503*35238bceSAndroid Build Coastguard Worker };
504*35238bceSAndroid Build Coastguard Worker 
505*35238bceSAndroid Build Coastguard Worker struct SpecializationData
506*35238bceSAndroid Build Coastguard Worker {
507*35238bceSAndroid Build Coastguard Worker     uint32_t index;
508*35238bceSAndroid Build Coastguard Worker     uint32_t value;
509*35238bceSAndroid Build Coastguard Worker 
SpecializationDataglu::SpecializationData510*35238bceSAndroid Build Coastguard Worker     SpecializationData(void) : index(0), value(0)
511*35238bceSAndroid Build Coastguard Worker     {
512*35238bceSAndroid Build Coastguard Worker     }
SpecializationDataglu::SpecializationData513*35238bceSAndroid Build Coastguard Worker     SpecializationData(const uint32_t index_, const uint32_t value_) : index(index_), value(value_)
514*35238bceSAndroid Build Coastguard Worker     {
515*35238bceSAndroid Build Coastguard Worker     }
516*35238bceSAndroid Build Coastguard Worker };
517*35238bceSAndroid Build Coastguard Worker 
518*35238bceSAndroid Build Coastguard Worker struct ShaderBinary
519*35238bceSAndroid Build Coastguard Worker {
520*35238bceSAndroid Build Coastguard Worker     ShaderBinaryDataType binary;
521*35238bceSAndroid Build Coastguard Worker     std::vector<ShaderType> shaderTypes;
522*35238bceSAndroid Build Coastguard Worker     std::vector<std::string> shaderEntryPoints;
523*35238bceSAndroid Build Coastguard Worker     std::vector<uint32_t> specializationIndices;
524*35238bceSAndroid Build Coastguard Worker     std::vector<uint32_t> specializationValues;
525*35238bceSAndroid Build Coastguard Worker 
ShaderBinaryglu::ShaderBinary526*35238bceSAndroid Build Coastguard Worker     ShaderBinary(void)
527*35238bceSAndroid Build Coastguard Worker     {
528*35238bceSAndroid Build Coastguard Worker     }
ShaderBinaryglu::ShaderBinary529*35238bceSAndroid Build Coastguard Worker     ShaderBinary(const ShaderBinaryDataType binary_) : binary(binary_)
530*35238bceSAndroid Build Coastguard Worker     {
531*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(!binary_.empty());
532*35238bceSAndroid Build Coastguard Worker     }
ShaderBinaryglu::ShaderBinary533*35238bceSAndroid Build Coastguard Worker     ShaderBinary(const ShaderBinaryDataType binary_, glu::ShaderType shaderType_) : binary(binary_)
534*35238bceSAndroid Build Coastguard Worker     {
535*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(!binary_.empty());
536*35238bceSAndroid Build Coastguard Worker         shaderTypes.push_back(shaderType_);
537*35238bceSAndroid Build Coastguard Worker         shaderEntryPoints.push_back("main");
538*35238bceSAndroid Build Coastguard Worker     }
539*35238bceSAndroid Build Coastguard Worker 
operator <<glu::ShaderBinary540*35238bceSAndroid Build Coastguard Worker     ShaderBinary &operator<<(const ShaderType &shaderType)
541*35238bceSAndroid Build Coastguard Worker     {
542*35238bceSAndroid Build Coastguard Worker         shaderTypes.push_back(shaderType);
543*35238bceSAndroid Build Coastguard Worker         return *this;
544*35238bceSAndroid Build Coastguard Worker     }
545*35238bceSAndroid Build Coastguard Worker 
operator <<glu::ShaderBinary546*35238bceSAndroid Build Coastguard Worker     ShaderBinary &operator<<(const std::string &entryPoint)
547*35238bceSAndroid Build Coastguard Worker     {
548*35238bceSAndroid Build Coastguard Worker         shaderEntryPoints.push_back(entryPoint);
549*35238bceSAndroid Build Coastguard Worker         return *this;
550*35238bceSAndroid Build Coastguard Worker     }
551*35238bceSAndroid Build Coastguard Worker 
operator <<glu::ShaderBinary552*35238bceSAndroid Build Coastguard Worker     ShaderBinary &operator<<(const SpecializationData &specData)
553*35238bceSAndroid Build Coastguard Worker     {
554*35238bceSAndroid Build Coastguard Worker         specializationIndices.push_back(specData.index);
555*35238bceSAndroid Build Coastguard Worker         specializationValues.push_back(specData.value);
556*35238bceSAndroid Build Coastguard Worker         return *this;
557*35238bceSAndroid Build Coastguard Worker     }
558*35238bceSAndroid Build Coastguard Worker };
559*35238bceSAndroid Build Coastguard Worker 
560*35238bceSAndroid Build Coastguard Worker struct VertexBinary : public ShaderBinary
561*35238bceSAndroid Build Coastguard Worker {
VertexBinaryglu::VertexBinary562*35238bceSAndroid Build Coastguard Worker     VertexBinary(const ShaderBinaryDataType binary_) : ShaderBinary(binary_, glu::SHADERTYPE_VERTEX)
563*35238bceSAndroid Build Coastguard Worker     {
564*35238bceSAndroid Build Coastguard Worker     }
565*35238bceSAndroid Build Coastguard Worker };
566*35238bceSAndroid Build Coastguard Worker 
567*35238bceSAndroid Build Coastguard Worker struct FragmentBinary : public ShaderBinary
568*35238bceSAndroid Build Coastguard Worker {
FragmentBinaryglu::FragmentBinary569*35238bceSAndroid Build Coastguard Worker     FragmentBinary(const ShaderBinaryDataType binary_) : ShaderBinary(binary_, glu::SHADERTYPE_FRAGMENT)
570*35238bceSAndroid Build Coastguard Worker     {
571*35238bceSAndroid Build Coastguard Worker     }
572*35238bceSAndroid Build Coastguard Worker };
573*35238bceSAndroid Build Coastguard Worker 
574*35238bceSAndroid Build Coastguard Worker struct GeometryBinary : public ShaderBinary
575*35238bceSAndroid Build Coastguard Worker {
GeometryBinaryglu::GeometryBinary576*35238bceSAndroid Build Coastguard Worker     GeometryBinary(const ShaderBinaryDataType binary_) : ShaderBinary(binary_, glu::SHADERTYPE_GEOMETRY)
577*35238bceSAndroid Build Coastguard Worker     {
578*35238bceSAndroid Build Coastguard Worker     }
579*35238bceSAndroid Build Coastguard Worker };
580*35238bceSAndroid Build Coastguard Worker 
581*35238bceSAndroid Build Coastguard Worker struct ComputeBinary : public ShaderBinary
582*35238bceSAndroid Build Coastguard Worker {
ComputeBinaryglu::ComputeBinary583*35238bceSAndroid Build Coastguard Worker     ComputeBinary(const ShaderBinaryDataType binary_) : ShaderBinary(binary_, glu::SHADERTYPE_COMPUTE)
584*35238bceSAndroid Build Coastguard Worker     {
585*35238bceSAndroid Build Coastguard Worker     }
586*35238bceSAndroid Build Coastguard Worker };
587*35238bceSAndroid Build Coastguard Worker 
588*35238bceSAndroid Build Coastguard Worker struct TessellationControlBinary : public ShaderBinary
589*35238bceSAndroid Build Coastguard Worker {
TessellationControlBinaryglu::TessellationControlBinary590*35238bceSAndroid Build Coastguard Worker     TessellationControlBinary(const ShaderBinaryDataType binary_)
591*35238bceSAndroid Build Coastguard Worker         : ShaderBinary(binary_, glu::SHADERTYPE_TESSELLATION_CONTROL)
592*35238bceSAndroid Build Coastguard Worker     {
593*35238bceSAndroid Build Coastguard Worker     }
594*35238bceSAndroid Build Coastguard Worker };
595*35238bceSAndroid Build Coastguard Worker 
596*35238bceSAndroid Build Coastguard Worker struct TessellationEvaluationBinary : public ShaderBinary
597*35238bceSAndroid Build Coastguard Worker {
TessellationEvaluationBinaryglu::TessellationEvaluationBinary598*35238bceSAndroid Build Coastguard Worker     TessellationEvaluationBinary(const ShaderBinaryDataType binary_)
599*35238bceSAndroid Build Coastguard Worker         : ShaderBinary(binary_, glu::SHADERTYPE_TESSELLATION_EVALUATION)
600*35238bceSAndroid Build Coastguard Worker     {
601*35238bceSAndroid Build Coastguard Worker     }
602*35238bceSAndroid Build Coastguard Worker };
603*35238bceSAndroid Build Coastguard Worker 
604*35238bceSAndroid Build Coastguard Worker struct ProgramBinaries
605*35238bceSAndroid Build Coastguard Worker {
606*35238bceSAndroid Build Coastguard Worker     std::vector<ShaderBinary> binaries;
607*35238bceSAndroid Build Coastguard Worker 
608*35238bceSAndroid Build Coastguard Worker     glw::GLenum binaryFormat;
609*35238bceSAndroid Build Coastguard Worker 
ProgramBinariesglu::ProgramBinaries610*35238bceSAndroid Build Coastguard Worker     ProgramBinaries(void) : binaryFormat(GL_SHADER_BINARY_FORMAT_SPIR_V_ARB)
611*35238bceSAndroid Build Coastguard Worker     {
612*35238bceSAndroid Build Coastguard Worker     }
ProgramBinariesglu::ProgramBinaries613*35238bceSAndroid Build Coastguard Worker     ProgramBinaries(glw::GLenum binaryFormat_) : binaryFormat(binaryFormat_)
614*35238bceSAndroid Build Coastguard Worker     {
615*35238bceSAndroid Build Coastguard Worker     }
616*35238bceSAndroid Build Coastguard Worker 
operator <<glu::ProgramBinaries617*35238bceSAndroid Build Coastguard Worker     ProgramBinaries &operator<<(const ShaderBinary &shaderBinary)
618*35238bceSAndroid Build Coastguard Worker     {
619*35238bceSAndroid Build Coastguard Worker         binaries.push_back(shaderBinary);
620*35238bceSAndroid Build Coastguard Worker         return *this;
621*35238bceSAndroid Build Coastguard Worker     }
622*35238bceSAndroid Build Coastguard Worker };
623*35238bceSAndroid Build Coastguard Worker 
624*35238bceSAndroid Build Coastguard Worker template <typename Iterator>
operator <<(const TransformFeedbackVaryings<Iterator> & varyings)625*35238bceSAndroid Build Coastguard Worker inline ProgramSources &ProgramSources::operator<<(const TransformFeedbackVaryings<Iterator> &varyings)
626*35238bceSAndroid Build Coastguard Worker {
627*35238bceSAndroid Build Coastguard Worker     for (Iterator cur = varyings.begin; cur != varyings.end; ++cur)
628*35238bceSAndroid Build Coastguard Worker         transformFeedbackVaryings.push_back(*cur);
629*35238bceSAndroid Build Coastguard Worker     return *this;
630*35238bceSAndroid Build Coastguard Worker }
631*35238bceSAndroid Build Coastguard Worker 
632*35238bceSAndroid Build Coastguard Worker //! Helper for constructing vertex-fragment source pair.
makeVtxFragSources(const std::string & vertexSrc,const std::string & fragmentSrc)633*35238bceSAndroid Build Coastguard Worker inline ProgramSources makeVtxFragSources(const std::string &vertexSrc, const std::string &fragmentSrc)
634*35238bceSAndroid Build Coastguard Worker {
635*35238bceSAndroid Build Coastguard Worker     ProgramSources sources;
636*35238bceSAndroid Build Coastguard Worker     sources.sources[SHADERTYPE_VERTEX].push_back(vertexSrc);
637*35238bceSAndroid Build Coastguard Worker     sources.sources[SHADERTYPE_FRAGMENT].push_back(fragmentSrc);
638*35238bceSAndroid Build Coastguard Worker     return sources;
639*35238bceSAndroid Build Coastguard Worker }
640*35238bceSAndroid Build Coastguard Worker 
641*35238bceSAndroid Build Coastguard Worker } // namespace glu
642*35238bceSAndroid Build Coastguard Worker 
643*35238bceSAndroid Build Coastguard Worker #endif // _GLUSHADERPROGRAM_HPP
644