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" |
11 #include "GrVkCommandBuffer.h" | 11 #include "GrVkCommandBuffer.h" |
12 #include "GrVkPipeline.h" | 12 #include "GrVkPipeline.h" |
13 #include "GrVkRenderPass.h" | 13 #include "GrVkRenderPass.h" |
14 #include "GrVkSampler.h" | 14 #include "GrVkSampler.h" |
15 #include "GrVkUtil.h" | 15 #include "GrVkUtil.h" |
16 | 16 |
17 #ifdef SK_TRACE_VK_RESOURCES | 17 #ifdef SK_TRACE_VK_RESOURCES |
18 SkTDynamicHash<GrVkResource, uint32_t> GrVkResource::fTrace; | 18 SkTDynamicHash<GrVkResource, uint32_t> GrVkResource::fTrace; |
19 SkRandom GrVkResource::fRandom; | 19 SkRandom GrVkResource::fRandom; |
20 #endif | 20 #endif |
21 | 21 |
22 GrVkResourceProvider::GrVkResourceProvider(GrVkGpu* gpu) : fGpu(gpu) | 22 GrVkResourceProvider::GrVkResourceProvider(GrVkGpu* gpu) |
23 , fPipelineCache(VK_NUL
L_HANDLE) { | 23 : fGpu(gpu) |
| 24 , fPipelineCache(VK_NULL_HANDLE) |
| 25 , fUniformDescPool(nullptr) |
| 26 , fCurrentUniformDescCount(0) { |
24 fPipelineStateCache = new PipelineStateCache(gpu); | 27 fPipelineStateCache = new PipelineStateCache(gpu); |
25 } | 28 } |
26 | 29 |
27 GrVkResourceProvider::~GrVkResourceProvider() { | 30 GrVkResourceProvider::~GrVkResourceProvider() { |
28 SkASSERT(0 == fSimpleRenderPasses.count()); | 31 SkASSERT(0 == fSimpleRenderPasses.count()); |
29 SkASSERT(VK_NULL_HANDLE == fPipelineCache); | 32 SkASSERT(VK_NULL_HANDLE == fPipelineCache); |
30 delete fPipelineStateCache; | 33 delete fPipelineStateCache; |
31 } | 34 } |
32 | 35 |
| 36 void GrVkResourceProvider::initUniformDescObjects() { |
| 37 // Create Uniform Buffer Descriptor |
| 38 // The vertex uniform buffer will have binding 0 and the fragment binding 1. |
| 39 VkDescriptorSetLayoutBinding dsUniBindings[2]; |
| 40 memset(&dsUniBindings, 0, 2 * sizeof(VkDescriptorSetLayoutBinding)); |
| 41 dsUniBindings[0].binding = GrVkUniformHandler::kVertexBinding; |
| 42 dsUniBindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; |
| 43 dsUniBindings[0].descriptorCount = 1; |
| 44 dsUniBindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT; |
| 45 dsUniBindings[0].pImmutableSamplers = nullptr; |
| 46 dsUniBindings[1].binding = GrVkUniformHandler::kFragBinding; |
| 47 dsUniBindings[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; |
| 48 dsUniBindings[1].descriptorCount = 1; |
| 49 dsUniBindings[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; |
| 50 dsUniBindings[1].pImmutableSamplers = nullptr; |
| 51 |
| 52 VkDescriptorSetLayoutCreateInfo dsUniformLayoutCreateInfo; |
| 53 memset(&dsUniformLayoutCreateInfo, 0, sizeof(VkDescriptorSetLayoutCreateInfo
)); |
| 54 dsUniformLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CR
EATE_INFO; |
| 55 dsUniformLayoutCreateInfo.pNext = nullptr; |
| 56 dsUniformLayoutCreateInfo.flags = 0; |
| 57 dsUniformLayoutCreateInfo.bindingCount = 2; |
| 58 dsUniformLayoutCreateInfo.pBindings = dsUniBindings; |
| 59 |
| 60 GR_VK_CALL_ERRCHECK(fGpu->vkInterface(), CreateDescriptorSetLayout(fGpu->dev
ice(), |
| 61 &dsUnifor
mLayoutCreateInfo, |
| 62 nullptr, |
| 63 &fUniform
DescLayout)); |
| 64 fCurrMaxUniDescriptors = kStartNumUniformDescriptors; |
| 65 fUniformDescPool = this->findOrCreateCompatibleDescriptorPool(VK_DESCRIPTOR_
TYPE_UNIFORM_BUFFER, |
| 66 fCurrMaxUniDes
criptors); |
| 67 } |
| 68 |
33 void GrVkResourceProvider::init() { | 69 void GrVkResourceProvider::init() { |
34 VkPipelineCacheCreateInfo createInfo; | 70 VkPipelineCacheCreateInfo createInfo; |
35 memset(&createInfo, 0, sizeof(VkPipelineCacheCreateInfo)); | 71 memset(&createInfo, 0, sizeof(VkPipelineCacheCreateInfo)); |
36 createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; | 72 createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; |
37 createInfo.pNext = nullptr; | 73 createInfo.pNext = nullptr; |
38 createInfo.flags = 0; | 74 createInfo.flags = 0; |
39 createInfo.initialDataSize = 0; | 75 createInfo.initialDataSize = 0; |
40 createInfo.pInitialData = nullptr; | 76 createInfo.pInitialData = nullptr; |
41 VkResult result = GR_VK_CALL(fGpu->vkInterface(), | 77 VkResult result = GR_VK_CALL(fGpu->vkInterface(), |
42 CreatePipelineCache(fGpu->device(), &createInfo
, nullptr, | 78 CreatePipelineCache(fGpu->device(), &createInfo
, nullptr, |
43 &fPipelineCache)); | 79 &fPipelineCache)); |
44 SkASSERT(VK_SUCCESS == result); | 80 SkASSERT(VK_SUCCESS == result); |
45 if (VK_SUCCESS != result) { | 81 if (VK_SUCCESS != result) { |
46 fPipelineCache = VK_NULL_HANDLE; | 82 fPipelineCache = VK_NULL_HANDLE; |
47 } | 83 } |
| 84 |
| 85 this->initUniformDescObjects(); |
48 } | 86 } |
49 | 87 |
50 GrVkPipeline* GrVkResourceProvider::createPipeline(const GrPipeline& pipeline, | 88 GrVkPipeline* GrVkResourceProvider::createPipeline(const GrPipeline& pipeline, |
51 const GrPrimitiveProcessor& p
rimProc, | 89 const GrPrimitiveProcessor& p
rimProc, |
52 VkPipelineShaderStageCreateIn
fo* shaderStageInfo, | 90 VkPipelineShaderStageCreateIn
fo* shaderStageInfo, |
53 int shaderStageCount, | 91 int shaderStageCount, |
54 GrPrimitiveType primitiveType
, | 92 GrPrimitiveType primitiveType
, |
55 const GrVkRenderPass& renderP
ass, | 93 const GrVkRenderPass& renderP
ass, |
56 VkPipelineLayout layout) { | 94 VkPipelineLayout layout) { |
57 | 95 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 } | 136 } |
99 | 137 |
100 sk_sp<GrVkPipelineState> GrVkResourceProvider::findOrCreateCompatiblePipelineSta
te( | 138 sk_sp<GrVkPipelineState> GrVkResourceProvider::findOrCreateCompatiblePipelineSta
te( |
101 const GrPipelin
e& pipeline, | 139 const GrPipelin
e& pipeline, |
102 const GrPrimiti
veProcessor& proc, | 140 const GrPrimiti
veProcessor& proc, |
103 GrPrimitiveType
primitiveType, | 141 GrPrimitiveType
primitiveType, |
104 const GrVkRende
rPass& renderPass) { | 142 const GrVkRende
rPass& renderPass) { |
105 return fPipelineStateCache->refPipelineState(pipeline, proc, primitiveType,
renderPass); | 143 return fPipelineStateCache->refPipelineState(pipeline, proc, primitiveType,
renderPass); |
106 } | 144 } |
107 | 145 |
| 146 void GrVkResourceProvider::getUniformDescriptorSet(VkDescriptorSet* ds, |
| 147 const GrVkDescriptorPool** ou
tPool) { |
| 148 fCurrentUniformDescCount += kNumUniformDescPerSet; |
| 149 if (fCurrentUniformDescCount > fCurrMaxUniDescriptors) { |
| 150 fUniformDescPool->unref(fGpu); |
| 151 if (fCurrMaxUniDescriptors < kMaxUniformDescriptors >> 1) { |
| 152 fCurrMaxUniDescriptors = fCurrMaxUniDescriptors << 1; |
| 153 } else { |
| 154 fCurrMaxUniDescriptors = kMaxUniformDescriptors; |
| 155 } |
| 156 fUniformDescPool = |
| 157 this->findOrCreateCompatibleDescriptorPool(VK_DESCRIPTOR_TYPE_UNIFOR
M_BUFFER, |
| 158 fCurrMaxUniDescriptors); |
| 159 fCurrentUniformDescCount = kNumUniformDescPerSet; |
| 160 } |
| 161 SkASSERT(fUniformDescPool); |
| 162 |
| 163 VkDescriptorSetAllocateInfo dsAllocateInfo; |
| 164 memset(&dsAllocateInfo, 0, sizeof(VkDescriptorSetAllocateInfo)); |
| 165 dsAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; |
| 166 dsAllocateInfo.pNext = nullptr; |
| 167 dsAllocateInfo.descriptorPool = fUniformDescPool->descPool(); |
| 168 dsAllocateInfo.descriptorSetCount = 1; |
| 169 dsAllocateInfo.pSetLayouts = &fUniformDescLayout; |
| 170 GR_VK_CALL_ERRCHECK(fGpu->vkInterface(), AllocateDescriptorSets(fGpu->device
(), |
| 171 &dsAllocateI
nfo, |
| 172 ds)); |
| 173 *outPool = fUniformDescPool; |
| 174 } |
| 175 |
108 GrVkCommandBuffer* GrVkResourceProvider::createCommandBuffer() { | 176 GrVkCommandBuffer* GrVkResourceProvider::createCommandBuffer() { |
109 GrVkCommandBuffer* cmdBuffer = GrVkCommandBuffer::Create(fGpu, fGpu->cmdPool
()); | 177 GrVkCommandBuffer* cmdBuffer = GrVkCommandBuffer::Create(fGpu, fGpu->cmdPool
()); |
110 fActiveCommandBuffers.push_back(cmdBuffer); | 178 fActiveCommandBuffers.push_back(cmdBuffer); |
111 cmdBuffer->ref(); | 179 cmdBuffer->ref(); |
112 return cmdBuffer; | 180 return cmdBuffer; |
113 } | 181 } |
114 | 182 |
115 void GrVkResourceProvider::checkCommandBuffers() { | 183 void GrVkResourceProvider::checkCommandBuffers() { |
116 for (int i = fActiveCommandBuffers.count()-1; i >= 0; --i) { | 184 for (int i = fActiveCommandBuffers.count()-1; i >= 0; --i) { |
117 if (fActiveCommandBuffers[i]->finished(fGpu)) { | 185 if (fActiveCommandBuffers[i]->finished(fGpu)) { |
(...skipping 26 matching lines...) Expand all Loading... |
144 fSamplers.reset(); | 212 fSamplers.reset(); |
145 | 213 |
146 fPipelineStateCache->release(); | 214 fPipelineStateCache->release(); |
147 | 215 |
148 #ifdef SK_TRACE_VK_RESOURCES | 216 #ifdef SK_TRACE_VK_RESOURCES |
149 SkASSERT(0 == GrVkResource::fTrace.count()); | 217 SkASSERT(0 == GrVkResource::fTrace.count()); |
150 #endif | 218 #endif |
151 | 219 |
152 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineCache(fGpu->device(), fPipeli
neCache, nullptr)); | 220 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineCache(fGpu->device(), fPipeli
neCache, nullptr)); |
153 fPipelineCache = VK_NULL_HANDLE; | 221 fPipelineCache = VK_NULL_HANDLE; |
| 222 |
| 223 if (fUniformDescLayout) { |
| 224 GR_VK_CALL(fGpu->vkInterface(), DestroyDescriptorSetLayout(fGpu->device(
), |
| 225 fUniformDescL
ayout, |
| 226 nullptr)); |
| 227 fUniformDescLayout = VK_NULL_HANDLE; |
| 228 } |
| 229 fUniformDescPool->unref(fGpu); |
154 } | 230 } |
155 | 231 |
156 void GrVkResourceProvider::abandonResources() { | 232 void GrVkResourceProvider::abandonResources() { |
157 // release our current command buffers | 233 // release our current command buffers |
158 for (int i = 0; i < fActiveCommandBuffers.count(); ++i) { | 234 for (int i = 0; i < fActiveCommandBuffers.count(); ++i) { |
159 SkASSERT(fActiveCommandBuffers[i]->finished(fGpu)); | 235 SkASSERT(fActiveCommandBuffers[i]->finished(fGpu)); |
160 fActiveCommandBuffers[i]->unrefAndAbandon(); | 236 fActiveCommandBuffers[i]->unrefAndAbandon(); |
161 } | 237 } |
162 fActiveCommandBuffers.reset(); | 238 fActiveCommandBuffers.reset(); |
163 | 239 |
164 for (int i = 0; i < fSimpleRenderPasses.count(); ++i) { | 240 for (int i = 0; i < fSimpleRenderPasses.count(); ++i) { |
165 fSimpleRenderPasses[i]->unrefAndAbandon(); | 241 fSimpleRenderPasses[i]->unrefAndAbandon(); |
166 } | 242 } |
167 fSimpleRenderPasses.reset(); | 243 fSimpleRenderPasses.reset(); |
168 | 244 |
169 // Iterate through all store GrVkSamplers and unrefAndAbandon them before re
setting the hash. | 245 // Iterate through all store GrVkSamplers and unrefAndAbandon them before re
setting the hash. |
170 SkTDynamicHash<GrVkSampler, uint16_t>::Iter iter(&fSamplers); | 246 SkTDynamicHash<GrVkSampler, uint16_t>::Iter iter(&fSamplers); |
171 for (; !iter.done(); ++iter) { | 247 for (; !iter.done(); ++iter) { |
172 (*iter).unrefAndAbandon(); | 248 (*iter).unrefAndAbandon(); |
173 } | 249 } |
174 fSamplers.reset(); | 250 fSamplers.reset(); |
175 | 251 |
176 fPipelineStateCache->abandon(); | 252 fPipelineStateCache->abandon(); |
177 | 253 |
178 #ifdef SK_TRACE_VK_RESOURCES | 254 #ifdef SK_TRACE_VK_RESOURCES |
179 SkASSERT(0 == GrVkResource::fTrace.count()); | 255 SkASSERT(0 == GrVkResource::fTrace.count()); |
180 #endif | 256 #endif |
181 fPipelineCache = VK_NULL_HANDLE; | 257 fPipelineCache = VK_NULL_HANDLE; |
| 258 |
| 259 fUniformDescLayout = VK_NULL_HANDLE; |
| 260 fUniformDescPool->unrefAndAbandon(); |
182 } | 261 } |
OLD | NEW |