Commit b717952e by Jamie Madill Committed by Commit Bot

Vulkan: Use packed enum map for descriptor set index.

This simplifies a lot of the data structure indexing in the program executable class. Also renames the "DriverUniforms" and "InternalShader" index into a single "Internal" index. Bug: angleproject:5736 Change-Id: I2a51d8b14d5b16b438dbe636f77b11bbc045ba9a Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2773321 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com>
parent 1b08cfcb
...@@ -3942,7 +3942,7 @@ void ContextVk::invalidateComputePipelineBinding() ...@@ -3942,7 +3942,7 @@ void ContextVk::invalidateComputePipelineBinding()
void ContextVk::invalidateGraphicsDescriptorSet(DescriptorSetIndex usedDescriptorSet) void ContextVk::invalidateGraphicsDescriptorSet(DescriptorSetIndex usedDescriptorSet)
{ {
// UtilsVk currently only uses set 0 // UtilsVk currently only uses set 0
ASSERT(usedDescriptorSet == DescriptorSetIndex::DriverUniforms); ASSERT(usedDescriptorSet == DescriptorSetIndex::Internal);
if (mDriverUniforms[PipelineType::Graphics].descriptorSet != VK_NULL_HANDLE) if (mDriverUniforms[PipelineType::Graphics].descriptorSet != VK_NULL_HANDLE)
{ {
mGraphicsDirtyBits.set(DIRTY_BIT_DRIVER_UNIFORMS_BINDING); mGraphicsDirtyBits.set(DIRTY_BIT_DRIVER_UNIFORMS_BINDING);
...@@ -3952,7 +3952,7 @@ void ContextVk::invalidateGraphicsDescriptorSet(DescriptorSetIndex usedDescripto ...@@ -3952,7 +3952,7 @@ void ContextVk::invalidateGraphicsDescriptorSet(DescriptorSetIndex usedDescripto
void ContextVk::invalidateComputeDescriptorSet(DescriptorSetIndex usedDescriptorSet) void ContextVk::invalidateComputeDescriptorSet(DescriptorSetIndex usedDescriptorSet)
{ {
// UtilsVk currently only uses set 0 // UtilsVk currently only uses set 0
ASSERT(usedDescriptorSet == DescriptorSetIndex::DriverUniforms); ASSERT(usedDescriptorSet == DescriptorSetIndex::Internal);
if (mDriverUniforms[PipelineType::Compute].descriptorSet != VK_NULL_HANDLE) if (mDriverUniforms[PipelineType::Compute].descriptorSet != VK_NULL_HANDLE)
{ {
mComputeDirtyBits.set(DIRTY_BIT_DRIVER_UNIFORMS_BINDING); mComputeDirtyBits.set(DIRTY_BIT_DRIVER_UNIFORMS_BINDING);
...@@ -4355,7 +4355,7 @@ void ContextVk::handleDirtyDriverUniformsBindingImpl(vk::CommandBuffer *commandB ...@@ -4355,7 +4355,7 @@ void ContextVk::handleDirtyDriverUniformsBindingImpl(vk::CommandBuffer *commandB
} }
commandBuffer->bindDescriptorSets( commandBuffer->bindDescriptorSets(
mExecutable->getPipelineLayout(), bindPoint, DescriptorSetIndex::DriverUniforms, 1, mExecutable->getPipelineLayout(), bindPoint, DescriptorSetIndex::Internal, 1,
&driverUniforms->descriptorSet, 1, &driverUniforms->dynamicOffset); &driverUniforms->descriptorSet, 1, &driverUniforms->dynamicOffset);
} }
......
...@@ -51,7 +51,7 @@ void GlslangWrapperVk::ResetGlslangProgramInterfaceInfo( ...@@ -51,7 +51,7 @@ void GlslangWrapperVk::ResetGlslangProgramInterfaceInfo(
ToUnderlying(DescriptorSetIndex::ShaderResource); ToUnderlying(DescriptorSetIndex::ShaderResource);
glslangProgramInterfaceInfo->currentShaderResourceBindingIndex = 0; glslangProgramInterfaceInfo->currentShaderResourceBindingIndex = 0;
glslangProgramInterfaceInfo->driverUniformsDescriptorSetIndex = glslangProgramInterfaceInfo->driverUniformsDescriptorSetIndex =
ToUnderlying(DescriptorSetIndex::DriverUniforms); ToUnderlying(DescriptorSetIndex::Internal);
glslangProgramInterfaceInfo->locationsUsedForXfbExtension = 0; glslangProgramInterfaceInfo->locationsUsedForXfbExtension = 0;
} }
......
...@@ -426,11 +426,11 @@ angle::Result ProgramExecutableVk::allocUniformAndXfbDescriptorSet( ...@@ -426,11 +426,11 @@ angle::Result ProgramExecutableVk::allocUniformAndXfbDescriptorSet(
VkDescriptorSet descriptorSet = VK_NULL_HANDLE; VkDescriptorSet descriptorSet = VK_NULL_HANDLE;
if (mUniformsAndXfbDescriptorSetCache.get(xfbBufferDesc, &descriptorSet)) if (mUniformsAndXfbDescriptorSetCache.get(xfbBufferDesc, &descriptorSet))
{ {
*newDescriptorSetAllocated = false; *newDescriptorSetAllocated = false;
mDescriptorSets[ToUnderlying(DescriptorSetIndex::UniformsAndXfb)] = descriptorSet; mDescriptorSets[DescriptorSetIndex::UniformsAndXfb] = descriptorSet;
// The descriptor pool that this descriptor set was allocated from needs to be retained each // The descriptor pool that this descriptor set was allocated from needs to be retained each
// time the descriptor set is used in a new command. // time the descriptor set is used in a new command.
mDescriptorPoolBindings[ToUnderlying(DescriptorSetIndex::UniformsAndXfb)].get().retain( mDescriptorPoolBindings[DescriptorSetIndex::UniformsAndXfb].get().retain(
&contextVk->getResourceUseList()); &contextVk->getResourceUseList());
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -446,8 +446,8 @@ angle::Result ProgramExecutableVk::allocUniformAndXfbDescriptorSet( ...@@ -446,8 +446,8 @@ angle::Result ProgramExecutableVk::allocUniformAndXfbDescriptorSet(
} }
// Add the descriptor set into cache // Add the descriptor set into cache
mUniformsAndXfbDescriptorSetCache.insert( mUniformsAndXfbDescriptorSetCache.insert(xfbBufferDesc,
xfbBufferDesc, mDescriptorSets[ToUnderlying(DescriptorSetIndex::UniformsAndXfb)]); mDescriptorSets[DescriptorSetIndex::UniformsAndXfb]);
*newDescriptorSetAllocated = true; *newDescriptorSetAllocated = true;
return angle::Result::Continue; return angle::Result::Continue;
...@@ -465,18 +465,16 @@ angle::Result ProgramExecutableVk::allocateDescriptorSetAndGetInfo( ...@@ -465,18 +465,16 @@ angle::Result ProgramExecutableVk::allocateDescriptorSetAndGetInfo(
DescriptorSetIndex descriptorSetIndex, DescriptorSetIndex descriptorSetIndex,
bool *newPoolAllocatedOut) bool *newPoolAllocatedOut)
{ {
vk::DynamicDescriptorPool &dynamicDescriptorPool = vk::DynamicDescriptorPool &dynamicDescriptorPool = mDynamicDescriptorPools[descriptorSetIndex];
mDynamicDescriptorPools[ToUnderlying(descriptorSetIndex)];
const vk::DescriptorSetLayout &descriptorSetLayout = const vk::DescriptorSetLayout &descriptorSetLayout =
mDescriptorSetLayouts[ToUnderlying(descriptorSetIndex)].get(); mDescriptorSetLayouts[descriptorSetIndex].get();
ANGLE_TRY(dynamicDescriptorPool.allocateSetsAndGetInfo( ANGLE_TRY(dynamicDescriptorPool.allocateSetsAndGetInfo(
contextVk, descriptorSetLayout.ptr(), 1, contextVk, descriptorSetLayout.ptr(), 1, &mDescriptorPoolBindings[descriptorSetIndex],
&mDescriptorPoolBindings[ToUnderlying(descriptorSetIndex)], &mDescriptorSets[descriptorSetIndex], newPoolAllocatedOut));
&mDescriptorSets[ToUnderlying(descriptorSetIndex)], newPoolAllocatedOut)); mEmptyDescriptorSets[descriptorSetIndex] = VK_NULL_HANDLE;
mEmptyDescriptorSets[ToUnderlying(descriptorSetIndex)] = VK_NULL_HANDLE;
++mObjectPerfCounters.descriptorSetsAllocated[ToUnderlying(descriptorSetIndex)]; ++mObjectPerfCounters.descriptorSetsAllocated[descriptorSetIndex];
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -845,7 +843,7 @@ angle::Result ProgramExecutableVk::initDynamicDescriptorPools( ...@@ -845,7 +843,7 @@ angle::Result ProgramExecutableVk::initDynamicDescriptorPools(
if (!descriptorPoolSizes.empty()) if (!descriptorPoolSizes.empty())
{ {
ANGLE_TRY(mDynamicDescriptorPools[ToUnderlying(descriptorSetIndex)].init( ANGLE_TRY(mDynamicDescriptorPools[descriptorSetIndex].init(
contextVk, descriptorPoolSizes.data(), descriptorPoolSizes.size(), contextVk, descriptorPoolSizes.data(), descriptorPoolSizes.size(),
descriptorSetLayout)); descriptorSetLayout));
} }
...@@ -904,7 +902,7 @@ angle::Result ProgramExecutableVk::createPipelineLayout( ...@@ -904,7 +902,7 @@ angle::Result ProgramExecutableVk::createPipelineLayout(
ANGLE_TRY(contextVk->getDescriptorSetLayoutCache().getDescriptorSetLayout( ANGLE_TRY(contextVk->getDescriptorSetLayoutCache().getDescriptorSetLayout(
contextVk, uniformsAndXfbSetDesc, contextVk, uniformsAndXfbSetDesc,
&mDescriptorSetLayouts[ToUnderlying(DescriptorSetIndex::UniformsAndXfb)])); &mDescriptorSetLayouts[DescriptorSetIndex::UniformsAndXfb]));
// Uniform and storage buffers, atomic counter buffers and images: // Uniform and storage buffers, atomic counter buffers and images:
vk::DescriptorSetLayoutDesc resourcesSetDesc; vk::DescriptorSetLayoutDesc resourcesSetDesc;
...@@ -932,8 +930,7 @@ angle::Result ProgramExecutableVk::createPipelineLayout( ...@@ -932,8 +930,7 @@ angle::Result ProgramExecutableVk::createPipelineLayout(
} }
ANGLE_TRY(contextVk->getDescriptorSetLayoutCache().getDescriptorSetLayout( ANGLE_TRY(contextVk->getDescriptorSetLayoutCache().getDescriptorSetLayout(
contextVk, resourcesSetDesc, contextVk, resourcesSetDesc, &mDescriptorSetLayouts[DescriptorSetIndex::ShaderResource]));
&mDescriptorSetLayouts[ToUnderlying(DescriptorSetIndex::ShaderResource)]));
// Textures: // Textures:
vk::DescriptorSetLayoutDesc texturesSetDesc; vk::DescriptorSetLayoutDesc texturesSetDesc;
...@@ -946,8 +943,7 @@ angle::Result ProgramExecutableVk::createPipelineLayout( ...@@ -946,8 +943,7 @@ angle::Result ProgramExecutableVk::createPipelineLayout(
} }
ANGLE_TRY(contextVk->getDescriptorSetLayoutCache().getDescriptorSetLayout( ANGLE_TRY(contextVk->getDescriptorSetLayoutCache().getDescriptorSetLayout(
contextVk, texturesSetDesc, contextVk, texturesSetDesc, &mDescriptorSetLayouts[DescriptorSetIndex::Texture]));
&mDescriptorSetLayouts[ToUnderlying(DescriptorSetIndex::Texture)]));
// Driver uniforms: // Driver uniforms:
VkShaderStageFlags driverUniformsStages = VkShaderStageFlags driverUniformsStages =
...@@ -955,8 +951,7 @@ angle::Result ProgramExecutableVk::createPipelineLayout( ...@@ -955,8 +951,7 @@ angle::Result ProgramExecutableVk::createPipelineLayout(
vk::DescriptorSetLayoutDesc driverUniformsSetDesc = vk::DescriptorSetLayoutDesc driverUniformsSetDesc =
contextVk->getDriverUniformsDescriptorSetDesc(driverUniformsStages); contextVk->getDriverUniformsDescriptorSetDesc(driverUniformsStages);
ANGLE_TRY(contextVk->getDescriptorSetLayoutCache().getDescriptorSetLayout( ANGLE_TRY(contextVk->getDescriptorSetLayoutCache().getDescriptorSetLayout(
contextVk, driverUniformsSetDesc, contextVk, driverUniformsSetDesc, &mDescriptorSetLayouts[DescriptorSetIndex::Internal]));
&mDescriptorSetLayouts[ToUnderlying(DescriptorSetIndex::DriverUniforms)]));
// Create pipeline layout with these 4 descriptor sets. // Create pipeline layout with these 4 descriptor sets.
vk::PipelineLayoutDesc pipelineLayoutDesc; vk::PipelineLayoutDesc pipelineLayoutDesc;
...@@ -965,7 +960,7 @@ angle::Result ProgramExecutableVk::createPipelineLayout( ...@@ -965,7 +960,7 @@ angle::Result ProgramExecutableVk::createPipelineLayout(
pipelineLayoutDesc.updateDescriptorSetLayout(DescriptorSetIndex::ShaderResource, pipelineLayoutDesc.updateDescriptorSetLayout(DescriptorSetIndex::ShaderResource,
resourcesSetDesc); resourcesSetDesc);
pipelineLayoutDesc.updateDescriptorSetLayout(DescriptorSetIndex::Texture, texturesSetDesc); pipelineLayoutDesc.updateDescriptorSetLayout(DescriptorSetIndex::Texture, texturesSetDesc);
pipelineLayoutDesc.updateDescriptorSetLayout(DescriptorSetIndex::DriverUniforms, pipelineLayoutDesc.updateDescriptorSetLayout(DescriptorSetIndex::Internal,
driverUniformsSetDesc); driverUniformsSetDesc);
ANGLE_TRY(contextVk->getPipelineLayoutCache().getPipelineLayout( ANGLE_TRY(contextVk->getPipelineLayoutCache().getPipelineLayout(
...@@ -974,16 +969,16 @@ angle::Result ProgramExecutableVk::createPipelineLayout( ...@@ -974,16 +969,16 @@ angle::Result ProgramExecutableVk::createPipelineLayout(
// Initialize descriptor pools. // Initialize descriptor pools.
ANGLE_TRY(initDynamicDescriptorPools( ANGLE_TRY(initDynamicDescriptorPools(
contextVk, uniformsAndXfbSetDesc, DescriptorSetIndex::UniformsAndXfb, contextVk, uniformsAndXfbSetDesc, DescriptorSetIndex::UniformsAndXfb,
mDescriptorSetLayouts[ToUnderlying(DescriptorSetIndex::UniformsAndXfb)].get().getHandle())); mDescriptorSetLayouts[DescriptorSetIndex::UniformsAndXfb].get().getHandle()));
ANGLE_TRY(initDynamicDescriptorPools( ANGLE_TRY(initDynamicDescriptorPools(
contextVk, resourcesSetDesc, DescriptorSetIndex::ShaderResource, contextVk, resourcesSetDesc, DescriptorSetIndex::ShaderResource,
mDescriptorSetLayouts[ToUnderlying(DescriptorSetIndex::ShaderResource)].get().getHandle())); mDescriptorSetLayouts[DescriptorSetIndex::ShaderResource].get().getHandle()));
ANGLE_TRY(initDynamicDescriptorPools( ANGLE_TRY(initDynamicDescriptorPools(
contextVk, texturesSetDesc, DescriptorSetIndex::Texture, contextVk, texturesSetDesc, DescriptorSetIndex::Texture,
mDescriptorSetLayouts[ToUnderlying(DescriptorSetIndex::Texture)].get().getHandle())); mDescriptorSetLayouts[DescriptorSetIndex::Texture].get().getHandle()));
ANGLE_TRY(initDynamicDescriptorPools( ANGLE_TRY(initDynamicDescriptorPools(
contextVk, driverUniformsSetDesc, DescriptorSetIndex::DriverUniforms, contextVk, driverUniformsSetDesc, DescriptorSetIndex::Internal,
mDescriptorSetLayouts[ToUnderlying(DescriptorSetIndex::DriverUniforms)].get().getHandle())); mDescriptorSetLayouts[DescriptorSetIndex::Internal].get().getHandle()));
mDynamicBufferOffsets.resize(glExecutable.getLinkedShaderStageCount()); mDynamicBufferOffsets.resize(glExecutable.getLinkedShaderStageCount());
...@@ -1060,7 +1055,7 @@ void ProgramExecutableVk::updateDefaultUniformsDescriptorSet( ...@@ -1060,7 +1055,7 @@ void ProgramExecutableVk::updateDefaultUniformsDescriptorSet(
writeInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; writeInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
writeInfo.pNext = nullptr; writeInfo.pNext = nullptr;
writeInfo.dstSet = mDescriptorSets[ToUnderlying(DescriptorSetIndex::UniformsAndXfb)]; writeInfo.dstSet = mDescriptorSets[DescriptorSetIndex::UniformsAndXfb];
writeInfo.dstBinding = info.binding; writeInfo.dstBinding = info.binding;
writeInfo.dstArrayElement = 0; writeInfo.dstArrayElement = 0;
writeInfo.descriptorCount = 1; writeInfo.descriptorCount = 1;
...@@ -1075,11 +1070,11 @@ angle::Result ProgramExecutableVk::getOrAllocateShaderResourcesDescriptorSet( ...@@ -1075,11 +1070,11 @@ angle::Result ProgramExecutableVk::getOrAllocateShaderResourcesDescriptorSet(
ContextVk *contextVk, ContextVk *contextVk,
VkDescriptorSet *descriptorSetOut) VkDescriptorSet *descriptorSetOut)
{ {
if (mDescriptorSets[ToUnderlying(DescriptorSetIndex::ShaderResource)] == VK_NULL_HANDLE) if (mDescriptorSets[DescriptorSetIndex::ShaderResource] == VK_NULL_HANDLE)
{ {
ANGLE_TRY(allocateDescriptorSet(contextVk, DescriptorSetIndex::ShaderResource)); ANGLE_TRY(allocateDescriptorSet(contextVk, DescriptorSetIndex::ShaderResource));
} }
*descriptorSetOut = mDescriptorSets[ToUnderlying(DescriptorSetIndex::ShaderResource)]; *descriptorSetOut = mDescriptorSets[DescriptorSetIndex::ShaderResource];
ASSERT(*descriptorSetOut != VK_NULL_HANDLE); ASSERT(*descriptorSetOut != VK_NULL_HANDLE);
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -1395,8 +1390,8 @@ angle::Result ProgramExecutableVk::updateShaderResourcesDescriptorSet( ...@@ -1395,8 +1390,8 @@ angle::Result ProgramExecutableVk::updateShaderResourcesDescriptorSet(
fillProgramStateMap(contextVk, &programStates); fillProgramStateMap(contextVk, &programStates);
// Reset the descriptor set handles so we only allocate a new one when necessary. // Reset the descriptor set handles so we only allocate a new one when necessary.
mDescriptorSets[ToUnderlying(DescriptorSetIndex::ShaderResource)] = VK_NULL_HANDLE; mDescriptorSets[DescriptorSetIndex::ShaderResource] = VK_NULL_HANDLE;
mEmptyDescriptorSets[ToUnderlying(DescriptorSetIndex::ShaderResource)] = VK_NULL_HANDLE; mEmptyDescriptorSets[DescriptorSetIndex::ShaderResource] = VK_NULL_HANDLE;
for (const gl::ShaderType shaderType : executable->getLinkedShaderStages()) for (const gl::ShaderType shaderType : executable->getLinkedShaderStages())
{ {
...@@ -1524,15 +1519,14 @@ void ProgramExecutableVk::updateTransformFeedbackDescriptorSetImpl( ...@@ -1524,15 +1519,14 @@ void ProgramExecutableVk::updateTransformFeedbackDescriptorSetImpl(
TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(transformFeedback); TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(transformFeedback);
transformFeedbackVk->initDescriptorSet( transformFeedbackVk->initDescriptorSet(
contextVk, mVariableInfoMap, executable.getTransformFeedbackBufferCount(), contextVk, mVariableInfoMap, executable.getTransformFeedbackBufferCount(),
mDescriptorSets[ToUnderlying(DescriptorSetIndex::UniformsAndXfb)]); mDescriptorSets[DescriptorSetIndex::UniformsAndXfb]);
} }
return; return;
} }
TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(glState.getCurrentTransformFeedback()); TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(glState.getCurrentTransformFeedback());
transformFeedbackVk->updateDescriptorSet( transformFeedbackVk->updateDescriptorSet(contextVk, programState, mVariableInfoMap,
contextVk, programState, mVariableInfoMap, mDescriptorSets[DescriptorSetIndex::UniformsAndXfb]);
mDescriptorSets[ToUnderlying(DescriptorSetIndex::UniformsAndXfb)]);
} }
angle::Result ProgramExecutableVk::updateTexturesDescriptorSet(ContextVk *contextVk) angle::Result ProgramExecutableVk::updateTexturesDescriptorSet(ContextVk *contextVk)
...@@ -1549,10 +1543,10 @@ angle::Result ProgramExecutableVk::updateTexturesDescriptorSet(ContextVk *contex ...@@ -1549,10 +1543,10 @@ angle::Result ProgramExecutableVk::updateTexturesDescriptorSet(ContextVk *contex
VkDescriptorSet descriptorSet = VK_NULL_HANDLE; VkDescriptorSet descriptorSet = VK_NULL_HANDLE;
if (mTextureDescriptorsCache.get(texturesDesc, &descriptorSet)) if (mTextureDescriptorsCache.get(texturesDesc, &descriptorSet))
{ {
mDescriptorSets[ToUnderlying(DescriptorSetIndex::Texture)] = descriptorSet; mDescriptorSets[DescriptorSetIndex::Texture] = descriptorSet;
// The descriptor pool that this descriptor set was allocated from needs to be retained each // The descriptor pool that this descriptor set was allocated from needs to be retained each
// time the descriptor set is used in a new command. // time the descriptor set is used in a new command.
mDescriptorPoolBindings[ToUnderlying(DescriptorSetIndex::Texture)].get().retain( mDescriptorPoolBindings[DescriptorSetIndex::Texture].get().retain(
&contextVk->getResourceUseList()); &contextVk->getResourceUseList());
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -1596,7 +1590,7 @@ angle::Result ProgramExecutableVk::updateTexturesDescriptorSet(ContextVk *contex ...@@ -1596,7 +1590,7 @@ angle::Result ProgramExecutableVk::updateTexturesDescriptorSet(ContextVk *contex
mTextureDescriptorsCache.destroy(contextVk->getRenderer()); mTextureDescriptorsCache.destroy(contextVk->getRenderer());
} }
descriptorSet = mDescriptorSets[ToUnderlying(DescriptorSetIndex::Texture)]; descriptorSet = mDescriptorSets[DescriptorSetIndex::Texture];
mTextureDescriptorsCache.insert(texturesDesc, descriptorSet); mTextureDescriptorsCache.insert(texturesDesc, descriptorSet);
} }
ASSERT(descriptorSet != VK_NULL_HANDLE); ASSERT(descriptorSet != VK_NULL_HANDLE);
...@@ -1704,14 +1698,16 @@ angle::Result ProgramExecutableVk::updateDescriptorSets(ContextVk *contextVk, ...@@ -1704,14 +1698,16 @@ angle::Result ProgramExecutableVk::updateDescriptorSets(ContextVk *contextVk,
// Find the maximum non-null descriptor set. This is used in conjunction with a driver // Find the maximum non-null descriptor set. This is used in conjunction with a driver
// workaround to bind empty descriptor sets only for gaps in between 0 and max and avoid // workaround to bind empty descriptor sets only for gaps in between 0 and max and avoid
// binding unnecessary empty descriptor sets for the sets beyond max. // binding unnecessary empty descriptor sets for the sets beyond max.
const size_t descriptorSetStart = ToUnderlying(DescriptorSetIndex::UniformsAndXfb); DescriptorSetIndex lastNonNullDescriptorSetIndex = DescriptorSetIndex::InvalidEnum;
size_t descriptorSetRange = 0; for (DescriptorSetIndex descriptorSetIndex : angle::AllEnums<DescriptorSetIndex>())
for (size_t descriptorSetIndex = descriptorSetStart;
descriptorSetIndex < mDescriptorSets.size(); ++descriptorSetIndex)
{ {
if (descriptorSetIndex == DescriptorSetIndex::Internal)
{
continue;
}
if (mDescriptorSets[descriptorSetIndex] != VK_NULL_HANDLE) if (mDescriptorSets[descriptorSetIndex] != VK_NULL_HANDLE)
{ {
descriptorSetRange = descriptorSetIndex + 1; lastNonNullDescriptorSetIndex = descriptorSetIndex;
} }
} }
...@@ -1720,9 +1716,14 @@ angle::Result ProgramExecutableVk::updateDescriptorSets(ContextVk *contextVk, ...@@ -1720,9 +1716,14 @@ angle::Result ProgramExecutableVk::updateDescriptorSets(ContextVk *contextVk,
? VK_PIPELINE_BIND_POINT_COMPUTE ? VK_PIPELINE_BIND_POINT_COMPUTE
: VK_PIPELINE_BIND_POINT_GRAPHICS; : VK_PIPELINE_BIND_POINT_GRAPHICS;
for (uint32_t descriptorSetIndex = descriptorSetStart; descriptorSetIndex < descriptorSetRange; for (DescriptorSetIndex descriptorSetIndex : angle::AllEnums<DescriptorSetIndex>())
++descriptorSetIndex)
{ {
if (descriptorSetIndex == DescriptorSetIndex::Internal ||
ToUnderlying(descriptorSetIndex) > ToUnderlying(lastNonNullDescriptorSetIndex))
{
continue;
}
VkDescriptorSet descSet = mDescriptorSets[descriptorSetIndex]; VkDescriptorSet descSet = mDescriptorSets[descriptorSetIndex];
if (descSet == VK_NULL_HANDLE) if (descSet == VK_NULL_HANDLE)
{ {
...@@ -1752,7 +1753,7 @@ angle::Result ProgramExecutableVk::updateDescriptorSets(ContextVk *contextVk, ...@@ -1752,7 +1753,7 @@ angle::Result ProgramExecutableVk::updateDescriptorSets(ContextVk *contextVk,
// through dynamic uniform buffers (requiring dynamic offsets). No other descriptor // through dynamic uniform buffers (requiring dynamic offsets). No other descriptor
// requires a dynamic offset. // requires a dynamic offset.
const uint32_t uniformBlockOffsetCount = const uint32_t uniformBlockOffsetCount =
descriptorSetIndex == ToUnderlying(DescriptorSetIndex::UniformsAndXfb) descriptorSetIndex == DescriptorSetIndex::UniformsAndXfb
? static_cast<uint32_t>(mNumDefaultUniformDescriptors) ? static_cast<uint32_t>(mNumDefaultUniformDescriptors)
: 0; : 0;
...@@ -1773,34 +1774,31 @@ void ProgramExecutableVk::outputCumulativePerfCounters() ...@@ -1773,34 +1774,31 @@ void ProgramExecutableVk::outputCumulativePerfCounters()
return; return;
} }
{ std::ostringstream text;
std::ostringstream text;
for (size_t descriptorSetIndex = 0; for (DescriptorSetIndex descriptorSetIndex : angle::AllEnums<DescriptorSetIndex>())
descriptorSetIndex < mObjectPerfCounters.descriptorSetsAllocated.size(); {
++descriptorSetIndex) uint32_t count = mObjectPerfCounters.descriptorSetsAllocated[descriptorSetIndex];
if (count > 0)
{ {
uint32_t count = mObjectPerfCounters.descriptorSetsAllocated[descriptorSetIndex]; text << " DescriptorSetIndex " << ToUnderlying(descriptorSetIndex) << ": " << count
if (count > 0) << "\n";
{
text << " DescriptorSetIndex " << descriptorSetIndex << ": " << count << "\n";
}
} }
}
// Only output information for programs that allocated descriptor sets. // Only output information for programs that allocated descriptor sets.
std::string textStr = text.str(); std::string textStr = text.str();
if (!textStr.empty()) if (!textStr.empty())
{ {
INFO() << "ProgramExecutable: " << this << ":"; INFO() << "ProgramExecutable: " << this << ":";
// Output each descriptor set allocation on a single line, so they're prefixed with the // Output each descriptor set allocation on a single line, so they're prefixed with the
// INFO information (file, line number, etc.). // INFO information (file, line number, etc.).
// https://stackoverflow.com/a/12514641 // https://stackoverflow.com/a/12514641
std::istringstream iss(textStr); std::istringstream iss(textStr);
for (std::string line; std::getline(iss, line);) for (std::string line; std::getline(iss, line);)
{ {
INFO() << line; INFO() << line;
}
} }
} }
} }
......
...@@ -102,7 +102,7 @@ struct DefaultUniformBlock final : private angle::NonCopyable ...@@ -102,7 +102,7 @@ struct DefaultUniformBlock final : private angle::NonCopyable
}; };
// Performance and resource counters. // Performance and resource counters.
using DescriptorSetCountList = std::array<uint32_t, DescriptorSetIndex::EnumCount>; using DescriptorSetCountList = angle::PackedEnumMap<DescriptorSetIndex, uint32_t>;
struct ProgramExecutablePerfCounters struct ProgramExecutablePerfCounters
{ {
......
...@@ -124,12 +124,6 @@ class ProgramVk : public ProgramImpl ...@@ -124,12 +124,6 @@ class ProgramVk : public ProgramImpl
} }
void onProgramBind(); void onProgramBind();
// Used in testing only.
vk::DynamicDescriptorPool *getDynamicDescriptorPool(uint32_t poolIndex)
{
return &mExecutable.mDynamicDescriptorPools[poolIndex];
}
const ProgramExecutableVk &getExecutable() const { return mExecutable; } const ProgramExecutableVk &getExecutable() const { return mExecutable; }
ProgramExecutableVk &getExecutable() { return mExecutable; } ProgramExecutableVk &getExecutable() { return mExecutable; }
......
...@@ -17,12 +17,10 @@ ...@@ -17,12 +17,10 @@
namespace rx namespace rx
{ {
enum class DescriptorSetIndex : uint32_t;
enum DescriptorSetIndex : uint32_t;
namespace vk namespace vk
{ {
namespace priv namespace priv
{ {
......
...@@ -666,7 +666,7 @@ void InsertInputDecorations(spirv::IdRef id, ...@@ -666,7 +666,7 @@ void InsertInputDecorations(spirv::IdRef id,
angle::spirv::Blob *blobOut) angle::spirv::Blob *blobOut)
{ {
spirv::WriteDecorate(blobOut, id, spv::DecorationDescriptorSet, spirv::WriteDecorate(blobOut, id, spv::DecorationDescriptorSet,
{spirv::LiteralInteger(DescriptorSetIndex::InternalShader)}); {spirv::LiteralInteger(ToUnderlying(DescriptorSetIndex::Internal))});
spirv::WriteDecorate(blobOut, id, spv::DecorationBinding, {spirv::LiteralInteger(binding)}); spirv::WriteDecorate(blobOut, id, spv::DecorationBinding, {spirv::LiteralInteger(binding)});
spirv::WriteDecorate(blobOut, id, spv::DecorationInputAttachmentIndex, spirv::WriteDecorate(blobOut, id, spv::DecorationInputAttachmentIndex,
{spirv::LiteralInteger(attachmentIndex)}); {spirv::LiteralInteger(attachmentIndex)});
...@@ -1129,7 +1129,7 @@ angle::Result UtilsVk::ensureResourcesInitialized(ContextVk *contextVk, ...@@ -1129,7 +1129,7 @@ angle::Result UtilsVk::ensureResourcesInitialized(ContextVk *contextVk,
ANGLE_TRY(contextVk->getDescriptorSetLayoutCache().getDescriptorSetLayout( ANGLE_TRY(contextVk->getDescriptorSetLayoutCache().getDescriptorSetLayout(
contextVk, descriptorSetDesc, contextVk, descriptorSetDesc,
&mDescriptorSetLayouts[function][ToUnderlying(DescriptorSetIndex::InternalShader)])); &mDescriptorSetLayouts[function][DescriptorSetIndex::Internal]));
vk::DescriptorSetLayoutBindingVector bindingVector; vk::DescriptorSetLayoutBindingVector bindingVector;
std::vector<VkSampler> immutableSamplers; std::vector<VkSampler> immutableSamplers;
...@@ -1151,9 +1151,7 @@ angle::Result UtilsVk::ensureResourcesInitialized(ContextVk *contextVk, ...@@ -1151,9 +1151,7 @@ angle::Result UtilsVk::ensureResourcesInitialized(ContextVk *contextVk,
{ {
ANGLE_TRY(mDescriptorPools[function].init( ANGLE_TRY(mDescriptorPools[function].init(
contextVk, descriptorPoolSizes.data(), descriptorPoolSizes.size(), contextVk, descriptorPoolSizes.data(), descriptorPoolSizes.size(),
mDescriptorSetLayouts[function][ToUnderlying(DescriptorSetIndex::InternalShader)] mDescriptorSetLayouts[function][DescriptorSetIndex::Internal].get().getHandle()));
.get()
.getHandle()));
} }
gl::ShaderType pushConstantsShaderStage = gl::ShaderType pushConstantsShaderStage =
...@@ -1162,8 +1160,7 @@ angle::Result UtilsVk::ensureResourcesInitialized(ContextVk *contextVk, ...@@ -1162,8 +1160,7 @@ angle::Result UtilsVk::ensureResourcesInitialized(ContextVk *contextVk,
// Corresponding pipeline layouts: // Corresponding pipeline layouts:
vk::PipelineLayoutDesc pipelineLayoutDesc; vk::PipelineLayoutDesc pipelineLayoutDesc;
pipelineLayoutDesc.updateDescriptorSetLayout(DescriptorSetIndex::InternalShader, pipelineLayoutDesc.updateDescriptorSetLayout(DescriptorSetIndex::Internal, descriptorSetDesc);
descriptorSetDesc);
if (pushConstantsSize) if (pushConstantsSize)
{ {
pipelineLayoutDesc.updatePushConstantRange(pushConstantsShaderStage, 0, pipelineLayoutDesc.updatePushConstantRange(pushConstantsShaderStage, 0,
...@@ -1496,15 +1493,15 @@ angle::Result UtilsVk::setupProgram(ContextVk *contextVk, ...@@ -1496,15 +1493,15 @@ angle::Result UtilsVk::setupProgram(ContextVk *contextVk,
if (descriptorSet != VK_NULL_HANDLE) if (descriptorSet != VK_NULL_HANDLE)
{ {
commandBuffer->bindDescriptorSets(pipelineLayout.get(), pipelineBindPoint, commandBuffer->bindDescriptorSets(pipelineLayout.get(), pipelineBindPoint,
DescriptorSetIndex::InternalShader, 1, &descriptorSet, 0, DescriptorSetIndex::Internal, 1, &descriptorSet, 0,
nullptr); nullptr);
if (isCompute) if (isCompute)
{ {
contextVk->invalidateComputeDescriptorSet(DescriptorSetIndex::InternalShader); contextVk->invalidateComputeDescriptorSet(DescriptorSetIndex::Internal);
} }
else else
{ {
contextVk->invalidateGraphicsDescriptorSet(DescriptorSetIndex::InternalShader); contextVk->invalidateGraphicsDescriptorSet(DescriptorSetIndex::Internal);
} }
} }
...@@ -3440,11 +3437,8 @@ angle::Result UtilsVk::allocateDescriptorSet(ContextVk *contextVk, ...@@ -3440,11 +3437,8 @@ angle::Result UtilsVk::allocateDescriptorSet(ContextVk *contextVk,
VkDescriptorSet *descriptorSetOut) VkDescriptorSet *descriptorSetOut)
{ {
ANGLE_TRY(mDescriptorPools[function].allocateSets( ANGLE_TRY(mDescriptorPools[function].allocateSets(
contextVk, contextVk, mDescriptorSetLayouts[function][DescriptorSetIndex::Internal].get().ptr(), 1,
mDescriptorSetLayouts[function][ToUnderlying(DescriptorSetIndex::InternalShader)] bindingOut, descriptorSetOut));
.get()
.ptr(),
1, bindingOut, descriptorSetOut));
mObjectPerfCounters.descriptorSetsAllocated++; mObjectPerfCounters.descriptorSetsAllocated++;
......
...@@ -2879,8 +2879,7 @@ bool PipelineLayoutDesc::operator==(const PipelineLayoutDesc &other) const ...@@ -2879,8 +2879,7 @@ bool PipelineLayoutDesc::operator==(const PipelineLayoutDesc &other) const
void PipelineLayoutDesc::updateDescriptorSetLayout(DescriptorSetIndex setIndex, void PipelineLayoutDesc::updateDescriptorSetLayout(DescriptorSetIndex setIndex,
const DescriptorSetLayoutDesc &desc) const DescriptorSetLayoutDesc &desc)
{ {
ASSERT(ToUnderlying(setIndex) < mDescriptorSetLayouts.size()); mDescriptorSetLayouts[setIndex] = desc;
mDescriptorSetLayouts[ToUnderlying(setIndex)] = desc;
} }
void PipelineLayoutDesc::updatePushConstantRange(gl::ShaderType shaderType, void PipelineLayoutDesc::updatePushConstantRange(gl::ShaderType shaderType,
......
...@@ -35,16 +35,12 @@ namespace rx ...@@ -35,16 +35,12 @@ namespace rx
// - Set 3 contains all other shader resources, such as uniform and storage blocks, atomic counter // - Set 3 contains all other shader resources, such as uniform and storage blocks, atomic counter
// buffers, images and image buffers. // buffers, images and image buffers.
// ANGLE driver uniforms set index (binding is always 0): enum class DescriptorSetIndex : uint32_t
enum DescriptorSetIndex : uint32_t
{ {
// All internal shaders assume there is only one descriptor set, indexed at 0 Internal, // ANGLE driver uniforms or internal shaders
InternalShader = 0, UniformsAndXfb, // Uniforms set index
Texture, // Textures set index
DriverUniforms = 0, // ANGLE driver uniforms set index ShaderResource, // Other shader resources set index
UniformsAndXfb, // Uniforms set index
Texture, // Textures set index
ShaderResource, // Other shader resources set index
InvalidEnum, InvalidEnum,
EnumCount = InvalidEnum, EnumCount = InvalidEnum,
...@@ -839,7 +835,7 @@ struct PackedPushConstantRange ...@@ -839,7 +835,7 @@ struct PackedPushConstantRange
}; };
template <typename T> template <typename T>
using DescriptorSetLayoutArray = std::array<T, static_cast<size_t>(DescriptorSetIndex::EnumCount)>; using DescriptorSetLayoutArray = angle::PackedEnumMap<DescriptorSetIndex, T>;
using DescriptorSetLayoutPointerArray = using DescriptorSetLayoutPointerArray =
DescriptorSetLayoutArray<BindingPointer<DescriptorSetLayout>>; DescriptorSetLayoutArray<BindingPointer<DescriptorSetLayout>>;
template <typename T> template <typename T>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment