@@ -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