1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrGLSLProgramDataManager_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrGLSLProgramDataManager_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSpan.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkRuntimeEffect.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkNoncopyable.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrResourceHandle.h" 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker class SkM44; 20*c8dee2aaSAndroid Build Coastguard Worker class SkMatrix; 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker /** Manages the resources used by a shader program. 23*c8dee2aaSAndroid Build Coastguard Worker * The resources are objects the program uses to communicate with the 24*c8dee2aaSAndroid Build Coastguard Worker * application code. 25*c8dee2aaSAndroid Build Coastguard Worker */ 26*c8dee2aaSAndroid Build Coastguard Worker class GrGLSLProgramDataManager { 27*c8dee2aaSAndroid Build Coastguard Worker public: GR_DEFINE_RESOURCE_HANDLE_CLASS(UniformHandle)28*c8dee2aaSAndroid Build Coastguard Worker GR_DEFINE_RESOURCE_HANDLE_CLASS(UniformHandle) 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Worker virtual ~GrGLSLProgramDataManager() {} 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker /** Functions for uploading uniform values. The varities ending in v can be used to upload to an 33*c8dee2aaSAndroid Build Coastguard Worker * array of uniforms. arrayCount must be <= the array count of the uniform. 34*c8dee2aaSAndroid Build Coastguard Worker */ 35*c8dee2aaSAndroid Build Coastguard Worker virtual void set1i(UniformHandle, int32_t) const = 0; 36*c8dee2aaSAndroid Build Coastguard Worker virtual void set1iv(UniformHandle, int arrayCount, const int v[]) const = 0; 37*c8dee2aaSAndroid Build Coastguard Worker virtual void set1f(UniformHandle, float v0) const = 0; 38*c8dee2aaSAndroid Build Coastguard Worker virtual void set1fv(UniformHandle, int arrayCount, const float v[]) const = 0; 39*c8dee2aaSAndroid Build Coastguard Worker virtual void set2i(UniformHandle, int32_t, int32_t) const = 0; 40*c8dee2aaSAndroid Build Coastguard Worker virtual void set2iv(UniformHandle, int arrayCount, const int v[]) const = 0; 41*c8dee2aaSAndroid Build Coastguard Worker virtual void set2f(UniformHandle, float, float) const = 0; 42*c8dee2aaSAndroid Build Coastguard Worker virtual void set2fv(UniformHandle, int arrayCount, const float v[]) const = 0; 43*c8dee2aaSAndroid Build Coastguard Worker virtual void set3i(UniformHandle, int32_t, int32_t, int32_t) const = 0; 44*c8dee2aaSAndroid Build Coastguard Worker virtual void set3iv(UniformHandle, int arrayCount, const int v[]) const = 0; 45*c8dee2aaSAndroid Build Coastguard Worker virtual void set3f(UniformHandle, float, float, float) const = 0; 46*c8dee2aaSAndroid Build Coastguard Worker virtual void set3fv(UniformHandle, int arrayCount, const float v[]) const = 0; 47*c8dee2aaSAndroid Build Coastguard Worker virtual void set4i(UniformHandle, int32_t, int32_t, int32_t, int32_t) const = 0; 48*c8dee2aaSAndroid Build Coastguard Worker virtual void set4iv(UniformHandle, int arrayCount, const int v[]) const = 0; 49*c8dee2aaSAndroid Build Coastguard Worker virtual void set4f(UniformHandle, float, float, float, float) const = 0; 50*c8dee2aaSAndroid Build Coastguard Worker virtual void set4fv(UniformHandle, int arrayCount, const float v[]) const = 0; 51*c8dee2aaSAndroid Build Coastguard Worker // matrices are column-major, the first three upload a single matrix, the latter three upload 52*c8dee2aaSAndroid Build Coastguard Worker // arrayCount matrices into a uniform array. 53*c8dee2aaSAndroid Build Coastguard Worker virtual void setMatrix2f(UniformHandle, const float matrix[]) const = 0; 54*c8dee2aaSAndroid Build Coastguard Worker virtual void setMatrix3f(UniformHandle, const float matrix[]) const = 0; 55*c8dee2aaSAndroid Build Coastguard Worker virtual void setMatrix4f(UniformHandle, const float matrix[]) const = 0; 56*c8dee2aaSAndroid Build Coastguard Worker virtual void setMatrix2fv(UniformHandle, int arrayCount, const float matrices[]) const = 0; 57*c8dee2aaSAndroid Build Coastguard Worker virtual void setMatrix3fv(UniformHandle, int arrayCount, const float matrices[]) const = 0; 58*c8dee2aaSAndroid Build Coastguard Worker virtual void setMatrix4fv(UniformHandle, int arrayCount, const float matrices[]) const = 0; 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker // convenience method for uploading a SkMatrix to a 3x3 matrix uniform 61*c8dee2aaSAndroid Build Coastguard Worker void setSkMatrix(UniformHandle, const SkMatrix&) const; 62*c8dee2aaSAndroid Build Coastguard Worker // convenience method for uploading a SkMatrix to a 4x4 matrix uniform 63*c8dee2aaSAndroid Build Coastguard Worker void setSkM44(UniformHandle, const SkM44&) const; 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker enum class Specialized : bool { kNo = false, kYes = true }; 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker /** 68*c8dee2aaSAndroid Build Coastguard Worker * Sets runtime effect uniform values. The Specialized span is optional. If it is non-empty 69*c8dee2aaSAndroid Build Coastguard Worker * then it should be the same size as the Uniform span. Uniforms for which the Specialized value 70*c8dee2aaSAndroid Build Coastguard Worker * is kYes will be skipped and the UniformHandle span should have an entry for each 71*c8dee2aaSAndroid Build Coastguard Worker * kNo value. If Specialized is empty then the Uniform and UniformHandle spans should have the 72*c8dee2aaSAndroid Build Coastguard Worker * same size. 73*c8dee2aaSAndroid Build Coastguard Worker */ 74*c8dee2aaSAndroid Build Coastguard Worker void setRuntimeEffectUniforms(SkSpan<const SkRuntimeEffect::Uniform>, 75*c8dee2aaSAndroid Build Coastguard Worker SkSpan<const UniformHandle>, 76*c8dee2aaSAndroid Build Coastguard Worker SkSpan<const Specialized>, 77*c8dee2aaSAndroid Build Coastguard Worker const void* src) const; 78*c8dee2aaSAndroid Build Coastguard Worker setRuntimeEffectUniforms(SkSpan<const SkRuntimeEffect::Uniform> uniforms,SkSpan<const UniformHandle> handles,const void * src)79*c8dee2aaSAndroid Build Coastguard Worker void setRuntimeEffectUniforms(SkSpan<const SkRuntimeEffect::Uniform> uniforms, 80*c8dee2aaSAndroid Build Coastguard Worker SkSpan<const UniformHandle> handles, 81*c8dee2aaSAndroid Build Coastguard Worker const void* src) const { 82*c8dee2aaSAndroid Build Coastguard Worker this->setRuntimeEffectUniforms(uniforms, handles, {}, src); 83*c8dee2aaSAndroid Build Coastguard Worker } 84*c8dee2aaSAndroid Build Coastguard Worker 85*c8dee2aaSAndroid Build Coastguard Worker protected: GrGLSLProgramDataManager()86*c8dee2aaSAndroid Build Coastguard Worker GrGLSLProgramDataManager() {} 87*c8dee2aaSAndroid Build Coastguard Worker 88*c8dee2aaSAndroid Build Coastguard Worker private: 89*c8dee2aaSAndroid Build Coastguard Worker GrGLSLProgramDataManager(const GrGLSLProgramDataManager&) = delete; 90*c8dee2aaSAndroid Build Coastguard Worker GrGLSLProgramDataManager& operator=(const GrGLSLProgramDataManager&) = delete; 91*c8dee2aaSAndroid Build Coastguard Worker 92*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = SkNoncopyable; 93*c8dee2aaSAndroid Build Coastguard Worker }; 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Worker #endif 96