blob: 9bb3539566b192c22346f0e1148d3e382cf8a9ca [file] [log] [blame]
Jim Van Verthbe259dc2020-05-19 11:40:31 -04001/*
2 * Copyright 2020 Google LLC
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 GrUniformDataManager_DEFINED
9#define GrUniformDataManager_DEFINED
10
Jim Van Verthbe259dc2020-05-19 11:40:31 -040011#include "include/private/GrTypesPriv.h"
12#include "include/private/SkTArray.h"
13#include "src/core/SkAutoMalloc.h"
Brian Salomona59925f2021-09-16 09:25:47 -040014#include "src/gpu/glsl/GrGLSLProgramDataManager.h"
15
16#include <vector>
17
18class GrProgramInfo;
Jim Van Verthbe259dc2020-05-19 11:40:31 -040019
Brian Salomon01d8ad62020-07-07 09:57:54 -040020/**
21 * Subclass of GrGLSLProgramDataManager used to store uniforms for a program in a CPU buffer that
Brian Salomona59925f2021-09-16 09:25:47 -040022 * can be uploaded to a UBO.
Brian Salomon01d8ad62020-07-07 09:57:54 -040023 */
Jim Van Verthbe259dc2020-05-19 11:40:31 -040024class GrUniformDataManager : public GrGLSLProgramDataManager {
25public:
Brian Salomona59925f2021-09-16 09:25:47 -040026 enum class Layout {
27 kStd140,
28 kStd430,
29 kMetal, /** This is our own self-imposed layout we use for Metal. */
30 };
31
32 struct NewUniform {
33 size_t indexInProcessor = ~0;
34 GrSLType type = kVoid_GrSLType;
35 int count = 0;
36 uint32_t offset = 0;
37 };
38
39 using ProcessorUniforms = std::vector<NewUniform>;
40 using ProgramUniforms = std::vector<ProcessorUniforms>;
41
42 GrUniformDataManager(ProgramUniforms,
43 Layout layout,
44 uint32_t uniformCount,
45 uint32_t uniformSize);
Jim Van Verthbe259dc2020-05-19 11:40:31 -040046
47 void set1i(UniformHandle, int32_t) const override;
48 void set1iv(UniformHandle, int arrayCount, const int32_t v[]) const override;
49 void set1f(UniformHandle, float v0) const override;
50 void set1fv(UniformHandle, int arrayCount, const float v[]) const override;
51 void set2i(UniformHandle, int32_t, int32_t) const override;
52 void set2iv(UniformHandle, int arrayCount, const int32_t v[]) const override;
53 void set2f(UniformHandle, float, float) const override;
54 void set2fv(UniformHandle, int arrayCount, const float v[]) const override;
55 void set3i(UniformHandle, int32_t, int32_t, int32_t) const override;
56 void set3iv(UniformHandle, int arrayCount, const int32_t v[]) const override;
57 void set3f(UniformHandle, float, float, float) const override;
58 void set3fv(UniformHandle, int arrayCount, const float v[]) const override;
59 void set4i(UniformHandle, int32_t, int32_t, int32_t, int32_t) const override;
60 void set4iv(UniformHandle, int arrayCount, const int32_t v[]) const override;
61 void set4f(UniformHandle, float, float, float, float) const override;
62 void set4fv(UniformHandle, int arrayCount, const float v[]) const override;
63 // matrices are column-major, the first two upload a single matrix, the latter two upload
64 // arrayCount matrices into a uniform array.
65 void setMatrix2f(UniformHandle, const float matrix[]) const override;
66 void setMatrix3f(UniformHandle, const float matrix[]) const override;
67 void setMatrix4f(UniformHandle, const float matrix[]) const override;
68 void setMatrix2fv(UniformHandle, int arrayCount, const float matrices[]) const override;
69 void setMatrix3fv(UniformHandle, int arrayCount, const float matrices[]) const override;
70 void setMatrix4fv(UniformHandle, int arrayCount, const float matrices[]) const override;
71
Greg Daniela581a8b2020-06-19 15:22:18 -040072 // For the uniform data to be dirty so that we will reupload on the next use.
73 void markDirty() { fUniformsDirty = true; }
74
Brian Salomona59925f2021-09-16 09:25:47 -040075 void setUniforms(const GrProgramInfo& info);
76
Jim Van Verthbe259dc2020-05-19 11:40:31 -040077protected:
78 struct Uniform {
79 uint32_t fOffset;
80 SkDEBUGCODE(
81 GrSLType fType;
82 int fArrayCount;
83 );
84 };
85
86 template<int N> inline void setMatrices(UniformHandle, int arrayCount,
87 const float matrices[]) const;
88
89 void* getBufferPtrAndMarkDirty(const Uniform& uni) const;
90
91 uint32_t fUniformSize;
92
93 SkTArray<Uniform, true> fUniforms;
94
95 mutable SkAutoMalloc fUniformData;
96 mutable bool fUniformsDirty;
Brian Salomona59925f2021-09-16 09:25:47 -040097
98private:
99 class UniformManager {
100 public:
101 UniformManager(ProgramUniforms, Layout layout);
102 bool writeUniforms(const GrProgramInfo& info, void* buffer);
103
104 private:
105 ProgramUniforms fUniforms;
106 Layout fLayout;
107 };
108
109 UniformManager fUniformManager;
Jim Van Verthbe259dc2020-05-19 11:40:31 -0400110};
111
112#endif