Home | History | Annotate | Download | only in gl
      1 /*
      2  * Copyright 2015 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef GrGLUniformHandler_DEFINED
      9 #define GrGLUniformHandler_DEFINED
     10 
     11 #include "glsl/GrGLSLUniformHandler.h"
     12 
     13 #include "gl/GrGLProgramDataManager.h"
     14 
     15 class GrGLCaps;
     16 
     17 class GrGLUniformHandler : public GrGLSLUniformHandler {
     18 public:
     19     static const int kUniformsPerBlock = 8;
     20 
     21     const GrShaderVar& getUniformVariable(UniformHandle u) const override {
     22         return fUniforms[u.toIndex()].fVariable;
     23     }
     24 
     25     const char* getUniformCStr(UniformHandle u) const override {
     26         return this->getUniformVariable(u).c_str();
     27     }
     28 private:
     29     explicit GrGLUniformHandler(GrGLSLProgramBuilder* program)
     30         : INHERITED(program)
     31         , fUniforms(kUniformsPerBlock)
     32         , fSamplers(kUniformsPerBlock)
     33         , fTexelBuffers(kUniformsPerBlock) {}
     34 
     35     UniformHandle internalAddUniformArray(uint32_t visibility,
     36                                           GrSLType type,
     37                                           GrSLPrecision precision,
     38                                           const char* name,
     39                                           bool mangleName,
     40                                           int arrayCount,
     41                                           const char** outName) override;
     42 
     43     SamplerHandle addSampler(uint32_t visibility, GrSwizzle, GrSLType, GrSLPrecision,
     44                              const char* name) override;
     45 
     46     const GrShaderVar& samplerVariable(SamplerHandle handle) const override {
     47         return fSamplers[handle.toIndex()].fVariable;
     48     }
     49 
     50     GrSwizzle samplerSwizzle(SamplerHandle handle) const override {
     51         return fSamplerSwizzles[handle.toIndex()];
     52     }
     53 
     54     TexelBufferHandle addTexelBuffer(uint32_t visibility, GrSLPrecision,
     55                                      const char* name) override;
     56 
     57     const GrShaderVar& texelBufferVariable(TexelBufferHandle handle) const override {
     58         return fTexelBuffers[handle.toIndex()].fVariable;
     59     }
     60 
     61     void appendUniformDecls(GrShaderFlags visibility, SkString*) const override;
     62 
     63     // Manually set uniform locations for all our uniforms.
     64     void bindUniformLocations(GrGLuint programID, const GrGLCaps& caps);
     65 
     66     // Updates the loction of the Uniforms if we cannot bind uniform locations manually
     67     void getUniformLocations(GrGLuint programID, const GrGLCaps& caps);
     68 
     69     const GrGLGpu* glGpu() const;
     70 
     71     typedef GrGLProgramDataManager::UniformInfo UniformInfo;
     72     typedef GrGLProgramDataManager::UniformInfoArray UniformInfoArray;
     73 
     74     UniformInfoArray    fUniforms;
     75     UniformInfoArray    fSamplers;
     76     SkTArray<GrSwizzle> fSamplerSwizzles;
     77     UniformInfoArray    fTexelBuffers;
     78 
     79     friend class GrGLProgramBuilder;
     80 
     81     typedef GrGLSLUniformHandler INHERITED;
     82 };
     83 
     84 #endif
     85