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

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

Issue 2275633002: Add support for getting vulkan descriptor sets without a GrVkUniformHandler. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 4 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
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 "GrVkDescriptorSetManager.h" 8 #include "GrVkDescriptorSetManager.h"
9 9
10 #include "GrVkDescriptorPool.h" 10 #include "GrVkDescriptorPool.h"
11 #include "GrVkDescriptorSet.h" 11 #include "GrVkDescriptorSet.h"
12 #include "GrVkGpu.h" 12 #include "GrVkGpu.h"
13 #include "GrVkUniformHandler.h" 13 #include "GrVkUniformHandler.h"
14 #include "glsl/GrGLSLSampler.h" 14 #include "glsl/GrGLSLSampler.h"
15 15
16 GrVkDescriptorSetManager::GrVkDescriptorSetManager(GrVkGpu* gpu, 16 GrVkDescriptorSetManager::GrVkDescriptorSetManager(GrVkGpu* gpu,
17 VkDescriptorType type, 17 VkDescriptorType type,
18 const GrVkUniformHandler* uni formHandler) 18 const GrVkUniformHandler* uni formHandler)
19 : fPoolManager(type, gpu, uniformHandler) { 19 : fPoolManager(type, gpu, uniformHandler) {
20 if (type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) { 20 if (type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) {
21 SkASSERT(uniformHandler); 21 SkASSERT(uniformHandler);
22 for (int i = 0; i < uniformHandler->numSamplers(); ++i) { 22 for (int i = 0; i < uniformHandler->numSamplers(); ++i) {
23 fBindingVisibilities.push_back(uniformHandler->getSampler(i).visibil ity()); 23 fBindingVisibilities.push_back(uniformHandler->getSampler(i).visibil ity());
jvanverth1 2016/08/23 20:13:36 Any possibility of storing the visibilities as a s
24 } 24 }
25 } else { 25 } else {
26 SkASSERT(type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER); 26 SkASSERT(type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER);
27 // We set the visibility of the first binding to the vertex shader and t he second to the 27 // We set the visibility of the first binding to the vertex shader and t he second to the
28 // fragment shader. 28 // fragment shader.
29 fBindingVisibilities.push_back(kVertex_GrShaderFlag); 29 fBindingVisibilities.push_back(kVertex_GrShaderFlag);
30 fBindingVisibilities.push_back(kFragment_GrShaderFlag); 30 fBindingVisibilities.push_back(kFragment_GrShaderFlag);
31 } 31 }
32 } 32 }
33 33
34 GrVkDescriptorSetManager::GrVkDescriptorSetManager(GrVkGpu* gpu,
35 VkDescriptorType type,
36 const uint32_t* visibilities,
37 int visibilityCount)
38 : fPoolManager(type, gpu, visibilities, visibilityCount) {
39 if (type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) {
40 for (int i = 0; i < visibilityCount; ++i) {
41 fBindingVisibilities.push_back(visibilities[i]);
42 }
43 } else {
44 SkASSERT(type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER);
45 SkASSERT(!visibilities || (2 == visibilityCount &&
46 kVertex_GrShaderFlag == visibilities[0] &&
47 kFragment_GrShaderFlag == visibilities[1]));
48 // We set the visibility of the first binding to the vertex shader and t he second to the
49 // fragment shader.
50 fBindingVisibilities.push_back(kVertex_GrShaderFlag);
51 fBindingVisibilities.push_back(kFragment_GrShaderFlag);
52 }
53 }
54
34 const GrVkDescriptorSet* GrVkDescriptorSetManager::getDescriptorSet(GrVkGpu* gpu , 55 const GrVkDescriptorSet* GrVkDescriptorSetManager::getDescriptorSet(GrVkGpu* gpu ,
35 const Handle & handle) { 56 const Handle & handle) {
36 const GrVkDescriptorSet* ds = nullptr; 57 const GrVkDescriptorSet* ds = nullptr;
37 int count = fFreeSets.count(); 58 int count = fFreeSets.count();
38 if (count > 0) { 59 if (count > 0) {
39 ds = fFreeSets[count - 1]; 60 ds = fFreeSets[count - 1];
40 fFreeSets.removeShuffle(count - 1); 61 fFreeSets.removeShuffle(count - 1);
41 } else { 62 } else {
42 VkDescriptorSet vkDS; 63 VkDescriptorSet vkDS;
43 fPoolManager.getNewDescriptorSet(gpu, &vkDS); 64 fPoolManager.getNewDescriptorSet(gpu, &vkDS);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 } 105 }
85 for (int i = 0; i < uniHandler->numSamplers(); ++i) { 106 for (int i = 0; i < uniHandler->numSamplers(); ++i) {
86 if (uniHandler->getSampler(i).visibility() != fBindingVisibilities[i ]) { 107 if (uniHandler->getSampler(i).visibility() != fBindingVisibilities[i ]) {
87 return false; 108 return false;
88 } 109 }
89 } 110 }
90 } 111 }
91 return true; 112 return true;
92 } 113 }
93 114
115 bool GrVkDescriptorSetManager::isCompatible(VkDescriptorType type,
116 const uint32_t* visibilities,
117 int visibilityCount) const {
118 if (type != fPoolManager.fDescType) {
119 return false;
120 }
121
122 if (type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) {
123 SkASSERT(visibilities);
124 if (fBindingVisibilities.count() != visibilityCount) {
125 return false;
126 }
127 for (int i = 0; i < visibilityCount; ++i) {
128 if (visibilities[i] != fBindingVisibilities[i]) {
129 return false;
130 }
131 }
132 }
133 return true;
134 }
135
94 //////////////////////////////////////////////////////////////////////////////// 136 ////////////////////////////////////////////////////////////////////////////////
95 137
96 VkShaderStageFlags visibility_to_vk_stage_flags(uint32_t visibility) { 138 VkShaderStageFlags visibility_to_vk_stage_flags(uint32_t visibility) {
97 VkShaderStageFlags flags = 0; 139 VkShaderStageFlags flags = 0;
98 140
99 if (visibility & kVertex_GrShaderFlag) { 141 if (visibility & kVertex_GrShaderFlag) {
100 flags |= VK_SHADER_STAGE_VERTEX_BIT; 142 flags |= VK_SHADER_STAGE_VERTEX_BIT;
101 } 143 }
102 if (visibility & kGeometry_GrShaderFlag) { 144 if (visibility & kGeometry_GrShaderFlag) {
103 flags |= VK_SHADER_STAGE_GEOMETRY_BIT; 145 flags |= VK_SHADER_STAGE_GEOMETRY_BIT;
104 } 146 }
105 if (visibility & kFragment_GrShaderFlag) { 147 if (visibility & kFragment_GrShaderFlag) {
106 flags |= VK_SHADER_STAGE_FRAGMENT_BIT; 148 flags |= VK_SHADER_STAGE_FRAGMENT_BIT;
107 } 149 }
108 return flags; 150 return flags;
109 } 151 }
110 152
111 GrVkDescriptorSetManager::DescriptorPoolManager::DescriptorPoolManager( 153 GrVkDescriptorSetManager::DescriptorPoolManager::DescriptorPoolManager(
112 VkDescriptorType type, 154 VkDescriptorType type,
113 GrVkGpu* gpu, 155 GrVkGpu* gpu,
114 const GrVkUniformHandler* uniformHandler) 156 const GrVkUniformHandler* uniformHandler)
115 : fDescType(type) 157 : fDescType(type)
116 , fCurrentDescriptorCount(0) 158 , fCurrentDescriptorCount(0)
117 , fPool(nullptr) { 159 , fPool(nullptr) {
160 this->init(gpu, type, uniformHandler, nullptr, 0);
161 }
162
163 GrVkDescriptorSetManager::DescriptorPoolManager::DescriptorPoolManager(VkDescrip torType type,
164 GrVkGpu* gpu,
165 const uin t32_t* visibilities,
166 int visib ilityCount)
167 : fDescType(type)
168 , fCurrentDescriptorCount(0)
169 , fPool(nullptr) {
170 this->init(gpu, type, nullptr, visibilities, visibilityCount);
171 }
172
173 void GrVkDescriptorSetManager::DescriptorPoolManager::init(GrVkGpu* gpu,
174 VkDescriptorType type ,
175 const GrVkUniformHand ler* uniformHandler,
176 const uint32_t* visib ilities,
177 int visibilityCount) {
118 if (type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) { 178 if (type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) {
119 SkASSERT(uniformHandler); 179 SkASSERT(SkToBool(uniformHandler) != SkToBool(visibilities));
120 uint32_t numSamplers = (uint32_t)uniformHandler->numSamplers(); 180 uint32_t numSamplers;
181 if (uniformHandler) {
182 numSamplers = (uint32_t)uniformHandler->numSamplers();
183 } else {
184 numSamplers = (uint32_t)visibilityCount;
185 }
121 186
122 SkAutoTDeleteArray<VkDescriptorSetLayoutBinding> dsSamplerBindings( 187 SkAutoTDeleteArray<VkDescriptorSetLayoutBinding> dsSamplerBindings(
123 new VkDescriptorSetLayoutBinding[numSamplers]); 188 new VkDescriptorSetLayoutBinding[numSamplers]);
124 for (uint32_t i = 0; i < numSamplers; ++i) { 189 for (uint32_t i = 0; i < numSamplers; ++i) {
125 const GrVkGLSLSampler& sampler = 190 uint32_t visibility;
191 if (uniformHandler) {
192 const GrVkGLSLSampler& sampler =
126 static_cast<const GrVkGLSLSampler&>(uniformHandler->getSampl er(i)); 193 static_cast<const GrVkGLSLSampler&>(uniformHandler->getSampl er(i));
127 SkASSERT(sampler.binding() == i); 194 SkASSERT(sampler.binding() == i);
128 dsSamplerBindings[i].binding = sampler.binding(); 195 visibility = sampler.visibility();
196 } else {
197 visibility = visibilities[i];
198 }
199 dsSamplerBindings[i].binding = i;
129 dsSamplerBindings[i].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IM AGE_SAMPLER; 200 dsSamplerBindings[i].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IM AGE_SAMPLER;
130 dsSamplerBindings[i].descriptorCount = 1; 201 dsSamplerBindings[i].descriptorCount = 1;
131 dsSamplerBindings[i].stageFlags = visibility_to_vk_stage_flags(sampl er.visibility()); 202 dsSamplerBindings[i].stageFlags = visibility_to_vk_stage_flags(visib ility);
132 dsSamplerBindings[i].pImmutableSamplers = nullptr; 203 dsSamplerBindings[i].pImmutableSamplers = nullptr;
133 } 204 }
134 205
135 VkDescriptorSetLayoutCreateInfo dsSamplerLayoutCreateInfo; 206 VkDescriptorSetLayoutCreateInfo dsSamplerLayoutCreateInfo;
136 memset(&dsSamplerLayoutCreateInfo, 0, sizeof(VkDescriptorSetLayoutCreate Info)); 207 memset(&dsSamplerLayoutCreateInfo, 0, sizeof(VkDescriptorSetLayoutCreate Info));
137 dsSamplerLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOU T_CREATE_INFO; 208 dsSamplerLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOU T_CREATE_INFO;
138 dsSamplerLayoutCreateInfo.pNext = nullptr; 209 dsSamplerLayoutCreateInfo.pNext = nullptr;
139 dsSamplerLayoutCreateInfo.flags = 0; 210 dsSamplerLayoutCreateInfo.flags = 0;
140 dsSamplerLayoutCreateInfo.bindingCount = numSamplers; 211 dsSamplerLayoutCreateInfo.bindingCount = numSamplers;
141 // Setting to nullptr fixes an error in the param checker validation lay er. Even though 212 // Setting to nullptr fixes an error in the param checker validation lay er. Even though
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 } 310 }
240 } 311 }
241 312
242 void GrVkDescriptorSetManager::DescriptorPoolManager::abandonGPUResources() { 313 void GrVkDescriptorSetManager::DescriptorPoolManager::abandonGPUResources() {
243 fDescLayout = VK_NULL_HANDLE; 314 fDescLayout = VK_NULL_HANDLE;
244 if (fPool) { 315 if (fPool) {
245 fPool->unrefAndAbandon(); 316 fPool->unrefAndAbandon();
246 fPool = nullptr; 317 fPool = nullptr;
247 } 318 }
248 } 319 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698