blob: 6a3b07f9fc94261eeb1294abfa6a8e24872e403d [file] [log] [blame]
jvanverth992ad362016-02-26 09:21:02 -08001/*
2* Copyright 2016 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
egdaniel22281c12016-03-23 13:49:40 -07008#ifndef GrVkPipelineStateDataManager_DEFINED
9#define GrVkPipelineStateDataManager_DEFINED
jvanverth992ad362016-02-26 09:21:02 -080010
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "src/gpu/glsl/GrGLSLProgramDataManager.h"
jvanverth992ad362016-02-26 09:21:02 -080012
Mike Kleinc0bd9f92019-04-23 12:05:21 -050013#include "include/gpu/vk/GrVkTypes.h"
14#include "src/core/SkAutoMalloc.h"
15#include "src/gpu/vk/GrVkUniformHandler.h"
jvanverth992ad362016-02-26 09:21:02 -080016
17class GrVkGpu;
18class GrVkUniformBuffer;
19
egdaniel22281c12016-03-23 13:49:40 -070020class GrVkPipelineStateDataManager : public GrGLSLProgramDataManager {
jvanverth992ad362016-02-26 09:21:02 -080021public:
22 typedef GrVkUniformHandler::UniformInfoArray UniformInfoArray;
23
egdaniel22281c12016-03-23 13:49:40 -070024 GrVkPipelineStateDataManager(const UniformInfoArray&,
Greg Daniel18f96022017-05-04 15:09:03 -040025 uint32_t geometryUniformSize,
egdaniel22281c12016-03-23 13:49:40 -070026 uint32_t fragmentUniformSize);
jvanverth992ad362016-02-26 09:21:02 -080027
fmenozzi497e9e22016-06-21 09:42:12 -070028 void set1i(UniformHandle, int32_t) const override;
fmenozzi35a98c72016-07-20 08:26:12 -070029 void set1iv(UniformHandle, int arrayCount, const int32_t v[]) const override;
jvanverth992ad362016-02-26 09:21:02 -080030 void set1f(UniformHandle, float v0) const override;
31 void set1fv(UniformHandle, int arrayCount, const float v[]) const override;
Michael Ludwig779ed022018-08-28 17:20:07 -040032 void set2i(UniformHandle, int32_t, int32_t) const override;
33 void set2iv(UniformHandle, int arrayCount, const int32_t v[]) const override;
jvanverth992ad362016-02-26 09:21:02 -080034 void set2f(UniformHandle, float, float) const override;
35 void set2fv(UniformHandle, int arrayCount, const float v[]) const override;
Michael Ludwig779ed022018-08-28 17:20:07 -040036 void set3i(UniformHandle, int32_t, int32_t, int32_t) const override;
37 void set3iv(UniformHandle, int arrayCount, const int32_t v[]) const override;
jvanverth992ad362016-02-26 09:21:02 -080038 void set3f(UniformHandle, float, float, float) const override;
39 void set3fv(UniformHandle, int arrayCount, const float v[]) const override;
Michael Ludwig779ed022018-08-28 17:20:07 -040040 void set4i(UniformHandle, int32_t, int32_t, int32_t, int32_t) const override;
41 void set4iv(UniformHandle, int arrayCount, const int32_t v[]) const override;
jvanverth992ad362016-02-26 09:21:02 -080042 void set4f(UniformHandle, float, float, float, float) const override;
43 void set4fv(UniformHandle, int arrayCount, const float v[]) const override;
44 // matrices are column-major, the first two upload a single matrix, the latter two upload
45 // arrayCount matrices into a uniform array.
cdalton8d988b32016-03-07 15:39:09 -080046 void setMatrix2f(UniformHandle, const float matrix[]) const override;
jvanverth992ad362016-02-26 09:21:02 -080047 void setMatrix3f(UniformHandle, const float matrix[]) const override;
48 void setMatrix4f(UniformHandle, const float matrix[]) const override;
cdalton8d988b32016-03-07 15:39:09 -080049 void setMatrix2fv(UniformHandle, int arrayCount, const float matrices[]) const override;
jvanverth992ad362016-02-26 09:21:02 -080050 void setMatrix3fv(UniformHandle, int arrayCount, const float matrices[]) const override;
51 void setMatrix4fv(UniformHandle, int arrayCount, const float matrices[]) const override;
52
53 // for nvpr only
54 void setPathFragmentInputTransform(VaryingHandle u, int components,
55 const SkMatrix& matrix) const override {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -040056 SK_ABORT("Only supported in NVPR, which is not in vulkan");
jvanverth992ad362016-02-26 09:21:02 -080057 }
58
Greg Daniel18f96022017-05-04 15:09:03 -040059 // Returns true if either the geometry or fragment buffers needed to generate a new underlying
egdaniel7cbffda2016-04-08 13:27:53 -070060 // VkBuffer object in order upload data. If true is returned, this is a signal to the caller
61 // that they will need to update the descriptor set that is using these buffers.
jvanvertha584de92016-06-30 09:10:52 -070062 bool uploadUniformBuffers(GrVkGpu* gpu,
Greg Daniel18f96022017-05-04 15:09:03 -040063 GrVkUniformBuffer* geometryBuffer,
jvanverth992ad362016-02-26 09:21:02 -080064 GrVkUniformBuffer* fragmentBuffer) const;
65private:
66 struct Uniform {
67 uint32_t fBinding;
68 uint32_t fOffset;
69 SkDEBUGCODE(
70 GrSLType fType;
71 int fArrayCount;
jvanverth992ad362016-02-26 09:21:02 -080072 );
73 };
74
cdalton8d988b32016-03-07 15:39:09 -080075 template<int N> inline void setMatrices(UniformHandle, int arrayCount,
76 const float matrices[]) const;
77
jvanverth910114a2016-03-08 12:09:27 -080078 void* getBufferPtrAndMarkDirty(const Uniform& uni) const;
79
Greg Daniel18f96022017-05-04 15:09:03 -040080 uint32_t fGeometryUniformSize;
jvanverth992ad362016-02-26 09:21:02 -080081 uint32_t fFragmentUniformSize;
82
83 SkTArray<Uniform, true> fUniforms;
84
Greg Daniel18f96022017-05-04 15:09:03 -040085 mutable SkAutoMalloc fGeometryUniformData;
jvanverth992ad362016-02-26 09:21:02 -080086 mutable SkAutoMalloc fFragmentUniformData;
Greg Daniel18f96022017-05-04 15:09:03 -040087 mutable bool fGeometryUniformsDirty;
jvanverth910114a2016-03-08 12:09:27 -080088 mutable bool fFragmentUniformsDirty;
jvanverth992ad362016-02-26 09:21:02 -080089};
90
91#endif