| 1180 | |
| 1181 | |
| 1182 | Tr2GpuResourcePool::Buffer Tr2PostProcessRenderer::RenderDynamicExposure( const Tr2TextureAL& source, Tr2GpuResourcePool& gpuResourcePool, Tr2RenderContext& renderContext, Tr2PPDynamicExposureEffect* dynamicExposure ) |
| 1183 | { |
| 1184 | GPU_REGION( renderContext, "Exposure" ); |
| 1185 | |
| 1186 | uint32_t tilesX = source.GetWidth() / HISTOGRAM_TILE_SIZE_X + 1; |
| 1187 | uint32_t tilesY = source.GetHeight() / HISTOGRAM_TILE_SIZE_Y + 1; |
| 1188 | |
| 1189 | uint32_t localHistogramCount = tilesX * tilesY * 16; |
| 1190 | |
| 1191 | auto localHistograms = gpuResourcePool.GetTempBuffer( |
| 1192 | "LocalHistograms", |
| 1193 | Tr2BufferDescriptionAL( Tr2RenderContextEnum::PIXEL_FORMAT_R32G32B32A32_UINT, localHistogramCount, Tr2GpuUsage::SHADER_RESOURCE | Tr2GpuUsage::UNORDERED_ACCESS, Tr2CpuUsage::NONE ) ); |
| 1194 | |
| 1195 | |
| 1196 | auto histogram = gpuResourcePool.GetTempBuffer( |
| 1197 | "Histogram", |
| 1198 | Tr2BufferDescriptionAL( Tr2RenderContextEnum::PIXEL_FORMAT_R32_UINT, 65, Tr2GpuUsage::SHADER_RESOURCE | Tr2GpuUsage::UNORDERED_ACCESS, Tr2CpuUsage::NONE ) ); |
| 1199 | |
| 1200 | |
| 1201 | // we also need to update the tonemapping buffer |
| 1202 | m_dynamicExposureCreateHistogramShader->SetParameter( MEMOIZED_STRING( "ScreenTilesX" ), float( tilesX ) ); |
| 1203 | TEMP_PARAM( m_dynamicExposureCreateHistogramShader, "BlitOriginal", source ); |
| 1204 | TEMP_PARAM( m_dynamicExposureCreateHistogramShader, "LocalHistograms", localHistograms ); |
| 1205 | m_dynamicExposureMergeHistogramShader->SetParameter( MEMOIZED_STRING( "ScreenTilesX" ), float( tilesX ) ); |
| 1206 | m_dynamicExposureMergeHistogramShader->SetParameter( MEMOIZED_STRING( "ScreenTilesY" ), float( tilesY ) ); |
| 1207 | TEMP_PARAM( m_dynamicExposureMergeHistogramShader, "LocalHistograms", localHistograms ); |
| 1208 | TEMP_PARAM( m_dynamicExposureMergeHistogramShader, "Histogram", histogram ); |
| 1209 | |
| 1210 | uint32_t m_uintValue[4] = { 0, 0, 0, 0 }; |
| 1211 | // Clear local histograms |
| 1212 | renderContext.ClearUav( localHistograms, m_uintValue ); |
| 1213 | |
| 1214 | // Clear histograms |
| 1215 | renderContext.ClearUav( histogram, m_uintValue ); |
| 1216 | |
| 1217 | // Create histograms |
| 1218 | m_dynamicExposureCreateHistogramShader->SetParameter( MEMOIZED_STRING( "MinLuminance" ), log( dynamicExposure->m_minLuminance ) ); |
| 1219 | m_dynamicExposureCreateHistogramShader->SetParameter( MEMOIZED_STRING( "MaxLuminance" ), log( dynamicExposure->m_maxLuminance ) ); |
| 1220 | m_dynamicExposureCreateHistogramShader->SetParameter( MEMOIZED_STRING( "MinBrightness" ), dynamicExposure->m_minBrightness ); |
| 1221 | m_dynamicExposureCreateHistogramShader->SetParameter( MEMOIZED_STRING( "MaxBrightness" ), dynamicExposure->m_maxBrightness ); |
| 1222 | Tr2Renderer::RunComputeShader( m_dynamicExposureCreateHistogramShader, tilesX, tilesY, 1, renderContext ); |
| 1223 | |
| 1224 | // Merge histogram |
| 1225 | uint32_t mergeHistogramXDim = tilesX * tilesY / NUM_TILES_PER_THREAD_GROUP + 1; |
| 1226 | Tr2Renderer::RunComputeShader( m_dynamicExposureMergeHistogramShader, mergeHistogramXDim, 1, 1, renderContext ); |
| 1227 | |
| 1228 | // Measure histogram |
| 1229 | m_dynamicExposureMeasureExposureShader->SetParameter( MEMOIZED_STRING( "MinLuminance" ), log( dynamicExposure->m_minLuminance ) ); |
| 1230 | m_dynamicExposureMeasureExposureShader->SetParameter( MEMOIZED_STRING( "MaxLuminance" ), log( dynamicExposure->m_maxLuminance ) ); |
| 1231 | m_dynamicExposureMeasureExposureShader->SetParameter( MEMOIZED_STRING( "MinBrightness" ), dynamicExposure->m_minBrightness ); |
| 1232 | m_dynamicExposureMeasureExposureShader->SetParameter( MEMOIZED_STRING( "MaxBrightness" ), dynamicExposure->m_maxBrightness ); |
| 1233 | m_dynamicExposureMeasureExposureShader->SetParameter( MEMOIZED_STRING( "IncreaseSpeed" ), dynamicExposure->m_increaseSpeed ); |
| 1234 | m_dynamicExposureMeasureExposureShader->SetParameter( MEMOIZED_STRING( "DecreaseSpeed" ), dynamicExposure->m_decreaseSpeed ); |
| 1235 | m_dynamicExposureMeasureExposureShader->SetParameter( MEMOIZED_STRING( "MinExposure" ), dynamicExposure->m_minExposure ); |
| 1236 | m_dynamicExposureMeasureExposureShader->SetParameter( MEMOIZED_STRING( "MaxExposure" ), dynamicExposure->m_maxExposure ); |
| 1237 | TEMP_PARAM( m_dynamicExposureMeasureExposureShader, "Histogram", histogram ); |
| 1238 | TEMP_PARAM( m_dynamicExposureMeasureExposureShader, "Exposure", GetExposureBuffer( gpuResourcePool ) ); |
| 1239 | Tr2Renderer::RunComputeShader( m_dynamicExposureMeasureExposureShader, 1, 1, 1, renderContext ); |
nothing calls this directly
no test coverage detected