blob: ae87fafed933f5d26d03be512aa8b5ef4a591881 [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
Brian Salomon1471df92018-06-08 10:49:00 -040020// Handles for program uniforms (other than per-effect uniforms)
21struct GrGLSLBuiltinUniformHandles {
22 GrGLSLProgramDataManager::UniformHandle fRTAdjustmentUni;
23 // We use the render target height to provide a y-down frag coord when specifying
24 // origin_upper_left is not supported.
25 GrGLSLProgramDataManager::UniformHandle fRTHeightUni;
26};
27
egdaniel7ea439b2015-12-03 09:20:44 -080028class GrGLSLUniformHandler {
29public:
egdaniel7ea439b2015-12-03 09:20:44 -080030 virtual ~GrGLSLUniformHandler() {}
31
Brian Salomonf9f45122016-11-29 11:59:17 -050032 using UniformHandle = GrGLSLProgramDataManager::UniformHandle;
Brian Salomon802cb312018-06-08 18:05:20 -040033
Brian Salomonf9f45122016-11-29 11:59:17 -050034 GR_DEFINE_RESOURCE_HANDLE_CLASS(SamplerHandle);
egdaniel7ea439b2015-12-03 09:20:44 -080035
36 /** Add a uniform variable to the current program, that has visibility in one or more shaders.
cdalton5e58cee2016-02-11 12:49:47 -080037 visibility is a bitfield of GrShaderFlag values indicating from which shaders the uniform
38 should be accessible. At least one bit must be set. Geometry shader uniforms are not
egdaniel7ea439b2015-12-03 09:20:44 -080039 supported at this time. The actual uniform name will be mangled. If outName is not nullptr
40 then it will refer to the final uniform name after return. Use the addUniformArray variant
41 to add an array of uniforms. */
42 UniformHandle addUniform(uint32_t visibility,
43 GrSLType type,
44 GrSLPrecision precision,
45 const char* name,
46 const char** outName = nullptr) {
egdaniel990dbc82016-07-13 14:09:30 -070047 SkASSERT(!GrSLTypeIsCombinedSamplerType(type));
egdaniel7ea439b2015-12-03 09:20:44 -080048 return this->addUniformArray(visibility, type, precision, name, 0, outName);
49 }
50
Ethan Nicholasf7b88202017-09-18 14:10:39 -040051 UniformHandle addUniform(uint32_t visibility,
52 GrSLType type,
53 const char* name,
54 const char** outName = nullptr) {
55 return this->addUniform(visibility, type, kDefault_GrSLPrecision, name, outName);
56 }
57
egdaniel7ea439b2015-12-03 09:20:44 -080058 UniformHandle addUniformArray(uint32_t visibility,
59 GrSLType type,
60 GrSLPrecision precision,
61 const char* name,
62 int arrayCount,
63 const char** outName = nullptr) {
egdaniel990dbc82016-07-13 14:09:30 -070064 SkASSERT(!GrSLTypeIsCombinedSamplerType(type));
Robert Phillipsfe8da172018-01-24 14:52:02 +000065 bool mangle = strncmp(name, GR_NO_MANGLE_PREFIX, strlen(GR_NO_MANGLE_PREFIX));
66 return this->internalAddUniformArray(visibility, type, precision, name, mangle, arrayCount,
egdaniel7ea439b2015-12-03 09:20:44 -080067 outName);
68 }
69
Ethan Nicholasf7b88202017-09-18 14:10:39 -040070 UniformHandle addUniformArray(uint32_t visibility,
71 GrSLType type,
72 const char* name,
73 int arrayCount,
74 const char** outName = nullptr) {
75 SkASSERT(!GrSLTypeIsCombinedSamplerType(type));
Robert Phillipsfe8da172018-01-24 14:52:02 +000076 bool mangle = strncmp(name, GR_NO_MANGLE_PREFIX, strlen(GR_NO_MANGLE_PREFIX));
77 return this->internalAddUniformArray(visibility, type, kDefault_GrSLPrecision, name, mangle,
Ethan Nicholasf7b88202017-09-18 14:10:39 -040078 arrayCount, outName);
79 }
80
Brian Salomon99938a82016-11-21 13:41:08 -050081 virtual const GrShaderVar& getUniformVariable(UniformHandle u) const = 0;
egdaniel7ea439b2015-12-03 09:20:44 -080082
83 /**
84 * Shortcut for getUniformVariable(u).c_str()
85 */
86 virtual const char* getUniformCStr(UniformHandle u) const = 0;
egdaniel09aa1fc2016-04-20 07:09:46 -070087
egdaniel7ea439b2015-12-03 09:20:44 -080088protected:
89 explicit GrGLSLUniformHandler(GrGLSLProgramBuilder* program) : fProgramBuilder(program) {}
90
91 // This is not owned by the class
92 GrGLSLProgramBuilder* fProgramBuilder;
93
94private:
Brian Salomon99938a82016-11-21 13:41:08 -050095 virtual const GrShaderVar& samplerVariable(SamplerHandle) const = 0;
Brian Salomon101b8442016-11-18 11:58:54 -050096 virtual GrSwizzle samplerSwizzle(SamplerHandle) const = 0;
egdaniel09aa1fc2016-04-20 07:09:46 -070097
Brian Salomon60dd8c72018-07-30 10:24:13 -040098 virtual SamplerHandle addSampler(uint32_t visibility, GrSwizzle, GrTextureType, GrSLPrecision,
Brian Salomon101b8442016-11-18 11:58:54 -050099 const char* name) = 0;
egdaniel09aa1fc2016-04-20 07:09:46 -0700100
egdaniel7ea439b2015-12-03 09:20:44 -0800101 virtual UniformHandle internalAddUniformArray(uint32_t visibility,
102 GrSLType type,
103 GrSLPrecision precision,
104 const char* name,
105 bool mangleName,
106 int arrayCount,
107 const char** outName) = 0;
108
cdalton5e58cee2016-02-11 12:49:47 -0800109 virtual void appendUniformDecls(GrShaderFlags visibility, SkString*) const = 0;
egdaniel7ea439b2015-12-03 09:20:44 -0800110
111 friend class GrGLSLProgramBuilder;
112};
113
114#endif