@@ -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
125157bool ILogicalDevice::validateMemoryBarrier (const uint32_t queueFamilyIndex, asset::SMemoryBarrier barrier) const
0 commit comments