1*35238bceSAndroid Build Coastguard Worker #ifndef _SGLRSHADERPROGRAM_HPP 2*35238bceSAndroid Build Coastguard Worker #define _SGLRSHADERPROGRAM_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 SGLR shader program. 24*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/ 25*35238bceSAndroid Build Coastguard Worker 26*35238bceSAndroid Build Coastguard Worker #include "tcuDefs.hpp" 27*35238bceSAndroid Build Coastguard Worker #include "rrShaders.hpp" 28*35238bceSAndroid Build Coastguard Worker #include "gluShaderUtil.hpp" 29*35238bceSAndroid Build Coastguard Worker 30*35238bceSAndroid Build Coastguard Worker #include <vector> 31*35238bceSAndroid Build Coastguard Worker #include <string> 32*35238bceSAndroid Build Coastguard Worker 33*35238bceSAndroid Build Coastguard Worker namespace sglr 34*35238bceSAndroid Build Coastguard Worker { 35*35238bceSAndroid Build Coastguard Worker 36*35238bceSAndroid Build Coastguard Worker namespace rc 37*35238bceSAndroid Build Coastguard Worker { 38*35238bceSAndroid Build Coastguard Worker class Texture1D; 39*35238bceSAndroid Build Coastguard Worker class Texture2D; 40*35238bceSAndroid Build Coastguard Worker class TextureCube; 41*35238bceSAndroid Build Coastguard Worker class Texture2DArray; 42*35238bceSAndroid Build Coastguard Worker class Texture3D; 43*35238bceSAndroid Build Coastguard Worker class TextureCubeArray; 44*35238bceSAndroid Build Coastguard Worker } // namespace rc 45*35238bceSAndroid Build Coastguard Worker 46*35238bceSAndroid Build Coastguard Worker class ShaderProgram; 47*35238bceSAndroid Build Coastguard Worker 48*35238bceSAndroid Build Coastguard Worker namespace pdec 49*35238bceSAndroid Build Coastguard Worker { 50*35238bceSAndroid Build Coastguard Worker 51*35238bceSAndroid Build Coastguard Worker enum VaryingFlags 52*35238bceSAndroid Build Coastguard Worker { 53*35238bceSAndroid Build Coastguard Worker VARYINGFLAG_NONE = 0, 54*35238bceSAndroid Build Coastguard Worker VARYINGFLAG_FLATSHADE = (1 << 0), 55*35238bceSAndroid Build Coastguard Worker }; 56*35238bceSAndroid Build Coastguard Worker 57*35238bceSAndroid Build Coastguard Worker struct VertexAttribute 58*35238bceSAndroid Build Coastguard Worker { VertexAttributesglr::pdec::VertexAttribute59*35238bceSAndroid Build Coastguard Worker VertexAttribute(const std::string &name_, rr::GenericVecType type_) : name(name_), type(type_) 60*35238bceSAndroid Build Coastguard Worker { 61*35238bceSAndroid Build Coastguard Worker } 62*35238bceSAndroid Build Coastguard Worker 63*35238bceSAndroid Build Coastguard Worker std::string name; 64*35238bceSAndroid Build Coastguard Worker rr::GenericVecType type; 65*35238bceSAndroid Build Coastguard Worker }; 66*35238bceSAndroid Build Coastguard Worker 67*35238bceSAndroid Build Coastguard Worker struct VertexToFragmentVarying 68*35238bceSAndroid Build Coastguard Worker { VertexToFragmentVaryingsglr::pdec::VertexToFragmentVarying69*35238bceSAndroid Build Coastguard Worker VertexToFragmentVarying(rr::GenericVecType type_, int flags = VARYINGFLAG_NONE) 70*35238bceSAndroid Build Coastguard Worker : type(type_) 71*35238bceSAndroid Build Coastguard Worker , flatshade((flags & VARYINGFLAG_FLATSHADE) != 0) 72*35238bceSAndroid Build Coastguard Worker { 73*35238bceSAndroid Build Coastguard Worker } 74*35238bceSAndroid Build Coastguard Worker 75*35238bceSAndroid Build Coastguard Worker rr::GenericVecType type; 76*35238bceSAndroid Build Coastguard Worker bool flatshade; 77*35238bceSAndroid Build Coastguard Worker }; 78*35238bceSAndroid Build Coastguard Worker 79*35238bceSAndroid Build Coastguard Worker struct VertexToGeometryVarying 80*35238bceSAndroid Build Coastguard Worker { VertexToGeometryVaryingsglr::pdec::VertexToGeometryVarying81*35238bceSAndroid Build Coastguard Worker VertexToGeometryVarying(rr::GenericVecType type_, int flags = VARYINGFLAG_NONE) 82*35238bceSAndroid Build Coastguard Worker : type(type_) 83*35238bceSAndroid Build Coastguard Worker , flatshade((flags & VARYINGFLAG_FLATSHADE) != 0) 84*35238bceSAndroid Build Coastguard Worker { 85*35238bceSAndroid Build Coastguard Worker } 86*35238bceSAndroid Build Coastguard Worker 87*35238bceSAndroid Build Coastguard Worker rr::GenericVecType type; 88*35238bceSAndroid Build Coastguard Worker bool flatshade; 89*35238bceSAndroid Build Coastguard Worker }; 90*35238bceSAndroid Build Coastguard Worker 91*35238bceSAndroid Build Coastguard Worker struct GeometryToFragmentVarying 92*35238bceSAndroid Build Coastguard Worker { GeometryToFragmentVaryingsglr::pdec::GeometryToFragmentVarying93*35238bceSAndroid Build Coastguard Worker GeometryToFragmentVarying(rr::GenericVecType type_, int flags = VARYINGFLAG_NONE) 94*35238bceSAndroid Build Coastguard Worker : type(type_) 95*35238bceSAndroid Build Coastguard Worker , flatshade((flags & VARYINGFLAG_FLATSHADE) != 0) 96*35238bceSAndroid Build Coastguard Worker { 97*35238bceSAndroid Build Coastguard Worker } 98*35238bceSAndroid Build Coastguard Worker 99*35238bceSAndroid Build Coastguard Worker rr::GenericVecType type; 100*35238bceSAndroid Build Coastguard Worker bool flatshade; 101*35238bceSAndroid Build Coastguard Worker }; 102*35238bceSAndroid Build Coastguard Worker 103*35238bceSAndroid Build Coastguard Worker struct FragmentOutput 104*35238bceSAndroid Build Coastguard Worker { FragmentOutputsglr::pdec::FragmentOutput105*35238bceSAndroid Build Coastguard Worker FragmentOutput(rr::GenericVecType type_) : type(type_) 106*35238bceSAndroid Build Coastguard Worker { 107*35238bceSAndroid Build Coastguard Worker } 108*35238bceSAndroid Build Coastguard Worker 109*35238bceSAndroid Build Coastguard Worker rr::GenericVecType type; 110*35238bceSAndroid Build Coastguard Worker }; 111*35238bceSAndroid Build Coastguard Worker 112*35238bceSAndroid Build Coastguard Worker struct Uniform 113*35238bceSAndroid Build Coastguard Worker { Uniformsglr::pdec::Uniform114*35238bceSAndroid Build Coastguard Worker Uniform(const std::string &name_, glu::DataType type_) : name(name_), type(type_) 115*35238bceSAndroid Build Coastguard Worker { 116*35238bceSAndroid Build Coastguard Worker } 117*35238bceSAndroid Build Coastguard Worker 118*35238bceSAndroid Build Coastguard Worker std::string name; 119*35238bceSAndroid Build Coastguard Worker glu::DataType type; 120*35238bceSAndroid Build Coastguard Worker }; 121*35238bceSAndroid Build Coastguard Worker 122*35238bceSAndroid Build Coastguard Worker struct VertexSource 123*35238bceSAndroid Build Coastguard Worker { VertexSourcesglr::pdec::VertexSource124*35238bceSAndroid Build Coastguard Worker VertexSource(const std::string &str) : source(str) 125*35238bceSAndroid Build Coastguard Worker { 126*35238bceSAndroid Build Coastguard Worker } 127*35238bceSAndroid Build Coastguard Worker 128*35238bceSAndroid Build Coastguard Worker std::string source; 129*35238bceSAndroid Build Coastguard Worker }; 130*35238bceSAndroid Build Coastguard Worker 131*35238bceSAndroid Build Coastguard Worker struct FragmentSource 132*35238bceSAndroid Build Coastguard Worker { FragmentSourcesglr::pdec::FragmentSource133*35238bceSAndroid Build Coastguard Worker FragmentSource(const std::string &str) : source(str) 134*35238bceSAndroid Build Coastguard Worker { 135*35238bceSAndroid Build Coastguard Worker } 136*35238bceSAndroid Build Coastguard Worker 137*35238bceSAndroid Build Coastguard Worker std::string source; 138*35238bceSAndroid Build Coastguard Worker }; 139*35238bceSAndroid Build Coastguard Worker 140*35238bceSAndroid Build Coastguard Worker struct GeometrySource 141*35238bceSAndroid Build Coastguard Worker { GeometrySourcesglr::pdec::GeometrySource142*35238bceSAndroid Build Coastguard Worker GeometrySource(const std::string &str) : source(str) 143*35238bceSAndroid Build Coastguard Worker { 144*35238bceSAndroid Build Coastguard Worker } 145*35238bceSAndroid Build Coastguard Worker 146*35238bceSAndroid Build Coastguard Worker std::string source; 147*35238bceSAndroid Build Coastguard Worker }; 148*35238bceSAndroid Build Coastguard Worker 149*35238bceSAndroid Build Coastguard Worker struct GeometryShaderDeclaration 150*35238bceSAndroid Build Coastguard Worker { GeometryShaderDeclarationsglr::pdec::GeometryShaderDeclaration151*35238bceSAndroid Build Coastguard Worker GeometryShaderDeclaration(rr::GeometryShaderInputType inputType_, rr::GeometryShaderOutputType outputType_, 152*35238bceSAndroid Build Coastguard Worker size_t numOutputVertices_, size_t numInvocations_ = 1) 153*35238bceSAndroid Build Coastguard Worker : inputType(inputType_) 154*35238bceSAndroid Build Coastguard Worker , outputType(outputType_) 155*35238bceSAndroid Build Coastguard Worker , numOutputVertices(numOutputVertices_) 156*35238bceSAndroid Build Coastguard Worker , numInvocations(numInvocations_) 157*35238bceSAndroid Build Coastguard Worker { 158*35238bceSAndroid Build Coastguard Worker } 159*35238bceSAndroid Build Coastguard Worker 160*35238bceSAndroid Build Coastguard Worker rr::GeometryShaderInputType inputType; 161*35238bceSAndroid Build Coastguard Worker rr::GeometryShaderOutputType outputType; 162*35238bceSAndroid Build Coastguard Worker size_t numOutputVertices; 163*35238bceSAndroid Build Coastguard Worker size_t numInvocations; 164*35238bceSAndroid Build Coastguard Worker }; 165*35238bceSAndroid Build Coastguard Worker 166*35238bceSAndroid Build Coastguard Worker class ShaderProgramDeclaration 167*35238bceSAndroid Build Coastguard Worker { 168*35238bceSAndroid Build Coastguard Worker public: 169*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration(void); 170*35238bceSAndroid Build Coastguard Worker 171*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration &operator<<(const VertexAttribute &); 172*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration &operator<<(const VertexToFragmentVarying &); 173*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration &operator<<(const VertexToGeometryVarying &); 174*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration &operator<<(const GeometryToFragmentVarying &); 175*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration &operator<<(const FragmentOutput &); 176*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration &operator<<(const Uniform &); 177*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration &operator<<(const VertexSource &); 178*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration &operator<<(const FragmentSource &); 179*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration &operator<<(const GeometrySource &); 180*35238bceSAndroid Build Coastguard Worker ShaderProgramDeclaration &operator<<(const GeometryShaderDeclaration &); 181*35238bceSAndroid Build Coastguard Worker 182*35238bceSAndroid Build Coastguard Worker private: hasGeometryShader(void) const183*35238bceSAndroid Build Coastguard Worker inline bool hasGeometryShader(void) const 184*35238bceSAndroid Build Coastguard Worker { 185*35238bceSAndroid Build Coastguard Worker return m_geometryShaderSet; 186*35238bceSAndroid Build Coastguard Worker } getVertexInputCount(void) const187*35238bceSAndroid Build Coastguard Worker inline size_t getVertexInputCount(void) const 188*35238bceSAndroid Build Coastguard Worker { 189*35238bceSAndroid Build Coastguard Worker return m_vertexAttributes.size(); 190*35238bceSAndroid Build Coastguard Worker } getVertexOutputCount(void) const191*35238bceSAndroid Build Coastguard Worker inline size_t getVertexOutputCount(void) const 192*35238bceSAndroid Build Coastguard Worker { 193*35238bceSAndroid Build Coastguard Worker return hasGeometryShader() ? m_vertexToGeometryVaryings.size() : m_vertexToFragmentVaryings.size(); 194*35238bceSAndroid Build Coastguard Worker } getFragmentInputCount(void) const195*35238bceSAndroid Build Coastguard Worker inline size_t getFragmentInputCount(void) const 196*35238bceSAndroid Build Coastguard Worker { 197*35238bceSAndroid Build Coastguard Worker return hasGeometryShader() ? m_geometryToFragmentVaryings.size() : m_vertexToFragmentVaryings.size(); 198*35238bceSAndroid Build Coastguard Worker } getFragmentOutputCount(void) const199*35238bceSAndroid Build Coastguard Worker inline size_t getFragmentOutputCount(void) const 200*35238bceSAndroid Build Coastguard Worker { 201*35238bceSAndroid Build Coastguard Worker return m_fragmentOutputs.size(); 202*35238bceSAndroid Build Coastguard Worker } getGeometryInputCount(void) const203*35238bceSAndroid Build Coastguard Worker inline size_t getGeometryInputCount(void) const 204*35238bceSAndroid Build Coastguard Worker { 205*35238bceSAndroid Build Coastguard Worker return hasGeometryShader() ? m_vertexToGeometryVaryings.size() : 0; 206*35238bceSAndroid Build Coastguard Worker } getGeometryOutputCount(void) const207*35238bceSAndroid Build Coastguard Worker inline size_t getGeometryOutputCount(void) const 208*35238bceSAndroid Build Coastguard Worker { 209*35238bceSAndroid Build Coastguard Worker return hasGeometryShader() ? m_geometryToFragmentVaryings.size() : 0; 210*35238bceSAndroid Build Coastguard Worker } 211*35238bceSAndroid Build Coastguard Worker 212*35238bceSAndroid Build Coastguard Worker bool valid(void) const; 213*35238bceSAndroid Build Coastguard Worker 214*35238bceSAndroid Build Coastguard Worker std::vector<VertexAttribute> m_vertexAttributes; 215*35238bceSAndroid Build Coastguard Worker std::vector<VertexToFragmentVarying> m_vertexToFragmentVaryings; 216*35238bceSAndroid Build Coastguard Worker std::vector<VertexToGeometryVarying> m_vertexToGeometryVaryings; 217*35238bceSAndroid Build Coastguard Worker std::vector<GeometryToFragmentVarying> m_geometryToFragmentVaryings; 218*35238bceSAndroid Build Coastguard Worker std::vector<FragmentOutput> m_fragmentOutputs; 219*35238bceSAndroid Build Coastguard Worker std::vector<Uniform> m_uniforms; 220*35238bceSAndroid Build Coastguard Worker std::string m_vertexSource; 221*35238bceSAndroid Build Coastguard Worker std::string m_fragmentSource; 222*35238bceSAndroid Build Coastguard Worker std::string m_geometrySource; 223*35238bceSAndroid Build Coastguard Worker GeometryShaderDeclaration m_geometryDecl; 224*35238bceSAndroid Build Coastguard Worker 225*35238bceSAndroid Build Coastguard Worker bool m_vertexShaderSet; 226*35238bceSAndroid Build Coastguard Worker bool m_fragmentShaderSet; 227*35238bceSAndroid Build Coastguard Worker bool m_geometryShaderSet; 228*35238bceSAndroid Build Coastguard Worker 229*35238bceSAndroid Build Coastguard Worker friend class ::sglr::ShaderProgram; 230*35238bceSAndroid Build Coastguard Worker }; 231*35238bceSAndroid Build Coastguard Worker 232*35238bceSAndroid Build Coastguard Worker } // namespace pdec 233*35238bceSAndroid Build Coastguard Worker 234*35238bceSAndroid Build Coastguard Worker struct UniformSlot 235*35238bceSAndroid Build Coastguard Worker { 236*35238bceSAndroid Build Coastguard Worker std::string name; 237*35238bceSAndroid Build Coastguard Worker glu::DataType type; 238*35238bceSAndroid Build Coastguard Worker 239*35238bceSAndroid Build Coastguard Worker union 240*35238bceSAndroid Build Coastguard Worker { 241*35238bceSAndroid Build Coastguard Worker int32_t i; 242*35238bceSAndroid Build Coastguard Worker int32_t i4[4]; 243*35238bceSAndroid Build Coastguard Worker float f; 244*35238bceSAndroid Build Coastguard Worker float f4[4]; 245*35238bceSAndroid Build Coastguard Worker float m3[3 * 3]; //!< row major, can be fed directly to tcu::Matrix constructor 246*35238bceSAndroid Build Coastguard Worker float m4[4 * 4]; //!< row major, can be fed directly to tcu::Matrix constructor 247*35238bceSAndroid Build Coastguard Worker } value; 248*35238bceSAndroid Build Coastguard Worker 249*35238bceSAndroid Build Coastguard Worker union 250*35238bceSAndroid Build Coastguard Worker { 251*35238bceSAndroid Build Coastguard Worker const void *ptr; 252*35238bceSAndroid Build Coastguard Worker 253*35238bceSAndroid Build Coastguard Worker const rc::Texture1D *tex1D; 254*35238bceSAndroid Build Coastguard Worker const rc::Texture2D *tex2D; 255*35238bceSAndroid Build Coastguard Worker const rc::TextureCube *texCube; 256*35238bceSAndroid Build Coastguard Worker const rc::Texture2DArray *tex2DArray; 257*35238bceSAndroid Build Coastguard Worker const rc::Texture3D *tex3D; 258*35238bceSAndroid Build Coastguard Worker const rc::TextureCubeArray *texCubeArray; 259*35238bceSAndroid Build Coastguard Worker } sampler; 260*35238bceSAndroid Build Coastguard Worker UniformSlotsglr::UniformSlot261*35238bceSAndroid Build Coastguard Worker inline UniformSlot(void) : type(glu::TYPE_LAST) 262*35238bceSAndroid Build Coastguard Worker { 263*35238bceSAndroid Build Coastguard Worker value.i = 0; 264*35238bceSAndroid Build Coastguard Worker sampler.ptr = DE_NULL; 265*35238bceSAndroid Build Coastguard Worker } 266*35238bceSAndroid Build Coastguard Worker }; 267*35238bceSAndroid Build Coastguard Worker 268*35238bceSAndroid Build Coastguard Worker class ShaderProgram : private rr::VertexShader, private rr::GeometryShader, private rr::FragmentShader 269*35238bceSAndroid Build Coastguard Worker { 270*35238bceSAndroid Build Coastguard Worker public: 271*35238bceSAndroid Build Coastguard Worker ShaderProgram(const pdec::ShaderProgramDeclaration &); 272*35238bceSAndroid Build Coastguard Worker virtual ~ShaderProgram(void); 273*35238bceSAndroid Build Coastguard Worker 274*35238bceSAndroid Build Coastguard Worker const UniformSlot &getUniformByName(const char *name) const; 275*35238bceSAndroid Build Coastguard Worker getVertexShader(void) const276*35238bceSAndroid Build Coastguard Worker inline const rr::VertexShader *getVertexShader(void) const 277*35238bceSAndroid Build Coastguard Worker { 278*35238bceSAndroid Build Coastguard Worker return static_cast<const rr::VertexShader *>(this); 279*35238bceSAndroid Build Coastguard Worker } getFragmentShader(void) const280*35238bceSAndroid Build Coastguard Worker inline const rr::FragmentShader *getFragmentShader(void) const 281*35238bceSAndroid Build Coastguard Worker { 282*35238bceSAndroid Build Coastguard Worker return static_cast<const rr::FragmentShader *>(this); 283*35238bceSAndroid Build Coastguard Worker } getGeometryShader(void) const284*35238bceSAndroid Build Coastguard Worker inline const rr::GeometryShader *getGeometryShader(void) const 285*35238bceSAndroid Build Coastguard Worker { 286*35238bceSAndroid Build Coastguard Worker return static_cast<const rr::GeometryShader *>(this); 287*35238bceSAndroid Build Coastguard Worker } 288*35238bceSAndroid Build Coastguard Worker 289*35238bceSAndroid Build Coastguard Worker private: 290*35238bceSAndroid Build Coastguard Worker virtual void shadeVertices(const rr::VertexAttrib *inputs, rr::VertexPacket *const *packets, 291*35238bceSAndroid Build Coastguard Worker const int numPackets) const = 0; 292*35238bceSAndroid Build Coastguard Worker virtual void shadeFragments(rr::FragmentPacket *packets, const int numPackets, 293*35238bceSAndroid Build Coastguard Worker const rr::FragmentShadingContext &context) const = 0; 294*35238bceSAndroid Build Coastguard Worker virtual void shadePrimitives(rr::GeometryEmitter &output, int verticesIn, const rr::PrimitivePacket *packets, 295*35238bceSAndroid Build Coastguard Worker const int numPackets, int invocationID) const; 296*35238bceSAndroid Build Coastguard Worker 297*35238bceSAndroid Build Coastguard Worker std::vector<std::string> m_attributeNames; 298*35238bceSAndroid Build Coastguard Worker 299*35238bceSAndroid Build Coastguard Worker protected: 300*35238bceSAndroid Build Coastguard Worker std::vector<UniformSlot> m_uniforms; 301*35238bceSAndroid Build Coastguard Worker 302*35238bceSAndroid Build Coastguard Worker private: 303*35238bceSAndroid Build Coastguard Worker const std::string m_vertSrc; 304*35238bceSAndroid Build Coastguard Worker const std::string m_fragSrc; 305*35238bceSAndroid Build Coastguard Worker const std::string m_geomSrc; 306*35238bceSAndroid Build Coastguard Worker const bool m_hasGeometryShader; 307*35238bceSAndroid Build Coastguard Worker 308*35238bceSAndroid Build Coastguard Worker friend class ReferenceContext; // for uniform access 309*35238bceSAndroid Build Coastguard Worker friend class GLContext; // for source string access 310*35238bceSAndroid Build Coastguard Worker } DE_WARN_UNUSED_TYPE; 311*35238bceSAndroid Build Coastguard Worker 312*35238bceSAndroid Build Coastguard Worker } // namespace sglr 313*35238bceSAndroid Build Coastguard Worker 314*35238bceSAndroid Build Coastguard Worker #endif // _SGLRSHADERPROGRAM_HPP 315