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 = 16; | |
jvanverth1
2016/04/28 20:34:30
Add this as a constant.
| |
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 |