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