Skip to content

Commit ad27a61

Browse files
author
kevyuu
committed
Implement allPreviousStages and allLaterStages
1 parent 2798fba commit ad27a61

File tree

1 file changed

+108
-0
lines changed

1 file changed

+108
-0
lines changed

include/nbl/asset/ECommonEnums.h

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,114 @@ struct SMemoryBarrier
185185
}
186186
};
187187

188+
inline core::bitflag<PIPELINE_STAGE_FLAGS> allPreviousStages(core::bitflag<PIPELINE_STAGE_FLAGS> stages)
189+
{
190+
struct PerStagePreviousStages
191+
{
192+
public:
193+
constexpr PerStagePreviousStages()
194+
{
195+
add(PIPELINE_STAGE_FLAGS::COMPUTE_SHADER_BIT, data[static_cast<size_t>(PIPELINE_STAGE_FLAGS::DISPATCH_INDIRECT_COMMAND_BIT)]);
196+
197+
add(PIPELINE_STAGE_FLAGS::RAY_TRACING_SHADER_BIT, data[static_cast<size_t>(PIPELINE_STAGE_FLAGS::DISPATCH_INDIRECT_COMMAND_BIT)]);
198+
199+
// 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})
202+
{
203+
if (pipelineStage == PIPELINE_STAGE_FLAGS::EARLY_FRAGMENT_TESTS_BIT)
204+
primitivePrevStage |= PIPELINE_STAGE_FLAGS::FRAGMENT_DENSITY_PROCESS_BIT;
205+
add(pipelineStage, primitivePrevStage);
206+
primitivePrevStage |= pipelineStage;
207+
}
208+
209+
210+
}
211+
constexpr const auto& operator[](const size_t ix) const {return data[ix];}
212+
213+
private:
214+
constexpr static uint8_t findLSB(size_t val)
215+
{
216+
for (size_t ix=0ull; ix<sizeof(size_t)*8; ix++)
217+
if ((0x1ull<<ix)&val)
218+
return ix;
219+
return ~0u;
220+
}
221+
constexpr void add(PIPELINE_STAGE_FLAGS stageFlag, PIPELINE_STAGE_FLAGS previousStageFlags)
222+
{
223+
const auto bitIx = findLSB(static_cast<size_t>(stageFlag));
224+
data[bitIx] |= previousStageFlags;
225+
}
226+
227+
PIPELINE_STAGE_FLAGS data[32] = {};
228+
};
229+
230+
constexpr PerStagePreviousStages bitToAccess = {};
231+
232+
core::bitflag<PIPELINE_STAGE_FLAGS> retval = PIPELINE_STAGE_FLAGS::NONE;
233+
while (bool(stages.value))
234+
{
235+
const auto bitIx = hlsl::findLSB(stages);
236+
retval |= bitToAccess[bitIx];
237+
stages ^= static_cast<PIPELINE_STAGE_FLAGS>(0x1u<<bitIx);
238+
}
239+
240+
return retval;
241+
}
242+
243+
inline core::bitflag<PIPELINE_STAGE_FLAGS> allLaterStages(core::bitflag<PIPELINE_STAGE_FLAGS> stages)
244+
{
245+
struct PerStageLaterStages
246+
{
247+
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+
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+
}
260+
261+
add(PIPELINE_STAGE_FLAGS::FRAGMENT_DENSITY_PROCESS_BIT, data[static_cast<size_t>(PIPELINE_STAGE_FLAGS::EARLY_FRAGMENT_TESTS_BIT)]);
262+
263+
}
264+
constexpr const auto& operator[](const size_t ix) const {return data[ix];}
265+
266+
private:
267+
constexpr static uint8_t findLSB(size_t val)
268+
{
269+
for (size_t ix=0ull; ix<sizeof(size_t)*8; ix++)
270+
if ((0x1ull<<ix)&val)
271+
return ix;
272+
return ~0u;
273+
}
274+
constexpr void add(PIPELINE_STAGE_FLAGS stageFlag, PIPELINE_STAGE_FLAGS laterStageFlags)
275+
{
276+
const auto bitIx = findLSB(static_cast<size_t>(stageFlag));
277+
data[bitIx] |= laterStageFlags;
278+
}
279+
280+
PIPELINE_STAGE_FLAGS data[32] = {};
281+
};
282+
283+
constexpr PerStageLaterStages bitToAccess = {};
284+
285+
core::bitflag<PIPELINE_STAGE_FLAGS> retval = PIPELINE_STAGE_FLAGS::NONE;
286+
while (bool(stages.value))
287+
{
288+
const auto bitIx = hlsl::findLSB(stages);
289+
retval |= bitToAccess[bitIx];
290+
stages ^= static_cast<PIPELINE_STAGE_FLAGS>(0x1u<<bitIx);
291+
}
292+
293+
return retval;
294+
}
295+
188296
inline core::bitflag<ACCESS_FLAGS> allAccessesFromStages(core::bitflag<PIPELINE_STAGE_FLAGS> stages)
189297
{
190298
struct PerStageAccesses

0 commit comments

Comments
 (0)