Fix SSR with HiZ on WebGPU on Android device when R32_Float cannnot be sampled

This commit is contained in:
Wojtek Figat
2026-03-24 00:26:47 +01:00
parent 88fe9ba186
commit 4d5bf4ec0c
4 changed files with 17 additions and 8 deletions

View File

@@ -143,6 +143,10 @@ GPUTexture* RenderBuffers::RequestHiZ(GPUContext* context, bool fullRes, int32 m
{
HiZ = RenderTargetPool::Get(desc);
RENDER_TARGET_POOL_SET_NAME(HiZ, "HiZ");
#if PLATFORM_WEB
// Hack to fix WebGPU limitation that requires to specify different sampler type manually to load 32-bit float texture
SetWebGPUTextureViewSampler(HiZ->View(), GPU_WEBGPU_SAMPLER_TYPE_UNFILTERABLE_FLOAT);
#endif
}
// Downscale

View File

@@ -103,3 +103,10 @@ class RendererPass : public Singleton<T>, public RendererPassBase
#define REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, index, dataType) LOG(Fatal, "Shader {0} has incorrect constant buffer {1} size: {2} bytes. Expected: {3} bytes", shader->ToString(), index, shader->GetCB(index)->GetSize(), sizeof(dataType));
#define CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, index, dataType) ASSERT(shader && shader->GetCB(index)); if (shader->GetCB(index)->GetSize() != sizeof(dataType) && shader->GetCB(index)->GetSize() != 0) { REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, index, dataType); return true; }
#if PLATFORM_WEB
// Hack to fix WebGPU limitation that requires to specify different sampler type manually (eg. to sample depth texture without filtering)
void SetWebGPUTextureViewSampler(GPUTextureView* view, uint32 samplerType);
#define GPU_WEBGPU_SAMPLER_TYPE_UNFILTERABLE_FLOAT 0x00000003 // WGPUTextureSampleType_UnfilterableFloat
#define GPU_WEBGPU_SAMPLER_TYPE_DEPTH 0x00000004 // WGPUTextureSampleType_Depth
#endif

View File

@@ -275,15 +275,13 @@ GPUTexture* ScreenSpaceReflectionsPass::Render(RenderContext& renderContext, GPU
context->UpdateCB(cb, &data);
context->BindCB(0, cb);
// Bind GBuffer inputs
context->BindSR(0, buffers->GBuffer0);
context->BindSR(1, buffers->GBuffer1);
context->BindSR(2, buffers->GBuffer2);
context->BindSR(3, depthBufferTrace);
// Combine pass
{
PROFILE_GPU("Combine");
context->BindSR(0, buffers->GBuffer0);
context->BindSR(1, buffers->GBuffer1);
context->BindSR(2, buffers->GBuffer2);
context->BindSR(3, buffers->DepthBuffer);
context->BindSR(TEXTURE0, lightBuffer);
context->BindSR(TEXTURE1, reflectionsRT);
context->BindSR(TEXTURE2, _preIntegratedGF->GetTexture());
@@ -328,6 +326,7 @@ GPUTexture* ScreenSpaceReflectionsPass::Render(RenderContext& renderContext, GPU
PROFILE_GPU("RayTrace");
context->SetViewportAndScissors((float)traceWidth, (float)traceHeight);
context->SetRenderTarget(*traceBuffer);
context->BindSR(3, depthBufferTrace);
context->BindSR(TEXTURE0, colorBuffer0->View());
if (useGlobalSurfaceAtlas)
{

View File

@@ -1177,8 +1177,7 @@ void ShadowsPass::SetupShadows(RenderContext& renderContext, RenderContextBatch&
}
#if PLATFORM_WEB
// Hack to fix WebGPU limitation that requires to specify different sampler type manually to sample depth texture
void SetWebGPUTextureViewSampler(GPUTextureView * view, uint32 samplerType);
SetWebGPUTextureViewSampler(shadows.ShadowMapAtlas->View(), 0x00000004); // WGPUTextureSampleType_Depth
SetWebGPUTextureViewSampler(shadows.ShadowMapAtlas->View(), GPU_WEBGPU_SAMPLER_TYPE_DEPTH);
#endif
shadows.ClearShadowMapAtlas = true;
shadows.Resolution = atlasResolution;