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         , fImageStorages(kUniformsPerBlock) {}
     35 
     36     UniformHandle internalAddUniformArray(uint32_t visibility,
     37                                           GrSLType type,
     38                                           GrSLPrecision precision,
     39                                           const char* name,
     40                                           bool mangleName,
     41                                           int arrayCount,
     42                                           const char** outName) override;
     43 
     44     SamplerHandle addSampler(uint32_t visibility, GrSwizzle, GrSLType, GrSLPrecision,
     45                              const char* name) override;
     46 
     47     const GrShaderVar& samplerVariable(SamplerHandle handle) const override {
     48         return fSamplers[handle.toIndex()].fVariable;
     49     }
     50 
     51     GrSwizzle samplerSwizzle(SamplerHandle handle) const override {
     52         return fSamplerSwizzles[handle.toIndex()];
     53     }
     54 
     55     TexelBufferHandle addTexelBuffer(uint32_t visibility, GrSLPrecision,
     56                                      const char* name) override;
     57 
     58     const GrShaderVar& texelBufferVariable(TexelBufferHandle handle) const override {
     59         return fTexelBuffers[handle.toIndex()].fVariable;
     60     }
     61 
     62     ImageStorageHandle addImageStorage(uint32_t visibility, GrSLType, GrImageStorageFormat,
     63                                        GrSLMemoryModel, GrSLRestrict, GrIOType,
     64                                        const char* name) override;
     65 
     66     const GrShaderVar& imageStorageVariable(ImageStorageHandle handle) const override {
     67         return fImageStorages[handle.toIndex()].fVariable;
     68     }
     69 
     70     void appendUniformDecls(GrShaderFlags visibility, SkString*) const override;
     71 
     72     // Manually set uniform locations for all our uniforms.
     73     void bindUniformLocations(GrGLuint programID, const GrGLCaps& caps);
     74 
     75     // Updates the loction of the Uniforms if we cannot bind uniform locations manually
     76     void getUniformLocations(GrGLuint programID, const GrGLCaps& caps);
     77 
     78     const GrGLGpu* glGpu() const;
     79 
     80     typedef GrGLProgramDataManager::UniformInfo UniformInfo;
     81     typedef GrGLProgramDataManager::UniformInfoArray UniformInfoArray;
     82 
     83     UniformInfoArray    fUniforms;
     84     UniformInfoArray    fSamplers;
     85     SkTArray<GrSwizzle> fSamplerSwizzles;
     86     UniformInfoArray    fTexelBuffers;
     87     UniformInfoArray    fImageStorages;
     88 
     89     friend class GrGLProgramBuilder;
     90 
     91     typedef GrGLSLUniformHandler INHERITED;
     92 };
     93 
     94 #endif
     95