blob: 91d50924b68e24e67f0dfd9a5d2a510aeb638fd0 [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&,
Ethan Nicholas0be34802019-08-15 12:36:58 -040025 uint32_t uniformSize);
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,
Ethan Nicholas0be34802019-08-15 12:36:58 -040062 GrVkUniformBuffer* buffer) const;
jvanverth992ad362016-02-26 09:21:02 -080063private:
64 struct Uniform {
jvanverth992ad362016-02-26 09:21:02 -080065 uint32_t fOffset;
66 SkDEBUGCODE(
67 GrSLType fType;
68 int fArrayCount;
jvanverth992ad362016-02-26 09:21:02 -080069 );
70 };
71
cdalton8d988b32016-03-07 15:39:09 -080072 template<int N> inline void setMatrices(UniformHandle, int arrayCount,
73 const float matrices[]) const;
74
jvanverth910114a2016-03-08 12:09:27 -080075 void* getBufferPtrAndMarkDirty(const Uniform& uni) const;
76
Ethan Nicholas0be34802019-08-15 12:36:58 -040077 uint32_t fUniformSize;
jvanverth992ad362016-02-26 09:21:02 -080078
79 SkTArray<Uniform, true> fUniforms;
80
Ethan Nicholas0be34802019-08-15 12:36:58 -040081 mutable SkAutoMalloc fUniformData;
82 mutable bool fUniformsDirty;
jvanverth992ad362016-02-26 09:21:02 -080083};
84
85#endif