small optimizations and refactors

This commit is contained in:
Turánszki János
2025-09-09 17:51:47 +02:00
parent 5dc4f68e94
commit 162daa3d40
7 changed files with 50 additions and 50 deletions
+4 -4
View File
@@ -7,17 +7,17 @@ PUSHCONSTANT(bloom, Bloom);
[numthreads(POSTPROCESS_BLOCKSIZE, POSTPROCESS_BLOCKSIZE, 1)]
void main(uint3 DTid : SV_DispatchThreadID)
{
const float2 uv = DTid.xy + 0.5f;
const float2 uv = DTid.xy + 0.5;
float3 color = 0;
half3 color = 0;
Texture2D<float4> texture_input = bindless_textures[descriptor_index(bloom.texture_input)];
Texture2D<half4> texture_input = bindless_textures_half4[descriptor_index(bloom.texture_input)];
color += texture_input.SampleLevel(sampler_linear_clamp, (uv + float2(-0.5, -0.5)) * bloom.resolution_rcp, 0).rgb;
color += texture_input.SampleLevel(sampler_linear_clamp, (uv + float2(0.5, -0.5)) * bloom.resolution_rcp, 0).rgb;
color += texture_input.SampleLevel(sampler_linear_clamp, (uv + float2(-0.5, 0.5)) * bloom.resolution_rcp, 0).rgb;
color += texture_input.SampleLevel(sampler_linear_clamp, (uv + float2(0.5, 0.5)) * bloom.resolution_rcp, 0).rgb;
color /= 4.0f;
color /= 4.0;
float exposure = bloom.exposure;
+1 -1
View File
@@ -108,7 +108,7 @@ void main(uint3 DTid : SV_DispatchThreadID, uint3 Gid : SV_GroupID, uint2 GTid :
for(uint y = GTid.y * 2; y < TILE_SIZE; y += THREADCOUNT * 2)
{
const int2 pixel = tile_upperleft + int2(x, y);
const float3 uvw = float3((pixel + 0.5f) * postprocess.resolution_rcp, layer);
const float3 uvw = float3((pixel + 1.0) * postprocess.resolution_rcp, layer);
const float4 depths = input_depth.GatherRed(sampler_linear_clamp, uvw);
const float4 reds = input_color.GatherRed(sampler_linear_clamp, uvw);
const float4 greens = input_color.GatherGreen(sampler_linear_clamp, uvw);
+43 -35
View File
@@ -11,58 +11,66 @@ RWTexture2D<float3> output : register(u0);
// This hack can improve bright areas:
#define HDR_CORRECTION
static const uint TILE_BORDER = 1;
static const uint TILE_SIZE = POSTPROCESS_BLOCKSIZE + TILE_BORDER * 2;
static const int THREADCOUNT = POSTPROCESS_BLOCKSIZE;
static const int TILE_BORDER = 1;
static const int TILE_SIZE = TILE_BORDER + THREADCOUNT + TILE_BORDER;
groupshared uint2 tile_cache[TILE_SIZE*TILE_SIZE];
[numthreads(POSTPROCESS_BLOCKSIZE, POSTPROCESS_BLOCKSIZE, 1)]
inline uint coord_to_cache(int2 coord)
{
return flatten2D(clamp(coord, 0, TILE_SIZE - 1), TILE_SIZE);
}
[numthreads(THREADCOUNT, THREADCOUNT, 1)]
void main(uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint3 Gid : SV_GroupID, uint groupIndex : SV_GroupIndex)
{
if (postprocess.params0.x)
// preload grid cache:
const int2 tile_upperleft = Gid.xy * THREADCOUNT - TILE_BORDER;
for(uint y = GTid.y * 2; y < TILE_SIZE; y += THREADCOUNT * 2)
for(uint x = GTid.x * 2; x < TILE_SIZE; x += THREADCOUNT * 2)
{
// Early exit when it is the first frame
output[DTid.xy] = input_current[DTid.xy].rgb;
return;
const int2 pixel = tile_upperleft + int2(x, y);
const float2 uv = (pixel + 1.0) * postprocess.resolution_rcp;
const half4 dddd = texture_lineardepth.GatherRed(sampler_linear_clamp, uv);
const half4 rrrr = input_current.GatherRed(sampler_linear_clamp, uv);
const half4 gggg = input_current.GatherGreen(sampler_linear_clamp, uv);
const half4 bbbb = input_current.GatherBlue(sampler_linear_clamp, uv);
const uint t = coord_to_cache(int2(x, y));
tile_cache[t] = pack_half4(half4(rrrr.w, gggg.w, bbbb.w, dddd.w));
tile_cache[t + 1] = pack_half4(half4(rrrr.z, gggg.z, bbbb.z, dddd.z));
tile_cache[t + TILE_SIZE] = pack_half4(half4(rrrr.x, gggg.x, bbbb.x, dddd.x));
tile_cache[t + TILE_SIZE + 1] = pack_half4(half4(rrrr.y, gggg.y, bbbb.y, dddd.y));
}
GroupMemoryBarrierWithGroupSync();
const float2 uv = (DTid.xy + 0.5) * postprocess.resolution_rcp;
half3 neighborhoodMin = 10000;
half3 neighborhoodMax = -10000;
half3 current;
float bestDepth = 1;
const int2 tile_upperleft = Gid.xy * POSTPROCESS_BLOCKSIZE - TILE_BORDER;
for (uint t = groupIndex; t < TILE_SIZE * TILE_SIZE; t += POSTPROCESS_BLOCKSIZE * POSTPROCESS_BLOCKSIZE)
{
const uint2 pixel = tile_upperleft + unflatten2D(t, TILE_SIZE);
const half depth = texture_lineardepth[pixel];
const half3 color = input_current[pixel].rgb;
tile_cache[t] = pack_half4(half4(color, depth));
}
GroupMemoryBarrierWithGroupSync();
const int2 pixel_local = TILE_BORDER + GTid.xy;
// Search for best velocity and compute color clamping range in 3x3 neighborhood:
int2 bestOffset = 0;
for (int x = -1; x <= 1; ++x)
for (int y = -TILE_BORDER; y <= TILE_BORDER; ++y)
for (int x = -TILE_BORDER; x <= TILE_BORDER; ++x)
{
for (int y = -1; y <= 1; ++y)
const int2 offset = int2(x, y);
const uint t = coord_to_cache(pixel_local + int2(x, y));
const half4 neighbor = unpack_half4(tile_cache[t]);
neighborhoodMin = min(neighborhoodMin, neighbor.xyz);
neighborhoodMax = max(neighborhoodMax, neighbor.xyz);
if (x == 0 && y == 0)
{
const int2 offset = int2(x, y);
const uint idx = flatten2D(GTid.xy + TILE_BORDER + offset, TILE_SIZE);
current = neighbor.xyz;
}
const half4 neighbor = unpack_half4(tile_cache[idx]);
neighborhoodMin = min(neighborhoodMin, neighbor.xyz);
neighborhoodMax = max(neighborhoodMax, neighbor.xyz);
if (x == 0 && y == 0)
{
current = neighbor.xyz;
}
const half depth = neighbor.w;
if (depth < bestDepth)
{
bestDepth = depth;
bestOffset = offset;
}
const half depth = neighbor.w;
if (depth < bestDepth)
{
bestDepth = depth;
bestOffset = offset;
}
}
const float2 velocity = texture_velocity[DTid.xy + bestOffset].xy;
-1
View File
@@ -22,7 +22,6 @@
#include <iomanip>
#include <fstream>
#include <sstream>
#include <codecvt> // string conversion
#include <filesystem>
#include <vector>
#include <iostream>
+1 -7
View File
@@ -11186,12 +11186,7 @@ void ComputeLuminance(
cmd
);
{
GPUBarrier barriers[] = {
GPUBarrier::Memory(),
};
device->Barrier(barriers, arraysize(barriers), cmd);
}
device->Barrier(GPUBarrier::Memory(), cmd);
}
// Pass 2 : Reduce into 1x1 texture
@@ -11204,7 +11199,6 @@ void ComputeLuminance(
{
GPUBarrier barriers[] = {
GPUBarrier::Memory(),
GPUBarrier::Buffer(&res.luminance, ResourceState::UNORDERED_ACCESS, ResourceState::SHADER_RESOURCE),
};
device->Barrier(barriers, arraysize(barriers), cmd);
-1
View File
@@ -10,7 +10,6 @@
#include "shaders/ShaderInterop_Renderer.h"
#include "wiResourceManager.h"
#include "wiVector.h"
#include "wiArchive.h"
#include "wiRectPacker.h"
#include "wiUnorderedSet.h"
#include "wiBVH.h"
+1 -1
View File
@@ -9,7 +9,7 @@ namespace wi::version
// minor features, major updates, breaking compatibility changes
const int minor = 71;
// minor bug fixes, alterations, refactors, updates
const int revision = 822;
const int revision = 823;
const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);