@@ -22,24 +22,48 @@ ILogicalDevice::ILogicalDevice(core::smart_refctd_ptr<const IAPIConnection>&& ap
22
22
if (qci.count )
23
23
{
24
24
using stage_flags_t = asset::PIPELINE_STAGE_FLAGS;
25
+ using access_flags_t = asset::ACCESS_FLAGS;
25
26
info.supportedStages = stage_flags_t ::HOST_BIT;
27
+ info.supportedAccesses = access_flags_t ::HOST_READ_BIT|access_flags_t ::HOST_WRITE_BIT;
26
28
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
+ }
30
44
31
45
const auto familyFlags = m_physicalDevice->getQueueFamilyProperties ()[i].queueFlags ;
32
46
if (familyFlags.hasFlags (IQueue::FAMILY_FLAGS::COMPUTE_BIT))
33
47
{
34
48
info.supportedStages |= computeAndGraphicsStages|stage_flags_t ::COMPUTE_SHADER_BIT;
49
+ info.supportedAccesses |= computeAndGraphicsAccesses;
35
50
if (m_enabledFeatures.accelerationStructure )
51
+ {
36
52
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
+ }
37
55
if (m_enabledFeatures.rayTracingPipeline )
56
+ {
38
57
info.supportedStages |= stage_flags_t ::RAY_TRACING_SHADER_BIT;
58
+ info.supportedAccesses |= access_flags_t ::SHADER_BINDING_TABLE_READ_BIT;
59
+ }
39
60
}
40
61
if (familyFlags.hasFlags (IQueue::FAMILY_FLAGS::GRAPHICS_BIT))
41
62
{
42
63
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;
43
67
44
68
if (m_enabledFeatures.tessellationShader )
45
69
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
51
75
// if (m_enabledFeatures.taskShader)
52
76
// info.supportedStages |= stage_flags_t::;
53
77
if (m_enabledFeatures.fragmentDensityMap )
78
+ {
54
79
info.supportedStages |= stage_flags_t ::FRAGMENT_DENSITY_PROCESS_BIT;
80
+ info.supportedAccesses |= access_flags_t ::FRAGMENT_DENSITY_MAP_READ_BIT;
81
+ }
55
82
// if (m_enabledFeatures.????)
56
83
// info.supportedStages |= stage_flags_t::SHADING_RATE_ATTACHMENT_BIT;
84
+ // info.supportedAccesses |= access_flags_t::SHADING_RATE_ATTACHMENT_READ_BIT;
57
85
58
86
info.supportedStages |= stage_flags_t ::FRAMEBUFFER_SPACE_BITS;
59
87
}
60
88
if (familyFlags.hasFlags (IQueue::FAMILY_FLAGS::TRANSFER_BIT))
89
+ {
61
90
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
+ }
66
98
}
67
99
info.queueCount = qci.count ;
68
100
if (i)
@@ -103,23 +135,23 @@ bool ILogicalDevice::supportsMask(const uint32_t queueFamilyIndex, core::bitflag
103
135
return getSupportedStageMask (queueFamilyIndex).hasFlags (stageMask);
104
136
}
105
137
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
107
139
{
108
140
if (getQueueCount (queueFamilyIndex)==0 )
109
141
return false ;
110
142
using q_family_flags_t = IQueue::FAMILY_FLAGS;
111
143
const auto & familyProps = m_physicalDevice->getQueueFamilyProperties ()[queueFamilyIndex].queueFlags ;
112
144
const bool shaderCapableFamily = bool (familyProps&(q_family_flags_t ::COMPUTE_BIT|q_family_flags_t ::GRAPHICS_BIT));
113
145
// 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 );
123
155
}
124
156
125
157
bool ILogicalDevice::validateMemoryBarrier (const uint32_t queueFamilyIndex, asset::SMemoryBarrier barrier) const
0 commit comments