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