blob: a690a3634e319c1d9992d178bf11a30ca95e1787 [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
11#include "glsl/GrGLSLProgramDataManager.h"
12
Hal Canary95e3c052017-01-11 12:44:43 -050013#include "SkAutoMalloc.h"
jvanverth992ad362016-02-26 09:21:02 -080014#include "vk/GrVkUniformHandler.h"
15
16class GrVkGpu;
17class GrVkUniformBuffer;
18
egdaniel22281c12016-03-23 13:49:40 -070019class GrVkPipelineStateDataManager : public GrGLSLProgramDataManager {
jvanverth992ad362016-02-26 09:21:02 -080020public:
21 typedef GrVkUniformHandler::UniformInfoArray UniformInfoArray;
22
egdaniel22281c12016-03-23 13:49:40 -070023 GrVkPipelineStateDataManager(const UniformInfoArray&,
Greg Daniel18f96022017-05-04 15:09:03 -040024 uint32_t geometryUniformSize,
egdaniel22281c12016-03-23 13:49:40 -070025 uint32_t fragmentUniformSize);
jvanverth992ad362016-02-26 09:21:02 -080026
fmenozzi497e9e22016-06-21 09:42:12 -070027 void set1i(UniformHandle, int32_t) const override;
fmenozzi35a98c72016-07-20 08:26:12 -070028 void set1iv(UniformHandle, int arrayCount, const int32_t v[]) const override;
jvanverth992ad362016-02-26 09:21:02 -080029 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;
jvanverth992ad362016-02-26 09:21:02 -080033 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;
jvanverth992ad362016-02-26 09:21:02 -080037 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;
jvanverth992ad362016-02-26 09:21:02 -080041 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.
cdalton8d988b32016-03-07 15:39:09 -080045 void setMatrix2f(UniformHandle, const float matrix[]) const override;
jvanverth992ad362016-02-26 09:21:02 -080046 void setMatrix3f(UniformHandle, const float matrix[]) const override;
47 void setMatrix4f(UniformHandle, const float matrix[]) const override;
cdalton8d988b32016-03-07 15:39:09 -080048 void setMatrix2fv(UniformHandle, int arrayCount, const float matrices[]) const override;
jvanverth992ad362016-02-26 09:21:02 -080049 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 {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -040055 SK_ABORT("Only supported in NVPR, which is not in vulkan");
jvanverth992ad362016-02-26 09:21:02 -080056 }
57
Greg Daniel18f96022017-05-04 15:09:03 -040058 // Returns true if either the geometry or fragment buffers needed to generate a new underlying
egdaniel7cbffda2016-04-08 13:27:53 -070059 // VkBuffer object in order upload data. If true is returned, this is a signal to the caller
60 // that they will need to update the descriptor set that is using these buffers.
jvanvertha584de92016-06-30 09:10:52 -070061 bool uploadUniformBuffers(GrVkGpu* gpu,
Greg Daniel18f96022017-05-04 15:09:03 -040062 GrVkUniformBuffer* geometryBuffer,
jvanverth992ad362016-02-26 09:21:02 -080063 GrVkUniformBuffer* fragmentBuffer) const;
64private:
65 struct Uniform {
66 uint32_t fBinding;
67 uint32_t fOffset;
68 SkDEBUGCODE(
69 GrSLType fType;
70 int fArrayCount;
jvanverth992ad362016-02-26 09:21:02 -080071 );
72 };
73
cdalton8d988b32016-03-07 15:39:09 -080074 template<int N> inline void setMatrices(UniformHandle, int arrayCount,
75 const float matrices[]) const;
76
jvanverth910114a2016-03-08 12:09:27 -080077 void* getBufferPtrAndMarkDirty(const Uniform& uni) const;
78
Greg Daniel18f96022017-05-04 15:09:03 -040079 uint32_t fGeometryUniformSize;
jvanverth992ad362016-02-26 09:21:02 -080080 uint32_t fFragmentUniformSize;
81
82 SkTArray<Uniform, true> fUniforms;
83
Greg Daniel18f96022017-05-04 15:09:03 -040084 mutable SkAutoMalloc fGeometryUniformData;
jvanverth992ad362016-02-26 09:21:02 -080085 mutable SkAutoMalloc fFragmentUniformData;
Greg Daniel18f96022017-05-04 15:09:03 -040086 mutable bool fGeometryUniformsDirty;
jvanverth910114a2016-03-08 12:09:27 -080087 mutable bool fFragmentUniformsDirty;
jvanverth992ad362016-02-26 09:21:02 -080088};
89
90#endif