blob: d029691b8421c29d7a389d626510790c242cab0a [file] [log] [blame]
egdaniel7ea439b2015-12-03 09:20:44 -08001/*
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
15class GrGLCaps;
16
egdaniel7ea439b2015-12-03 09:20:44 -080017class GrGLUniformHandler : public GrGLSLUniformHandler {
18public:
jvanverth633b3562016-03-23 11:01:22 -070019 static const int kUniformsPerBlock = 8;
20
Brian Salomon99938a82016-11-21 13:41:08 -050021 const GrShaderVar& getUniformVariable(UniformHandle u) const override {
egdaniel7ea439b2015-12-03 09:20:44 -080022 return fUniforms[u.toIndex()].fVariable;
23 }
24
25 const char* getUniformCStr(UniformHandle u) const override {
26 return this->getUniformVariable(u).c_str();
27 }
28private:
29 explicit GrGLUniformHandler(GrGLSLProgramBuilder* program)
30 : INHERITED(program)
Brian Salomon101b8442016-11-18 11:58:54 -050031 , fUniforms(kUniformsPerBlock)
Brian Salomonf9f45122016-11-29 11:59:17 -050032 , fSamplers(kUniformsPerBlock)
Greg Danielbc5d4d72017-05-05 10:28:42 -040033 , fTexelBuffers(kUniformsPerBlock)
Brian Salomonf9f45122016-11-29 11:59:17 -050034 , fImageStorages(kUniformsPerBlock) {}
egdaniel7ea439b2015-12-03 09:20:44 -080035
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
Brian Salomon101b8442016-11-18 11:58:54 -050044 SamplerHandle addSampler(uint32_t visibility, GrSwizzle, GrSLType, GrSLPrecision,
45 const char* name) override;
egdaniel09aa1fc2016-04-20 07:09:46 -070046
Brian Salomon99938a82016-11-21 13:41:08 -050047 const GrShaderVar& samplerVariable(SamplerHandle handle) const override {
Brian Salomon101b8442016-11-18 11:58:54 -050048 return fSamplers[handle.toIndex()].fVariable;
49 }
50
51 GrSwizzle samplerSwizzle(SamplerHandle handle) const override {
52 return fSamplerSwizzles[handle.toIndex()];
egdaniel09aa1fc2016-04-20 07:09:46 -070053 }
54
Greg Danielbc5d4d72017-05-05 10:28:42 -040055 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
Brian Salomonf9f45122016-11-29 11:59:17 -050066 const GrShaderVar& imageStorageVariable(ImageStorageHandle handle) const override {
67 return fImageStorages[handle.toIndex()].fVariable;
68 }
69
cdalton5e58cee2016-02-11 12:49:47 -080070 void appendUniformDecls(GrShaderFlags visibility, SkString*) const override;
egdaniel7ea439b2015-12-03 09:20:44 -080071
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
Brian Salomon101b8442016-11-18 11:58:54 -050083 UniformInfoArray fUniforms;
84 UniformInfoArray fSamplers;
85 SkTArray<GrSwizzle> fSamplerSwizzles;
Greg Danielbc5d4d72017-05-05 10:28:42 -040086 UniformInfoArray fTexelBuffers;
Brian Salomonf9f45122016-11-29 11:59:17 -050087 UniformInfoArray fImageStorages;
egdaniel09aa1fc2016-04-20 07:09:46 -070088
egdaniel7ea439b2015-12-03 09:20:44 -080089 friend class GrGLProgramBuilder;
90
halcanary9d524f22016-03-29 09:03:52 -070091 typedef GrGLSLUniformHandler INHERITED;
egdaniel7ea439b2015-12-03 09:20:44 -080092};
93
94#endif