Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(271)

Side by Side Diff: src/gpu/vk/GrVkProgram.h

Issue 1816153002: Set up cache in vulkan to reuse GrVkPrograms (aka VkPipelines) (Closed) Base URL: https://skia.googlesource.com/skia.git@progSamplers
Patch Set: rebase Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/vk/GrVkPipelineStateDataManager.cpp ('k') | src/gpu/vk/GrVkProgram.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * Copyright 2015 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
9 #ifndef GrVkProgram_DEFINED
10 #define GrVkProgram_DEFINED
11
12 #include "GrVkImage.h"
13 #include "GrVkProgramDesc.h"
14 #include "GrVkProgramDataManager.h"
15 #include "glsl/GrGLSLProgramBuilder.h"
16
17 #include "vulkan/vulkan.h"
18
19 class GrPipeline;
20 class GrVkCommandBuffer;
21 class GrVkDescriptorPool;
22 class GrVkGpu;
23 class GrVkImageView;
24 class GrVkPipeline;
25 class GrVkSampler;
26 class GrVkUniformBuffer;
27
28 class GrVkProgram : public SkRefCnt {
29 public:
30 typedef GrGLSLProgramBuilder::BuiltinUniformHandles BuiltinUniformHandles;
31
32 ~GrVkProgram();
33
34 GrVkPipeline* vkPipeline() const { return fPipeline; }
35
36 void setData(GrVkGpu*, const GrPrimitiveProcessor&, const GrPipeline&);
37
38 void bind(const GrVkGpu* gpu, GrVkCommandBuffer* commandBuffer);
39
40 void addUniformResources(GrVkCommandBuffer&);
41
42 void freeGPUResources(const GrVkGpu* gpu);
43
44 // This releases resources the only a given instance of a GrVkProgram needs to hold onto and do
45 // don't need to survive across new uses of the program.
46 void freeTempResources(const GrVkGpu* gpu);
47
48 void abandonGPUResources();
49
50 private:
51 typedef GrVkProgramDataManager::UniformInfoArray UniformInfoArray;
52 typedef GrGLSLProgramDataManager::UniformHandle UniformHandle;
53
54 GrVkProgram(GrVkGpu* gpu,
55 GrVkPipeline* pipeline,
56 VkPipelineLayout layout,
57 VkDescriptorSetLayout dsLayout[2],
58 const BuiltinUniformHandles& builtinUniformHandles,
59 const UniformInfoArray& uniforms,
60 uint32_t vertexUniformSize,
61 uint32_t fragmentUniformSize,
62 uint32_t numSamplers,
63 GrGLSLPrimitiveProcessor* geometryProcessor,
64 GrGLSLXferProcessor* xferProcessor,
65 const GrGLSLFragProcs& fragmentProcessors);
66
67 // Each pool will manage one type of descriptor. Thus each descriptor set we use will all be of
68 // one VkDescriptorType.
69 struct DescriptorPoolManager {
70 DescriptorPoolManager(VkDescriptorSetLayout layout, VkDescriptorType typ e,
71 uint32_t descCount, GrVkGpu* gpu)
72 : fDescLayout(layout)
73 , fDescType(type)
74 , fCurrentDescriptorSet(0)
75 , fPool(nullptr) {
76 SkASSERT(descCount < (SK_MaxU32 >> 2));
77 fMaxDescriptorSets = descCount << 2;
78 this->getNewPool(gpu);
79 }
80
81 ~DescriptorPoolManager() {
82 SkASSERT(!fDescLayout);
83 SkASSERT(!fPool);
84 }
85
86 void getNewDescriptorSet(GrVkGpu* gpu, VkDescriptorSet* ds);
87
88 void freeGPUResources(const GrVkGpu* gpu);
89 void abandonGPUResources();
90
91 VkDescriptorSetLayout fDescLayout;
92 VkDescriptorType fDescType;
93 uint32_t fMaxDescriptorSets;
94 uint32_t fCurrentDescriptorSet;
95 GrVkDescriptorPool* fPool;
96
97 private:
98 void getNewPool(GrVkGpu* gpu);
99 };
100
101 void writeUniformBuffers(const GrVkGpu* gpu);
102
103 void writeSamplers(GrVkGpu* gpu, const SkTArray<const GrTextureAccess*>& tex tureBindings);
104
105
106 /**
107 * We use the RT's size and origin to adjust from Skia device space to OpenGL normalized device
108 * space and to make device space positions have the correct origin for proce ssors that require
109 * them.
110 */
111 struct RenderTargetState {
112 SkISize fRenderTargetSize;
113 GrSurfaceOrigin fRenderTargetOrigin;
114
115 RenderTargetState() { this->invalidate(); }
116 void invalidate() {
117 fRenderTargetSize.fWidth = -1;
118 fRenderTargetSize.fHeight = -1;
119 fRenderTargetOrigin = (GrSurfaceOrigin)-1;
120 }
121
122 /**
123 * Gets a vec4 that adjusts the position from Skia device coords to GL's normalized device
124 * coords. Assuming the transformed position, pos, is a homogeneous vec3, the vec, v, is
125 * applied as such:
126 * pos.x = dot(v.xy, pos.xz)
127 * pos.y = dot(v.zw, pos.yz)
128 */
129 void getRTAdjustmentVec(float* destVec) {
130 destVec[0] = 2.f / fRenderTargetSize.fWidth;
131 destVec[1] = -1.f;
132 if (kBottomLeft_GrSurfaceOrigin == fRenderTargetOrigin) {
133 destVec[2] = -2.f / fRenderTargetSize.fHeight;
134 destVec[3] = 1.f;
135 } else {
136 destVec[2] = 2.f / fRenderTargetSize.fHeight;
137 destVec[3] = -1.f;
138 }
139 }
140 };
141
142 // Helper for setData() that sets the view matrix and loads the render targe t height uniform
143 void setRenderTargetState(const GrPipeline&);
144
145 // GrVkResources
146 GrVkPipeline* fPipeline;
147
148 // Used for binding DescriptorSets to the command buffer but does not need t o survive during
149 // command buffer execution. Thus this is not need to be a GrVkResource.
150 VkPipelineLayout fPipelineLayout;
151
152 // The DescriptorSets need to survive until the gpu has finished all draws t hat use them.
153 // However, they will only be freed by the descriptor pool. Thus by simply k eeping the
154 // descriptor pool alive through the draw, the descritor sets will also stay alive. Thus we do
155 // not need a GrVkResource versions of VkDescriptorSet. We hold on to these in the program since
156 // we update the descriptor sets and bind them at separate times;
157 VkDescriptorSet fDescriptorSets[2];
158
159 // Meta data so we know which descriptor sets we are using and need to bind.
160 int fStartDS;
161 int fDSCount;
162
163 SkAutoTDelete<GrVkUniformBuffer> fVertexUniformBuffer;
164 SkAutoTDelete<GrVkUniformBuffer> fFragmentUniformBuffer;
165
166 // GrVkResources used for sampling textures
167 SkTDArray<GrVkSampler*> fSamplers;
168 SkTDArray<const GrVkImageView*> fTextureViews;
169 SkTDArray<const GrVkImage::Resource*> fTextures;
170
171 // Tracks the current render target uniforms stored in the vertex buffer.
172 RenderTargetState fRenderTargetState;
173 BuiltinUniformHandles fBuiltinUniformHandles;
174
175 // Processors in the program
176 SkAutoTDelete<GrGLSLPrimitiveProcessor> fGeometryProcessor;
177 SkAutoTDelete<GrGLSLXferProcessor> fXferProcessor;
178 GrGLSLFragProcs fFragmentProcessors;
179
180 GrVkProgramDataManager fProgramDataManager;
181
182 DescriptorPoolManager fSamplerPoolManager;
183 DescriptorPoolManager fUniformPoolManager;
184
185 int fNumSamplers;
186
187 friend class GrVkProgramBuilder;
188 };
189
190 #endif
OLDNEW
« no previous file with comments | « src/gpu/vk/GrVkPipelineStateDataManager.cpp ('k') | src/gpu/vk/GrVkProgram.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698