@@ -192,13 +192,17 @@ inline core::bitflag<PIPELINE_STAGE_FLAGS> allPreviousStages(core::bitflag<PIPEL
192
192
public:
193
193
constexpr PerStagePreviousStages ()
194
194
{
195
- add (PIPELINE_STAGE_FLAGS::COMPUTE_SHADER_BIT, data[static_cast <size_t >(PIPELINE_STAGE_FLAGS::DISPATCH_INDIRECT_COMMAND_BIT)]);
195
+ // set all stage to have itself as their previous stages
196
+ for (auto i = 0 ; i < std::numeric_limits<PIPELINE_STAGE_FLAGS>::digits; i++)
197
+ data[i] = static_cast <PIPELINE_STAGE_FLAGS>(i);
196
198
197
- add (PIPELINE_STAGE_FLAGS::RAY_TRACING_SHADER_BIT, data[static_cast <size_t >(PIPELINE_STAGE_FLAGS::DISPATCH_INDIRECT_COMMAND_BIT)]);
199
+ add (PIPELINE_STAGE_FLAGS::COMPUTE_SHADER_BIT, PIPELINE_STAGE_FLAGS::DISPATCH_INDIRECT_COMMAND_BIT);
200
+
201
+ add (PIPELINE_STAGE_FLAGS::RAY_TRACING_SHADER_BIT, PIPELINE_STAGE_FLAGS::DISPATCH_INDIRECT_COMMAND_BIT);
198
202
199
203
// graphics primitive pipeline
200
- auto primitivePrevStage = data[ static_cast < size_t >( PIPELINE_STAGE_FLAGS::DISPATCH_INDIRECT_COMMAND_BIT)] ;
201
- for (const auto pipelineStage : {PIPELINE_STAGE_FLAGS::INDEX_INPUT_BIT, PIPELINE_STAGE_FLAGS::VERTEX_ATTRIBUTE_INPUT_BIT, PIPELINE_STAGE_FLAGS::VERTEX_SHADER_BIT, PIPELINE_STAGE_FLAGS::TESSELLATION_CONTROL_SHADER_BIT, PIPELINE_STAGE_FLAGS::TESSELLATION_EVALUATION_SHADER_BIT, PIPELINE_STAGE_FLAGS::GEOMETRY_SHADER_BIT, PIPELINE_STAGE_FLAGS::SHADING_RATE_ATTACHMENT_BIT, PIPELINE_STAGE_FLAGS::EARLY_FRAGMENT_TESTS_BIT, PIPELINE_STAGE_FLAGS::FRAGMENT_SHADER_BIT, PIPELINE_STAGE_FLAGS::LATE_FRAGMENT_TESTS_BIT, PIPELINE_STAGE_FLAGS::COLOR_ATTACHMENT_OUTPUT_BIT})
204
+ PIPELINE_STAGE_FLAGS primitivePrevStage = PIPELINE_STAGE_FLAGS::DISPATCH_INDIRECT_COMMAND_BIT;
205
+ for (auto pipelineStage : {PIPELINE_STAGE_FLAGS::INDEX_INPUT_BIT, PIPELINE_STAGE_FLAGS::VERTEX_ATTRIBUTE_INPUT_BIT, PIPELINE_STAGE_FLAGS::VERTEX_SHADER_BIT, PIPELINE_STAGE_FLAGS::TESSELLATION_CONTROL_SHADER_BIT, PIPELINE_STAGE_FLAGS::TESSELLATION_EVALUATION_SHADER_BIT, PIPELINE_STAGE_FLAGS::GEOMETRY_SHADER_BIT, PIPELINE_STAGE_FLAGS::SHADING_RATE_ATTACHMENT_BIT, PIPELINE_STAGE_FLAGS::EARLY_FRAGMENT_TESTS_BIT, PIPELINE_STAGE_FLAGS::FRAGMENT_SHADER_BIT, PIPELINE_STAGE_FLAGS::LATE_FRAGMENT_TESTS_BIT, PIPELINE_STAGE_FLAGS::COLOR_ATTACHMENT_OUTPUT_BIT})
202
206
{
203
207
if (pipelineStage == PIPELINE_STAGE_FLAGS::EARLY_FRAGMENT_TESTS_BIT)
204
208
primitivePrevStage |= PIPELINE_STAGE_FLAGS::FRAGMENT_DENSITY_PROCESS_BIT;
@@ -224,7 +228,7 @@ inline core::bitflag<PIPELINE_STAGE_FLAGS> allPreviousStages(core::bitflag<PIPEL
224
228
data[bitIx] |= previousStageFlags;
225
229
}
226
230
227
- PIPELINE_STAGE_FLAGS data[32 ] = {};
231
+ PIPELINE_STAGE_FLAGS data[std::numeric_limits<std:: underlying_type_t <PIPELINE_STAGE_FLAGS>>::digits ] = {};
228
232
};
229
233
230
234
constexpr PerStagePreviousStages bitToAccess = {};
@@ -245,21 +249,26 @@ inline core::bitflag<PIPELINE_STAGE_FLAGS> allLaterStages(core::bitflag<PIPELINE
245
249
struct PerStageLaterStages
246
250
{
247
251
public:
248
- constexpr PerStageLaterStages ()
249
- {
250
- add (PIPELINE_STAGE_FLAGS::DISPATCH_INDIRECT_COMMAND_BIT, PIPELINE_STAGE_FLAGS::COMPUTE_SHADER_BIT);
251
- add (PIPELINE_STAGE_FLAGS::DISPATCH_INDIRECT_COMMAND_BIT, PIPELINE_STAGE_FLAGS::RAY_TRACING_SHADER_BIT);
252
+ constexpr PerStageLaterStages ()
253
+ {
254
+ // set all stage to have itself as their next stages
255
+ for (auto i = 0 ; i < std::numeric_limits<PIPELINE_STAGE_FLAGS>::digits; i++)
256
+ data[i] = static_cast <PIPELINE_STAGE_FLAGS>(i);
252
257
253
- // graphics primitive pipeline
254
- PIPELINE_STAGE_FLAGS laterStage = PIPELINE_STAGE_FLAGS::NONE;
255
- for (const auto pipelineStage : std::reverse{PIPELINE_STAGE_FLAGS::DISPATCH_INDIRECT_COMMAND_BIT, PIPELINE_STAGE_FLAGS::INDEX_INPUT_BIT, PIPELINE_STAGE_FLAGS::VERTEX_ATTRIBUTE_INPUT_BIT, PIPELINE_STAGE_FLAGS::VERTEX_SHADER_BIT, PIPELINE_STAGE_FLAGS::TESSELLATION_CONTROL_SHADER_BIT, PIPELINE_STAGE_FLAGS::TESSELLATION_EVALUATION_SHADER_BIT, PIPELINE_STAGE_FLAGS::GEOMETRY_SHADER_BIT, PIPELINE_STAGE_FLAGS::SHADING_RATE_ATTACHMENT_BIT, PIPELINE_STAGE_FLAGS::EARLY_FRAGMENT_TESTS_BIT, PIPELINE_STAGE_FLAGS::FRAGMENT_SHADER_BIT, PIPELINE_STAGE_FLAGS::LATE_FRAGMENT_TESTS_BIT, PIPELINE_STAGE_FLAGS::COLOR_ATTACHMENT_OUTPUT_BIT})
256
- {
257
- add (pipelineStage, laterStage);
258
- laterStage |= pipelineStage;
259
- }
258
+ add (PIPELINE_STAGE_FLAGS::DISPATCH_INDIRECT_COMMAND_BIT, PIPELINE_STAGE_FLAGS::COMPUTE_SHADER_BIT);
259
+ add (PIPELINE_STAGE_FLAGS::DISPATCH_INDIRECT_COMMAND_BIT, PIPELINE_STAGE_FLAGS::RAY_TRACING_SHADER_BIT);
260
260
261
- add (PIPELINE_STAGE_FLAGS::FRAGMENT_DENSITY_PROCESS_BIT, data[static_cast <size_t >(PIPELINE_STAGE_FLAGS::EARLY_FRAGMENT_TESTS_BIT)]);
261
+ // graphics primitive pipeline
262
+ PIPELINE_STAGE_FLAGS laterStage = PIPELINE_STAGE_FLAGS::NONE;
263
+ const auto graphicsPrimitivePipelineOrders = std::array{ PIPELINE_STAGE_FLAGS::DISPATCH_INDIRECT_COMMAND_BIT, PIPELINE_STAGE_FLAGS::INDEX_INPUT_BIT, PIPELINE_STAGE_FLAGS::VERTEX_ATTRIBUTE_INPUT_BIT, PIPELINE_STAGE_FLAGS::VERTEX_SHADER_BIT, PIPELINE_STAGE_FLAGS::TESSELLATION_CONTROL_SHADER_BIT, PIPELINE_STAGE_FLAGS::TESSELLATION_EVALUATION_SHADER_BIT, PIPELINE_STAGE_FLAGS::GEOMETRY_SHADER_BIT, PIPELINE_STAGE_FLAGS::SHADING_RATE_ATTACHMENT_BIT, PIPELINE_STAGE_FLAGS::EARLY_FRAGMENT_TESTS_BIT, PIPELINE_STAGE_FLAGS::FRAGMENT_SHADER_BIT, PIPELINE_STAGE_FLAGS::LATE_FRAGMENT_TESTS_BIT, PIPELINE_STAGE_FLAGS::COLOR_ATTACHMENT_OUTPUT_BIT };
264
+ for (auto iter = graphicsPrimitivePipelineOrders.rbegin (); iter < graphicsPrimitivePipelineOrders.rend (); iter++)
265
+ {
266
+ const auto pipelineStage = *iter;
267
+ add (pipelineStage, laterStage);
268
+ laterStage |= pipelineStage;
269
+ }
262
270
271
+ add (PIPELINE_STAGE_FLAGS::FRAGMENT_DENSITY_PROCESS_BIT, PIPELINE_STAGE_FLAGS::EARLY_FRAGMENT_TESTS_BIT);
263
272
}
264
273
constexpr const auto & operator [](const size_t ix) const {return data[ix];}
265
274
@@ -277,7 +286,7 @@ inline core::bitflag<PIPELINE_STAGE_FLAGS> allLaterStages(core::bitflag<PIPELINE
277
286
data[bitIx] |= laterStageFlags;
278
287
}
279
288
280
- PIPELINE_STAGE_FLAGS data[32 ] = {};
289
+ PIPELINE_STAGE_FLAGS data[std::numeric_limits<std:: underlying_type_t <PIPELINE_STAGE_FLAGS>>::digits ] = {};
281
290
};
282
291
283
292
constexpr PerStageLaterStages bitToAccess = {};
0 commit comments