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

Side by Side Diff: src/gpu/vk/GrVkResourceProvider.cpp

Issue 1977403002: Refactor creation of GrVkRenderPasses to make them move general (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: review nits Created 4 years, 6 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/GrVkResourceProvider.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "GrVkResourceProvider.h" 8 #include "GrVkResourceProvider.h"
9 9
10 #include "GrTextureParams.h" 10 #include "GrTextureParams.h"
(...skipping 10 matching lines...) Expand all
21 21
22 GrVkResourceProvider::GrVkResourceProvider(GrVkGpu* gpu) 22 GrVkResourceProvider::GrVkResourceProvider(GrVkGpu* gpu)
23 : fGpu(gpu) 23 : fGpu(gpu)
24 , fPipelineCache(VK_NULL_HANDLE) 24 , fPipelineCache(VK_NULL_HANDLE)
25 , fUniformDescPool(nullptr) 25 , fUniformDescPool(nullptr)
26 , fCurrentUniformDescCount(0) { 26 , fCurrentUniformDescCount(0) {
27 fPipelineStateCache = new PipelineStateCache(gpu); 27 fPipelineStateCache = new PipelineStateCache(gpu);
28 } 28 }
29 29
30 GrVkResourceProvider::~GrVkResourceProvider() { 30 GrVkResourceProvider::~GrVkResourceProvider() {
31 SkASSERT(0 == fSimpleRenderPasses.count()); 31 SkASSERT(0 == fRenderPassArray.count());
32 SkASSERT(VK_NULL_HANDLE == fPipelineCache); 32 SkASSERT(VK_NULL_HANDLE == fPipelineCache);
33 delete fPipelineStateCache; 33 delete fPipelineStateCache;
34 } 34 }
35 35
36 void GrVkResourceProvider::initUniformDescObjects() { 36 void GrVkResourceProvider::initUniformDescObjects() {
37 // Create Uniform Buffer Descriptor 37 // Create Uniform Buffer Descriptor
38 // The vertex uniform buffer will have binding 0 and the fragment binding 1. 38 // The vertex uniform buffer will have binding 0 and the fragment binding 1.
39 VkDescriptorSetLayoutBinding dsUniBindings[2]; 39 VkDescriptorSetLayoutBinding dsUniBindings[2];
40 memset(&dsUniBindings, 0, 2 * sizeof(VkDescriptorSetLayoutBinding)); 40 memset(&dsUniBindings, 0, 2 * sizeof(VkDescriptorSetLayoutBinding));
41 dsUniBindings[0].binding = GrVkUniformHandler::kVertexBinding; 41 dsUniBindings[0].binding = GrVkUniformHandler::kVertexBinding;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 95
96 return GrVkPipeline::Create(fGpu, pipeline, primProc, shaderStageInfo, shade rStageCount, 96 return GrVkPipeline::Create(fGpu, pipeline, primProc, shaderStageInfo, shade rStageCount,
97 primitiveType, renderPass, layout, fPipelineCach e); 97 primitiveType, renderPass, layout, fPipelineCach e);
98 } 98 }
99 99
100 100
101 // To create framebuffers, we first need to create a simple RenderPass that is 101 // To create framebuffers, we first need to create a simple RenderPass that is
102 // only used for framebuffer creation. When we actually render we will create 102 // only used for framebuffer creation. When we actually render we will create
103 // RenderPasses as needed that are compatible with the framebuffer. 103 // RenderPasses as needed that are compatible with the framebuffer.
104 const GrVkRenderPass* 104 const GrVkRenderPass*
105 GrVkResourceProvider::findOrCreateCompatibleRenderPass(const GrVkRenderTarget& t arget) { 105 GrVkResourceProvider::findCompatibleRenderPass(const GrVkRenderTarget& target,
106 for (int i = 0; i < fSimpleRenderPasses.count(); ++i) { 106 CompatibleRPHandle* compatibleHan dle) {
107 GrVkRenderPass* renderPass = fSimpleRenderPasses[i]; 107 for (int i = 0; i < fRenderPassArray.count(); ++i) {
108 if (renderPass->isCompatible(target)) { 108 if (fRenderPassArray[i].isCompatible(target)) {
109 const GrVkRenderPass* renderPass = fRenderPassArray[i].getCompatible RenderPass();
109 renderPass->ref(); 110 renderPass->ref();
111 if (compatibleHandle) {
112 *compatibleHandle = CompatibleRPHandle(i);
113 }
110 return renderPass; 114 return renderPass;
111 } 115 }
112 } 116 }
113 117
114 GrVkRenderPass* renderPass = new GrVkRenderPass(); 118 const GrVkRenderPass* renderPass =
115 renderPass->initSimple(fGpu, target); 119 fRenderPassArray.emplace_back(fGpu, target).getCompatibleRenderPass();
116 fSimpleRenderPasses.push_back(renderPass); 120 renderPass->ref();
121
122 if (compatibleHandle) {
123 *compatibleHandle = CompatibleRPHandle(fRenderPassArray.count() - 1);
124 }
125 return renderPass;
126 }
127
128 const GrVkRenderPass*
129 GrVkResourceProvider::findCompatibleRenderPass(const CompatibleRPHandle& compati bleHandle) {
130 SkASSERT(compatibleHandle.isValid() && compatibleHandle.toIndex() < fRenderP assArray.count());
131 int index = compatibleHandle.toIndex();
132 const GrVkRenderPass* renderPass = fRenderPassArray[index].getCompatibleRend erPass();
117 renderPass->ref(); 133 renderPass->ref();
118 return renderPass; 134 return renderPass;
119 } 135 }
120 136
121 GrVkDescriptorPool* GrVkResourceProvider::findOrCreateCompatibleDescriptorPool( 137 GrVkDescriptorPool* GrVkResourceProvider::findOrCreateCompatibleDescriptorPool(
122 VkDescriptorType typ e, uint32_t count) { 138 VkDescriptorType typ e, uint32_t count) {
123 return new GrVkDescriptorPool(fGpu, type, count); 139 return new GrVkDescriptorPool(fGpu, type, count);
124 } 140 }
125 141
126 GrVkSampler* GrVkResourceProvider::findOrCreateCompatibleSampler(const GrTexture Params& params, 142 GrVkSampler* GrVkResourceProvider::findOrCreateCompatibleSampler(const GrTexture Params& params,
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 207
192 void GrVkResourceProvider::destroyResources() { 208 void GrVkResourceProvider::destroyResources() {
193 // release our current command buffers 209 // release our current command buffers
194 for (int i = 0; i < fActiveCommandBuffers.count(); ++i) { 210 for (int i = 0; i < fActiveCommandBuffers.count(); ++i) {
195 SkASSERT(fActiveCommandBuffers[i]->finished(fGpu)); 211 SkASSERT(fActiveCommandBuffers[i]->finished(fGpu));
196 SkASSERT(fActiveCommandBuffers[i]->unique()); 212 SkASSERT(fActiveCommandBuffers[i]->unique());
197 fActiveCommandBuffers[i]->unref(fGpu); 213 fActiveCommandBuffers[i]->unref(fGpu);
198 } 214 }
199 fActiveCommandBuffers.reset(); 215 fActiveCommandBuffers.reset();
200 216
201 // loop over all render passes to make sure we destroy all the internal VkRe nderPasses 217 // loop over all render pass sets to make sure we destroy all the internal V kRenderPasses
202 for (int i = 0; i < fSimpleRenderPasses.count(); ++i) { 218 for (int i = 0; i < fRenderPassArray.count(); ++i) {
203 fSimpleRenderPasses[i]->unref(fGpu); 219 fRenderPassArray[i].releaseResources(fGpu);
204 } 220 }
205 fSimpleRenderPasses.reset(); 221 fRenderPassArray.reset();
206 222
207 // Iterate through all store GrVkSamplers and unref them before resetting th e hash. 223 // Iterate through all store GrVkSamplers and unref them before resetting th e hash.
208 SkTDynamicHash<GrVkSampler, uint16_t>::Iter iter(&fSamplers); 224 SkTDynamicHash<GrVkSampler, uint16_t>::Iter iter(&fSamplers);
209 for (; !iter.done(); ++iter) { 225 for (; !iter.done(); ++iter) {
210 (*iter).unref(fGpu); 226 (*iter).unref(fGpu);
211 } 227 }
212 fSamplers.reset(); 228 fSamplers.reset();
213 229
214 fPipelineStateCache->release(); 230 fPipelineStateCache->release();
215 231
(...skipping 14 matching lines...) Expand all
230 } 246 }
231 247
232 void GrVkResourceProvider::abandonResources() { 248 void GrVkResourceProvider::abandonResources() {
233 // release our current command buffers 249 // release our current command buffers
234 for (int i = 0; i < fActiveCommandBuffers.count(); ++i) { 250 for (int i = 0; i < fActiveCommandBuffers.count(); ++i) {
235 SkASSERT(fActiveCommandBuffers[i]->finished(fGpu)); 251 SkASSERT(fActiveCommandBuffers[i]->finished(fGpu));
236 fActiveCommandBuffers[i]->unrefAndAbandon(); 252 fActiveCommandBuffers[i]->unrefAndAbandon();
237 } 253 }
238 fActiveCommandBuffers.reset(); 254 fActiveCommandBuffers.reset();
239 255
240 for (int i = 0; i < fSimpleRenderPasses.count(); ++i) { 256 // loop over all render pass sets to make sure we destroy all the internal V kRenderPasses
241 fSimpleRenderPasses[i]->unrefAndAbandon(); 257 for (int i = 0; i < fRenderPassArray.count(); ++i) {
258 fRenderPassArray[i].abandonResources();
242 } 259 }
243 fSimpleRenderPasses.reset(); 260 fRenderPassArray.reset();
244 261
245 // Iterate through all store GrVkSamplers and unrefAndAbandon them before re setting the hash. 262 // Iterate through all store GrVkSamplers and unrefAndAbandon them before re setting the hash.
246 SkTDynamicHash<GrVkSampler, uint16_t>::Iter iter(&fSamplers); 263 SkTDynamicHash<GrVkSampler, uint16_t>::Iter iter(&fSamplers);
247 for (; !iter.done(); ++iter) { 264 for (; !iter.done(); ++iter) {
248 (*iter).unrefAndAbandon(); 265 (*iter).unrefAndAbandon();
249 } 266 }
250 fSamplers.reset(); 267 fSamplers.reset();
251 268
252 fPipelineStateCache->abandon(); 269 fPipelineStateCache->abandon();
253 270
254 #ifdef SK_TRACE_VK_RESOURCES 271 #ifdef SK_TRACE_VK_RESOURCES
255 SkASSERT(0 == GrVkResource::fTrace.count()); 272 SkASSERT(0 == GrVkResource::fTrace.count());
256 #endif 273 #endif
257 fPipelineCache = VK_NULL_HANDLE; 274 fPipelineCache = VK_NULL_HANDLE;
258 275
259 fUniformDescLayout = VK_NULL_HANDLE; 276 fUniformDescLayout = VK_NULL_HANDLE;
260 fUniformDescPool->unrefAndAbandon(); 277 fUniformDescPool->unrefAndAbandon();
261 } 278 }
279
280 ////////////////////////////////////////////////////////////////////////////////
281
282 GrVkResourceProvider::CompatibleRenderPassSet::CompatibleRenderPassSet(
283 const GrVkG pu* gpu,
284 const GrVkR enderTarget& target)
285 : fLastReturnedIndex(0) {
286 fRenderPasses.emplace_back(new GrVkRenderPass());
287 fRenderPasses[0]->initSimple(gpu, target);
288 }
289
290 bool GrVkResourceProvider::CompatibleRenderPassSet::isCompatible(
291 const GrVkRenderTar get& target) const {
292 // The first GrVkRenderpass should always exists since we create the basic l oad store
293 // render pass on create
294 SkASSERT(fRenderPasses[0]);
295 return fRenderPasses[0]->isCompatible(target);
296 }
297
298 void GrVkResourceProvider::CompatibleRenderPassSet::releaseResources(const GrVkG pu* gpu) {
299 for (int i = 0; i < fRenderPasses.count(); ++i) {
300 if (fRenderPasses[i]) {
301 fRenderPasses[i]->unref(gpu);
302 fRenderPasses[i] = nullptr;
303 }
304 }
305 }
306
307 void GrVkResourceProvider::CompatibleRenderPassSet::abandonResources() {
308 for (int i = 0; i < fRenderPasses.count(); ++i) {
309 if (fRenderPasses[i]) {
310 fRenderPasses[i]->unrefAndAbandon();
311 fRenderPasses[i] = nullptr;
312 }
313 }
314 }
OLDNEW
« no previous file with comments | « src/gpu/vk/GrVkResourceProvider.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698