blob: d74f1ee7f7241d40ace6ad44097c47ca0bada9bf [file] [log] [blame]
Stephen White79b81c92019-07-31 15:56:26 -04001/*
2 * Copyright 2019 Google Inc.
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 GrDawnProgramDataManager_DEFINED
9#define GrDawnProgramDataManager_DEFINED
10
Stephen Whiteb7eaedc2019-08-21 09:48:05 -040011#include "src/gpu/dawn/GrDawnRingBuffer.h"
Stephen White79b81c92019-07-31 15:56:26 -040012#include "src/gpu/dawn/GrDawnUniformHandler.h"
13#include "src/gpu/glsl/GrGLSLProgramDataManager.h"
14#include "dawn/dawncpp.h"
15
16#include "src/core/SkAutoMalloc.h"
17
18class GrDawnGpu;
19class GrDawnUniformBuffer;
20
21class GrDawnProgramDataManager : public GrGLSLProgramDataManager {
22public:
23 typedef GrDawnUniformHandler::UniformInfoArray UniformInfoArray;
24
25 GrDawnProgramDataManager(const UniformInfoArray&,
26 uint32_t geometryUniformSize,
27 uint32_t fragmentUniformSize);
28
29 void set1i(UniformHandle, int32_t) const override;
30 void set1iv(UniformHandle, int arrayCount, const int32_t v[]) const override;
31 void set2i(UniformHandle, int32_t, int32_t) const override;
32 void set2iv(UniformHandle, int arrayCount, const int32_t v[]) const override;
33 void set3i(UniformHandle, int32_t, int32_t, int32_t) const override;
34 void set3iv(UniformHandle, int arrayCount, const int32_t v[]) const override;
35 void set4i(UniformHandle, int32_t, int32_t, int32_t, int32_t) const override;
36 void set4iv(UniformHandle, int arrayCount, const int32_t v[]) const override;
37
38 void set1f(UniformHandle, float v0) const override;
39 void set1fv(UniformHandle, int arrayCount, const float v[]) const override;
40 void set2f(UniformHandle, float, float) const override;
41 void set2fv(UniformHandle, int arrayCount, const float v[]) const override;
42 void set3f(UniformHandle, float, float, float) const override;
43 void set3fv(UniformHandle, int arrayCount, const float v[]) const override;
44 void set4f(UniformHandle, float, float, float, float) const override;
45 void set4fv(UniformHandle, int arrayCount, const float v[]) const override;
46 // matrices are column-major, the first two upload a single matrix, the latter two upload
47 // arrayCount matrices into a uniform array.
48 void setMatrix2f(UniformHandle, const float matrix[]) const override;
49 void setMatrix3f(UniformHandle, const float matrix[]) const override;
50 void setMatrix4f(UniformHandle, const float matrix[]) const override;
51 void setMatrix2fv(UniformHandle, int arrayCount, const float matrices[]) const override;
52 void setMatrix3fv(UniformHandle, int arrayCount, const float matrices[]) const override;
53 void setMatrix4fv(UniformHandle, int arrayCount, const float matrices[]) const override;
54
55 // for nvpr only
56 void setPathFragmentInputTransform(VaryingHandle u, int components,
57 const SkMatrix& matrix) const override {
58 SK_ABORT("Only supported in NVPR, which is not in Dawn");
59 }
60
Stephen Whiteb7eaedc2019-08-21 09:48:05 -040061 void uploadUniformBuffers(GrDawnRingBuffer::Slice geometryBuffer,
62 GrDawnRingBuffer::Slice fragmentBuffer) const;
Stephen White79b81c92019-07-31 15:56:26 -040063
Stephen Whiteb7eaedc2019-08-21 09:48:05 -040064 uint32_t geometryUniformSize() const { return fGeometryUniformSize; }
65 uint32_t fragmentUniformSize() const { return fFragmentUniformSize; }
Stephen White79b81c92019-07-31 15:56:26 -040066private:
67 struct Uniform {
68 uint32_t fBinding;
69 uint32_t fOffset;
70 SkDEBUGCODE(
71 GrSLType fType;
72 int fArrayCount;
73 );
74 };
75
76 template<int N> inline void setMatrices(UniformHandle, int arrayCount,
77 const float matrices[]) const;
78
79 void* getBufferPtrAndMarkDirty(const Uniform& uni) const;
80
81 uint32_t fGeometryUniformSize;
82 uint32_t fFragmentUniformSize;
83
84 SkTArray<Uniform, true> fUniforms;
85
86 mutable SkAutoMalloc fGeometryUniformData;
87 mutable SkAutoMalloc fFragmentUniformData;
88 mutable bool fGeometryUniformsDirty;
89 mutable bool fFragmentUniformsDirty;
90};
91
92#endif