Skip to content

Commit 7c5d3b4

Browse files
committed
refactor to use workgroup2 with histogram metering, some more defines in main
1 parent 5e27920 commit 7c5d3b4

3 files changed

Lines changed: 28 additions & 22 deletions

File tree

26_Autoexposure/app_resources/median_luma_meter.comp.hlsl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,20 @@ using PtrAccessor = BdaAccessor < uint32_t >;
1616

1717
[[vk::push_constant]] AutoexposurePushData pushData;
1818

19-
#define BIN_COUNT 1024
20-
2119
groupshared uint32_t sdata[BIN_COUNT];
2220
struct SharedAccessor
2321
{
2422
using type = uint32_t;
25-
void get(const uint32_t index, NBL_REF_ARG(uint32_t) value)
23+
template<typename AccessType, typename IndexType=uint32_t>
24+
void get(const uint32_t ix, NBL_REF_ARG(AccessType) value)
2625
{
27-
value = sdata[index];
26+
value = sdata[ix];
2827
}
2928

30-
void set(const uint32_t index, const uint32_t value)
29+
template<typename AccessType, typename IndexType=uint32_t>
30+
void set(const uint32_t ix, const AccessType value)
3131
{
32-
sdata[index] = value;
32+
sdata[ix] = value;
3333
}
3434

3535
void workgroupExecutionAndMemoryBarrier()
@@ -68,7 +68,7 @@ void main(uint32_t3 ID : SV_GroupThreadID, uint32_t3 GroupID : SV_GroupID)
6868
SharedAccessor sdata;
6969
TexAccessor tex;
7070

71-
using LumaMeter = luma_meter::median_meter< WORKGROUP_SIZE, BIN_COUNT, PtrAccessor, SharedAccessor, TexAccessor>;
71+
using LumaMeter = luma_meter::median_meter<wg_config_t, BIN_COUNT, PtrAccessor, SharedAccessor, TexAccessor, device_capabilities>;
7272
LumaMeter meter = LumaMeter::create(pushData.lumaMin, pushData.lumaMax, pushData.lowerBoundPercentile, pushData.upperBoundPercentile);
7373

7474
uint32_t texWidth, texHeight;

26_Autoexposure/app_resources/median_luma_tonemap.comp.hlsl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,20 @@ using PtrAccessor = BdaAccessor < uint32_t >;
2121

2222
[[vk::push_constant]] AutoexposurePushData pushData;
2323

24-
#define BIN_COUNT 1024
25-
2624
groupshared uint32_t sdata[BIN_COUNT];
2725
struct SharedAccessor
2826
{
2927
using type = uint32_t;
30-
void get(const uint32_t index, NBL_REF_ARG(uint32_t) value)
28+
template<typename AccessType, typename IndexType=uint32_t>
29+
void get(const uint32_t ix, NBL_REF_ARG(AccessType) value)
3130
{
32-
value = sdata[index];
31+
value = sdata[ix];
3332
}
3433

35-
void set(const uint32_t index, const uint32_t value)
34+
template<typename AccessType, typename IndexType=uint32_t>
35+
void set(const uint32_t ix, const AccessType value)
3636
{
37-
sdata[index] = value;
37+
sdata[ix] = value;
3838
}
3939

4040
void workgroupExecutionAndMemoryBarrier()
@@ -74,7 +74,7 @@ void main(uint32_t3 ID : SV_GroupThreadID, uint32_t3 GroupID : SV_GroupID)
7474
SharedAccessor sdata;
7575
TexAccessor tex;
7676

77-
using LumaMeter = luma_meter::median_meter< WORKGROUP_SIZE, BIN_COUNT, PtrAccessor, SharedAccessor, TexAccessor>;
77+
using LumaMeter = luma_meter::median_meter<wg_config_t, BIN_COUNT, PtrAccessor, SharedAccessor, TexAccessor, device_capabilities>;
7878
LumaMeter meter = LumaMeter::create(pushData.lumaMin, pushData.lumaMax, pushData.lowerBoundPercentile, pushData.upperBoundPercentile);
7979

8080
float32_t EV = meter.gatherLuma(histo_accessor, sdata);

26_Autoexposure/main.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class AutoexposureApp final : public SimpleWindowedApplication, public BuiltinRe
4242
"app_resources/median_luma_tonemap.comp.hlsl",
4343
"app_resources/present.frag.hlsl"
4444
};
45-
constexpr static inline MeteringMode MeterMode = MeteringMode::AVERAGE;
45+
constexpr static inline MeteringMode MeterMode = MeteringMode::MEDIAN;
4646
constexpr static inline uint32_t BinCount = 1024;
4747
constexpr static inline uint32_t2 Dimensions = { 1280, 720 };
4848
constexpr static inline float32_t2 MeteringWindowScale = { 0.8f, 0.8f };
@@ -318,7 +318,7 @@ class AutoexposureApp final : public SimpleWindowedApplication, public BuiltinRe
318318
const uint32_t workgroupSize = m_physicalDevice->getLimits().maxComputeWorkGroupInvocations;
319319
const uint32_t subgroupSize = m_physicalDevice->getLimits().maxSubgroupSize;
320320

321-
const uint32_t configItemsPerInvoc = MeterMode == MeteringMode::AVERAGE ? 1 : workgroupSize / BinCount;
321+
const uint32_t configItemsPerInvoc = MeterMode == MeteringMode::AVERAGE ? 1 : BinCount / workgroupSize;
322322
workgroup2::SArithmeticConfiguration wgConfig;
323323
wgConfig.init(hlsl::findMSB(workgroupSize), hlsl::log2(float(subgroupSize)), configItemsPerInvoc);
324324

@@ -327,15 +327,21 @@ class AutoexposureApp final : public SimpleWindowedApplication, public BuiltinRe
327327
std::string identifier;
328328
std::string definition;
329329
};
330-
constexpr uint32_t NumDefines = 4;
331-
const MacroDefines definesBuf[NumDefines] = {
330+
constexpr uint32_t NumBaseDefines = 3;
331+
constexpr uint32_t NumExtraDefines = 2;
332+
const MacroDefines definesBuf[NumBaseDefines+NumExtraDefines] = {
332333
{ "WORKGROUP_SIZE", std::to_string(workgroupSize) },
333334
{ "SUBGROUP_SIZE", std::to_string(subgroupSize) },
334335
{"WG_CONFIG_T", wgConfig.getConfigTemplateStructString()},
335-
{"NATIVE_SUBGROUP_ARITHMETIC", "1"}
336+
{"NATIVE_SUBGROUP_ARITHMETIC", "1"},
337+
{ "BIN_COUNT", std::to_string(BinCount) }
336338
};
337339

338-
const uint32_t defineCount = m_physicalDevice->getLimits().shaderSubgroupArithmetic ? NumDefines : NumDefines - 1;
340+
uint32_t defineCount = NumBaseDefines;
341+
if (m_physicalDevice->getLimits().shaderSubgroupArithmetic)
342+
defineCount++;
343+
if (MeterMode == MeteringMode::MEDIAN)
344+
defineCount++;
339345
std::vector<IShaderCompiler::SMacroDefinition> defines;
340346
for (uint32_t i = 0; i < defineCount; i++)
341347
defines.emplace_back(definesBuf[i].identifier, definesBuf[i].definition);
@@ -632,14 +638,14 @@ class AutoexposureApp final : public SimpleWindowedApplication, public BuiltinRe
632638
m_device,
633639
&m_gatherAllocation,
634640
m_gatherBuffer,
635-
m_physicalDevice->getLimits().maxSubgroupSize * sizeof(uint32_t),
641+
m_physicalDevice->getLimits().maxSubgroupSize * sizeof(float32_t),
636642
"Luma Gather Buffer"
637643
);
638644
build_buffer(
639645
m_device,
640646
&m_histoAllocation,
641647
m_histoBuffer,
642-
BinCount * sizeof(float_t),
648+
BinCount * sizeof(uint32_t),
643649
"Luma Histogram Buffer"
644650
);
645651
build_buffer(

0 commit comments

Comments
 (0)