Skip to content

Commit 5942569

Browse files
fix a pipeline validation screwup
1 parent e4e0f44 commit 5942569

File tree

1 file changed

+49
-17
lines changed

1 file changed

+49
-17
lines changed

src/nbl/video/ILogicalDevice.cpp

Lines changed: 49 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,24 +22,48 @@ ILogicalDevice::ILogicalDevice(core::smart_refctd_ptr<const IAPIConnection>&& ap
2222
if (qci.count)
2323
{
2424
using stage_flags_t = asset::PIPELINE_STAGE_FLAGS;
25+
using access_flags_t = asset::ACCESS_FLAGS;
2526
info.supportedStages = stage_flags_t::HOST_BIT;
27+
info.supportedAccesses = access_flags_t::HOST_READ_BIT|access_flags_t::HOST_WRITE_BIT;
2628

27-
const auto transferStages = stage_flags_t::COPY_BIT|stage_flags_t::CLEAR_BIT|(m_enabledFeatures.accelerationStructure ? stage_flags_t::ACCELERATION_STRUCTURE_COPY_BIT:stage_flags_t::NONE)|stage_flags_t::RESOLVE_BIT|stage_flags_t::BLIT_BIT;
28-
const core::bitflag<stage_flags_t> computeAndGraphicsStages = (m_enabledFeatures.deviceGeneratedCommands ? stage_flags_t::COMMAND_PREPROCESS_BIT:stage_flags_t::NONE)|
29-
(m_enabledFeatures.conditionalRendering ? stage_flags_t::CONDITIONAL_RENDERING_BIT:stage_flags_t::NONE)|transferStages|stage_flags_t::DISPATCH_INDIRECT_COMMAND_BIT;
29+
const auto transferStages = stage_flags_t::COPY_BIT|stage_flags_t::CLEAR_BIT|stage_flags_t::RESOLVE_BIT|stage_flags_t::BLIT_BIT;
30+
const auto transferAccesses = access_flags_t::TRANSFER_READ_BIT|access_flags_t::TRANSFER_WRITE_BIT;
31+
32+
core::bitflag<stage_flags_t> computeAndGraphicsStages = transferStages|stage_flags_t::DISPATCH_INDIRECT_COMMAND_BIT;
33+
core::bitflag<access_flags_t> computeAndGraphicsAccesses = transferAccesses|access_flags_t::INDIRECT_COMMAND_READ_BIT|access_flags_t::UNIFORM_READ_BIT|access_flags_t::STORAGE_READ_BIT|access_flags_t::STORAGE_WRITE_BIT|access_flags_t::SAMPLED_READ_BIT;
34+
if (m_enabledFeatures.deviceGeneratedCommands)
35+
{
36+
computeAndGraphicsStages |= stage_flags_t::COMMAND_PREPROCESS_BIT;
37+
computeAndGraphicsAccesses |= access_flags_t::COMMAND_PREPROCESS_READ_BIT|access_flags_t::COMMAND_PREPROCESS_WRITE_BIT;
38+
}
39+
if (m_enabledFeatures.conditionalRendering)
40+
{
41+
computeAndGraphicsStages |= stage_flags_t::CONDITIONAL_RENDERING_BIT;
42+
computeAndGraphicsAccesses |= access_flags_t::CONDITIONAL_RENDERING_READ_BIT;
43+
}
3044

3145
const auto familyFlags = m_physicalDevice->getQueueFamilyProperties()[i].queueFlags;
3246
if (familyFlags.hasFlags(IQueue::FAMILY_FLAGS::COMPUTE_BIT))
3347
{
3448
info.supportedStages |= computeAndGraphicsStages|stage_flags_t::COMPUTE_SHADER_BIT;
49+
info.supportedAccesses |= computeAndGraphicsAccesses;
3550
if (m_enabledFeatures.accelerationStructure)
51+
{
3652
info.supportedStages |= stage_flags_t::ACCELERATION_STRUCTURE_COPY_BIT|stage_flags_t::ACCELERATION_STRUCTURE_BUILD_BIT;
53+
info.supportedAccesses |= access_flags_t::ACCELERATION_STRUCTURE_READ_BIT|access_flags_t::ACCELERATION_STRUCTURE_WRITE_BIT;
54+
}
3755
if (m_enabledFeatures.rayTracingPipeline)
56+
{
3857
info.supportedStages |= stage_flags_t::RAY_TRACING_SHADER_BIT;
58+
info.supportedAccesses |= access_flags_t::SHADER_BINDING_TABLE_READ_BIT;
59+
}
3960
}
4061
if (familyFlags.hasFlags(IQueue::FAMILY_FLAGS::GRAPHICS_BIT))
4162
{
4263
info.supportedStages |= computeAndGraphicsStages|stage_flags_t::VERTEX_INPUT_BITS|stage_flags_t::VERTEX_SHADER_BIT;
64+
info.supportedAccesses |= computeAndGraphicsAccesses|access_flags_t::INDEX_READ_BIT|access_flags_t::VERTEX_ATTRIBUTE_READ_BIT;
65+
info.supportedAccesses |= access_flags_t::DEPTH_STENCIL_ATTACHMENT_READ_BIT|access_flags_t::DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
66+
info.supportedAccesses |= access_flags_t::INPUT_ATTACHMENT_READ_BIT|access_flags_t::COLOR_ATTACHMENT_READ_BIT|access_flags_t::COLOR_ATTACHMENT_WRITE_BIT;
4367

4468
if (m_enabledFeatures.tessellationShader)
4569
info.supportedStages |= stage_flags_t::TESSELLATION_CONTROL_SHADER_BIT|stage_flags_t::TESSELLATION_EVALUATION_SHADER_BIT;
@@ -51,18 +75,26 @@ ILogicalDevice::ILogicalDevice(core::smart_refctd_ptr<const IAPIConnection>&& ap
5175
//if (m_enabledFeatures.taskShader)
5276
// info.supportedStages |= stage_flags_t::;
5377
if (m_enabledFeatures.fragmentDensityMap)
78+
{
5479
info.supportedStages |= stage_flags_t::FRAGMENT_DENSITY_PROCESS_BIT;
80+
info.supportedAccesses |= access_flags_t::FRAGMENT_DENSITY_MAP_READ_BIT;
81+
}
5582
//if (m_enabledFeatures.????)
5683
// info.supportedStages |= stage_flags_t::SHADING_RATE_ATTACHMENT_BIT;
84+
// info.supportedAccesses |= access_flags_t::SHADING_RATE_ATTACHMENT_READ_BIT;
5785

5886
info.supportedStages |= stage_flags_t::FRAMEBUFFER_SPACE_BITS;
5987
}
6088
if (familyFlags.hasFlags(IQueue::FAMILY_FLAGS::TRANSFER_BIT))
89+
{
6190
info.supportedStages |= transferStages;
62-
}
63-
{
64-
using access_flags_t = asset::ACCESS_FLAGS;
65-
info.supportedAccesses = access_flags_t::HOST_READ_BIT|access_flags_t::HOST_WRITE_BIT;
91+
info.supportedAccesses |= transferAccesses;
92+
if (m_enabledFeatures.accelerationStructure)
93+
{
94+
info.supportedStages |= stage_flags_t::ACCELERATION_STRUCTURE_COPY_BIT;
95+
info.supportedAccesses |= access_flags_t::ACCELERATION_STRUCTURE_READ_BIT|access_flags_t::ACCELERATION_STRUCTURE_WRITE_BIT;
96+
}
97+
}
6698
}
6799
info.queueCount = qci.count;
68100
if (i)
@@ -103,23 +135,23 @@ bool ILogicalDevice::supportsMask(const uint32_t queueFamilyIndex, core::bitflag
103135
return getSupportedStageMask(queueFamilyIndex).hasFlags(stageMask);
104136
}
105137

106-
bool ILogicalDevice::supportsMask(const uint32_t queueFamilyIndex, core::bitflag<asset::ACCESS_FLAGS> stageMask) const
138+
bool ILogicalDevice::supportsMask(const uint32_t queueFamilyIndex, core::bitflag<asset::ACCESS_FLAGS> accessMask) const
107139
{
108140
if (getQueueCount(queueFamilyIndex)==0)
109141
return false;
110142
using q_family_flags_t = IQueue::FAMILY_FLAGS;
111143
const auto& familyProps = m_physicalDevice->getQueueFamilyProperties()[queueFamilyIndex].queueFlags;
112144
const bool shaderCapableFamily = bool(familyProps&(q_family_flags_t::COMPUTE_BIT|q_family_flags_t::GRAPHICS_BIT));
113145
// strip special values
114-
if (stageMask.hasFlags(asset::ACCESS_FLAGS::MEMORY_READ_BITS))
115-
stageMask ^= asset::ACCESS_FLAGS::MEMORY_READ_BITS;
116-
else if (stageMask.hasFlags(asset::ACCESS_FLAGS::SHADER_READ_BITS) && shaderCapableFamily)
117-
stageMask ^= asset::ACCESS_FLAGS::SHADER_READ_BITS;
118-
if (stageMask.hasFlags(asset::ACCESS_FLAGS::MEMORY_WRITE_BITS))
119-
stageMask ^= asset::ACCESS_FLAGS::MEMORY_WRITE_BITS;
120-
else if (stageMask.hasFlags(asset::ACCESS_FLAGS::SHADER_WRITE_BITS) && shaderCapableFamily)
121-
stageMask ^= asset::ACCESS_FLAGS::SHADER_WRITE_BITS;
122-
return getSupportedAccessMask(queueFamilyIndex).hasFlags(stageMask);
146+
if (accessMask.hasFlags(asset::ACCESS_FLAGS::MEMORY_READ_BITS))
147+
accessMask ^= asset::ACCESS_FLAGS::MEMORY_READ_BITS;
148+
else if (accessMask.hasFlags(asset::ACCESS_FLAGS::SHADER_READ_BITS) && shaderCapableFamily)
149+
accessMask ^= asset::ACCESS_FLAGS::SHADER_READ_BITS;
150+
if (accessMask.hasFlags(asset::ACCESS_FLAGS::MEMORY_WRITE_BITS))
151+
accessMask ^= asset::ACCESS_FLAGS::MEMORY_WRITE_BITS;
152+
else if (accessMask.hasFlags(asset::ACCESS_FLAGS::SHADER_WRITE_BITS) && shaderCapableFamily)
153+
accessMask ^= asset::ACCESS_FLAGS::SHADER_WRITE_BITS;
154+
return getSupportedAccessMask(queueFamilyIndex).hasFlags(accessMask);
123155
}
124156

125157
bool ILogicalDevice::validateMemoryBarrier(const uint32_t queueFamilyIndex, asset::SMemoryBarrier barrier) const

0 commit comments

Comments
 (0)