blob: b3a3dac7c690d7318d05bf723e65bdd55770a176 [file] [log] [blame]
Timothy Liang44636e92018-08-08 10:50:21 -04001/*
2 * Copyright 2018 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 GrMtlPipelineStateDataManager_DEFINED
9#define GrMtlPipelineStateDataManager_DEFINED
10
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "src/core/SkAutoMalloc.h"
12#include "src/gpu/glsl/GrGLSLProgramDataManager.h"
13#include "src/gpu/mtl/GrMtlUniformHandler.h"
Timothy Liang44636e92018-08-08 10:50:21 -040014
Jim Van Verthdd15d692019-04-22 15:29:53 -040015#import <Metal/Metal.h>
16
Timothy Liang44636e92018-08-08 10:50:21 -040017class GrMtlBuffer;
18class GrMtlGpu;
19
20class GrMtlPipelineStateDataManager : public GrGLSLProgramDataManager {
21public:
22 typedef GrMtlUniformHandler::UniformInfoArray UniformInfoArray;
23
24 GrMtlPipelineStateDataManager(const UniformInfoArray&,
Ethan Nicholase5dc1eb2019-08-13 17:02:25 -040025 uint32_t uniformSize);
Timothy Liang44636e92018-08-08 10:50:21 -040026
27 void set1i(UniformHandle, int32_t) const override;
28 void set1iv(UniformHandle, int arrayCount, const int32_t v[]) const override;
29 void set1f(UniformHandle, float v0) const override;
30 void set1fv(UniformHandle, int arrayCount, const float v[]) const override;
Michael Ludwig779ed022018-08-28 17:20:07 -040031 void set2i(UniformHandle, int32_t, int32_t) const override;
32 void set2iv(UniformHandle, int arrayCount, const int32_t v[]) const override;
Timothy Liang44636e92018-08-08 10:50:21 -040033 void set2f(UniformHandle, float, float) const override;
34 void set2fv(UniformHandle, int arrayCount, const float v[]) const override;
Michael Ludwig779ed022018-08-28 17:20:07 -040035 void set3i(UniformHandle, int32_t, int32_t, int32_t) const override;
36 void set3iv(UniformHandle, int arrayCount, const int32_t v[]) const override;
Timothy Liang44636e92018-08-08 10:50:21 -040037 void set3f(UniformHandle, float, float, float) const override;
38 void set3fv(UniformHandle, int arrayCount, const float v[]) const override;
Michael Ludwig779ed022018-08-28 17:20:07 -040039 void set4i(UniformHandle, int32_t, int32_t, int32_t, int32_t) const override;
40 void set4iv(UniformHandle, int arrayCount, const int32_t v[]) const override;
Timothy Liang44636e92018-08-08 10:50:21 -040041 void set4f(UniformHandle, float, float, float, float) const override;
42 void set4fv(UniformHandle, int arrayCount, const float v[]) const override;
43 // matrices are column-major, the first two upload a single matrix, the latter two upload
44 // arrayCount matrices into a uniform array.
45 void setMatrix2f(UniformHandle, const float matrix[]) const override;
46 void setMatrix3f(UniformHandle, const float matrix[]) const override;
47 void setMatrix4f(UniformHandle, const float matrix[]) const override;
48 void setMatrix2fv(UniformHandle, int arrayCount, const float matrices[]) const override;
49 void setMatrix3fv(UniformHandle, int arrayCount, const float matrices[]) const override;
50 void setMatrix4fv(UniformHandle, int arrayCount, const float matrices[]) const override;
51
52 // for nvpr only
53 void setPathFragmentInputTransform(VaryingHandle u, int components,
54 const SkMatrix& matrix) const override {
55 SK_ABORT("Only supported in NVPR, which is not in Metal");
56 }
57
Jim Van Verthdd15d692019-04-22 15:29:53 -040058 void uploadAndBindUniformBuffers(GrMtlGpu* gpu,
59 id<MTLRenderCommandEncoder> renderCmdEncoder) const;
60 void resetDirtyBits();
Timothy Liang44636e92018-08-08 10:50:21 -040061
62private:
63 struct Uniform {
Timothy Liang44636e92018-08-08 10:50:21 -040064 uint32_t fOffset;
65 SkDEBUGCODE(
66 GrSLType fType;
67 int fArrayCount;
68 );
69 };
70
71 template<int N> inline void setMatrices(UniformHandle, int arrayCount,
72 const float matrices[]) const;
73
74 void* getBufferPtrAndMarkDirty(const Uniform& uni) const;
75
Ethan Nicholase5dc1eb2019-08-13 17:02:25 -040076 uint32_t fUniformSize;
Timothy Liang44636e92018-08-08 10:50:21 -040077
78 SkTArray<Uniform, true> fUniforms;
79
Ethan Nicholase5dc1eb2019-08-13 17:02:25 -040080 mutable SkAutoMalloc fUniformData;
81 mutable bool fUniformsDirty;
Timothy Liang44636e92018-08-08 10:50:21 -040082};
83
84#endif