OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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); | |
jvanverth1
2016/06/02 20:09:35
So at the moment each set only has one renderpass,
egdaniel
2016/06/02 20:50:26
Yes currently it will always be the load and store
| |
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 } | |
OLD | NEW |