Index: src/gpu/vk/GrVkResourceProvider.cpp |
diff --git a/src/gpu/vk/GrVkResourceProvider.cpp b/src/gpu/vk/GrVkResourceProvider.cpp |
index abe07bdd0455e9218d757a044eb5cfdb7574b496..d1c6f09e939384f6b478eab2a50fc5bfdb86063d 100644 |
--- a/src/gpu/vk/GrVkResourceProvider.cpp |
+++ b/src/gpu/vk/GrVkResourceProvider.cpp |
@@ -9,10 +9,12 @@ |
#include "GrTextureParams.h" |
#include "GrVkCommandBuffer.h" |
+#include "GrVkGLSLSampler.h" |
#include "GrVkPipeline.h" |
#include "GrVkRenderTarget.h" |
#include "GrVkSampler.h" |
#include "GrVkUniformBuffer.h" |
+#include "GrVkUniformHandler.h" |
#include "GrVkUtil.h" |
#ifdef SK_TRACE_VK_RESOURCES |
@@ -22,8 +24,7 @@ uint32_t GrVkResource::fKeyCounter = 0; |
GrVkResourceProvider::GrVkResourceProvider(GrVkGpu* gpu) |
: fGpu(gpu) |
- , fPipelineCache(VK_NULL_HANDLE) |
- , fCurrentUniformDescCount(0) { |
+ , fPipelineCache(VK_NULL_HANDLE) { |
fPipelineStateCache = new PipelineStateCache(gpu); |
} |
@@ -57,12 +58,16 @@ void GrVkResourceProvider::initUniformDescObjects() { |
dsUniformLayoutCreateInfo.bindingCount = 2; |
dsUniformLayoutCreateInfo.pBindings = dsUniBindings; |
+ VkDescriptorSetLayout uniformDescLayout; |
GR_VK_CALL_ERRCHECK(fGpu->vkInterface(), CreateDescriptorSetLayout(fGpu->device(), |
&dsUniformLayoutCreateInfo, |
nullptr, |
- &fUniformDescLayout)); |
+ &uniformDescLayout)); |
- this->getDescSetHandle(0, fUniformDescLayout, &fUniformDSHandle); |
+ fDescriptorSetManagers.emplace_back(fGpu, uniformDescLayout, |
+ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2); |
+ SkASSERT(1 == fDescriptorSetManagers.count()); |
+ fUniformDSHandle = GrVkDescriptorSetManager::Handle(0); |
} |
void GrVkResourceProvider::init() { |
@@ -190,31 +195,91 @@ sk_sp<GrVkPipelineState> GrVkResourceProvider::findOrCreateCompatiblePipelineSta |
return fPipelineStateCache->refPipelineState(pipeline, proc, primitiveType, renderPass); |
} |
+VkShaderStageFlags visibility_to_vk_stage_flags(uint32_t visibility) { |
+ VkShaderStageFlags flags = 0; |
-void GrVkResourceProvider::getDescSetHandle(uint32_t numSamplers, VkDescriptorSetLayout layout, |
- GrVkDescriptorSetManager::Handle* handle) { |
+ if (visibility & kVertex_GrShaderFlag) { |
+ flags |= VK_SHADER_STAGE_VERTEX_BIT; |
+ } |
+ if (visibility & kGeometry_GrShaderFlag) { |
+ flags |= VK_SHADER_STAGE_GEOMETRY_BIT; |
+ } |
+ if (visibility & kFragment_GrShaderFlag) { |
+ flags |= VK_SHADER_STAGE_FRAGMENT_BIT; |
+ } |
+ return flags; |
+} |
+ |
+void GrVkResourceProvider::getSamplerDescriptorSetHandle(const GrVkUniformHandler& uniformHandler, |
+ GrVkDescriptorSetManager::Handle* handle) { |
SkASSERT(handle); |
for (int i = 0; i < fDescriptorSetManagers.count(); ++i) { |
- if (fDescriptorSetManagers[i].isCompatible(numSamplers)) { |
+ if (fDescriptorSetManagers[i].isCompatible(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, |
+ &uniformHandler)) { |
*handle = GrVkDescriptorSetManager::Handle(i); |
return; |
} |
} |
// Failed to find a DescSetManager, we must create a new one; |
- VkDescriptorType type = numSamplers ? VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER |
- : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; |
+ uint32_t numSamplers = (uint32_t)uniformHandler.numSamplers(); |
+ |
+ SkAutoTDeleteArray<VkDescriptorSetLayoutBinding> dsSamplerBindings( |
+ new VkDescriptorSetLayoutBinding[numSamplers]); |
+ for (uint32_t i = 0; i < numSamplers; ++i) { |
+ const GrVkGLSLSampler& sampler = |
+ static_cast<const GrVkGLSLSampler&>(uniformHandler.getSampler(i)); |
+ SkASSERT(sampler.binding() == i); |
+ dsSamplerBindings[i].binding = sampler.binding(); |
+ dsSamplerBindings[i].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; |
+ dsSamplerBindings[i].descriptorCount = 1; |
+ dsSamplerBindings[i].stageFlags = visibility_to_vk_stage_flags(sampler.visibility()); |
+ dsSamplerBindings[i].pImmutableSamplers = nullptr; |
+ } |
- fDescriptorSetManagers.emplace_back(fGpu, layout, type, numSamplers); |
+ VkDescriptorSetLayoutCreateInfo dsSamplerLayoutCreateInfo; |
+ memset(&dsSamplerLayoutCreateInfo, 0, sizeof(VkDescriptorSetLayoutCreateInfo)); |
+ dsSamplerLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; |
+ dsSamplerLayoutCreateInfo.pNext = nullptr; |
+ dsSamplerLayoutCreateInfo.flags = 0; |
+ dsSamplerLayoutCreateInfo.bindingCount = numSamplers; |
+ // Setting to nullptr fixes an error in the param checker validation layer. Even though |
+ // bindingCount is 0 (which is valid), it still tries to validate pBindings unless it is null. |
+ dsSamplerLayoutCreateInfo.pBindings = numSamplers ? dsSamplerBindings.get() : nullptr; |
+ |
+ VkDescriptorSetLayout dsLayout; |
+ GR_VK_CALL_ERRCHECK(fGpu->vkInterface(), |
+ CreateDescriptorSetLayout(fGpu->device(), |
+ &dsSamplerLayoutCreateInfo, |
+ nullptr, |
+ &dsLayout)); |
+ fDescriptorSetManagers.emplace_back(fGpu, dsLayout, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, |
+ numSamplers, &uniformHandler); |
*handle = GrVkDescriptorSetManager::Handle(fDescriptorSetManagers.count() - 1); |
} |
+VkDescriptorSetLayout GrVkResourceProvider::getUniformDSLayout() const { |
+ SkASSERT(fUniformDSHandle.isValid()); |
+ return fDescriptorSetManagers[fUniformDSHandle.toIndex()].layout(); |
+} |
+ |
+VkDescriptorSetLayout GrVkResourceProvider::getSamplerDSLayout( |
+ const GrVkDescriptorSetManager::Handle& handle) const { |
+ SkASSERT(handle.isValid()); |
+ return fDescriptorSetManagers[handle.toIndex()].layout(); |
+} |
+ |
const GrVkDescriptorSet* GrVkResourceProvider::getUniformDescriptorSet() { |
SkASSERT(fUniformDSHandle.isValid()); |
return fDescriptorSetManagers[fUniformDSHandle.toIndex()].getDescriptorSet(fGpu, |
fUniformDSHandle); |
} |
+const GrVkDescriptorSet* GrVkResourceProvider::getSamplerDescriptorSet( |
+ const GrVkDescriptorSetManager::Handle& handle) { |
+ SkASSERT(handle.isValid()); |
+ return fDescriptorSetManagers[handle.toIndex()].getDescriptorSet(fGpu, handle); |
+} |
void GrVkResourceProvider::recycleDescriptorSet(const GrVkDescriptorSet* descSet, |
const GrVkDescriptorSetManager::Handle& handle) { |
@@ -326,13 +391,6 @@ void GrVkResourceProvider::destroyResources() { |
GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineCache(fGpu->device(), fPipelineCache, nullptr)); |
fPipelineCache = VK_NULL_HANDLE; |
- if (fUniformDescLayout) { |
- GR_VK_CALL(fGpu->vkInterface(), DestroyDescriptorSetLayout(fGpu->device(), |
- fUniformDescLayout, |
- nullptr)); |
- fUniformDescLayout = VK_NULL_HANDLE; |
- } |
- |
// We must release/destroy all command buffers and pipeline states before releasing the |
// GrVkDescriptorSetManagers |
for (int i = 0; i < fDescriptorSetManagers.count(); ++i) { |