| 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); |
| 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 |