1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2020 Google LLC 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 GrUniformDataManager_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrUniformDataManager_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkAutoMalloc.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/glsl/GrGLSLProgramDataManager.h" 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker enum class SkSLType : char; 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker /** 21*c8dee2aaSAndroid Build Coastguard Worker * Subclass of GrGLSLProgramDataManager used to store uniforms for a program in a CPU buffer that 22*c8dee2aaSAndroid Build Coastguard Worker * can be uploaded to a UBO. This currently assumes uniform layouts that are compatible with 23*c8dee2aaSAndroid Build Coastguard Worker * Vulkan, Dawn, and D3D12. It could be used more broadly if this aspect was made configurable. 24*c8dee2aaSAndroid Build Coastguard Worker */ 25*c8dee2aaSAndroid Build Coastguard Worker class GrUniformDataManager : public GrGLSLProgramDataManager { 26*c8dee2aaSAndroid Build Coastguard Worker public: 27*c8dee2aaSAndroid Build Coastguard Worker GrUniformDataManager(uint32_t uniformCount, uint32_t uniformSize); 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker void set1i(UniformHandle, int32_t) const override; 30*c8dee2aaSAndroid Build Coastguard Worker void set1iv(UniformHandle, int arrayCount, const int32_t v[]) const override; 31*c8dee2aaSAndroid Build Coastguard Worker void set1f(UniformHandle, float v0) const override; 32*c8dee2aaSAndroid Build Coastguard Worker void set1fv(UniformHandle, int arrayCount, const float v[]) const override; 33*c8dee2aaSAndroid Build Coastguard Worker void set2i(UniformHandle, int32_t, int32_t) const override; 34*c8dee2aaSAndroid Build Coastguard Worker void set2iv(UniformHandle, int arrayCount, const int32_t v[]) const override; 35*c8dee2aaSAndroid Build Coastguard Worker void set2f(UniformHandle, float, float) const override; 36*c8dee2aaSAndroid Build Coastguard Worker void set2fv(UniformHandle, int arrayCount, const float v[]) const override; 37*c8dee2aaSAndroid Build Coastguard Worker void set3i(UniformHandle, int32_t, int32_t, int32_t) const override; 38*c8dee2aaSAndroid Build Coastguard Worker void set3iv(UniformHandle, int arrayCount, const int32_t v[]) const override; 39*c8dee2aaSAndroid Build Coastguard Worker void set3f(UniformHandle, float, float, float) const override; 40*c8dee2aaSAndroid Build Coastguard Worker void set3fv(UniformHandle, int arrayCount, const float v[]) const override; 41*c8dee2aaSAndroid Build Coastguard Worker void set4i(UniformHandle, int32_t, int32_t, int32_t, int32_t) const override; 42*c8dee2aaSAndroid Build Coastguard Worker void set4iv(UniformHandle, int arrayCount, const int32_t v[]) const override; 43*c8dee2aaSAndroid Build Coastguard Worker void set4f(UniformHandle, float, float, float, float) const override; 44*c8dee2aaSAndroid Build Coastguard Worker void set4fv(UniformHandle, int arrayCount, const float v[]) const override; 45*c8dee2aaSAndroid Build Coastguard Worker // Matrices are column-major. The following three calls upload a single matrix into a uniform. 46*c8dee2aaSAndroid Build Coastguard Worker void setMatrix2f(UniformHandle, const float matrix[]) const override; 47*c8dee2aaSAndroid Build Coastguard Worker void setMatrix3f(UniformHandle, const float matrix[]) const override; 48*c8dee2aaSAndroid Build Coastguard Worker void setMatrix4f(UniformHandle, const float matrix[]) const override; 49*c8dee2aaSAndroid Build Coastguard Worker // These three calls upload arrayCount matrices into a uniform array. 50*c8dee2aaSAndroid Build Coastguard Worker void setMatrix2fv(UniformHandle, int arrayCount, const float matrices[]) const override; 51*c8dee2aaSAndroid Build Coastguard Worker void setMatrix3fv(UniformHandle, int arrayCount, const float matrices[]) const override; 52*c8dee2aaSAndroid Build Coastguard Worker void setMatrix4fv(UniformHandle, int arrayCount, const float matrices[]) const override; 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker // For the uniform data to be dirty so that we will reupload on the next use. markDirty()55*c8dee2aaSAndroid Build Coastguard Worker void markDirty() { fUniformsDirty = true; } 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker protected: 58*c8dee2aaSAndroid Build Coastguard Worker struct Uniform { 59*c8dee2aaSAndroid Build Coastguard Worker uint32_t fOffset : 24; 60*c8dee2aaSAndroid Build Coastguard Worker SkSLType fType : 8; 61*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE( 62*c8dee2aaSAndroid Build Coastguard Worker int fArrayCount; 63*c8dee2aaSAndroid Build Coastguard Worker ) 64*c8dee2aaSAndroid Build Coastguard Worker }; 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker int copyUniforms(void* dest, const void* src, int numUniforms, SkSLType uniformType) const; 67*c8dee2aaSAndroid Build Coastguard Worker 68*c8dee2aaSAndroid Build Coastguard Worker template <int N, SkSLType kFullType, SkSLType kHalfType> 69*c8dee2aaSAndroid Build Coastguard Worker inline void set(UniformHandle u, const void* v) const; 70*c8dee2aaSAndroid Build Coastguard Worker template <int N, SkSLType kFullType, SkSLType kHalfType> 71*c8dee2aaSAndroid Build Coastguard Worker inline void setv(UniformHandle u, int arrayCount, const void* v) const; 72*c8dee2aaSAndroid Build Coastguard Worker template <int N, SkSLType FullType, SkSLType HalfType> 73*c8dee2aaSAndroid Build Coastguard Worker inline void setMatrices(UniformHandle, int arrayCount, const float matrices[]) const; 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker void* getBufferPtrAndMarkDirty(const Uniform& uni) const; 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker uint32_t fUniformSize; 78*c8dee2aaSAndroid Build Coastguard Worker bool fWrite16BitUniforms = false; 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Worker skia_private::TArray<Uniform, true> fUniforms; 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker mutable SkAutoMalloc fUniformData; 83*c8dee2aaSAndroid Build Coastguard Worker mutable bool fUniformsDirty = false; 84*c8dee2aaSAndroid Build Coastguard Worker }; 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker #endif 87