blob: cf80c3ff0ab1f95758b1eb4886940a9a44bfec30 [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
15class GrGLSLProgramBuilder;
16
17class GrGLSLUniformHandler {
18public:
egdaniel7ea439b2015-12-03 09:20:44 -080019 virtual ~GrGLSLUniformHandler() {}
20
Brian Salomonf9f45122016-11-29 11:59:17 -050021 using UniformHandle = GrGLSLProgramDataManager::UniformHandle;
22 GR_DEFINE_RESOURCE_HANDLE_CLASS(SamplerHandle);
Greg Danielbc5d4d72017-05-05 10:28:42 -040023 GR_DEFINE_RESOURCE_HANDLE_CLASS(TexelBufferHandle);
Brian Salomonf9f45122016-11-29 11:59:17 -050024 GR_DEFINE_RESOURCE_HANDLE_CLASS(ImageStorageHandle);
egdaniel7ea439b2015-12-03 09:20:44 -080025
26 /** Add a uniform variable to the current program, that has visibility in one or more shaders.
cdalton5e58cee2016-02-11 12:49:47 -080027 visibility is a bitfield of GrShaderFlag values indicating from which shaders the uniform
28 should be accessible. At least one bit must be set. Geometry shader uniforms are not
egdaniel7ea439b2015-12-03 09:20:44 -080029 supported at this time. The actual uniform name will be mangled. If outName is not nullptr
30 then it will refer to the final uniform name after return. Use the addUniformArray variant
31 to add an array of uniforms. */
32 UniformHandle addUniform(uint32_t visibility,
33 GrSLType type,
34 GrSLPrecision precision,
35 const char* name,
36 const char** outName = nullptr) {
egdaniel990dbc82016-07-13 14:09:30 -070037 SkASSERT(!GrSLTypeIsCombinedSamplerType(type));
egdaniel7ea439b2015-12-03 09:20:44 -080038 return this->addUniformArray(visibility, type, precision, name, 0, outName);
39 }
40
41 UniformHandle addUniformArray(uint32_t visibility,
42 GrSLType type,
43 GrSLPrecision precision,
44 const char* name,
45 int arrayCount,
46 const char** outName = nullptr) {
egdaniel990dbc82016-07-13 14:09:30 -070047 SkASSERT(!GrSLTypeIsCombinedSamplerType(type));
egdaniel7ea439b2015-12-03 09:20:44 -080048 return this->internalAddUniformArray(visibility, type, precision, name, true, arrayCount,
49 outName);
50 }
51
Brian Salomon99938a82016-11-21 13:41:08 -050052 virtual const GrShaderVar& getUniformVariable(UniformHandle u) const = 0;
egdaniel7ea439b2015-12-03 09:20:44 -080053
54 /**
55 * Shortcut for getUniformVariable(u).c_str()
56 */
57 virtual const char* getUniformCStr(UniformHandle u) const = 0;
egdaniel09aa1fc2016-04-20 07:09:46 -070058
egdaniel7ea439b2015-12-03 09:20:44 -080059protected:
60 explicit GrGLSLUniformHandler(GrGLSLProgramBuilder* program) : fProgramBuilder(program) {}
61
62 // This is not owned by the class
63 GrGLSLProgramBuilder* fProgramBuilder;
64
65private:
Brian Salomon99938a82016-11-21 13:41:08 -050066 virtual const GrShaderVar& samplerVariable(SamplerHandle) const = 0;
Brian Salomon101b8442016-11-18 11:58:54 -050067 virtual GrSwizzle samplerSwizzle(SamplerHandle) const = 0;
egdaniel09aa1fc2016-04-20 07:09:46 -070068
Brian Salomon101b8442016-11-18 11:58:54 -050069 virtual SamplerHandle addSampler(uint32_t visibility, GrSwizzle, GrSLType, GrSLPrecision,
70 const char* name) = 0;
egdaniel09aa1fc2016-04-20 07:09:46 -070071
Greg Danielbc5d4d72017-05-05 10:28:42 -040072 virtual const GrShaderVar& texelBufferVariable(TexelBufferHandle) const = 0;
73 virtual TexelBufferHandle addTexelBuffer(uint32_t visibility, GrSLPrecision,
74 const char* name) = 0;
75
Brian Salomonf9f45122016-11-29 11:59:17 -050076 virtual const GrShaderVar& imageStorageVariable(ImageStorageHandle) const = 0;
77 virtual ImageStorageHandle addImageStorage(uint32_t visibility, GrSLType type,
78 GrImageStorageFormat, GrSLMemoryModel, GrSLRestrict,
79 GrIOType, const char* name) = 0;
80
egdaniel7ea439b2015-12-03 09:20:44 -080081 virtual UniformHandle internalAddUniformArray(uint32_t visibility,
82 GrSLType type,
83 GrSLPrecision precision,
84 const char* name,
85 bool mangleName,
86 int arrayCount,
87 const char** outName) = 0;
88
cdalton5e58cee2016-02-11 12:49:47 -080089 virtual void appendUniformDecls(GrShaderFlags visibility, SkString*) const = 0;
egdaniel7ea439b2015-12-03 09:20:44 -080090
91 friend class GrGLSLProgramBuilder;
92};
93
94#endif