blob: 662486eebeac599c9e1d2720da1473282a06cf04 [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 GrGLSLUniformHandler_DEFINED
9#define GrGLSLUniformHandler_DEFINED
10
11#include "GrGLSLProgramDataManager.h"
Brian Salomon99938a82016-11-21 13:41:08 -050012#include "GrShaderVar.h"
13#include "GrSwizzle.h"
egdaniel7ea439b2015-12-03 09:20:44 -080014
Robert Phillipsfe8da172018-01-24 14:52:02 +000015// variable names beginning with this prefix will not be mangled
16#define GR_NO_MANGLE_PREFIX "sk_"
17
egdaniel7ea439b2015-12-03 09:20:44 -080018class GrGLSLProgramBuilder;
19
20class GrGLSLUniformHandler {
21public:
egdaniel7ea439b2015-12-03 09:20:44 -080022 virtual ~GrGLSLUniformHandler() {}
23
Brian Salomonf9f45122016-11-29 11:59:17 -050024 using UniformHandle = GrGLSLProgramDataManager::UniformHandle;
25 GR_DEFINE_RESOURCE_HANDLE_CLASS(SamplerHandle);
Greg Danielbc5d4d72017-05-05 10:28:42 -040026 GR_DEFINE_RESOURCE_HANDLE_CLASS(TexelBufferHandle);
egdaniel7ea439b2015-12-03 09:20:44 -080027
28 /** Add a uniform variable to the current program, that has visibility in one or more shaders.
cdalton5e58cee2016-02-11 12:49:47 -080029 visibility is a bitfield of GrShaderFlag values indicating from which shaders the uniform
30 should be accessible. At least one bit must be set. Geometry shader uniforms are not
egdaniel7ea439b2015-12-03 09:20:44 -080031 supported at this time. The actual uniform name will be mangled. If outName is not nullptr
32 then it will refer to the final uniform name after return. Use the addUniformArray variant
33 to add an array of uniforms. */
34 UniformHandle addUniform(uint32_t visibility,
35 GrSLType type,
36 GrSLPrecision precision,
37 const char* name,
38 const char** outName = nullptr) {
egdaniel990dbc82016-07-13 14:09:30 -070039 SkASSERT(!GrSLTypeIsCombinedSamplerType(type));
egdaniel7ea439b2015-12-03 09:20:44 -080040 return this->addUniformArray(visibility, type, precision, name, 0, outName);
41 }
42
Ethan Nicholasf7b88202017-09-18 14:10:39 -040043 UniformHandle addUniform(uint32_t visibility,
44 GrSLType type,
45 const char* name,
46 const char** outName = nullptr) {
47 return this->addUniform(visibility, type, kDefault_GrSLPrecision, name, outName);
48 }
49
egdaniel7ea439b2015-12-03 09:20:44 -080050 UniformHandle addUniformArray(uint32_t visibility,
51 GrSLType type,
52 GrSLPrecision precision,
53 const char* name,
54 int arrayCount,
55 const char** outName = nullptr) {
egdaniel990dbc82016-07-13 14:09:30 -070056 SkASSERT(!GrSLTypeIsCombinedSamplerType(type));
Robert Phillipsfe8da172018-01-24 14:52:02 +000057 bool mangle = strncmp(name, GR_NO_MANGLE_PREFIX, strlen(GR_NO_MANGLE_PREFIX));
58 return this->internalAddUniformArray(visibility, type, precision, name, mangle, arrayCount,
egdaniel7ea439b2015-12-03 09:20:44 -080059 outName);
60 }
61
Ethan Nicholasf7b88202017-09-18 14:10:39 -040062 UniformHandle addUniformArray(uint32_t visibility,
63 GrSLType type,
64 const char* name,
65 int arrayCount,
66 const char** outName = nullptr) {
67 SkASSERT(!GrSLTypeIsCombinedSamplerType(type));
Robert Phillipsfe8da172018-01-24 14:52:02 +000068 bool mangle = strncmp(name, GR_NO_MANGLE_PREFIX, strlen(GR_NO_MANGLE_PREFIX));
69 return this->internalAddUniformArray(visibility, type, kDefault_GrSLPrecision, name, mangle,
Ethan Nicholasf7b88202017-09-18 14:10:39 -040070 arrayCount, outName);
71 }
72
Brian Salomon99938a82016-11-21 13:41:08 -050073 virtual const GrShaderVar& getUniformVariable(UniformHandle u) const = 0;
egdaniel7ea439b2015-12-03 09:20:44 -080074
75 /**
76 * Shortcut for getUniformVariable(u).c_str()
77 */
78 virtual const char* getUniformCStr(UniformHandle u) const = 0;
egdaniel09aa1fc2016-04-20 07:09:46 -070079
egdaniel7ea439b2015-12-03 09:20:44 -080080protected:
81 explicit GrGLSLUniformHandler(GrGLSLProgramBuilder* program) : fProgramBuilder(program) {}
82
83 // This is not owned by the class
84 GrGLSLProgramBuilder* fProgramBuilder;
85
86private:
Brian Salomon99938a82016-11-21 13:41:08 -050087 virtual const GrShaderVar& samplerVariable(SamplerHandle) const = 0;
Brian Salomon101b8442016-11-18 11:58:54 -050088 virtual GrSwizzle samplerSwizzle(SamplerHandle) const = 0;
egdaniel09aa1fc2016-04-20 07:09:46 -070089
Brian Salomon101b8442016-11-18 11:58:54 -050090 virtual SamplerHandle addSampler(uint32_t visibility, GrSwizzle, GrSLType, GrSLPrecision,
91 const char* name) = 0;
egdaniel09aa1fc2016-04-20 07:09:46 -070092
Greg Danielbc5d4d72017-05-05 10:28:42 -040093 virtual const GrShaderVar& texelBufferVariable(TexelBufferHandle) const = 0;
94 virtual TexelBufferHandle addTexelBuffer(uint32_t visibility, GrSLPrecision,
95 const char* name) = 0;
96
egdaniel7ea439b2015-12-03 09:20:44 -080097 virtual UniformHandle internalAddUniformArray(uint32_t visibility,
98 GrSLType type,
99 GrSLPrecision precision,
100 const char* name,
101 bool mangleName,
102 int arrayCount,
103 const char** outName) = 0;
104
cdalton5e58cee2016-02-11 12:49:47 -0800105 virtual void appendUniformDecls(GrShaderFlags visibility, SkString*) const = 0;
egdaniel7ea439b2015-12-03 09:20:44 -0800106
107 friend class GrGLSLProgramBuilder;
108};
109
110#endif