From 95e357f73f28d24e70ce7a1ab8f9fb954de457e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tur=C3=A1nszki=20J=C3=A1nos?= Date: Thu, 9 Jan 2025 17:27:24 +0100 Subject: [PATCH] Improved safety features to avoid GPU crashes --- WickedEngine/shaders/ShaderInterop_DDGI.h | 6 +- WickedEngine/shaders/ShaderInterop_Renderer.h | 4 +- .../shaders/ShaderInterop_VoxelGrid.h | 2 +- WickedEngine/shaders/aerialPerspectiveCS.hlsl | 4 +- WickedEngine/shaders/bloomseparateCS.hlsl | 12 +- WickedEngine/shaders/bvh_primitivesCS.hlsl | 12 +- WickedEngine/shaders/ddgi_debugPS.hlsl | 2 +- WickedEngine/shaders/emittedparticleMS.hlsl | 8 +- WickedEngine/shaders/emittedparticleVS.hlsl | 8 +- .../shaders/emittedparticle_emitCS.hlsl | 2 +- .../shaders/emittedparticle_simulateCS.hlsl | 25 +--- WickedEngine/shaders/filterEnvMapCS.hlsl | 4 +- WickedEngine/shaders/fontPS.hlsl | 2 +- WickedEngine/shaders/fontVS.hlsl | 2 +- .../shaders/generateMIPChain2DCS_float4.hlsl | 6 +- .../shaders/generateMIPChain3DCS_float4.hlsl | 6 +- .../generateMIPChainCubeArrayCS_float4.hlsl | 6 +- .../generateMIPChainCubeCS_float4.hlsl | 6 +- WickedEngine/shaders/globals.hlsli | 66 ++++++---- WickedEngine/shaders/hairparticlePS.hlsl | 4 +- WickedEngine/shaders/hairparticleVS.hlsl | 8 +- WickedEngine/shaders/imagePS.hlsl | 8 +- WickedEngine/shaders/imageVS.hlsl | 2 +- WickedEngine/shaders/impostorPS.hlsl | 2 +- WickedEngine/shaders/impostor_prepareCS.hlsl | 8 +- WickedEngine/shaders/lightingHF.hlsli | 8 +- WickedEngine/shaders/objectHF.hlsli | 46 +++---- .../shaders/objectHF_mesh_shading.hlsli | 10 +- WickedEngine/shaders/objectVS_debug.hlsl | 2 +- WickedEngine/shaders/oceanSurfacePS.hlsl | 8 +- WickedEngine/shaders/paint_textureCS.hlsl | 6 +- WickedEngine/shaders/paintdecalPS.hlsl | 2 +- WickedEngine/shaders/paintdecalVS.hlsl | 6 +- WickedEngine/shaders/raytracingHF.hlsli | 6 +- WickedEngine/shaders/renderlightmapVS.hlsl | 6 +- WickedEngine/shaders/rtdiffuseCS.hlsl | 2 +- WickedEngine/shaders/shadingHF.hlsli | 38 +++--- WickedEngine/shaders/shadowHF.hlsli | 18 +-- WickedEngine/shaders/skinningCS.hlsl | 22 ++-- WickedEngine/shaders/skyHF.hlsli | 4 +- WickedEngine/shaders/surfaceHF.hlsli | 36 +++--- WickedEngine/shaders/surfel_coverageCS.hlsl | 1 + WickedEngine/shaders/surfel_updateCS.hlsl | 1 + .../terrainVirtualTextureUpdateCS.hlsl | 16 +-- WickedEngine/shaders/tonemapCS.hlsl | 19 ++- WickedEngine/shaders/trailPS.hlsl | 6 +- WickedEngine/shaders/underwaterCS.hlsl | 6 +- .../virtualTextureResidencyUpdateCS.hlsl | 6 +- .../shaders/virtualTextureTileAllocateCS.hlsl | 6 +- .../shaders/virtualTextureTileRequestsCS.hlsl | 4 +- WickedEngine/shaders/visibility_shadeCS.hlsl | 6 +- .../shaders/volumetricCloud_renderCS.hlsl | 4 +- WickedEngine/shaders/voxelConeTracingHF.hlsli | 2 +- WickedEngine/shaders/voxelGS.hlsl | 2 +- .../shaders/vxgi_resolve_diffuseCS.hlsl | 2 +- .../shaders/vxgi_resolve_specularCS.hlsl | 2 +- WickedEngine/shaders/wetmap_updateCS.hlsl | 10 +- WickedEngine/wiEmittedParticle.cpp | 12 +- WickedEngine/wiGraphicsDevice_DX12.cpp | 23 ++++ WickedEngine/wiGraphicsDevice_DX12.h | 2 +- WickedEngine/wiGraphicsDevice_Vulkan.cpp | 31 +++-- WickedEngine/wiGraphicsDevice_Vulkan.h | 70 +++++++++- WickedEngine/wiHairParticle.cpp | 12 +- WickedEngine/wiRenderer.cpp | 122 ++---------------- WickedEngine/wiScene.cpp | 12 +- WickedEngine/wiScene_Components.cpp | 18 +-- WickedEngine/wiVersion.cpp | 2 +- 67 files changed, 413 insertions(+), 419 deletions(-) diff --git a/WickedEngine/shaders/ShaderInterop_DDGI.h b/WickedEngine/shaders/ShaderInterop_DDGI.h index 0635b0e3e..dccd9d96a 100644 --- a/WickedEngine/shaders/ShaderInterop_DDGI.h +++ b/WickedEngine/shaders/ShaderInterop_DDGI.h @@ -123,7 +123,7 @@ inline float3 ddgi_probe_position(uint3 probeCoord) [branch] if (GetScene().ddgi.offset_texture >= 0) { - float3 offset = bindless_textures3D[GetScene().ddgi.offset_texture][ddgi_probe_offset_pixel(probeCoord)].xyz; + float3 offset = bindless_textures3D[descriptor_index(GetScene().ddgi.offset_texture)][ddgi_probe_offset_pixel(probeCoord)].xyz; offset = (offset - 0.5) * ddgi_cellsize(); pos += offset; } @@ -230,7 +230,7 @@ half3 ddgi_sample_irradiance(float3 P, half3 N) half dist_to_probe = length(probe_to_point); //float2 temp = textureLod(depth_texture, tex_coord, 0.0f).rg; - half2 temp = bindless_textures_half4[GetScene().ddgi.depth_texture].SampleLevel(sampler_linear_clamp, tex_coord, 0).xy; + half2 temp = bindless_textures_half4[descriptor_index(GetScene().ddgi.depth_texture)].SampleLevel(sampler_linear_clamp, tex_coord, 0).xy; half mean = temp.x; half variance = abs(sqr(temp.x) - temp.y); @@ -254,7 +254,7 @@ half3 ddgi_sample_irradiance(float3 P, half3 N) float2 tex_coord = ddgi_probe_color_uv(probe_grid_coord, irradiance_dir); //float3 probe_irradiance = textureLod(irradiance_texture, tex_coord, 0.0f).rgb; - half3 probe_irradiance = bindless_textures_half4[GetScene().ddgi.color_texture].SampleLevel(sampler_linear_clamp, tex_coord, 0).rgb; + half3 probe_irradiance = bindless_textures_half4[descriptor_index(GetScene().ddgi.color_texture)].SampleLevel(sampler_linear_clamp, tex_coord, 0).rgb; // A tiny bit of light is really visible due to log perception, so // crush tiny weights but keep the curve continuous. This must be done diff --git a/WickedEngine/shaders/ShaderInterop_Renderer.h b/WickedEngine/shaders/ShaderInterop_Renderer.h index 074a03551..28d901671 100644 --- a/WickedEngine/shaders/ShaderInterop_Renderer.h +++ b/WickedEngine/shaders/ShaderInterop_Renderer.h @@ -122,9 +122,9 @@ static const uint2 SVT_PACKED_MIP_OFFSETS[SVT_PACKED_MIP_COUNT] = { #ifndef __cplusplus #ifdef TEXTURE_SLOT_NONUNIFORM -#define UniformTextureSlot(x) NonUniformResourceIndex(x) +#define UniformTextureSlot(x) NonUniformResourceIndex(descriptor_index(x)) #else -#define UniformTextureSlot(x) (x) +#define UniformTextureSlot(x) descriptor_index(x) #endif // TEXTURE_SLOT_NONUNIFORM inline float get_lod(in uint2 dim, in float2 uv_dx, in float2 uv_dy, uint anisotropy = 0) diff --git a/WickedEngine/shaders/ShaderInterop_VoxelGrid.h b/WickedEngine/shaders/ShaderInterop_VoxelGrid.h index dc8f72dd4..93b5a1159 100644 --- a/WickedEngine/shaders/ShaderInterop_VoxelGrid.h +++ b/WickedEngine/shaders/ShaderInterop_VoxelGrid.h @@ -48,7 +48,7 @@ struct alignas(16) ShaderVoxelGrid return false; // early exit when coord is not valid (outside of resolution) const uint3 macro_coord = uint3(coord.x / 4u, coord.y / 4u, coord.z / 4u); const uint idx = flatten3D(macro_coord, resolution_div4); - const uint64_t voxels_4x4_block = bindless_buffers[buffer].Load(idx * sizeof(uint64_t)); + const uint64_t voxels_4x4_block = bindless_buffers[descriptor_index(buffer)].Load(idx * sizeof(uint64_t)); if (voxels_4x4_block == 0) return false; // early exit when whole block is empty uint3 sub_coord; diff --git a/WickedEngine/shaders/aerialPerspectiveCS.hlsl b/WickedEngine/shaders/aerialPerspectiveCS.hlsl index 2bcd5611a..4d24128ab 100644 --- a/WickedEngine/shaders/aerialPerspectiveCS.hlsl +++ b/WickedEngine/shaders/aerialPerspectiveCS.hlsl @@ -95,8 +95,8 @@ void RenderAerialPerspective(uint3 DTid, float2 uv, float depth, float3 depthWor [numthreads(POSTPROCESS_BLOCKSIZE, POSTPROCESS_BLOCKSIZE, 1)] void main(uint3 DTid : SV_DispatchThreadID) { - TextureCube input = bindless_cubemaps[capture.texture_input]; - RWTexture2DArray output = bindless_rwtextures2DArray[capture.texture_output]; + TextureCube input = bindless_cubemaps[descriptor_index(capture.texture_input)]; + RWTexture2DArray output = bindless_rwtextures2DArray[descriptor_index(capture.texture_output)]; const float2 uv = (DTid.xy + 0.5) * capture.resolution_rcp; const float3 N = uv_to_cubemap(uv, DTid.z); diff --git a/WickedEngine/shaders/bloomseparateCS.hlsl b/WickedEngine/shaders/bloomseparateCS.hlsl index 39dbf8e63..301d5f19e 100644 --- a/WickedEngine/shaders/bloomseparateCS.hlsl +++ b/WickedEngine/shaders/bloomseparateCS.hlsl @@ -11,7 +11,7 @@ void main(uint3 DTid : SV_DispatchThreadID) float3 color = 0; - Texture2D texture_input = bindless_textures[bloom.texture_input]; + Texture2D texture_input = bindless_textures[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; @@ -20,11 +20,17 @@ void main(uint3 DTid : SV_DispatchThreadID) color /= 4.0f; float exposure = bloom.exposure; - exposure *= bindless_buffers[bloom.buffer_input_luminance].Load(LUMINANCE_BUFFER_OFFSET_EXPOSURE); + + [branch] + if (bloom.buffer_input_luminance >= 0) + { + exposure *= bindless_buffers[descriptor_index(bloom.buffer_input_luminance)].Load(LUMINANCE_BUFFER_OFFSET_EXPOSURE); + } + color *= exposure; color = min(color, 10); // clamp upper limit: avoid incredibly large values to overly dominate bloom (high speculars were causing problems) color = max(color - bloom.threshold, 0); - bindless_rwtextures[bloom.texture_output][DTid.xy] = float4(color, 1); + bindless_rwtextures[descriptor_index(bloom.texture_output)][DTid.xy] = float4(color, 1); } diff --git a/WickedEngine/shaders/bvh_primitivesCS.hlsl b/WickedEngine/shaders/bvh_primitivesCS.hlsl index 924e9108e..e5b7ee6f4 100644 --- a/WickedEngine/shaders/bvh_primitivesCS.hlsl +++ b/WickedEngine/shaders/bvh_primitivesCS.hlsl @@ -28,13 +28,13 @@ void main(uint3 DTid : SV_DispatchThreadID, uint groupIndex : SV_GroupIndex) ShaderMaterial material = load_material(geometry.materialIndex); uint startIndex = prim.primitiveIndex * 3 + geometry.indexOffset; - uint i0 = bindless_buffers_uint[geometry.ib][startIndex + 0]; - uint i1 = bindless_buffers_uint[geometry.ib][startIndex + 1]; - uint i2 = bindless_buffers_uint[geometry.ib][startIndex + 2]; + uint i0 = bindless_buffers_uint[descriptor_index(geometry.ib)][startIndex + 0]; + uint i1 = bindless_buffers_uint[descriptor_index(geometry.ib)][startIndex + 1]; + uint i2 = bindless_buffers_uint[descriptor_index(geometry.ib)][startIndex + 2]; - float3 p0 = bindless_buffers_float4[geometry.vb_pos_wind][i0].xyz; - float3 p1 = bindless_buffers_float4[geometry.vb_pos_wind][i1].xyz; - float3 p2 = bindless_buffers_float4[geometry.vb_pos_wind][i2].xyz; + float3 p0 = bindless_buffers_float4[descriptor_index(geometry.vb_pos_wind)][i0].xyz; + float3 p1 = bindless_buffers_float4[descriptor_index(geometry.vb_pos_wind)][i1].xyz; + float3 p2 = bindless_buffers_float4[descriptor_index(geometry.vb_pos_wind)][i2].xyz; float3 P0 = mul(inst.transform.GetMatrix(), float4(p0, 1)).xyz; float3 P1 = mul(inst.transform.GetMatrix(), float4(p1, 1)).xyz; float3 P2 = mul(inst.transform.GetMatrix(), float4(p2, 1)).xyz; diff --git a/WickedEngine/shaders/ddgi_debugPS.hlsl b/WickedEngine/shaders/ddgi_debugPS.hlsl index 82fa73e5a..c5d14b63e 100644 --- a/WickedEngine/shaders/ddgi_debugPS.hlsl +++ b/WickedEngine/shaders/ddgi_debugPS.hlsl @@ -10,7 +10,7 @@ struct VSOut float4 main(VSOut input) : SV_Target { - Texture2D ddgiColorTexture = bindless_textures[GetScene().ddgi.color_texture]; + Texture2D ddgiColorTexture = bindless_textures[descriptor_index(GetScene().ddgi.color_texture)]; uint3 probeCoord = ddgi_probe_coord(input.probeIndex); float3 color = ddgiColorTexture.SampleLevel(sampler_linear_clamp, ddgi_probe_color_uv(probeCoord, input.normal), 0).rgb; diff --git a/WickedEngine/shaders/emittedparticleMS.hlsl b/WickedEngine/shaders/emittedparticleMS.hlsl index a34e47fbd..2468ba156 100644 --- a/WickedEngine/shaders/emittedparticleMS.hlsl +++ b/WickedEngine/shaders/emittedparticleMS.hlsl @@ -75,9 +75,9 @@ void main( { uint vertexID = particleIndex * 4 + i; - float3 position = bindless_buffers_float4[geometry.vb_pos_wind][vertexID].xyz; - float3 normal = normalize(bindless_buffers_float4[geometry.vb_nor][vertexID].xyz); - float4 uvsets = bindless_buffers_float4[geometry.vb_uvs][vertexID]; + float3 position = bindless_buffers_float4[descriptor_index(geometry.vb_pos_wind)][vertexID].xyz; + float3 normal = normalize(bindless_buffers_float4[descriptor_index(geometry.vb_nor)][vertexID].xyz); + float4 uvsets = bindless_buffers_float4[descriptor_index(geometry.vb_uvs)][vertexID]; VertextoPixel_MS Out; Out.clip = dot(Out.pos, GetCamera().clip_plane); @@ -89,7 +89,7 @@ void main( } VertextoPixel_MS_PRIM OutQuad; - OutQuad.color = pack_rgba(bindless_buffers_float4[geometry.vb_col][particleIndex * 4]); + OutQuad.color = pack_rgba(bindless_buffers_float4[descriptor_index(geometry.vb_col)][particleIndex * 4]); OutQuad.size = half(size); OutQuad.frameBlend = half(frameBlend); sharedPrimitives[tig * 2 + 0] = OutQuad; diff --git a/WickedEngine/shaders/emittedparticleVS.hlsl b/WickedEngine/shaders/emittedparticleVS.hlsl index 1df5e482d..e8c34df91 100644 --- a/WickedEngine/shaders/emittedparticleVS.hlsl +++ b/WickedEngine/shaders/emittedparticleVS.hlsl @@ -20,10 +20,10 @@ VertextoPixel main(uint vid : SV_VertexID, uint instanceID : SV_InstanceID) uint particleIndex = culledIndirectionBuffer2[culledIndirectionBuffer[instanceID]]; uint vertexID = particleIndex * 4 + vid; - float3 position = bindless_buffers_float4[geometry.vb_pos_wind][vertexID].xyz; - float3 normal = normalize(bindless_buffers_float4[geometry.vb_nor][vertexID].xyz); - float4 uvsets = bindless_buffers_float4[geometry.vb_uvs][vertexID]; - float4 color = bindless_buffers_float4[geometry.vb_col][vertexID]; + float3 position = bindless_buffers_float4[descriptor_index(geometry.vb_pos_wind)][vertexID].xyz; + float3 normal = normalize(bindless_buffers_float4[descriptor_index(geometry.vb_nor)][vertexID].xyz); + float4 uvsets = bindless_buffers_float4[descriptor_index(geometry.vb_uvs)][vertexID]; + float4 color = bindless_buffers_float4[descriptor_index(geometry.vb_col)][vertexID]; // load particle data: Particle particle = particleBuffer[particleIndex]; diff --git a/WickedEngine/shaders/emittedparticle_emitCS.hlsl b/WickedEngine/shaders/emittedparticle_emitCS.hlsl index 27fde537c..e34461b9d 100644 --- a/WickedEngine/shaders/emittedparticle_emitCS.hlsl +++ b/WickedEngine/shaders/emittedparticle_emitCS.hlsl @@ -50,7 +50,7 @@ void main(uint3 DTid : SV_DispatchThreadID) [branch] if(geometry.ib >= 0) { - Buffer buf = bindless_buffers_uint[geometry.ib]; + Buffer buf = bindless_buffers_uint[descriptor_index(geometry.ib)]; i0 = buf[geometry.indexOffset + tri * 3 + 0]; i1 = buf[geometry.indexOffset + tri * 3 + 1]; i2 = buf[geometry.indexOffset + tri * 3 + 2]; diff --git a/WickedEngine/shaders/emittedparticle_simulateCS.hlsl b/WickedEngine/shaders/emittedparticle_simulateCS.hlsl index 7f63d9738..f351ec981 100644 --- a/WickedEngine/shaders/emittedparticle_simulateCS.hlsl +++ b/WickedEngine/shaders/emittedparticle_simulateCS.hlsl @@ -18,7 +18,7 @@ RWStructuredBuffer aliveBuffer_NEW : register(u2); RWStructuredBuffer deadBuffer : register(u3); RWByteAddressBuffer counterBuffer : register(u4); RWStructuredBuffer distanceBuffer : register(u6); -RWByteAddressBuffer vertexBuffer_POS : register(u7); +RWBuffer vertexBuffer_POS : register(u7); RWBuffer vertexBuffer_NOR : register(u8); RWBuffer vertexBuffer_UVS : register(u9); RWBuffer vertexBuffer_COL : register(u10); @@ -65,7 +65,7 @@ void main(uint3 DTid : SV_DispatchThreadID, uint Gid : SV_GroupIndex) [branch] if ((xEmitterOptions & EMITTER_OPTION_BIT_USE_RAIN_BLOCKER) && GetFrame().texture_shadowatlas_index >= 0 && any(GetFrame().rain_blocker_mad_prev)) { - Texture2D texture_shadowatlas = bindless_textures[GetFrame().texture_shadowatlas_index]; + Texture2D texture_shadowatlas = bindless_textures[descriptor_index(GetFrame().texture_shadowatlas_index)]; float3 shadow_pos = mul(GetFrame().rain_blocker_matrix_prev, float4(particle.position, 1)).xyz; float3 shadow_uv = clipspace_to_uv(shadow_pos); if (is_saturated(shadow_uv)) @@ -325,11 +325,7 @@ void main(uint3 DTid : SV_DispatchThreadID, uint Gid : SV_GroupIndex) quadPos = mul(quadPos, (float3x3)GetCamera().view); // reversed mul for inverse camera rotation! // write out vertex: -#ifdef __PSSL__ - vertexBuffer_POS.TypedStore((v0 + vertexID) * sizeof(float3), particle.position + quadPos); -#else - vertexBuffer_POS.Store((v0 + vertexID) * sizeof(float3), particle.position + quadPos); -#endif // __PSSL__ + vertexBuffer_POS[v0 + vertexID] = float4(particle.position + quadPos, 0); vertexBuffer_NOR[v0 + vertexID] = float4(normalize(-GetCamera().forward), 0); vertexBuffer_UVS[v0 + vertexID] = float4(uv, uv2); vertexBuffer_COL[v0 + vertexID] = particleColor; @@ -364,16 +360,9 @@ void main(uint3 DTid : SV_DispatchThreadID, uint Gid : SV_GroupIndex) counterBuffer.InterlockedAdd(PARTICLECOUNTER_OFFSET_DEADCOUNT, 1, deadIndex); deadBuffer[deadIndex] = particleIndex; -#ifdef __PSSL__ - vertexBuffer_POS.TypedStore((v0 + 0) * sizeof(float3), 0); - vertexBuffer_POS.TypedStore((v0 + 1) * sizeof(float3), 0); - vertexBuffer_POS.TypedStore((v0 + 2) * sizeof(float3), 0); - vertexBuffer_POS.TypedStore((v0 + 3) * sizeof(float3), 0); -#else - vertexBuffer_POS.Store((v0 + 0) * sizeof(float3), 0); - vertexBuffer_POS.Store((v0 + 1) * sizeof(float3), 0); - vertexBuffer_POS.Store((v0 + 2) * sizeof(float3), 0); - vertexBuffer_POS.Store((v0 + 3) * sizeof(float3), 0); -#endif // __PSSL__ + vertexBuffer_POS[v0 + 0] = 0; + vertexBuffer_POS[v0 + 1] = 0; + vertexBuffer_POS[v0 + 2] = 0; + vertexBuffer_POS[v0 + 3] = 0; } } diff --git a/WickedEngine/shaders/filterEnvMapCS.hlsl b/WickedEngine/shaders/filterEnvMapCS.hlsl index faee7a571..5c964b22a 100644 --- a/WickedEngine/shaders/filterEnvMapCS.hlsl +++ b/WickedEngine/shaders/filterEnvMapCS.hlsl @@ -83,8 +83,8 @@ void main(uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID) if (DTid.x >= push.filterResolution.x || DTid.y >= push.filterResolution.y) return; - TextureCube input = bindless_cubemaps[push.texture_input]; - RWTexture2DArray output = bindless_rwtextures2DArray[push.texture_output]; + TextureCube input = bindless_cubemaps[descriptor_index(push.texture_input)]; + RWTexture2DArray output = bindless_rwtextures2DArray[descriptor_index(push.texture_output)]; float2 uv = (DTid.xy + 0.5f) * push.filterResolution_rcp.xy; uint face = DTid.z / THREAD_OFFLOAD; diff --git a/WickedEngine/shaders/fontPS.hlsl b/WickedEngine/shaders/fontPS.hlsl index 48b470e68..603757bda 100644 --- a/WickedEngine/shaders/fontPS.hlsl +++ b/WickedEngine/shaders/fontPS.hlsl @@ -10,7 +10,7 @@ struct VertextoPixel float4 main(VertextoPixel input) : SV_TARGET { - Texture2D tex = bindless_textures_half4[font.texture_index]; + Texture2D tex = bindless_textures_half4[descriptor_index(font.texture_index)]; half value = tex.SampleLevel(sampler_linear_clamp, input.uv, 0).r; half4 color = unpack_half4(font.color); diff --git a/WickedEngine/shaders/fontVS.hlsl b/WickedEngine/shaders/fontVS.hlsl index 545b65034..8400045a5 100644 --- a/WickedEngine/shaders/fontVS.hlsl +++ b/WickedEngine/shaders/fontVS.hlsl @@ -11,7 +11,7 @@ struct VertextoPixel VertextoPixel main(uint vertexID : SV_VertexID, uint instanceID : SV_InstanceID) { uint vID = instanceID * 4 + vertexID; - FontVertex vertex = bindless_buffers[font.buffer_index].Load(font.buffer_offset + vID * sizeof(FontVertex)); + FontVertex vertex = bindless_buffers[descriptor_index(font.buffer_index)].Load(font.buffer_offset + vID * sizeof(FontVertex)); VertextoPixel Out; Out.pos = mul(font.transform, float4(asfloat(vertex.pos), 0, 1)); diff --git a/WickedEngine/shaders/generateMIPChain2DCS_float4.hlsl b/WickedEngine/shaders/generateMIPChain2DCS_float4.hlsl index 9e8519597..9b527399c 100644 --- a/WickedEngine/shaders/generateMIPChain2DCS_float4.hlsl +++ b/WickedEngine/shaders/generateMIPChain2DCS_float4.hlsl @@ -12,9 +12,9 @@ void main(uint3 DTid : SV_DispatchThreadID) { if (DTid.x < mipgen.outputResolution.x && DTid.y < mipgen.outputResolution.y) { - SamplerState customsampler = bindless_samplers[mipgen.sampler_index]; - Texture2D input = bindless_textures[mipgen.texture_input]; - RWTexture2D output = bindless_rwtextures[mipgen.texture_output]; + SamplerState customsampler = bindless_samplers[descriptor_index(mipgen.sampler_index)]; + Texture2D input = bindless_textures[descriptor_index(mipgen.texture_input)]; + RWTexture2D output = bindless_rwtextures[descriptor_index(mipgen.texture_output)]; float2 uv = ((float2)DTid.xy + 0.5f) * (float2)mipgen.outputResolution_rcp.xy; float4 rrrr = input.GatherRed(customsampler, uv); diff --git a/WickedEngine/shaders/generateMIPChain3DCS_float4.hlsl b/WickedEngine/shaders/generateMIPChain3DCS_float4.hlsl index b027d4be2..4d72901df 100644 --- a/WickedEngine/shaders/generateMIPChain3DCS_float4.hlsl +++ b/WickedEngine/shaders/generateMIPChain3DCS_float4.hlsl @@ -12,9 +12,9 @@ void main(uint3 DTid : SV_DispatchThreadID) { if (DTid.x < mipgen.outputResolution.x && DTid.y < mipgen.outputResolution.y && DTid.z < mipgen.outputResolution.z) { - SamplerState customsampler = bindless_samplers[mipgen.sampler_index]; - Texture3D input = bindless_textures3D[mipgen.texture_input]; - RWTexture3D output = bindless_rwtextures3D[mipgen.texture_output]; + SamplerState customsampler = bindless_samplers[descriptor_index(mipgen.sampler_index)]; + Texture3D input = bindless_textures3D[descriptor_index(mipgen.texture_input)]; + RWTexture3D output = bindless_rwtextures3D[descriptor_index(mipgen.texture_output)]; output[DTid] = input.SampleLevel(customsampler, ((float3)DTid + 0.5f) * (float3)mipgen.outputResolution_rcp, 0); } diff --git a/WickedEngine/shaders/generateMIPChainCubeArrayCS_float4.hlsl b/WickedEngine/shaders/generateMIPChainCubeArrayCS_float4.hlsl index d229f4b2e..1ad07fdbd 100644 --- a/WickedEngine/shaders/generateMIPChainCubeArrayCS_float4.hlsl +++ b/WickedEngine/shaders/generateMIPChainCubeArrayCS_float4.hlsl @@ -12,9 +12,9 @@ void main(uint3 DTid : SV_DispatchThreadID) { if (DTid.x < mipgen.outputResolution.x && DTid.y < mipgen.outputResolution.y) { - SamplerState customsampler = bindless_samplers[mipgen.sampler_index]; - TextureCubeArray input = bindless_cubearrays[mipgen.texture_input]; - RWTexture2DArray output = bindless_rwtextures2DArray[mipgen.texture_output]; + SamplerState customsampler = bindless_samplers[descriptor_index(mipgen.sampler_index)]; + TextureCubeArray input = bindless_cubearrays[descriptor_index(mipgen.texture_input)]; + RWTexture2DArray output = bindless_rwtextures2DArray[descriptor_index(mipgen.texture_output)]; float2 uv = ((float2)DTid.xy + 0.5f) * mipgen.outputResolution_rcp.xy; float3 N = uv_to_cubemap(uv, DTid.z); diff --git a/WickedEngine/shaders/generateMIPChainCubeCS_float4.hlsl b/WickedEngine/shaders/generateMIPChainCubeCS_float4.hlsl index 15a75fabe..1409ba082 100644 --- a/WickedEngine/shaders/generateMIPChainCubeCS_float4.hlsl +++ b/WickedEngine/shaders/generateMIPChainCubeCS_float4.hlsl @@ -12,9 +12,9 @@ void main(uint3 DTid : SV_DispatchThreadID) { if (DTid.x < mipgen.outputResolution.x && DTid.y < mipgen.outputResolution.y) { - SamplerState customsampler = bindless_samplers[mipgen.sampler_index]; - TextureCube input = bindless_cubemaps[mipgen.texture_input]; - RWTexture2DArray output = bindless_rwtextures2DArray[mipgen.texture_output]; + SamplerState customsampler = bindless_samplers[descriptor_index(mipgen.sampler_index)]; + TextureCube input = bindless_cubemaps[descriptor_index(mipgen.texture_input)]; + RWTexture2DArray output = bindless_rwtextures2DArray[descriptor_index(mipgen.texture_output)]; float2 uv = ((float2)DTid.xy + 0.5f) * mipgen.outputResolution_rcp.xy; float3 N = uv_to_cubemap(uv, DTid.z); diff --git a/WickedEngine/shaders/globals.hlsli b/WickedEngine/shaders/globals.hlsli index 60de4599c..16c770b51 100644 --- a/WickedEngine/shaders/globals.hlsli +++ b/WickedEngine/shaders/globals.hlsli @@ -17,6 +17,15 @@ #endif // __XBOX_SCARLETT #endif +// Descriptor safety feature: +// We init null descriptors for bindless index = 0 for access safety +// Because shader compiler sometimes incorrectly loads descriptor outside of safety branch +// Note: descriptor index 0 always contains a preinitialized null descriptor +inline uint descriptor_index(in int x) +{ + return max(0, x); +} + #include "ColorSpaceUtility.hlsli" #include "PixelPacking_R11G11B10.hlsli" #include "PixelPacking_RGBE.hlsli" @@ -155,7 +164,7 @@ T inverse_lerp(T value1, T value2, T pos) // Source: https://www.shadertoy.com/view/3s33zj float3x3 adjoint(in float4x4 m) { - return float3x3( + return float3x3( cross(m[1].xyz, m[2].xyz), cross(m[2].xyz, m[0].xyz), cross(m[0].xyz, m[1].xyz) @@ -469,19 +478,19 @@ inline ShaderWeather GetWeather() } inline ShaderMeshInstance load_instance(uint instanceIndex) { - return bindless_structured_meshinstance[GetScene().instancebuffer][instanceIndex]; + return bindless_structured_meshinstance[descriptor_index(GetScene().instancebuffer)][instanceIndex]; } inline ShaderGeometry load_geometry(uint geometryIndex) { - return bindless_structured_geometry[GetScene().geometrybuffer][geometryIndex]; + return bindless_structured_geometry[descriptor_index(GetScene().geometrybuffer)][geometryIndex]; } inline ShaderMeshlet load_meshlet(uint meshletIndex) { - return bindless_structured_meshlet[GetScene().meshletbuffer][meshletIndex]; + return bindless_structured_meshlet[descriptor_index(GetScene().meshletbuffer)][meshletIndex]; } inline ShaderMaterial load_material(uint materialIndex) { - return bindless_structured_material[GetScene().materialbuffer][materialIndex]; + return bindless_structured_material[descriptor_index(GetScene().materialbuffer)][materialIndex]; } uint load_entitytile(uint tileIndex) { @@ -520,7 +529,7 @@ inline void write_mipmap_feedback(uint materialIndex, float4 uvsets_dx, float4 u const uint wave_mask = WaveActiveBitOr(mask); if(WaveIsFirstLane()) { - InterlockedOr(bindless_rwbuffers_uint[GetScene().texturestreamingbuffer][materialIndex], wave_mask); + InterlockedOr(bindless_rwbuffers_uint[descriptor_index(GetScene().texturestreamingbuffer)][materialIndex], wave_mask); } } } @@ -530,7 +539,7 @@ inline void write_mipmap_feedback(uint materialIndex, uint resolution0, uint res if(WaveIsFirstLane() && GetScene().texturestreamingbuffer >= 0) { const uint mask = resolution0 | (resolution1 << 16u); - InterlockedOr(bindless_rwbuffers_uint[GetScene().texturestreamingbuffer][materialIndex], mask); + InterlockedOr(bindless_rwbuffers_uint[descriptor_index(GetScene().texturestreamingbuffer)][materialIndex], mask); } } @@ -632,18 +641,19 @@ struct PrimitiveID { ShaderMeshInstance inst = load_instance(instanceIndex); ShaderGeometry geometry = load_geometry(inst.geometryOffset + subsetIndex); + [branch] if (maybe_clustered && geometry.vb_clu >= 0) { const uint clusterID = primitiveIndex >> 7u; const uint triangleID = primitiveIndex & 0x7F; - ShaderCluster cluster = bindless_structured_cluster[NonUniformResourceIndex(geometry.vb_clu)][clusterID]; + ShaderCluster cluster = bindless_structured_cluster[NonUniformResourceIndex(descriptor_index(geometry.vb_clu))][clusterID]; uint i0 = cluster.vertices[cluster.triangles[triangleID].i0()]; uint i1 = cluster.vertices[cluster.triangles[triangleID].i1()]; uint i2 = cluster.vertices[cluster.triangles[triangleID].i2()]; return uint3(i0, i1, i2); } const uint startIndex = primitiveIndex * 3 + geometry.indexOffset; - Buffer indexBuffer = bindless_buffers_uint[NonUniformResourceIndex(geometry.ib)]; + Buffer indexBuffer = bindless_buffers_uint[NonUniformResourceIndex(descriptor_index(geometry.ib))]; uint i0 = indexBuffer[startIndex + 0]; uint i1 = indexBuffer[startIndex + 1]; uint i2 = indexBuffer[startIndex + 2]; @@ -654,26 +664,26 @@ struct PrimitiveID uint i2() { return tri().z; } }; -#define texture_random64x64 bindless_textures[GetFrame().texture_random64x64_index] -#define texture_bluenoise bindless_textures[GetFrame().texture_bluenoise_index] -#define texture_sheenlut bindless_textures_half4[GetFrame().texture_sheenlut_index] -#define texture_skyviewlut bindless_textures_half4[GetFrame().texture_skyviewlut_index] -#define texture_transmittancelut bindless_textures_half4[GetFrame().texture_transmittancelut_index] -#define texture_multiscatteringlut bindless_textures_half4[GetFrame().texture_multiscatteringlut_index] -#define texture_skyluminancelut bindless_textures_half4[GetFrame().texture_skyluminancelut_index] -#define texture_cameravolumelut bindless_textures3D_half4[GetFrame().texture_cameravolumelut_index] -#define texture_wind bindless_textures3D[GetFrame().texture_wind_index] -#define texture_wind_prev bindless_textures3D[GetFrame().texture_wind_prev_index] -#define texture_caustics bindless_textures_half4[GetFrame().texture_caustics_index] -#define scene_acceleration_structure bindless_accelerationstructures[GetScene().TLAS] +#define texture_random64x64 bindless_textures[descriptor_index(GetFrame().texture_random64x64_index)] +#define texture_bluenoise bindless_textures[descriptor_index(GetFrame().texture_bluenoise_index)] +#define texture_sheenlut bindless_textures_half4[descriptor_index(GetFrame().texture_sheenlut_index)] +#define texture_skyviewlut bindless_textures_half4[descriptor_index(GetFrame().texture_skyviewlut_index)] +#define texture_transmittancelut bindless_textures_half4[descriptor_index(GetFrame().texture_transmittancelut_index)] +#define texture_multiscatteringlut bindless_textures_half4[descriptor_index(GetFrame().texture_multiscatteringlut_index)] +#define texture_skyluminancelut bindless_textures_half4[descriptor_index(GetFrame().texture_skyluminancelut_index)] +#define texture_cameravolumelut bindless_textures3D_half4[descriptor_index(GetFrame().texture_cameravolumelut_index)] +#define texture_wind bindless_textures3D[descriptor_index(GetFrame().texture_wind_index)] +#define texture_wind_prev bindless_textures3D[descriptor_index(GetFrame().texture_wind_prev_index)] +#define texture_caustics bindless_textures_half4[descriptor_index(GetFrame().texture_caustics_index)] +#define scene_acceleration_structure bindless_accelerationstructures[descriptor_index(GetScene().TLAS)] -#define texture_depth bindless_textures_float[GetCamera().texture_depth_index] -#define texture_depth_history bindless_textures_float[GetCamera().texture_depth_index_prev] -#define texture_lineardepth bindless_textures_float[GetCamera().texture_lineardepth_index] -#define texture_primitiveID bindless_textures_uint[GetCamera().texture_primitiveID_index] -#define texture_velocity bindless_textures_float2[GetCamera().texture_velocity_index] -#define texture_normal bindless_textures_float2[GetCamera().texture_normal_index] -#define texture_roughness bindless_textures_float[GetCamera().texture_roughness_index] +#define texture_depth bindless_textures_float[descriptor_index(GetCamera().texture_depth_index)] +#define texture_depth_history bindless_textures_float[descriptor_index(GetCamera().texture_depth_index_prev)] +#define texture_lineardepth bindless_textures_float[descriptor_index(GetCamera().texture_lineardepth_index)] +#define texture_primitiveID bindless_textures_uint[descriptor_index(GetCamera().texture_primitiveID_index)] +#define texture_velocity bindless_textures_float2[descriptor_index(GetCamera().texture_velocity_index)] +#define texture_normal bindless_textures_float2[descriptor_index(GetCamera().texture_normal_index)] +#define texture_roughness bindless_textures_float[descriptor_index(GetCamera().texture_roughness_index)] // Note: defines can be better for choosing between half/float by compiler than "static const float" #define PI 3.14159265358979323846 diff --git a/WickedEngine/shaders/hairparticlePS.hlsl b/WickedEngine/shaders/hairparticlePS.hlsl index 1416b12aa..29a8935af 100644 --- a/WickedEngine/shaders/hairparticlePS.hlsl +++ b/WickedEngine/shaders/hairparticlePS.hlsl @@ -45,12 +45,12 @@ float4 main(VertexToPixel input) : SV_Target [branch] if (GetCamera().texture_ao_index >= 0) { - surface.occlusion *= bindless_textures_half4[GetCamera().texture_ao_index].SampleLevel(sampler_linear_clamp, ScreenCoord, 0).r; + surface.occlusion *= bindless_textures_half4[descriptor_index(GetCamera().texture_ao_index)].SampleLevel(sampler_linear_clamp, ScreenCoord, 0).r; } [branch] if (GetCamera().texture_ssgi_index >= 0) { - surface.ssgi = bindless_textures[GetCamera().texture_ssgi_index].SampleLevel(sampler_linear_clamp, ScreenCoord, 0).rgb; + surface.ssgi = bindless_textures[descriptor_index(GetCamera().texture_ssgi_index)].SampleLevel(sampler_linear_clamp, ScreenCoord, 0).rgb; } #endif // CARTOON #endif // TRANSPARENT diff --git a/WickedEngine/shaders/hairparticleVS.hlsl b/WickedEngine/shaders/hairparticleVS.hlsl index dc947913e..685997e4b 100644 --- a/WickedEngine/shaders/hairparticleVS.hlsl +++ b/WickedEngine/shaders/hairparticleVS.hlsl @@ -13,10 +13,10 @@ VertexToPixel main(uint vid : SV_VERTEXID) Out.primitiveID = vid / 3; uint vertexID = primitiveBuffer[vid]; - float4 pos_wind = bindless_buffers_float4[geometry.vb_pos_wind][vertexID]; + float4 pos_wind = bindless_buffers_float4[descriptor_index(geometry.vb_pos_wind)][vertexID]; float3 position = mul(inst.transform.GetMatrix(), float4(pos_wind.xyz, 1)).xyz; - float3 normal = normalize(bindless_buffers_float4[geometry.vb_nor][vertexID].xyz); - float4 uvsets = bindless_buffers_float4[geometry.vb_uvs][vertexID]; + float3 normal = normalize(bindless_buffers_float4[descriptor_index(geometry.vb_nor)][vertexID].xyz); + float4 uvsets = bindless_buffers_float4[descriptor_index(geometry.vb_uvs)][vertexID]; Out.fade = saturate(distance(position.xyz, GetCamera().position.xyz) / xHairViewDistance); Out.fade = saturate(Out.fade - 0.8f) * 5.0f; // fade will be on edge and inwards 20% @@ -25,7 +25,7 @@ VertexToPixel main(uint vid : SV_VERTEXID) Out.clip = dot(Out.pos, GetCamera().clip_plane); Out.pos = mul(GetCamera().view_projection, Out.pos); - Out.nor_wet = half4(normal, (half)bindless_buffers_float[inst.vb_wetmap][vertexID]); + Out.nor_wet = half4(normal, (half)bindless_buffers_float[descriptor_index(inst.vb_wetmap)][vertexID]); Out.tex = uvsets.xy; return Out; diff --git a/WickedEngine/shaders/imagePS.hlsl b/WickedEngine/shaders/imagePS.hlsl index 8705781e9..b4a21c756 100644 --- a/WickedEngine/shaders/imagePS.hlsl +++ b/WickedEngine/shaders/imagePS.hlsl @@ -2,7 +2,7 @@ float4 main(VertextoPixel input) : SV_TARGET { - SamplerState sam = bindless_samplers[image.sampler_index]; + SamplerState sam = bindless_samplers[descriptor_index(image.sampler_index)]; float4 uvsets = input.compute_uvs(); @@ -10,7 +10,7 @@ float4 main(VertextoPixel input) : SV_TARGET [branch] if (image.texture_base_index >= 0) { - half4 tex = bindless_textures_half4[image.texture_base_index].Sample(sam, uvsets.xy); + half4 tex = bindless_textures_half4[descriptor_index(image.texture_base_index)].Sample(sam, uvsets.xy); if (image.flags & IMAGE_FLAG_EXTRACT_NORMALMAP) { @@ -24,7 +24,7 @@ float4 main(VertextoPixel input) : SV_TARGET [branch] if (image.texture_mask_index >= 0) { - mask = bindless_textures_half4[image.texture_mask_index].Sample(sam, uvsets.zw); + mask = bindless_textures_half4[descriptor_index(image.texture_mask_index)].Sample(sam, uvsets.zw); } const half2 mask_alpha_range = unpack_half2(image.mask_alpha_range); @@ -43,7 +43,7 @@ float4 main(VertextoPixel input) : SV_TARGET [branch] if (image.texture_background_index >= 0) { - Texture2D backgroundTexture = bindless_textures_half4[image.texture_background_index]; + Texture2D backgroundTexture = bindless_textures_half4[descriptor_index(image.texture_background_index)]; float2 uv_screen = input.uv_screen(); if(image.flags & IMAGE_FLAG_DISTORTION_MASK) { diff --git a/WickedEngine/shaders/imageVS.hlsl b/WickedEngine/shaders/imageVS.hlsl index 9b6dc0280..2c92654b7 100644 --- a/WickedEngine/shaders/imageVS.hlsl +++ b/WickedEngine/shaders/imageVS.hlsl @@ -20,7 +20,7 @@ VertextoPixel main(uint vI : SV_VertexID) } else { - Out.pos = bindless_buffers[image.buffer_index].Load(image.buffer_offset + vI * sizeof(float4)); + Out.pos = bindless_buffers[descriptor_index(image.buffer_index)].Load(image.buffer_offset + vI * sizeof(float4)); // Set up inverse bilinear interpolation Out.q = Out.pos.xy - image.b0; diff --git a/WickedEngine/shaders/impostorPS.hlsl b/WickedEngine/shaders/impostorPS.hlsl index 0dd8302e1..fed9de8c4 100644 --- a/WickedEngine/shaders/impostorPS.hlsl +++ b/WickedEngine/shaders/impostorPS.hlsl @@ -45,7 +45,7 @@ float4 main(VSOut input) : SV_Target [branch] if (GetCamera().texture_ao_index >= 0) { - surface.occlusion *= bindless_textures_half4[GetCamera().texture_ao_index].SampleLevel(sampler_linear_clamp, ScreenCoord, 0).r; + surface.occlusion *= bindless_textures_half4[descriptor_index(GetCamera().texture_ao_index)].SampleLevel(sampler_linear_clamp, ScreenCoord, 0).r; } #endif // TRANSPARENT #endif // ENVMAPRENDERING diff --git a/WickedEngine/shaders/impostor_prepareCS.hlsl b/WickedEngine/shaders/impostor_prepareCS.hlsl index a3acd84a2..efb26c41c 100644 --- a/WickedEngine/shaders/impostor_prepareCS.hlsl +++ b/WickedEngine/shaders/impostor_prepareCS.hlsl @@ -11,7 +11,7 @@ static const float3 BILLBOARD[] = }; RWBuffer output_indices : register(u0); -RWByteAddressBuffer output_vertices_pos : register(u1); +RWBuffer output_vertices_pos : register(u1); RWBuffer output_vertices_nor : register(u2); RWByteAddressBuffer output_impostor_data : register(u3); RWStructuredBuffer output_indirect : register(u4); @@ -104,11 +104,7 @@ void main(uint3 DTid : SV_DispatchThreadID) pos = mul(pos, float3x3(right, up, face)); pos *= instance.radius; pos += instance.center; -#ifdef __PSSL__ - output_vertices_pos.TypedStore((vertexOffset + vertexID) * sizeof(float3), pos); -#else - output_vertices_pos.Store((vertexOffset + vertexID) * sizeof(float3), pos); -#endif // __PSSL__ + output_vertices_pos[vertexOffset + vertexID] = float4(pos, 0); output_vertices_nor[vertexOffset + vertexID] = float4(face, 0); } } diff --git a/WickedEngine/shaders/lightingHF.hlsli b/WickedEngine/shaders/lightingHF.hlsli index ae67412a4..7370c42a8 100644 --- a/WickedEngine/shaders/lightingHF.hlsli +++ b/WickedEngine/shaders/lightingHF.hlsli @@ -126,7 +126,7 @@ inline void light_directional(in ShaderEntity light, in Surface surface, inout L const ShaderOcean ocean = GetWeather().ocean; if (ocean.texture_displacementmap >= 0) { - Texture2D displacementmap = bindless_textures[ocean.texture_displacementmap]; + Texture2D displacementmap = bindless_textures[descriptor_index(ocean.texture_displacementmap)]; float2 ocean_uv = surface.P.xz * ocean.patch_size_rcp; float3 displacement = displacementmap.SampleLevel(sampler_linear_wrap, ocean_uv, 0).xzy; float water_height = ocean.water_height + displacement.y; @@ -364,7 +364,7 @@ inline half3 GetAmbient(in float3 N) [branch] if (GetScene().globalprobe >= 0) { - TextureCube cubemap = bindless_cubemaps_half4[GetScene().globalprobe]; + TextureCube cubemap = bindless_cubemaps_half4[descriptor_index(GetScene().globalprobe)]; uint2 dim; uint mipcount; cubemap.GetDimensions(0, dim.x, dim.y, mipcount); @@ -408,7 +408,7 @@ inline half3 EnvironmentReflection_Global(in Surface surface) if (GetScene().globalprobe < 0) return 0; - TextureCube cubemap = bindless_cubemaps_half4[GetScene().globalprobe]; + TextureCube cubemap = bindless_cubemaps_half4[descriptor_index(GetScene().globalprobe)]; uint2 dim; uint mipcount; cubemap.GetDimensions(0, dim.x, dim.y, mipcount); @@ -496,7 +496,7 @@ inline void VoxelGI(inout Surface surface, inout Lighting lighting) [branch] if (GetFrame().vxgi.resolution != 0 && GetFrame().vxgi.texture_radiance >= 0) { - Texture3D voxels = bindless_textures3D_half4[GetFrame().vxgi.texture_radiance]; + Texture3D voxels = bindless_textures3D_half4[descriptor_index(GetFrame().vxgi.texture_radiance)]; // diffuse: half4 trace = ConeTraceDiffuse(voxels, surface.P, surface.N); diff --git a/WickedEngine/shaders/objectHF.hlsli b/WickedEngine/shaders/objectHF.hlsli index 7cf75aece..1432293f0 100644 --- a/WickedEngine/shaders/objectHF.hlsli +++ b/WickedEngine/shaders/objectHF.hlsli @@ -58,7 +58,7 @@ inline ShaderMaterial GetMaterial() return load_material(push.materialIndex); } -#define sampler_objectshader bindless_samplers[GetMaterial().sampler_descriptor] +#define sampler_objectshader bindless_samplers[descriptor_index(GetMaterial().sampler_descriptor)] // Use these to compile this file as shader prototype: //#define OBJECTSHADER_COMPILE_VS - compile vertex shader prototype @@ -128,7 +128,7 @@ struct VertexInput float4 GetPositionWind() { - return bindless_buffers_float4[GetMesh().vb_pos_wind][vertexID]; + return bindless_buffers_float4[descriptor_index(GetMesh().vb_pos_wind)][vertexID]; } float4 GetUVSets() @@ -136,13 +136,13 @@ struct VertexInput [branch] if (GetMesh().vb_uvs < 0) return 0; - return lerp(GetMesh().uv_range_min.xyxy, GetMesh().uv_range_max.xyxy, bindless_buffers_float4[GetMesh().vb_uvs][vertexID]); + return lerp(GetMesh().uv_range_min.xyxy, GetMesh().uv_range_max.xyxy, bindless_buffers_float4[descriptor_index(GetMesh().vb_uvs)][vertexID]); } ShaderMeshInstancePointer GetInstancePointer() { if (push.instances >= 0) - return bindless_buffers[push.instances].Load(push.instance_offset + instanceID * sizeof(ShaderMeshInstancePointer)); + return bindless_buffers[descriptor_index(push.instances)].Load(push.instance_offset + instanceID * sizeof(ShaderMeshInstancePointer)); ShaderMeshInstancePointer poi; poi.init(); @@ -154,7 +154,7 @@ struct VertexInput [branch] if (GetMesh().vb_atl < 0) return 0; - return bindless_buffers_float2[GetMesh().vb_atl][vertexID]; + return bindless_buffers_float2[descriptor_index(GetMesh().vb_atl)][vertexID]; } half4 GetVertexColor() @@ -162,7 +162,7 @@ struct VertexInput [branch] if (GetMesh().vb_col < 0) return 1; - return bindless_buffers_half4[GetMesh().vb_col][vertexID]; + return bindless_buffers_half4[descriptor_index(GetMesh().vb_col)][vertexID]; } float3 GetNormal() @@ -170,7 +170,7 @@ struct VertexInput [branch] if (GetMesh().vb_nor < 0) return 0; - return bindless_buffers_float4[GetMesh().vb_nor][vertexID].xyz; + return bindless_buffers_float4[descriptor_index(GetMesh().vb_nor)][vertexID].xyz; } float4 GetTangent() @@ -178,7 +178,7 @@ struct VertexInput [branch] if (GetMesh().vb_tan < 0) return 0; - return bindless_buffers_float4[GetMesh().vb_tan][vertexID]; + return bindless_buffers_float4[descriptor_index(GetMesh().vb_tan)][vertexID]; } ShaderMeshInstance GetInstance() @@ -196,7 +196,7 @@ struct VertexInput [branch] if (GetInstance().vb_ao < 0) return 1; - return bindless_buffers_half[NonUniformResourceIndex(GetInstance().vb_ao)][vertexID]; + return bindless_buffers_half[NonUniformResourceIndex(descriptor_index(GetInstance().vb_ao))][vertexID]; } half GetWetmap() @@ -204,12 +204,12 @@ struct VertexInput //[branch] //if (GetInstance().vb_wetmap < 0) // return 0; - //return bindless_buffers_half[NonUniformResourceIndex(GetInstance().vb_wetmap)][vertexID]; + //return bindless_buffers_half[NonUniformResourceIndex(descriptor_index(GetInstance().vb_wetmap))][vertexID]; // There is something seriously bad with AMD driver's shader compiler as the above commented version works incorrectly and this works correctly but only for wetmap [branch] if (GetInstance().vb_wetmap >= 0) - return bindless_buffers_half[NonUniformResourceIndex(GetInstance().vb_wetmap)][vertexID]; + return bindless_buffers_half[NonUniformResourceIndex(descriptor_index(GetInstance().vb_wetmap))][vertexID]; return 0; } }; @@ -559,7 +559,7 @@ float4 main(PixelInput input, in bool is_frontface : SV_IsFrontFace) : SV_Target [branch] if (material.textures[DISPLACEMENTMAP].IsValid()) { - Texture2D tex = bindless_textures_half4[material.textures[DISPLACEMENTMAP].texture_descriptor]; + Texture2D tex = bindless_textures_half4[descriptor_index(material.textures[DISPLACEMENTMAP].texture_descriptor)]; float2 uv = material.textures[DISPLACEMENTMAP].GetUVSet() == 0 ? uvsets.xy : uvsets.zw; float2 uv_dx = ddx_coarse(uv); float2 uv_dy = ddy_coarse(uv); @@ -669,12 +669,12 @@ float4 main(PixelInput input, in bool is_frontface : SV_IsFrontFace) : SV_Target if(chunk_coord.x >= -terrain.chunk_buffer_range && chunk_coord.x <= terrain.chunk_buffer_range && chunk_coord.y >= -terrain.chunk_buffer_range && chunk_coord.y <= terrain.chunk_buffer_range) { uint chunk_idx = flatten2D(chunk_coord + terrain.chunk_buffer_range, terrain.chunk_buffer_range * 2 + 1); - ShaderTerrainChunk chunk = bindless_structured_terrain_chunks[terrain.chunk_buffer][chunk_idx]; + ShaderTerrainChunk chunk = bindless_structured_terrain_chunks[descriptor_index(terrain.chunk_buffer)][chunk_idx]; [branch] if(chunk.heightmap >= 0) { - Texture2D terrain_heightmap = bindless_textures[NonUniformResourceIndex(chunk.heightmap)]; + Texture2D terrain_heightmap = bindless_textures[NonUniformResourceIndex(descriptor_index(chunk.heightmap))]; float2 chunk_min = terrain.center_chunk_pos.xz + chunk_coord * terrain.chunk_size; float2 chunk_max = terrain.center_chunk_pos.xz + terrain.chunk_size + chunk_coord * terrain.chunk_size; float2 terrain_uv = saturate(inverse_lerp(chunk_min, chunk_max, surface.P.xz)); @@ -791,7 +791,7 @@ float4 main(PixelInput input, in bool is_frontface : SV_IsFrontFace) : SV_Target [branch] if (camera.texture_ao_index >= 0) { - surface.occlusion *= bindless_textures_half4[camera.texture_ao_index].SampleLevel(sampler_linear_clamp, ScreenCoord, 0).r; + surface.occlusion *= bindless_textures_half4[descriptor_index(camera.texture_ao_index)].SampleLevel(sampler_linear_clamp, ScreenCoord, 0).r; } #endif // CARTOON #endif // TRANSPARENT @@ -897,7 +897,7 @@ float4 main(PixelInput input, in bool is_frontface : SV_IsFrontFace) : SV_Target [branch] if (material.textures[NORMALMAP].IsValid()) { - Texture2D texture_normalmap = bindless_textures_half4[material.textures[NORMALMAP].texture_descriptor]; + Texture2D texture_normalmap = bindless_textures_half4[descriptor_index(material.textures[NORMALMAP].texture_descriptor)]; const float2 UV_normalMap = material.textures[NORMALMAP].GetUVSet() == 0 ? uvsets.xy : uvsets.zw; bumpColor0 = 2 * texture_normalmap.Sample(sampler_objectshader, UV_normalMap - material.texMulAdd.ww).rg - 1; bumpColor1 = 2 * texture_normalmap.Sample(sampler_objectshader, UV_normalMap + material.texMulAdd.zw).rg - 1; @@ -905,7 +905,7 @@ float4 main(PixelInput input, in bool is_frontface : SV_IsFrontFace) : SV_Target [branch] if (camera.texture_waterriples_index >= 0) { - bumpColor2 = bindless_textures_half4[camera.texture_waterriples_index].SampleLevel(sampler_linear_clamp, ScreenCoord, 0).rg; + bumpColor2 = bindless_textures_half4[descriptor_index(camera.texture_waterriples_index)].SampleLevel(sampler_linear_clamp, ScreenCoord, 0).rg; } surface.bumpColor = half3(bumpColor0 + bumpColor1 + bumpColor2, 1) * material.GetRefraction(); surface.N = normalize(lerp(surface.N, mul(normalize(surface.bumpColor), TBN), material.GetNormalMapStrength())); @@ -918,11 +918,11 @@ float4 main(PixelInput input, in bool is_frontface : SV_IsFrontFace) : SV_Target float4 reflectionUV = mul(camera.reflection_view_projection, float4(surface.P, 1)); reflectionUV.xy /= reflectionUV.w; reflectionUV.xy = clipspace_to_uv(reflectionUV.xy) + surface.bumpColor.rg; - half3 reflectiveColor = bindless_textures_half4[camera.texture_reflection_index].SampleLevel(sampler_linear_mirror, reflectionUV.xy, 0).rgb; + half3 reflectiveColor = bindless_textures_half4[descriptor_index(camera.texture_reflection_index)].SampleLevel(sampler_linear_mirror, reflectionUV.xy, 0).rgb; [branch] if(camera.texture_reflection_depth_index >= 0) { - float reflectiveDepth = bindless_textures[camera.texture_reflection_depth_index].SampleLevel(sampler_point_clamp, reflectionUV.xy, 0).r; + float reflectiveDepth = bindless_textures[descriptor_index(camera.texture_reflection_depth_index)].SampleLevel(sampler_point_clamp, reflectionUV.xy, 0).r; float3 reflectivePosition = reconstruct_position(reflectionUV.xy, reflectiveDepth, camera.reflection_inverse_view_projection); float4 water_plane = camera.reflection_plane; float water_depth = -dot(float4(reflectivePosition, 1), water_plane); @@ -952,7 +952,7 @@ float4 main(PixelInput input, in bool is_frontface : SV_IsFrontFace) : SV_Target [branch] if (camera.texture_refraction_index >= 0) { - Texture2D texture_refraction = bindless_textures_half4[camera.texture_refraction_index]; + Texture2D texture_refraction = bindless_textures_half4[descriptor_index(camera.texture_refraction_index)]; float2 size; float mipLevels; texture_refraction.GetDimensions(0, size.x, size.y, mipLevels); @@ -998,13 +998,13 @@ float4 main(PixelInput input, in bool is_frontface : SV_IsFrontFace) : SV_Target [branch] if (camera.texture_ssr_index >= 0) { - half4 ssr = bindless_textures_half4[camera.texture_ssr_index].SampleLevel(sampler_linear_clamp, ScreenCoord, 0); + half4 ssr = bindless_textures_half4[descriptor_index(camera.texture_ssr_index)].SampleLevel(sampler_linear_clamp, ScreenCoord, 0); lighting.indirect.specular = lerp(lighting.indirect.specular, ssr.rgb * surface.F, ssr.a); } [branch] if (camera.texture_ssgi_index >= 0) { - surface.ssgi = bindless_textures_half4[camera.texture_ssgi_index].SampleLevel(sampler_linear_clamp, ScreenCoord, 0).rgb; + surface.ssgi = bindless_textures_half4[descriptor_index(camera.texture_ssgi_index)].SampleLevel(sampler_linear_clamp, ScreenCoord, 0).rgb; } #endif // CARTOON #endif // TRANSPARENT @@ -1018,7 +1018,7 @@ float4 main(PixelInput input, in bool is_frontface : SV_IsFrontFace) : SV_Target // Water refraction: float4 water_plane = camera.reflection_plane; const float camera_above_water = dot(float4(camera.position, 1), water_plane) < 0; - Texture2D texture_refraction = bindless_textures_half4[camera.texture_refraction_index]; + Texture2D texture_refraction = bindless_textures_half4[descriptor_index(camera.texture_refraction_index)]; // First sample using full perturbation: float2 refraction_uv = ScreenCoord.xy + surface.bumpColor.rg; float refraction_depth = find_max_depth(refraction_uv, 2, 2); diff --git a/WickedEngine/shaders/objectHF_mesh_shading.hlsli b/WickedEngine/shaders/objectHF_mesh_shading.hlsli index a60c0e3c3..491ad8f63 100644 --- a/WickedEngine/shaders/objectHF_mesh_shading.hlsli +++ b/WickedEngine/shaders/objectHF_mesh_shading.hlsli @@ -33,7 +33,7 @@ void main(uint3 Gid : SV_GroupID, uint groupIndex : SV_GroupIndex) amplification_payload.meshletGroupOffset = meshletGroupOffset; } - ShaderMeshInstancePointer poi = bindless_buffers[push.instances].Load(push.instance_offset + instanceID * sizeof(ShaderMeshInstancePointer)); + ShaderMeshInstancePointer poi = bindless_buffers[descriptor_index(push.instances)].Load(push.instance_offset + instanceID * sizeof(ShaderMeshInstancePointer)); ShaderMeshInstance inst = load_instance(poi.GetInstanceIndex()); uint meshletID = meshletGroupOffset + groupIndex; @@ -44,7 +44,7 @@ void main(uint3 Gid : SV_GroupID, uint groupIndex : SV_GroupIndex) if (visible) { ShaderCamera camera = GetCamera(poi.GetCameraIndex()); - ShaderClusterBounds bounds = bindless_structured_cluster_bounds[geometry.vb_bou][meshletID]; + ShaderClusterBounds bounds = bindless_structured_cluster_bounds[descriptor_index(geometry.vb_bou)][meshletID]; if (geometry.vb_pre >= 0) { // when object is skinned, we take the whole instance bounds, because skinned meshlet transforms are not computed @@ -87,7 +87,7 @@ void main(uint3 Gid : SV_GroupID, uint groupIndex : SV_GroupIndex) if (visible && camera.texture_reprojected_depth_index >= 0) { - Texture2D reprojected_depth = bindless_textures[camera.texture_reprojected_depth_index]; + Texture2D reprojected_depth = bindless_textures[descriptor_index(camera.texture_reprojected_depth_index)]; float cam_sphere_distance = length(bounds.sphere.center - camera.position); float radius = cam_sphere_distance * tan(asin(bounds.sphere.radius / cam_sphere_distance)); // perspective distortion https://www.nickdarnell.com/hierarchical-z-buffer-occlusion-culling/ float3 up_radius = camera.up * radius; @@ -189,7 +189,7 @@ void main( uint meshletGroupOffset = amplification_payload.meshletGroupOffset; uint meshletID = meshletGroupOffset + amplification_payload.meshlets[Gid]; ShaderGeometry geometry = GetMesh(); - ShaderCluster cluster = bindless_structured_cluster[geometry.vb_clu][meshletID]; + ShaderCluster cluster = bindless_structured_cluster[descriptor_index(geometry.vb_clu)][meshletID]; SetMeshOutputCounts(cluster.vertexCount, cluster.triangleCount); for (uint vi = groupIndex; vi < cluster.vertexCount; vi += MS_GROUPSIZE) @@ -203,7 +203,7 @@ void main( verts[vi] = vertex_to_pixel_export(input); } - ShaderMeshInstancePointer poi = bindless_buffers[push.instances].Load(push.instance_offset + amplification_payload.instanceID * sizeof(ShaderMeshInstancePointer)); + ShaderMeshInstancePointer poi = bindless_buffers[descriptor_index(push.instances)].Load(push.instance_offset + amplification_payload.instanceID * sizeof(ShaderMeshInstancePointer)); const uint frustum_index = poi.GetCameraIndex(); for (uint ti = groupIndex; ti < cluster.triangleCount; ti += MS_GROUPSIZE) diff --git a/WickedEngine/shaders/objectVS_debug.hlsl b/WickedEngine/shaders/objectVS_debug.hlsl index db527cbe0..3c8656719 100644 --- a/WickedEngine/shaders/objectVS_debug.hlsl +++ b/WickedEngine/shaders/objectVS_debug.hlsl @@ -4,5 +4,5 @@ PUSHCONSTANT(push, DebugObjectPushConstants); float4 main(uint vertexID : SV_VertexID) : SV_POSITION { - return mul(g_xTransform, float4(bindless_buffers_float4[push.vb_pos_wind][vertexID].xyz, 1)); + return mul(g_xTransform, float4(bindless_buffers_float4[descriptor_index(push.vb_pos_wind)][vertexID].xyz, 1)); } diff --git a/WickedEngine/shaders/oceanSurfacePS.hlsl b/WickedEngine/shaders/oceanSurfacePS.hlsl index 1e8eea097..7437f2223 100644 --- a/WickedEngine/shaders/oceanSurfacePS.hlsl +++ b/WickedEngine/shaders/oceanSurfacePS.hlsl @@ -32,7 +32,7 @@ float4 main(PSIn input) : SV_TARGET [branch] if (GetCamera().texture_waterriples_index >= 0) { - gradient.rg += bindless_textures_half4[GetCamera().texture_waterriples_index].SampleLevel(sampler_linear_clamp, ScreenCoord, 0).rg * 0.025; + gradient.rg += bindless_textures_half4[descriptor_index(GetCamera().texture_waterriples_index)].SampleLevel(sampler_linear_clamp, ScreenCoord, 0).rg * 0.025; } Surface surface; @@ -66,11 +66,11 @@ float4 main(PSIn input) : SV_TARGET //REFLECTION float4 reflectionPos = mul(GetCamera().reflection_view_projection, float4(surface.P, 1)); float2 reflectionUV = clipspace_to_uv(reflectionPos.xy / reflectionPos.w) + surface.N.xz * bump_strength; - half4 reflectiveColor = bindless_textures[GetCamera().texture_reflection_index].SampleLevel(sampler_linear_mirror, reflectionUV, 0); + half4 reflectiveColor = bindless_textures[descriptor_index(GetCamera().texture_reflection_index)].SampleLevel(sampler_linear_mirror, reflectionUV, 0); [branch] if(GetCamera().texture_reflection_depth_index >=0) { - float reflectiveDepth = bindless_textures[GetCamera().texture_reflection_depth_index].SampleLevel(sampler_point_clamp, reflectionUV, 0).r; + float reflectiveDepth = bindless_textures[descriptor_index(GetCamera().texture_reflection_depth_index)].SampleLevel(sampler_point_clamp, reflectionUV, 0).r; float3 reflectivePosition = reconstruct_position(reflectionUV, reflectiveDepth, GetCamera().reflection_inverse_view_projection); float water_depth = -dot(float4(reflectivePosition, 1), water_plane); water_depth += texture_ocean_displacementmap.SampleLevel(sampler_linear_wrap, reflectivePosition.xz * xOceanPatchSizeRecip, 0).z; // texture contains xzy! @@ -90,7 +90,7 @@ float4 main(PSIn input) : SV_TARGET { // Water refraction: const float camera_above_water = dot(float4(GetCamera().position, 1), water_plane) < 0; - Texture2D texture_refraction = bindless_textures[GetCamera().texture_refraction_index]; + Texture2D texture_refraction = bindless_textures[descriptor_index(GetCamera().texture_refraction_index)]; // First sample using full perturbation: float2 refraction_uv = ScreenCoord.xy + surface.N.xz * bump_strength; float refraction_depth = find_max_depth(refraction_uv, 2, 2); diff --git a/WickedEngine/shaders/paint_textureCS.hlsl b/WickedEngine/shaders/paint_textureCS.hlsl index a674320d3..acd9a8935 100644 --- a/WickedEngine/shaders/paint_textureCS.hlsl +++ b/WickedEngine/shaders/paint_textureCS.hlsl @@ -9,7 +9,7 @@ void main(uint groupIndex : SV_GroupIndex, uint2 Gid : SV_GroupID) const uint2 GTid = remap_lane_8x8(groupIndex); const uint2 DTid = Gid * PAINT_TEXTURE_BLOCKSIZE + GTid; - RWTexture2D texture_output = bindless_rwtextures[push.texture_output]; + RWTexture2D texture_output = bindless_rwtextures[descriptor_index(push.texture_output)]; float2 dim; texture_output.GetDimensions(dim.x, dim.y); @@ -42,7 +42,7 @@ void main(uint groupIndex : SV_GroupIndex, uint2 Gid : SV_GroupID) [branch] if(push.texture_brush >= 0) { - Texture2D texture_brush = bindless_textures[push.texture_brush]; + Texture2D texture_brush = bindless_textures[descriptor_index(push.texture_brush)]; const float2 brush_uv = (diff / radius) * float2(0.5, -0.5) + 0.5; const float2 brush_uv_quad_x = QuadReadAcrossX(brush_uv); const float2 brush_uv_quad_y = QuadReadAcrossY(brush_uv); @@ -54,7 +54,7 @@ void main(uint groupIndex : SV_GroupIndex, uint2 Gid : SV_GroupID) [branch] if(push.texture_reveal >= 0) { - Texture2D texture_reveal = bindless_textures[push.texture_reveal]; + Texture2D texture_reveal = bindless_textures[descriptor_index(push.texture_reveal)]; const float2 reveal_uv = (pixel + 0.5) / dim; const float2 reveal_uv_quad_x = QuadReadAcrossX(reveal_uv); const float2 reveal_uv_quad_y = QuadReadAcrossY(reveal_uv); diff --git a/WickedEngine/shaders/paintdecalPS.hlsl b/WickedEngine/shaders/paintdecalPS.hlsl index ed514f39f..cfceabfce 100644 --- a/WickedEngine/shaders/paintdecalPS.hlsl +++ b/WickedEngine/shaders/paintdecalPS.hlsl @@ -17,7 +17,7 @@ float4 main(Input input) : SV_TARGET float3 uvw = clipspace_to_uv(clipSpacePos.xyz); if (is_saturated(uvw)) { - Texture2D in_texture = bindless_textures[g_xPaintDecalTexture]; + Texture2D in_texture = bindless_textures[descriptor_index(g_xPaintDecalTexture)]; color = in_texture.Sample(sampler_linear_clamp, uvw.xy); // blend out if close to cube Z: diff --git a/WickedEngine/shaders/paintdecalVS.hlsl b/WickedEngine/shaders/paintdecalVS.hlsl index af65d2fcf..2a9cc093b 100644 --- a/WickedEngine/shaders/paintdecalVS.hlsl +++ b/WickedEngine/shaders/paintdecalVS.hlsl @@ -17,7 +17,7 @@ Output main(uint vertexID : SV_VertexID) [branch] if(geometry.vb_pos_wind >= 0) { - pos = bindless_buffers_float4[geometry.vb_pos_wind][vertexID].xyz; + pos = bindless_buffers_float4[descriptor_index(geometry.vb_pos_wind)][vertexID].xyz; } pos = mul(inst.transform.GetMatrix(), float4(pos, 1)).xyz; @@ -25,7 +25,7 @@ Output main(uint vertexID : SV_VertexID) [branch] if(geometry.vb_nor >= 0) { - nor = bindless_buffers_half4[geometry.vb_nor][vertexID].xyz; + nor = bindless_buffers_half4[descriptor_index(geometry.vb_nor)][vertexID].xyz; } nor = mul(inst.transformRaw.GetMatrixAdjoint(), nor); @@ -33,7 +33,7 @@ Output main(uint vertexID : SV_VertexID) [branch] if(geometry.vb_uvs >= 0) { - uv = bindless_buffers_float4[geometry.vb_uvs][vertexID].xy; + uv = bindless_buffers_float4[descriptor_index(geometry.vb_uvs)][vertexID].xy; } Output output; diff --git a/WickedEngine/shaders/raytracingHF.hlsli b/WickedEngine/shaders/raytracingHF.hlsli index 780d20861..d5f0ebb87 100644 --- a/WickedEngine/shaders/raytracingHF.hlsli +++ b/WickedEngine/shaders/raytracingHF.hlsli @@ -94,9 +94,9 @@ void ray_clip_plane(inout RayDesc ray, float4 clip_plane) groupshared uint stack[RAYTRACE_STACKSIZE][RAYTRACING_LAUNCH_BLOCKSIZE * RAYTRACING_LAUNCH_BLOCKSIZE]; #endif // RAYTRACE_STACK_SHARED -#define primitiveCounterBuffer bindless_buffers[GetScene().BVH_counter] -#define bvhNodeBuffer bindless_buffers[GetScene().BVH_nodes] -#define primitiveBuffer bindless_buffers[GetScene().BVH_primitives] +#define primitiveCounterBuffer bindless_buffers[descriptor_index(GetScene().BVH_counter)] +#define bvhNodeBuffer bindless_buffers[descriptor_index(GetScene().BVH_nodes)] +#define primitiveBuffer bindless_buffers[descriptor_index(GetScene().BVH_primitives)] struct RayHit { diff --git a/WickedEngine/shaders/renderlightmapVS.hlsl b/WickedEngine/shaders/renderlightmapVS.hlsl index 1f62e61a4..87e384d09 100644 --- a/WickedEngine/shaders/renderlightmapVS.hlsl +++ b/WickedEngine/shaders/renderlightmapVS.hlsl @@ -13,9 +13,9 @@ struct Output Output main(uint vertexID : SV_VertexID) { ShaderMeshInstance inst = load_instance(push.instanceIndex); - float3 pos = bindless_buffers_float4[push.vb_pos_wind][vertexID].xyz; - float3 nor = bindless_buffers_float4[push.vb_nor][vertexID].xyz; - float2 atl = bindless_buffers_float2[push.vb_atl][vertexID]; + float3 pos = bindless_buffers_float4[descriptor_index(push.vb_pos_wind)][vertexID].xyz; + float3 nor = bindless_buffers_float4[descriptor_index(push.vb_nor)][vertexID].xyz; + float2 atl = bindless_buffers_float2[descriptor_index(push.vb_atl)][vertexID]; Output output; diff --git a/WickedEngine/shaders/rtdiffuseCS.hlsl b/WickedEngine/shaders/rtdiffuseCS.hlsl index af054a44d..f7055f5af 100644 --- a/WickedEngine/shaders/rtdiffuseCS.hlsl +++ b/WickedEngine/shaders/rtdiffuseCS.hlsl @@ -118,7 +118,7 @@ void main(uint2 DTid : SV_DispatchThreadID) } else if (GetFrame().options & OPTION_BIT_SURFELGI_ENABLED && GetCamera().texture_surfelgi_index >= 0 && surfel_cellvalid(surfel_cell(P))) { - payload.data += bindless_textures[GetCamera().texture_surfelgi_index][DTid.xy * 2].rgb * GetGIBoost(); + payload.data += bindless_textures[descriptor_index(GetCamera().texture_surfelgi_index)][DTid.xy * 2].rgb * GetGIBoost(); } else { diff --git a/WickedEngine/shaders/shadingHF.hlsli b/WickedEngine/shaders/shadingHF.hlsli index 9c5494996..68dbdf035 100644 --- a/WickedEngine/shaders/shadingHF.hlsli +++ b/WickedEngine/shaders/shadingHF.hlsli @@ -12,7 +12,7 @@ inline void LightMapping(in int lightmap, in float2 ATLAS, inout Lighting lighti [branch] if (lightmap >= 0) { - Texture2D texture_lightmap = bindless_textures_half4[NonUniformResourceIndex(lightmap)]; + Texture2D texture_lightmap = bindless_textures_half4[NonUniformResourceIndex(descriptor_index(lightmap))]; #ifdef LIGHTMAP_QUALITY_BICUBIC lighting.indirect.diffuse = SampleTextureCatmullRom(texture_lightmap, sampler_linear_clamp, ATLAS).rgb; #else @@ -31,7 +31,7 @@ inline half3 PlanarReflection(in Surface surface, in half2 bumpColor) float4 reflectionUV = mul(GetCamera().reflection_view_projection, float4(surface.P, 1)); reflectionUV.xy /= reflectionUV.w; reflectionUV.xy = clipspace_to_uv(reflectionUV.xy); - return bindless_textures_half4[GetCamera().texture_reflection_index].SampleLevel(sampler_linear_clamp, reflectionUV.xy + bumpColor, 0).rgb; + return bindless_textures_half4[descriptor_index(GetCamera().texture_reflection_index)].SampleLevel(sampler_linear_clamp, reflectionUV.xy + bumpColor, 0).rgb; } return 0; } @@ -62,7 +62,7 @@ inline void ForwardLighting(inout Surface surface, inout Lighting lighting) float4x4 probeProjection = load_entitymatrix(probe.GetMatrixIndex()); const int probeTexture = asint(probeProjection[3][0]); probeProjection[3] = float4(0, 0, 0, 1); - TextureCube cubemap = bindless_cubemaps_half4[probeTexture]; + TextureCube cubemap = bindless_cubemaps_half4[descriptor_index(probeTexture)]; const half3 clipSpacePos = mul(probeProjection, float4(surface.P, 1)).xyz; const half3 uvw = clipspace_to_uv(clipSpacePos.xyz); @@ -220,7 +220,7 @@ inline void ForwardDecals(inout Surface surface, inout half4 surfaceMap, Sampler surface.V, tbn, decal.GetLength(), - bindless_textures_half4[decalDisplacementmap], + bindless_textures_half4[descriptor_index(decalDisplacementmap)], uvw.xy, decalDX, decalDY, @@ -231,7 +231,7 @@ inline void ForwardDecals(inout Surface surface, inout half4 surfaceMap, Sampler [branch] if (decalTexture >= 0) { - decalColor *= bindless_textures_half4[decalTexture].SampleGrad(sam, uvw.xy, decalDX, decalDY); + decalColor *= bindless_textures_half4[descriptor_index(decalTexture)].SampleGrad(sam, uvw.xy, decalDX, decalDY); if ((decal.GetFlags() & ENTITY_FLAG_DECAL_BASECOLOR_ONLY_ALPHA) == 0) { // perform manual blending of decals: @@ -243,7 +243,7 @@ inline void ForwardDecals(inout Surface surface, inout half4 surfaceMap, Sampler [branch] if (decalNormal >= 0) { - half3 decalBumpColor = half3(bindless_textures_half4[decalNormal].SampleGrad(sam, uvw.xy, decalDX, decalDY).rg, 1); + half3 decalBumpColor = half3(bindless_textures_half4[descriptor_index(decalNormal)].SampleGrad(sam, uvw.xy, decalDX, decalDY).rg, 1); decalBumpColor = decalBumpColor * 2 - 1; decalBumpColor.rg *= decal.GetAngleScale(); decalBumpAccumulation.rgb = mad(1 - decalBumpAccumulation.a, decalColor.a * decalBumpColor.rgb, decalBumpAccumulation.rgb); @@ -252,7 +252,7 @@ inline void ForwardDecals(inout Surface surface, inout half4 surfaceMap, Sampler [branch] if (decalSurfacemap >= 0) { - half4 decalSurfaceColor = (half4)bindless_textures_half4[decalSurfacemap].SampleGrad(sam, uvw.xy, decalDX, decalDY); + half4 decalSurfaceColor = (half4)bindless_textures_half4[descriptor_index(decalSurfacemap)].SampleGrad(sam, uvw.xy, decalDX, decalDY); decalSurfaceAccumulation = mad(1 - decalSurfaceAccumulationAlpha, decalColor.a * decalSurfaceColor, decalSurfaceAccumulation); decalSurfaceAccumulationAlpha = mad(1 - decalColor.a, decalSurfaceAccumulationAlpha, decalColor.a); } @@ -306,7 +306,7 @@ inline void TiledLighting(inout Surface surface, inout Lighting lighting, uint f float4x4 probeProjection = load_entitymatrix(probe.GetMatrixIndex()); const int probeTexture = asint(probeProjection[3][0]); probeProjection[3] = float4(0, 0, 0, 1); - TextureCube cubemap = bindless_cubemaps_half4[probeTexture]; + TextureCube cubemap = bindless_cubemaps_half4[descriptor_index(probeTexture)]; const half3 clipSpacePos = mul(probeProjection, float4(surface.P, 1)).xyz; const half3 uvw = clipspace_to_uv(clipSpacePos.xyz); @@ -344,27 +344,27 @@ inline void TiledLighting(inout Surface surface, inout Lighting lighting, uint f [branch] if (!surface.IsGIApplied() && GetCamera().texture_rtdiffuse_index >= 0) { - lighting.indirect.diffuse = bindless_textures_half4[GetCamera().texture_rtdiffuse_index][surface.pixel].rgb; + lighting.indirect.diffuse = bindless_textures_half4[descriptor_index(GetCamera().texture_rtdiffuse_index)][surface.pixel].rgb; surface.SetGIApplied(true); } [branch] if (!surface.IsGIApplied() && GetFrame().options & OPTION_BIT_SURFELGI_ENABLED && GetCamera().texture_surfelgi_index >= 0 && surfel_cellvalid(surfel_cell(surface.P))) { - lighting.indirect.diffuse = bindless_textures_half4[GetCamera().texture_surfelgi_index][surface.pixel].rgb; + lighting.indirect.diffuse = bindless_textures_half4[descriptor_index(GetCamera().texture_surfelgi_index)][surface.pixel].rgb; surface.SetGIApplied(true); } [branch] if (!surface.IsGIApplied() && GetCamera().texture_vxgi_diffuse_index >= 0) { - lighting.indirect.diffuse = bindless_textures_half4[GetCamera().texture_vxgi_diffuse_index][surface.pixel].rgb; + lighting.indirect.diffuse = bindless_textures_half4[descriptor_index(GetCamera().texture_vxgi_diffuse_index)][surface.pixel].rgb; surface.SetGIApplied(true); } [branch] if (GetCamera().texture_vxgi_specular_index >= 0) { - half4 vxgi_specular = bindless_textures_half4[GetCamera().texture_vxgi_specular_index][surface.pixel]; + half4 vxgi_specular = bindless_textures_half4[descriptor_index(GetCamera().texture_vxgi_specular_index)][surface.pixel]; lighting.indirect.specular = vxgi_specular.rgb * surface.F + lighting.indirect.specular * (1 - vxgi_specular.a); } #endif // TRANSPARENT @@ -395,7 +395,7 @@ inline void TiledLighting(inout Surface surface, inout Lighting lighting, uint f uint shadow_index = entity_index - lights().first_item(); if (shadow_index < 16) { - shadow_mask = bindless_textures2DArray_half4[GetCamera().texture_rtshadow_index][uint3(surface.pixel, shadow_index)].r; + shadow_mask = bindless_textures2DArray_half4[descriptor_index(GetCamera().texture_rtshadow_index)][uint3(surface.pixel, shadow_index)].r; } } #endif // SHADOW_MASK_ENABLED && !TRANSPARENT @@ -437,7 +437,7 @@ inline void TiledLighting(inout Surface surface, inout Lighting lighting, uint f uint shadow_index = entity_index - lights().first_item(); if (shadow_index < 16) { - shadow_mask = bindless_textures2DArray_half4[GetCamera().texture_rtshadow_index][uint3(surface.pixel, shadow_index)].r; + shadow_mask = bindless_textures2DArray_half4[descriptor_index(GetCamera().texture_rtshadow_index)][uint3(surface.pixel, shadow_index)].r; } } #endif // SHADOW_MASK_ENABLED && !TRANSPARENT @@ -481,7 +481,7 @@ inline void TiledLighting(inout Surface surface, inout Lighting lighting, uint f uint shadow_index = entity_index - lights().first_item(); if (shadow_index < 16) { - shadow_mask = bindless_textures2DArray_half4[GetCamera().texture_rtshadow_index][uint3(surface.pixel, shadow_index)].r; + shadow_mask = bindless_textures2DArray_half4[descriptor_index(GetCamera().texture_rtshadow_index)][uint3(surface.pixel, shadow_index)].r; } } #endif // SHADOW_MASK_ENABLED && !TRANSPARENT @@ -574,7 +574,7 @@ inline void TiledDecals(inout Surface surface, uint flatTileIndex, inout half4 s surface.V, tbn, decal.GetLength(), - bindless_textures_half4[decalDisplacementmap], + bindless_textures_half4[descriptor_index(decalDisplacementmap)], uvw.xy, decalDX, decalDY, @@ -585,7 +585,7 @@ inline void TiledDecals(inout Surface surface, uint flatTileIndex, inout half4 s [branch] if (decalTexture >= 0) { - decalColor *= bindless_textures_half4[decalTexture].SampleGrad(sam, uvw.xy, decalDX, decalDY); + decalColor *= bindless_textures_half4[descriptor_index(decalTexture)].SampleGrad(sam, uvw.xy, decalDX, decalDY); if ((decal.GetFlags() & ENTITY_FLAG_DECAL_BASECOLOR_ONLY_ALPHA) == 0) { // perform manual blending of decals: @@ -597,7 +597,7 @@ inline void TiledDecals(inout Surface surface, uint flatTileIndex, inout half4 s [branch] if (decalNormal >= 0) { - half3 decalBumpColor = half3(bindless_textures_half4[decalNormal].SampleGrad(sam, uvw.xy, decalDX, decalDY).rg, 1); + half3 decalBumpColor = half3(bindless_textures_half4[descriptor_index(decalNormal)].SampleGrad(sam, uvw.xy, decalDX, decalDY).rg, 1); decalBumpColor = decalBumpColor * 2 - 1; decalBumpColor.rg *= decal.GetAngleScale(); decalBumpAccumulation.rgb = mad(1 - decalBumpAccumulation.a, decalColor.a * decalBumpColor.rgb, decalBumpAccumulation.rgb); @@ -606,7 +606,7 @@ inline void TiledDecals(inout Surface surface, uint flatTileIndex, inout half4 s [branch] if (decalSurfacemap >= 0) { - half4 decalSurfaceColor = (half4)bindless_textures_half4[decalSurfacemap].SampleGrad(sam, uvw.xy, decalDX, decalDY); + half4 decalSurfaceColor = (half4)bindless_textures_half4[descriptor_index(decalSurfacemap)].SampleGrad(sam, uvw.xy, decalDX, decalDY); decalSurfaceAccumulation = mad(1 - decalSurfaceAccumulationAlpha, decalColor.a * decalSurfaceColor, decalSurfaceAccumulation); decalSurfaceAccumulationAlpha = mad(1 - decalColor.a, decalSurfaceAccumulationAlpha, decalColor.a); } diff --git a/WickedEngine/shaders/shadowHF.hlsli b/WickedEngine/shaders/shadowHF.hlsli index 348a118ce..41dfa2ba1 100644 --- a/WickedEngine/shaders/shadowHF.hlsli +++ b/WickedEngine/shaders/shadowHF.hlsli @@ -20,8 +20,8 @@ static const half soft_shadow_sample_count_rcp = rcp((half)soft_shadow_sample_co inline half3 sample_shadow(float2 uv, float cmp, float4 uv_clamping, half radius, min16uint2 pixel) { - Texture2D texture_shadowatlas = bindless_textures_half4[GetFrame().texture_shadowatlas_index]; - Texture2D texture_shadowatlas_transparent = bindless_textures_half4[GetFrame().texture_shadowatlas_transparent_index]; + Texture2D texture_shadowatlas = bindless_textures_half4[descriptor_index(GetFrame().texture_shadowatlas_index)]; + Texture2D texture_shadowatlas_transparent = bindless_textures_half4[descriptor_index(GetFrame().texture_shadowatlas_transparent_index)]; half3 shadow = 0; @@ -88,7 +88,7 @@ inline half3 shadow_cube(in ShaderEntity light, in float3 Lunnormalized, min16ui inline half3 sample_shadow(float2 uv, float cmp, min16uint2 pixel) { - Texture2D texture_shadowatlas = bindless_textures_half4[GetFrame().texture_shadowatlas_index]; + Texture2D texture_shadowatlas = bindless_textures_half4[descriptor_index(GetFrame().texture_shadowatlas_index)]; half3 shadow = texture_shadowatlas.SampleCmpLevelZero(sampler_cmp_depth, uv, cmp).r; #ifndef DISABLE_SOFT_SHADOWMAP @@ -105,7 +105,7 @@ inline half3 sample_shadow(float2 uv, float cmp, min16uint2 pixel) #endif // DISABLE_SOFT_SHADOWMAP #ifndef DISABLE_TRANSPARENT_SHADOWMAP - Texture2D texture_shadowatlas_transparent = bindless_textures_half4[GetFrame().texture_shadowatlas_transparent_index]; + Texture2D texture_shadowatlas_transparent = bindless_textures_half4[descriptor_index(GetFrame().texture_shadowatlas_transparent_index)]; half4 transparent_shadow = texture_shadowatlas_transparent.SampleLevel(sampler_linear_clamp, uv, 0); #ifdef TRANSPARENT_SHADOWMAP_SECONDARY_DEPTH_CHECK if (transparent_shadow.a > cmp) @@ -168,7 +168,7 @@ inline half shadow_2D_volumetricclouds(float3 P) { float cloudShadowSampleZ = shadow_pos.z; - Texture2D texture_volumetricclouds_shadow = bindless_textures_half4[GetFrame().texture_volumetricclouds_shadow_index]; + Texture2D texture_volumetricclouds_shadow = bindless_textures_half4[descriptor_index(GetFrame().texture_volumetricclouds_shadow_index)]; half3 cloudShadowData = texture_volumetricclouds_shadow.SampleLevel(sampler_linear_clamp, shadow_uv.xy, 0.0).rgb; half sampleDepthKm = saturate(1.0 - cloudShadowSampleZ) * GetFrame().cloudShadowFarPlaneKm; @@ -211,7 +211,7 @@ inline bool rain_blocker_check(in float3 P) const ShaderOcean ocean = GetWeather().ocean; if (ocean.texture_displacementmap >= 0) { - Texture2D displacementmap = bindless_textures[ocean.texture_displacementmap]; + Texture2D displacementmap = bindless_textures[descriptor_index(ocean.texture_displacementmap)]; float2 ocean_uv = P.xz * ocean.patch_size_rcp; float3 displacement = displacementmap.SampleLevel(sampler_linear_wrap, ocean_uv, 0).xzy; float water_height = ocean.water_height + displacement.y; @@ -234,7 +234,7 @@ inline bool rain_blocker_check(in float3 P) if (GetFrame().texture_shadowatlas_index < 0 || !any(GetFrame().rain_blocker_mad)) return false; - Texture2D texture_shadowatlas = bindless_textures[GetFrame().texture_shadowatlas_index]; + Texture2D texture_shadowatlas = bindless_textures[descriptor_index(GetFrame().texture_shadowatlas_index)]; float3 shadow_pos = mul(GetFrame().rain_blocker_matrix, float4(P, 1)).xyz; float3 shadow_uv = clipspace_to_uv(shadow_pos); if (is_saturated(shadow_uv)) @@ -258,7 +258,7 @@ inline bool rain_blocker_check_prev(in float3 P) const ShaderOcean ocean = GetWeather().ocean; if (ocean.texture_displacementmap >= 0) { - Texture2D displacementmap = bindless_textures[ocean.texture_displacementmap]; + Texture2D displacementmap = bindless_textures[descriptor_index(ocean.texture_displacementmap)]; float2 ocean_uv = P.xz * ocean.patch_size_rcp; float3 displacement = displacementmap.SampleLevel(sampler_linear_wrap, ocean_uv, 0).xzy; float water_height = ocean.water_height + displacement.y; @@ -281,7 +281,7 @@ inline bool rain_blocker_check_prev(in float3 P) if (GetFrame().texture_shadowatlas_index < 0 || !any(GetFrame().rain_blocker_mad_prev)) return false; - Texture2D texture_shadowatlas = bindless_textures[GetFrame().texture_shadowatlas_index]; + Texture2D texture_shadowatlas = bindless_textures[descriptor_index(GetFrame().texture_shadowatlas_index)]; float3 shadow_pos = mul(GetFrame().rain_blocker_matrix_prev, float4(P, 1)).xyz; float3 shadow_uv = clipspace_to_uv(shadow_pos); if (is_saturated(shadow_uv)) diff --git a/WickedEngine/shaders/skinningCS.hlsl b/WickedEngine/shaders/skinningCS.hlsl index 0b7b0f91e..594d4cde0 100644 --- a/WickedEngine/shaders/skinningCS.hlsl +++ b/WickedEngine/shaders/skinningCS.hlsl @@ -71,21 +71,21 @@ void main(uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID) [branch] if (push.vb_pos_wind >= 0) { - pos_wind = bindless_buffers_float4[push.vb_pos_wind][vertexID]; + pos_wind = bindless_buffers_float4[descriptor_index(push.vb_pos_wind)][vertexID]; } half3 nor = 0; [branch] if (push.vb_nor >= 0) { - nor = bindless_buffers_half4[push.vb_nor][vertexID].xyz; + nor = bindless_buffers_half4[descriptor_index(push.vb_nor)][vertexID].xyz; } half4 tan = 0; [branch] if (push.vb_tan >= 0) { - tan = bindless_buffers_half4[push.vb_tan][vertexID]; + tan = bindless_buffers_half4[descriptor_index(push.vb_tan)][vertexID]; } float3 pos = pos_wind.xyz; @@ -95,13 +95,13 @@ void main(uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID) pos = lerp(push.aabb_min, push.aabb_max, pos); } - ByteAddressBuffer skinningbuffer = bindless_buffers[push.skinningbuffer_index]; + ByteAddressBuffer skinningbuffer = bindless_buffers[descriptor_index(push.skinningbuffer_index)]; // Morph targets: [branch] if (push.morphvb_index >= 0 && push.morph_count > 0) { - Buffer morphvb = bindless_buffers_float4[push.morphvb_index]; + Buffer morphvb = bindless_buffers_float4[descriptor_index(push.morphvb_index)]; for (uint morph_index = 0; morph_index < push.morph_count; ++morph_index) { MorphTargetGPU morph = skinningbuffer.Load(push.morph_offset + morph_index * sizeof(MorphTargetGPU)); @@ -120,7 +120,7 @@ void main(uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID) [branch] if (push.vb_bon >= 0 && push.bone_offset != ~0u) { - ByteAddressBuffer boneBuffer = bindless_buffers[push.vb_bon]; + ByteAddressBuffer boneBuffer = bindless_buffers[descriptor_index(push.vb_bon)]; float4 p = 0; half3 n = 0; half3 t = 0; @@ -168,22 +168,18 @@ void main(uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID) [branch] if (push.so_pos >= 0) { -#ifdef __PSSL__ - bindless_rwbuffers[push.so_pos].TypedStore(vertexID * sizeof(float3), pos); -#else - bindless_rwbuffers[push.so_pos].Store(vertexID * sizeof(float3), pos); -#endif // __PSSL__ + bindless_rwbuffers_float4[descriptor_index(push.so_pos)][vertexID] = float4(pos, 0); } [branch] if (push.so_nor >= 0) { - bindless_rwbuffers_float4[push.so_nor][vertexID] = float4(nor, 0); + bindless_rwbuffers_float4[descriptor_index(push.so_nor)][vertexID] = float4(nor, 0); } [branch] if (push.so_tan >= 0) { - bindless_rwbuffers_float4[push.so_tan][vertexID] = tan; + bindless_rwbuffers_float4[descriptor_index(push.so_tan)][vertexID] = tan; } } diff --git a/WickedEngine/shaders/skyHF.hlsli b/WickedEngine/shaders/skyHF.hlsli index 54016c31e..009acfc80 100644 --- a/WickedEngine/shaders/skyHF.hlsli +++ b/WickedEngine/shaders/skyHF.hlsli @@ -165,11 +165,11 @@ float3 GetStaticSkyColor(in float3 V) if (GetFrame().options & OPTION_BIT_STATIC_SKY_SPHEREMAP) { float2 uv = (float2(-atan2(V.z, V.x) / PI, -V.y) + 1.0) * 0.5; - sky = bindless_textures[GetScene().globalenvmap].SampleLevel(sampler_linear_clamp, uv, 0).rgb; + sky = bindless_textures[descriptor_index(GetScene().globalenvmap)].SampleLevel(sampler_linear_clamp, uv, 0).rgb; } else { - sky = bindless_cubemaps[GetScene().globalenvmap].SampleLevel(sampler_linear_clamp, V, 0).rgb; + sky = bindless_cubemaps[descriptor_index(GetScene().globalenvmap)].SampleLevel(sampler_linear_clamp, V, 0).rgb; } diff --git a/WickedEngine/shaders/surfaceHF.hlsli b/WickedEngine/shaders/surfaceHF.hlsli index 6cbf54817..7a8cf4de5 100644 --- a/WickedEngine/shaders/surfaceHF.hlsli +++ b/WickedEngine/shaders/surfaceHF.hlsli @@ -355,7 +355,7 @@ struct Surface i1 = prim.i1(); i2 = prim.i2(); - Buffer buf = bindless_buffers_float4[NonUniformResourceIndex(geometry.vb_pos_wind)]; + Buffer buf = bindless_buffers_float4[NonUniformResourceIndex(descriptor_index(geometry.vb_pos_wind))]; data0 = buf[i0]; data1 = buf[i1]; data2 = buf[i2]; @@ -364,7 +364,7 @@ struct Surface } void load_internal(uint flatTileIndex = 0) { - SamplerState sam = bindless_samplers[NonUniformResourceIndex(material.sampler_descriptor)]; + SamplerState sam = bindless_samplers[NonUniformResourceIndex(descriptor_index(material.sampler_descriptor))]; const bool is_hairparticle = geometry.flags & SHADERMESH_FLAG_HAIRPARTICLE; const bool is_emittedparticle = geometry.flags & SHADERMESH_FLAG_EMITTEDPARTICLE; @@ -375,7 +375,7 @@ struct Surface [branch] if (geometry.vb_nor >= 0) { - Buffer buf = bindless_buffers_float4[NonUniformResourceIndex(geometry.vb_nor)]; + Buffer buf = bindless_buffers_float4[NonUniformResourceIndex(descriptor_index(geometry.vb_nor))]; float3 n0 = mul(inst.transformRaw.GetMatrixAdjoint(), buf[i0].xyz); float3 n1 = mul(inst.transformRaw.GetMatrixAdjoint(), buf[i1].xyz); float3 n2 = mul(inst.transformRaw.GetMatrixAdjoint(), buf[i2].xyz); @@ -415,7 +415,7 @@ struct Surface [branch] if (geometry.vb_uvs >= 0) { - Buffer buf = bindless_buffers_float4[NonUniformResourceIndex(geometry.vb_uvs)]; + Buffer buf = bindless_buffers_float4[NonUniformResourceIndex(descriptor_index(geometry.vb_uvs))]; float4 uv0 = lerp(geometry.uv_range_min.xyxy, geometry.uv_range_max.xyxy, buf[i0]); float4 uv1 = lerp(geometry.uv_range_min.xyxy, geometry.uv_range_max.xyxy, buf[i1]); float4 uv2 = lerp(geometry.uv_range_min.xyxy, geometry.uv_range_max.xyxy, buf[i2]); @@ -448,7 +448,7 @@ struct Surface [branch] if (geometry.vb_tan >= 0) { - Buffer buf = bindless_buffers_float4[NonUniformResourceIndex(geometry.vb_tan)]; + Buffer buf = bindless_buffers_float4[NonUniformResourceIndex(descriptor_index(geometry.vb_tan))]; float4 t0 = buf[i0]; float4 t1 = buf[i1]; float4 t2 = buf[i2]; @@ -472,7 +472,7 @@ struct Surface const float2 uv = material.textures[DISPLACEMENTMAP].GetUVSet() == 0 ? uvsets.xy : uvsets.zw; const float2 uv_dx = material.textures[DISPLACEMENTMAP].GetUVSet() == 0 ? uvsets_dx.xy : uvsets_dx.zw; const float2 uv_dy = material.textures[DISPLACEMENTMAP].GetUVSet() == 0 ? uvsets_dy.xy : uvsets_dy.zw; - Texture2D tex = bindless_textures_half4[NonUniformResourceIndex(material.textures[DISPLACEMENTMAP].texture_descriptor)]; + Texture2D tex = bindless_textures_half4[NonUniformResourceIndex(descriptor_index(material.textures[DISPLACEMENTMAP].texture_descriptor))]; ParallaxOcclusionMapping_Impl( uvsets, V, @@ -572,7 +572,7 @@ struct Surface [branch] if (geometry.vb_col >= 0 && material.IsUsingVertexColors()) { - Buffer buf = bindless_buffers_half4[NonUniformResourceIndex(geometry.vb_col)]; + Buffer buf = bindless_buffers_half4[NonUniformResourceIndex(descriptor_index(geometry.vb_col))]; const half4 c0 = buf[i0]; const half4 c1 = buf[i1]; const half4 c2 = buf[i2]; @@ -583,7 +583,7 @@ struct Surface [branch] if (inst.vb_ao >= 0 && material.IsUsingVertexAO()) { - Buffer buf = bindless_buffers_half[NonUniformResourceIndex(inst.vb_ao)]; + Buffer buf = bindless_buffers_half[NonUniformResourceIndex(descriptor_index(inst.vb_ao))]; const half ao0 = buf[i0]; const half ao1 = buf[i1]; const half ao2 = buf[i2]; @@ -594,13 +594,13 @@ struct Surface [branch] if (inst.lightmap >= 0 && geometry.vb_atl >= 0) { - Buffer buf = bindless_buffers_float2[NonUniformResourceIndex(geometry.vb_atl)]; + Buffer buf = bindless_buffers_float2[NonUniformResourceIndex(descriptor_index(geometry.vb_atl))]; const float2 a0 = buf[i0]; const float2 a1 = buf[i1]; const float2 a2 = buf[i2]; float2 atlas = attribute_at_bary(a0, a1, a2, bary); - Texture2D tex = bindless_textures_half4[NonUniformResourceIndex(inst.lightmap)]; + Texture2D tex = bindless_textures_half4[NonUniformResourceIndex(descriptor_index(inst.lightmap))]; gi = tex.SampleLevel(sampler_linear_clamp, atlas, 0).rgb; SetGIApplied(true); } @@ -676,12 +676,12 @@ struct Surface if(chunk_coord.x >= -terrain.chunk_buffer_range && chunk_coord.x <= terrain.chunk_buffer_range && chunk_coord.y >= -terrain.chunk_buffer_range && chunk_coord.y <= terrain.chunk_buffer_range) { uint chunk_idx = flatten2D(chunk_coord + terrain.chunk_buffer_range, terrain.chunk_buffer_range * 2 + 1); - ShaderTerrainChunk chunk = bindless_structured_terrain_chunks[terrain.chunk_buffer][chunk_idx]; + ShaderTerrainChunk chunk = bindless_structured_terrain_chunks[NonUniformResourceIndex(descriptor_index(terrain.chunk_buffer))][chunk_idx]; [branch] if(chunk.heightmap >= 0) { - Texture2D terrain_heightmap = bindless_textures[NonUniformResourceIndex(chunk.heightmap)]; + Texture2D terrain_heightmap = bindless_textures[NonUniformResourceIndex(descriptor_index(chunk.heightmap))]; float2 chunk_min = terrain.center_chunk_pos.xz + chunk_coord * terrain.chunk_size; float2 chunk_max = terrain.center_chunk_pos.xz + terrain.chunk_size + chunk_coord * terrain.chunk_size; float2 terrain_uv = saturate(inverse_lerp(chunk_min, chunk_max, P.xz)); @@ -791,7 +791,7 @@ struct Surface V, tbn, decal.GetLength(), - bindless_textures_half4[decalDisplacementmap], + bindless_textures_half4[descriptor_index(decalDisplacementmap)], uvw.xy, decalDX, decalDY, @@ -802,7 +802,7 @@ struct Surface [branch] if (decalTexture >= 0) { - decalColor *= bindless_textures_half4[decalTexture].SampleGrad(sam, uvw.xy, decalDX, decalDY); + decalColor *= bindless_textures_half4[descriptor_index(decalTexture)].SampleGrad(sam, uvw.xy, decalDX, decalDY); if ((decal.GetFlags() & ENTITY_FLAG_DECAL_BASECOLOR_ONLY_ALPHA) == 0) { // perform manual blending of decals: @@ -814,7 +814,7 @@ struct Surface [branch] if (decalNormal >= 0) { - half3 decalBumpColor = half3(bindless_textures_half4[decalNormal].SampleGrad(sam, uvw.xy, decalDX, decalDY).rg, 1); + half3 decalBumpColor = half3(bindless_textures_half4[descriptor_index(decalNormal)].SampleGrad(sam, uvw.xy, decalDX, decalDY).rg, 1); decalBumpColor = decalBumpColor * 2 - 1; decalBumpColor.rg *= decal.GetAngleScale(); decalBumpAccumulation.rgb = mad(1 - decalBumpAccumulation.a, decalColor.a * decalBumpColor.rgb, decalBumpAccumulation.rgb); @@ -823,7 +823,7 @@ struct Surface [branch] if (decalSurfacemap >= 0) { - half4 decalSurfaceColor = bindless_textures_half4[decalSurfacemap].SampleGrad(sam, uvw.xy, decalDX, decalDY); + half4 decalSurfaceColor = bindless_textures_half4[descriptor_index(decalSurfacemap)].SampleGrad(sam, uvw.xy, decalDX, decalDY); decalSurfaceAccumulation = mad(1 - decalSurfaceAccumulationAlpha, decalColor.a * decalSurfaceColor, decalSurfaceAccumulation); decalSurfaceAccumulationAlpha = mad(1 - decalColor.a, decalSurfaceAccumulationAlpha, decalColor.a); } @@ -864,7 +864,7 @@ struct Surface [branch] if (inst.vb_wetmap >= 0) { - Buffer buf = bindless_buffers_half[NonUniformResourceIndex(inst.vb_wetmap)]; + Buffer buf = bindless_buffers_half[NonUniformResourceIndex(descriptor_index(inst.vb_wetmap))]; const half wet0 = buf[i0]; const half wet1 = buf[i1]; const half wet2 = buf[i2]; @@ -1003,7 +1003,7 @@ struct Surface [branch] if (geometry.vb_pre >= 0) { - Buffer buf = bindless_buffers_float4[NonUniformResourceIndex(geometry.vb_pre)]; + Buffer buf = bindless_buffers_float4[NonUniformResourceIndex(descriptor_index(geometry.vb_pre))]; pre0 = buf[i0].xyz; pre1 = buf[i1].xyz; pre2 = buf[i2].xyz; diff --git a/WickedEngine/shaders/surfel_coverageCS.hlsl b/WickedEngine/shaders/surfel_coverageCS.hlsl index 5a1ac14d1..5530e71d1 100644 --- a/WickedEngine/shaders/surfel_coverageCS.hlsl +++ b/WickedEngine/shaders/surfel_coverageCS.hlsl @@ -1,3 +1,4 @@ +#define TEXTURE_SLOT_NONUNIFORM #include "globals.hlsli" #include "ShaderInterop_SurfelGI.h" #include "raytracingHF.hlsli" diff --git a/WickedEngine/shaders/surfel_updateCS.hlsl b/WickedEngine/shaders/surfel_updateCS.hlsl index 88e6d3ef6..aa966d854 100644 --- a/WickedEngine/shaders/surfel_updateCS.hlsl +++ b/WickedEngine/shaders/surfel_updateCS.hlsl @@ -1,3 +1,4 @@ +#define TEXTURE_SLOT_NONUNIFORM #include "globals.hlsli" #include "ShaderInterop_SurfelGI.h" #include "brdf.hlsli" diff --git a/WickedEngine/shaders/terrainVirtualTextureUpdateCS.hlsl b/WickedEngine/shaders/terrainVirtualTextureUpdateCS.hlsl index 3e769f3da..31a55a0a6 100644 --- a/WickedEngine/shaders/terrainVirtualTextureUpdateCS.hlsl +++ b/WickedEngine/shaders/terrainVirtualTextureUpdateCS.hlsl @@ -21,13 +21,13 @@ void main(uint3 DTid : SV_DispatchThreadID) if (DTid.x >= push.write_size || DTid.y >= push.write_size) return; - Texture2DArray blendmap = bindless_textures2DArray[push.blendmap_texture]; - ByteAddressBuffer blendmap_buffer = bindless_buffers[push.blendmap_buffer]; + Texture2DArray blendmap = bindless_textures2DArray[descriptor_index(push.blendmap_texture)]; + ByteAddressBuffer blendmap_buffer = bindless_buffers[descriptor_index(push.blendmap_buffer)]; #if defined(UPDATE_BASECOLORMAP) || defined(UPDATE_EMISSIVEMAP) - RWTexture2D output = bindless_rwtextures_uint2[push.output_texture]; + RWTexture2D output = bindless_rwtextures_uint2[descriptor_index(push.output_texture)]; #else - RWTexture2D output = bindless_rwtextures_uint4[push.output_texture]; + RWTexture2D output = bindless_rwtextures_uint4[descriptor_index(push.output_texture)]; #endif #ifdef UPDATE_BASECOLORMAP @@ -73,7 +73,7 @@ void main(uint3 DTid : SV_DispatchThreadID) [branch] if (material.textures[BASECOLORMAP].IsValid()) { - Texture2D tex = bindless_textures[material.textures[BASECOLORMAP].texture_descriptor]; + Texture2D tex = bindless_textures[descriptor_index(material.textures[BASECOLORMAP].texture_descriptor)]; float2 dim = 0; tex.GetDimensions(dim.x, dim.y); float2 diff = dim * push.resolution_rcp; @@ -92,7 +92,7 @@ void main(uint3 DTid : SV_DispatchThreadID) [branch] if (material.textures[NORMALMAP].IsValid()) { - Texture2D tex = bindless_textures[material.textures[NORMALMAP].texture_descriptor]; + Texture2D tex = bindless_textures[descriptor_index(material.textures[NORMALMAP].texture_descriptor)]; float2 dim = 0; tex.GetDimensions(dim.x, dim.y); float2 diff = dim * push.resolution_rcp; @@ -111,7 +111,7 @@ void main(uint3 DTid : SV_DispatchThreadID) [branch] if (material.textures[SURFACEMAP].IsValid()) { - Texture2D tex = bindless_textures[material.textures[SURFACEMAP].texture_descriptor]; + Texture2D tex = bindless_textures[descriptor_index(material.textures[SURFACEMAP].texture_descriptor)]; float2 dim = 0; tex.GetDimensions(dim.x, dim.y); float2 diff = dim * push.resolution_rcp; @@ -131,7 +131,7 @@ void main(uint3 DTid : SV_DispatchThreadID) [branch] if (material.textures[EMISSIVEMAP].IsValid()) { - Texture2D tex = bindless_textures[material.textures[EMISSIVEMAP].texture_descriptor]; + Texture2D tex = bindless_textures[descriptor_index(material.textures[EMISSIVEMAP].texture_descriptor)]; float2 dim = 0; tex.GetDimensions(dim.x, dim.y); float2 diff = dim * push.resolution_rcp; diff --git a/WickedEngine/shaders/tonemapCS.hlsl b/WickedEngine/shaders/tonemapCS.hlsl index 31b890983..193c6b980 100644 --- a/WickedEngine/shaders/tonemapCS.hlsl +++ b/WickedEngine/shaders/tonemapCS.hlsl @@ -63,13 +63,13 @@ void main(uint3 DTid : SV_DispatchThreadID) [branch] if (tonemap_push.texture_input_distortion >= 0) { - uv += bindless_textures[tonemap_push.texture_input_distortion].SampleLevel(sampler_linear_clamp, uv, 0).rg; + uv += bindless_textures[descriptor_index(tonemap_push.texture_input_distortion)].SampleLevel(sampler_linear_clamp, uv, 0).rg; } [branch] if (tonemap_push.texture_input_distortion_overlay >= 0) { - uv += bindless_textures[tonemap_push.texture_input_distortion_overlay].SampleLevel(sampler_linear_clamp, uv, 0).rg * 2 - 1; + uv += bindless_textures[descriptor_index(tonemap_push.texture_input_distortion_overlay)].SampleLevel(sampler_linear_clamp, uv, 0).rg * 2 - 1; } half4 result = 0; @@ -77,16 +77,21 @@ void main(uint3 DTid : SV_DispatchThreadID) [branch] if (tonemap_push.texture_input >= 0) { - result = bindless_textures_half4[tonemap_push.texture_input].SampleLevel(sampler_linear_clamp, uv, 0); + result = bindless_textures_half4[descriptor_index(tonemap_push.texture_input)].SampleLevel(sampler_linear_clamp, uv, 0); } - exposure *= bindless_buffers[tonemap_push.buffer_input_luminance].Load(LUMINANCE_BUFFER_OFFSET_EXPOSURE); + [branch] + if (tonemap_push.buffer_input_luminance >= 0) + { + exposure *= bindless_buffers[descriptor_index(tonemap_push.buffer_input_luminance)].Load(LUMINANCE_BUFFER_OFFSET_EXPOSURE); + } + result.rgb *= exposure; [branch] if (tonemap_push.texture_bloom >= 0) { - Texture2D texture_bloom = bindless_textures_half4[tonemap_push.texture_bloom]; + Texture2D texture_bloom = bindless_textures_half4[descriptor_index(tonemap_push.texture_bloom)]; half3 bloom = texture_bloom.SampleLevel(sampler_linear_clamp, uv, 1.5).rgb; bloom += texture_bloom.SampleLevel(sampler_linear_clamp, uv, 3.5).rgb; bloom += texture_bloom.SampleLevel(sampler_linear_clamp, uv, 4.5).rgb; @@ -115,7 +120,7 @@ void main(uint3 DTid : SV_DispatchThreadID) [branch] if (tonemap_push.texture_colorgrade_lookuptable >= 0) { - result.rgb = bindless_textures3D[tonemap_push.texture_colorgrade_lookuptable].SampleLevel(sampler_linear_clamp, result.rgb, 0).rgb; + result.rgb = bindless_textures3D[descriptor_index(tonemap_push.texture_colorgrade_lookuptable)].SampleLevel(sampler_linear_clamp, result.rgb, 0).rgb; } [branch] @@ -133,6 +138,6 @@ void main(uint3 DTid : SV_DispatchThreadID) [branch] if (tonemap_push.texture_output >= 0) { - bindless_rwtextures[tonemap_push.texture_output][DTid.xy] = result; + bindless_rwtextures[descriptor_index(tonemap_push.texture_output)][DTid.xy] = result; } } diff --git a/WickedEngine/shaders/trailPS.hlsl b/WickedEngine/shaders/trailPS.hlsl index 7ad02f866..083978aec 100644 --- a/WickedEngine/shaders/trailPS.hlsl +++ b/WickedEngine/shaders/trailPS.hlsl @@ -2,13 +2,13 @@ float4 main(float4 pos : SV_Position, float4 uv : TEXCOORD, float4 color : COLOR) : SV_TARGET { - color *= bindless_textures[g_xTrailTextureIndex1].Sample(sampler_linear_mirror, uv.xy); - color *= bindless_textures[g_xTrailTextureIndex2].Sample(sampler_linear_mirror, uv.zw); + color *= bindless_textures[descriptor_index(g_xTrailTextureIndex1)].Sample(sampler_linear_mirror, uv.xy); + color *= bindless_textures[descriptor_index(g_xTrailTextureIndex2)].Sample(sampler_linear_mirror, uv.zw); [branch] if (g_xTrailLinearDepthTextureIndex >= 0) { - Texture2D lineardepthTexture = bindless_textures[g_xTrailLinearDepthTextureIndex]; + Texture2D lineardepthTexture = bindless_textures[descriptor_index(g_xTrailLinearDepthTextureIndex)]; float depthScene = lineardepthTexture[pos.xy].r * g_xTrailCameraFar; float depthFragment = pos.w; color.a *= saturate(g_xTrailDepthSoften * (depthScene - depthFragment)); // soft depth fade diff --git a/WickedEngine/shaders/underwaterCS.hlsl b/WickedEngine/shaders/underwaterCS.hlsl index b137a6616..afe8361ed 100644 --- a/WickedEngine/shaders/underwaterCS.hlsl +++ b/WickedEngine/shaders/underwaterCS.hlsl @@ -25,7 +25,7 @@ void main(uint3 DTid : SV_DispatchThreadID) if (ocean.texture_displacementmap >= 0) { const float2 ocean_uv = ocean_pos.xz * ocean.patch_size_rcp; - Texture2D texture_displacementmap = bindless_textures[ocean.texture_displacementmap]; + Texture2D texture_displacementmap = bindless_textures[descriptor_index(ocean.texture_displacementmap)]; const float3 displacement = texture_displacementmap.SampleLevel(sampler_linear_wrap, ocean_uv, 0).xzy; ocean_pos += displacement; } @@ -50,7 +50,7 @@ void main(uint3 DTid : SV_DispatchThreadID) // Otherwise the ocean surface could be same as infinite depth and incorrectly fogged float3 ocean_surface_pos = intersectPlaneClampInfinite(GetCamera().position, V, float3(0, 1, 0), ocean.water_height); float2 ocean_surface_uv = ocean_surface_pos.xz * ocean.patch_size_rcp; - Texture2D texture_displacementmap = bindless_textures[ocean.texture_displacementmap]; + Texture2D texture_displacementmap = bindless_textures[descriptor_index(ocean.texture_displacementmap)]; const float3 displacement = texture_displacementmap.SampleLevel(sampler_linear_wrap, ocean_surface_uv, 0).xzy; ocean_surface_pos += displacement; const float ocean_dist = length(ocean_surface_pos - GetCamera().position); @@ -59,7 +59,7 @@ void main(uint3 DTid : SV_DispatchThreadID) if (ocean.texture_displacementmap >= 0) { const float2 ocean_uv = surface_position.xz * ocean.patch_size_rcp; - Texture2D texture_displacementmap = bindless_textures[ocean.texture_displacementmap]; + Texture2D texture_displacementmap = bindless_textures[descriptor_index(ocean.texture_displacementmap)]; const float3 displacement = texture_displacementmap.SampleLevel(sampler_linear_wrap, ocean_uv, 0).xzy; surface_position += displacement; } diff --git a/WickedEngine/shaders/virtualTextureResidencyUpdateCS.hlsl b/WickedEngine/shaders/virtualTextureResidencyUpdateCS.hlsl index fafd747f0..17e7846eb 100644 --- a/WickedEngine/shaders/virtualTextureResidencyUpdateCS.hlsl +++ b/WickedEngine/shaders/virtualTextureResidencyUpdateCS.hlsl @@ -9,7 +9,7 @@ void main(uint3 DTid : SV_DispatchThreadID, uint groupIndex : SV_GroupIndex) if (DTid.x >= cb.width || DTid.y >= cb.height) return; - Buffer pageBuffer = bindless_buffers_uint[cb.pageBufferRO]; + Buffer pageBuffer = bindless_buffers_uint[descriptor_index(cb.pageBufferRO)]; uint minLod = 0xFF; uint tile_x = 0; @@ -60,14 +60,14 @@ void main(uint3 DTid : SV_DispatchThreadID, uint groupIndex : SV_GroupIndex) const bool packed_mips = lod == cb.lodCount - 1; if (packed_mips) { - RWTexture2D residencyTexture = bindless_rwtextures_uint4[cb.residencyTextureRW_mips[lod - 1].x]; + RWTexture2D residencyTexture = bindless_rwtextures_uint4[descriptor_index(cb.residencyTextureRW_mips[lod - 1].x)]; uint x = page & 0xFF; uint y = (page >> 8u) & 0xFF; residencyTexture[write_coord] = uint4(residencyTexture[write_coord].xy, x, y); } else { - RWTexture2D residencyTexture = bindless_rwtextures_uint4[cb.residencyTextureRW_mips[lod].x]; + RWTexture2D residencyTexture = bindless_rwtextures_uint4[descriptor_index(cb.residencyTextureRW_mips[lod].x)]; if (lod < minLod || page == 0xFFFF) { residencyTexture[write_coord] = uint4(tile_x, tile_y, minLod, 0); diff --git a/WickedEngine/shaders/virtualTextureTileAllocateCS.hlsl b/WickedEngine/shaders/virtualTextureTileAllocateCS.hlsl index ee2bfdb0e..91851a005 100644 --- a/WickedEngine/shaders/virtualTextureTileAllocateCS.hlsl +++ b/WickedEngine/shaders/virtualTextureTileAllocateCS.hlsl @@ -9,9 +9,9 @@ void main(uint3 DTid : SV_DispatchThreadID, uint groupIndex : SV_GroupIndex) if (DTid.x >= push.threadCount) return; - Buffer pageBuffer = bindless_buffers_uint[push.pageBufferRO]; - RWByteAddressBuffer requestBuffer = bindless_rwbuffers[push.requestBufferRW]; - RWByteAddressBuffer allocationBuffer = bindless_rwbuffers[push.allocationBufferRW]; + Buffer pageBuffer = bindless_buffers_uint[descriptor_index(push.pageBufferRO)]; + RWByteAddressBuffer requestBuffer = bindless_rwbuffers[descriptor_index(push.requestBufferRW)]; + RWByteAddressBuffer allocationBuffer = bindless_rwbuffers[descriptor_index(push.allocationBufferRW)]; uint page_count = 0; uint lod_offsets[10]; diff --git a/WickedEngine/shaders/virtualTextureTileRequestsCS.hlsl b/WickedEngine/shaders/virtualTextureTileRequestsCS.hlsl index a2c9ca2e0..21bb2e2aa 100644 --- a/WickedEngine/shaders/virtualTextureTileRequestsCS.hlsl +++ b/WickedEngine/shaders/virtualTextureTileRequestsCS.hlsl @@ -9,8 +9,8 @@ void main(uint3 DTid : SV_DispatchThreadID, uint groupIndex : SV_GroupIndex) if (DTid.x >= push.width / 2 || DTid.y >= push.height / 2) return; - RWTexture2D feedbackTexture = bindless_rwtextures_uint[push.feedbackTextureRW]; // this is not written, but we keep it in UAV state intentionally - RWByteAddressBuffer requestBuffer = bindless_rwbuffers[push.requestBufferRW]; + RWTexture2D feedbackTexture = bindless_rwtextures_uint[descriptor_index(push.feedbackTextureRW)]; // this is not written, but we keep it in UAV state intentionally + RWByteAddressBuffer requestBuffer = bindless_rwbuffers[descriptor_index(push.requestBufferRW)]; uint page_count = 0; uint lod_offsets[10]; diff --git a/WickedEngine/shaders/visibility_shadeCS.hlsl b/WickedEngine/shaders/visibility_shadeCS.hlsl index b62f88bc2..ee8f278c1 100644 --- a/WickedEngine/shaders/visibility_shadeCS.hlsl +++ b/WickedEngine/shaders/visibility_shadeCS.hlsl @@ -108,18 +108,18 @@ void main(uint Gid : SV_GroupID, uint groupIndex : SV_GroupIndex) [branch] if (GetCamera().texture_ssr_index >= 0) { - half4 ssr = bindless_textures_half4[GetCamera().texture_ssr_index].SampleLevel(sampler_linear_clamp, surface.screenUV, 0); + half4 ssr = bindless_textures_half4[descriptor_index(GetCamera().texture_ssr_index)].SampleLevel(sampler_linear_clamp, surface.screenUV, 0); lighting.indirect.specular = lerp(lighting.indirect.specular, ssr.rgb * surface.F, ssr.a); } [branch] if (GetCamera().texture_ssgi_index >= 0) { - surface.ssgi = bindless_textures_half4[GetCamera().texture_ssgi_index].SampleLevel(sampler_linear_clamp, surface.screenUV, 0).rgb; + surface.ssgi = bindless_textures_half4[descriptor_index(GetCamera().texture_ssgi_index)].SampleLevel(sampler_linear_clamp, surface.screenUV, 0).rgb; } [branch] if (GetCamera().texture_ao_index >= 0) { - surface.occlusion *= bindless_textures_half4[GetCamera().texture_ao_index].SampleLevel(sampler_linear_clamp, surface.screenUV, 0).r; + surface.occlusion *= bindless_textures_half4[descriptor_index(GetCamera().texture_ao_index)].SampleLevel(sampler_linear_clamp, surface.screenUV, 0).r; } #endif // CARTOON diff --git a/WickedEngine/shaders/volumetricCloud_renderCS.hlsl b/WickedEngine/shaders/volumetricCloud_renderCS.hlsl index 40495fa2c..81779cee4 100644 --- a/WickedEngine/shaders/volumetricCloud_renderCS.hlsl +++ b/WickedEngine/shaders/volumetricCloud_renderCS.hlsl @@ -724,8 +724,8 @@ void RenderClouds(uint3 DTid, float2 uv, float depth, float3 depthWorldPosition, [numthreads(POSTPROCESS_BLOCKSIZE, POSTPROCESS_BLOCKSIZE, 1)] void main(uint3 DTid : SV_DispatchThreadID) { - TextureCube input = bindless_cubemaps[capture.texture_input]; - RWTexture2DArray output = bindless_rwtextures2DArray[capture.texture_output]; + TextureCube input = bindless_cubemaps[descriptor_index(capture.texture_input)]; + RWTexture2DArray output = bindless_rwtextures2DArray[descriptor_index(capture.texture_output)]; const float2 uv = (DTid.xy + 0.5) * capture.resolution_rcp; const float3 N = uv_to_cubemap(uv, DTid.z); diff --git a/WickedEngine/shaders/voxelConeTracingHF.hlsli b/WickedEngine/shaders/voxelConeTracingHF.hlsli index 5659d499a..a019a6fb0 100644 --- a/WickedEngine/shaders/voxelConeTracingHF.hlsli +++ b/WickedEngine/shaders/voxelConeTracingHF.hlsli @@ -110,7 +110,7 @@ inline float4 ConeTrace(in Texture3D voxels, in float3 P, in float3 N, in const float half_texel = 0.5 * GetFrame().vxgi.resolution_rcp; float3 tc0 = clamp(tc, half_texel, 1 - half_texel); tc0.y = (tc0.y + clipmap_index) / VXGI_CLIPMAP_COUNT; // remap into clipmap - float sdf = bindless_textures3D[GetFrame().vxgi.texture_sdf].SampleLevel(sampler_linear_clamp, tc0, 0).r; + float sdf = bindless_textures3D[descriptor_index(GetFrame().vxgi.texture_sdf)].SampleLevel(sampler_linear_clamp, tc0, 0).r; stepSizeCurrent = max(stepSize, sdf - diameter); } step_dist = diameter * stepSizeCurrent; diff --git a/WickedEngine/shaders/voxelGS.hlsl b/WickedEngine/shaders/voxelGS.hlsl index 8662fa268..fde71e6ae 100644 --- a/WickedEngine/shaders/voxelGS.hlsl +++ b/WickedEngine/shaders/voxelGS.hlsl @@ -46,7 +46,7 @@ void main( uint3 pixel = coord; pixel.y += clipmap_index * GetFrame().vxgi.resolution; - Texture3D voxels = bindless_textures3D[GetFrame().vxgi.texture_radiance]; + Texture3D voxels = bindless_textures3D[descriptor_index(GetFrame().vxgi.texture_radiance)]; float4 face_colors[6] = { voxels[pixel + uint3(0 * GetFrame().vxgi.resolution, 0, 0)], voxels[pixel + uint3(1 * GetFrame().vxgi.resolution, 0, 0)], diff --git a/WickedEngine/shaders/vxgi_resolve_diffuseCS.hlsl b/WickedEngine/shaders/vxgi_resolve_diffuseCS.hlsl index b9bfb5ea2..9615c5d5c 100644 --- a/WickedEngine/shaders/vxgi_resolve_diffuseCS.hlsl +++ b/WickedEngine/shaders/vxgi_resolve_diffuseCS.hlsl @@ -20,7 +20,7 @@ void main(uint3 DTid : SV_DispatchThreadID) const float3 N = decode_oct(texture_normal.SampleLevel(sampler_point_clamp, uv, 0)); const float3 P = reconstruct_position(uv, depth); - Texture3D voxels = bindless_textures3D_half4[GetFrame().vxgi.texture_radiance]; + Texture3D voxels = bindless_textures3D_half4[descriptor_index(GetFrame().vxgi.texture_radiance)]; half4 trace = ConeTraceDiffuse(voxels, P, N); half4 color = half4(trace.rgb, 1); color.rgb += GetAmbient(N) * (1 - trace.a); diff --git a/WickedEngine/shaders/vxgi_resolve_specularCS.hlsl b/WickedEngine/shaders/vxgi_resolve_specularCS.hlsl index 37babb39a..47a6b3d90 100644 --- a/WickedEngine/shaders/vxgi_resolve_specularCS.hlsl +++ b/WickedEngine/shaders/vxgi_resolve_specularCS.hlsl @@ -21,7 +21,7 @@ void main(uint3 DTid : SV_DispatchThreadID) const float3 P = reconstruct_position(uv, depth); const float3 V = normalize(GetCamera().frustum_corners.screen_to_nearplane(uv) - P); // ortho support - Texture3D voxels = bindless_textures3D_half4[GetFrame().vxgi.texture_radiance]; + Texture3D voxels = bindless_textures3D_half4[descriptor_index(GetFrame().vxgi.texture_radiance)]; half4 color = ConeTraceSpecular(voxels, P, N, V, roughness * roughness, pixel); output[pixel] = color; } diff --git a/WickedEngine/shaders/wetmap_updateCS.hlsl b/WickedEngine/shaders/wetmap_updateCS.hlsl index 0ca0be749..1104469e1 100644 --- a/WickedEngine/shaders/wetmap_updateCS.hlsl +++ b/WickedEngine/shaders/wetmap_updateCS.hlsl @@ -10,7 +10,7 @@ void main(uint DTid : SV_DispatchThreadID) if(geometry.vb_pos_wind < 0) return; - Buffer vb_pos_wind = bindless_buffers_float4[geometry.vb_pos_wind]; + Buffer vb_pos_wind = bindless_buffers_float4[descriptor_index(geometry.vb_pos_wind)]; float3 world_pos = vb_pos_wind[DTid].xyz; world_pos = mul(meshinstance.transform.GetMatrix(), float4(world_pos, 1)).xyz; @@ -18,14 +18,14 @@ void main(uint DTid : SV_DispatchThreadID) [branch] if(geometry.vb_nor >= 0) { - Buffer vb_nor = bindless_buffers_half4[geometry.vb_nor]; + Buffer vb_nor = bindless_buffers_half4[descriptor_index(geometry.vb_nor)]; half3 normal = vb_nor[DTid].xyz; normal = mul(meshinstance.transformRaw.GetMatrixAdjoint(), normal); normal = normalize(normal); drying *= lerp(4, 1, pow8(saturate(normal.y))); // modulate drying speed based on surface slope } - RWBuffer wetmap = bindless_rwbuffers_float[push.wetmap]; + RWBuffer wetmap = bindless_rwbuffers_float[descriptor_index(push.wetmap)]; float prev = wetmap[DTid]; float current = prev; @@ -38,7 +38,7 @@ void main(uint DTid : SV_DispatchThreadID) if (ocean.texture_displacementmap >= 0) { const float2 ocean_uv = ocean_pos.xz * ocean.patch_size_rcp; - Texture2D texture_displacementmap = bindless_textures[ocean.texture_displacementmap]; + Texture2D texture_displacementmap = bindless_textures[descriptor_index(ocean.texture_displacementmap)]; const float3 displacement = texture_displacementmap.SampleLevel(sampler_linear_wrap, ocean_uv, 0).xzy; ocean_pos += displacement; float water_depth = ocean_pos.y - world_pos.y; @@ -52,7 +52,7 @@ void main(uint DTid : SV_DispatchThreadID) if(push.rain_amount > 0 && GetFrame().texture_shadowatlas_index >= 0 && any(GetFrame().rain_blocker_mad)) { - Texture2D texture_shadowatlas = bindless_textures[GetFrame().texture_shadowatlas_index]; + Texture2D texture_shadowatlas = bindless_textures[descriptor_index(GetFrame().texture_shadowatlas_index)]; float3 shadow_pos = mul(GetFrame().rain_blocker_matrix, float4(world_pos, 1)).xyz; float3 shadow_uv = clipspace_to_uv(shadow_pos); float shadow = 1; diff --git a/WickedEngine/wiEmittedParticle.cpp b/WickedEngine/wiEmittedParticle.cpp index fb9c1db4d..f1e758868 100644 --- a/WickedEngine/wiEmittedParticle.cpp +++ b/WickedEngine/wiEmittedParticle.cpp @@ -104,7 +104,7 @@ namespace wi } const uint64_t alignment = device->GetMinOffsetAlignment(&bd); - vb_pos.size = sizeof(MeshComponent::Vertex_POS32) * 4 * MAX_PARTICLES; + vb_pos.size = sizeof(MeshComponent::Vertex_POS32W) * 4 * MAX_PARTICLES; vb_nor.size = sizeof(MeshComponent::Vertex_NOR) * 4 * MAX_PARTICLES; vb_uvs.size = sizeof(MeshComponent::Vertex_UVS) * 4 * MAX_PARTICLES; vb_col.size = sizeof(MeshComponent::Vertex_COL) * 4 * MAX_PARTICLES; @@ -123,8 +123,8 @@ namespace wi buffer_offset = AlignTo(buffer_offset, alignment); vb_pos.offset = buffer_offset; - vb_pos.subresource_srv = device->CreateSubresource(&generalBuffer, SubresourceType::SRV, vb_pos.offset, vb_pos.size, &MeshComponent::Vertex_POS32::FORMAT); - vb_pos.subresource_uav = device->CreateSubresource(&generalBuffer, SubresourceType::UAV, vb_pos.offset, vb_pos.size); // UAV can't have RGB32_F format! + vb_pos.subresource_srv = device->CreateSubresource(&generalBuffer, SubresourceType::SRV, vb_pos.offset, vb_pos.size, &MeshComponent::Vertex_POS32W::FORMAT); + vb_pos.subresource_uav = device->CreateSubresource(&generalBuffer, SubresourceType::UAV, vb_pos.offset, vb_pos.size, &MeshComponent::Vertex_POS32W::FORMAT); // UAV can't have RGB32_F format! vb_pos.descriptor_srv = device->GetDescriptorIndex(&generalBuffer, SubresourceType::SRV, vb_pos.subresource_srv); vb_pos.descriptor_uav = device->GetDescriptorIndex(&generalBuffer, SubresourceType::UAV, vb_pos.subresource_uav); buffer_offset += vb_pos.size; @@ -290,9 +290,9 @@ namespace wi geometry.triangles.index_format = GetIndexBufferFormat(primitiveBuffer.desc.format); geometry.triangles.index_count = MAX_PARTICLES * 6; geometry.triangles.index_offset = 0; - geometry.triangles.vertex_count = (uint32_t)(vb_pos.size / sizeof(MeshComponent::Vertex_POS32)); - geometry.triangles.vertex_format = MeshComponent::Vertex_POS32::FORMAT; - geometry.triangles.vertex_stride = sizeof(MeshComponent::Vertex_POS32); + geometry.triangles.vertex_count = (uint32_t)(vb_pos.size / sizeof(MeshComponent::Vertex_POS32W)); + geometry.triangles.vertex_format = Format::R32G32B32_FLOAT; + geometry.triangles.vertex_stride = sizeof(MeshComponent::Vertex_POS32W); bool success = device->CreateRaytracingAccelerationStructure(&desc, &BLAS); assert(success); diff --git a/WickedEngine/wiGraphicsDevice_DX12.cpp b/WickedEngine/wiGraphicsDevice_DX12.cpp index 7cf40860b..4e4b3b6a5 100644 --- a/WickedEngine/wiGraphicsDevice_DX12.cpp +++ b/WickedEngine/wiGraphicsDevice_DX12.cpp @@ -2999,6 +2999,29 @@ std::mutex queue_locker; wilog_messagebox("ID3D12CommandQueue::GetTimestampFrequency[QUEUE_GRAPHICS] failed! ERROR: %s", wi::helper::GetPlatformErrorString(hr).c_str()); } + { + // Descriptor safety feature: + // We init null descriptors for bindless index = 0 for access safety + // Because shader compiler sometimes incorrectly loads descriptor outside of safety branch + // Note: these are never freed, this is intentional + { + int index = allocationhandler->free_bindless_res.back(); + allocationhandler->free_bindless_res.pop_back(); + wilog_assert(index == 0, "Descriptor safety feature error: descriptor index must be 0!"); + D3D12_CPU_DESCRIPTOR_HANDLE dst_bindless = descriptorheap_res.start_cpu; + dst_bindless.ptr += index * allocationhandler->device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); + allocationhandler->device->CopyDescriptorsSimple(1, dst_bindless, nullSRV, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); + } + { + int index = allocationhandler->free_bindless_sam.back(); + allocationhandler->free_bindless_sam.pop_back(); + wilog_assert(index == 0, "Descriptor safety feature error: descriptor index must be 0!"); + D3D12_CPU_DESCRIPTOR_HANDLE dst_bindless = descriptorheap_sam.start_cpu; + dst_bindless.ptr += index * allocationhandler->device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER); + allocationhandler->device->CopyDescriptorsSimple(1, dst_bindless, nullSAM, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER); + } + } + wilog("Created GraphicsDevice_DX12 (%d ms)\nAdapter: %s", (int)std::round(timer.elapsed()), adapterName.c_str()); } GraphicsDevice_DX12::~GraphicsDevice_DX12() diff --git a/WickedEngine/wiGraphicsDevice_DX12.h b/WickedEngine/wiGraphicsDevice_DX12.h index 08f17eafd..c3482c866 100644 --- a/WickedEngine/wiGraphicsDevice_DX12.h +++ b/WickedEngine/wiGraphicsDevice_DX12.h @@ -543,7 +543,7 @@ namespace wi::graphics ~AllocationHandler() { - Update(~0, 0); // destroy all remaining + Update(~0ull, 0); // destroy all remaining } // Deferred destroy of resources that the GPU is already finished with: diff --git a/WickedEngine/wiGraphicsDevice_Vulkan.cpp b/WickedEngine/wiGraphicsDevice_Vulkan.cpp index 3a4a9486f..965ef32c3 100644 --- a/WickedEngine/wiGraphicsDevice_Vulkan.cpp +++ b/WickedEngine/wiGraphicsDevice_Vulkan.cpp @@ -616,14 +616,14 @@ namespace vulkan_internal { ss += "[Vulkan Warning]: "; ss += callback_data->pMessage; - ss += "\n"; + ss += "\n"; wi::helper::DebugOut(ss, wi::helper::DebugLevel::Warning); } else if (message_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) { ss += "[Vulkan Error]: "; ss += callback_data->pMessage; - ss += "\n"; + ss += "\n"; wi::helper::DebugOut(ss, wi::helper::DebugLevel::Error); } @@ -1665,9 +1665,19 @@ using namespace vulkan_internal; poolInfo.pPoolSizes = poolSizes; poolInfo.maxSets = poolSize; + destroy(); // issues destroy if already exists, nop otherwise res = vkCreateDescriptorPool(device->device, &poolInfo, nullptr, &descriptorPool); vulkan_check(res); +#if 0 + VkDebugUtilsObjectNameInfoEXT info{ VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT }; + info.pObjectName = "DescriptorBinderPool"; + info.objectType = VK_OBJECT_TYPE_DESCRIPTOR_POOL; + info.objectHandle = (uint64_t)descriptorPool; + res = vkSetDebugUtilsObjectNameEXT(device->device, &info); + vulkan_check(res); +#endif + // WARNING: MUST NOT CALL reset() HERE! // This is because init can be called mid-frame when there is allocation error, but the bindings must be retained! @@ -1758,7 +1768,6 @@ using namespace vulkan_internal; while (res == VK_ERROR_OUT_OF_POOL_MEMORY) { binder_pool.poolSize *= 2; - binder_pool.destroy(); binder_pool.init(device); allocInfo.descriptorPool = binder_pool.descriptorPool; res = vkAllocateDescriptorSets(device->device, &allocInfo, &descriptorSet); @@ -3103,7 +3112,7 @@ using namespace vulkan_internal; queues[QUEUE_COPY].locker = queue_lockers[copyFamily]; queues[QUEUE_VIDEO_DECODE].queue = videoQueue; if (videoFamily != VK_QUEUE_FAMILY_IGNORED) { - queues[QUEUE_VIDEO_DECODE].locker = queue_lockers[videoFamily]; + queues[QUEUE_VIDEO_DECODE].locker = queue_lockers[videoFamily]; } } @@ -3378,32 +3387,32 @@ using namespace vulkan_internal; if (features_1_2.descriptorBindingSampledImageUpdateAfterBind == VK_TRUE) { - allocationhandler->bindlessSampledImages.init(device, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, std::min(limit_bindless_descriptors, properties_1_2.maxDescriptorSetUpdateAfterBindSampledImages / 4)); + allocationhandler->bindlessSampledImages.init(this, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, std::min(limit_bindless_descriptors, properties_1_2.maxDescriptorSetUpdateAfterBindSampledImages / 4)); } if (features_1_2.descriptorBindingUniformTexelBufferUpdateAfterBind == VK_TRUE) { - allocationhandler->bindlessUniformTexelBuffers.init(device, VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, std::min(limit_bindless_descriptors, properties_1_2.maxDescriptorSetUpdateAfterBindSampledImages / 4)); + allocationhandler->bindlessUniformTexelBuffers.init(this, VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, std::min(limit_bindless_descriptors, properties_1_2.maxDescriptorSetUpdateAfterBindSampledImages / 4)); } if (features_1_2.descriptorBindingStorageBufferUpdateAfterBind == VK_TRUE) { - allocationhandler->bindlessStorageBuffers.init(device, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, properties_1_2.maxDescriptorSetUpdateAfterBindStorageBuffers / 4); + allocationhandler->bindlessStorageBuffers.init(this, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, properties_1_2.maxDescriptorSetUpdateAfterBindStorageBuffers / 4); } if (features_1_2.descriptorBindingStorageImageUpdateAfterBind == VK_TRUE) { - allocationhandler->bindlessStorageImages.init(device, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, std::min(limit_bindless_descriptors, properties_1_2.maxDescriptorSetUpdateAfterBindStorageImages / 4)); + allocationhandler->bindlessStorageImages.init(this, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, std::min(limit_bindless_descriptors, properties_1_2.maxDescriptorSetUpdateAfterBindStorageImages / 4)); } if (features_1_2.descriptorBindingStorageTexelBufferUpdateAfterBind == VK_TRUE) { - allocationhandler->bindlessStorageTexelBuffers.init(device, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, std::min(limit_bindless_descriptors, properties_1_2.maxDescriptorSetUpdateAfterBindStorageImages / 4)); + allocationhandler->bindlessStorageTexelBuffers.init(this, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, std::min(limit_bindless_descriptors, properties_1_2.maxDescriptorSetUpdateAfterBindStorageImages / 4)); } if (features_1_2.descriptorBindingSampledImageUpdateAfterBind == VK_TRUE) { - allocationhandler->bindlessSamplers.init(device, VK_DESCRIPTOR_TYPE_SAMPLER, 256); + allocationhandler->bindlessSamplers.init(this, VK_DESCRIPTOR_TYPE_SAMPLER, 256); } if (CheckCapability(GraphicsDeviceCapability::RAYTRACING)) { - allocationhandler->bindlessAccelerationStructures.init(device, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 32); + allocationhandler->bindlessAccelerationStructures.init(this, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 32); } // Pipeline Cache diff --git a/WickedEngine/wiGraphicsDevice_Vulkan.h b/WickedEngine/wiGraphicsDevice_Vulkan.h index b30dc6c05..41ed76345 100644 --- a/WickedEngine/wiGraphicsDevice_Vulkan.h +++ b/WickedEngine/wiGraphicsDevice_Vulkan.h @@ -490,7 +490,7 @@ namespace wi::graphics wi::vector freelist; std::mutex locker; - void init(VkDevice device, VkDescriptorType type, uint32_t descriptorCount) + void init(GraphicsDevice_Vulkan* device, VkDescriptorType type, uint32_t descriptorCount) { descriptorCount = std::min(descriptorCount, 500000u); @@ -505,9 +505,18 @@ namespace wi::graphics poolInfo.maxSets = 1; poolInfo.flags = VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT; - VkResult res = vkCreateDescriptorPool(device, &poolInfo, nullptr, &descriptorPool); + VkResult res = vkCreateDescriptorPool(device->device, &poolInfo, nullptr, &descriptorPool); vulkan_check(res); +#if 0 + VkDebugUtilsObjectNameInfoEXT info{ VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT }; + info.pObjectName = "BindlessDescriptorHeap"; + info.objectType = VK_OBJECT_TYPE_DESCRIPTOR_POOL; + info.objectHandle = (uint64_t)descriptorPool; + res = vkSetDebugUtilsObjectNameEXT(device->device, &info); + vulkan_check(res); +#endif + VkDescriptorSetLayoutBinding binding = {}; binding.descriptorType = type; binding.binding = 0; @@ -532,7 +541,7 @@ namespace wi::graphics bindingFlagsInfo.pBindingFlags = &bindingFlags; layoutInfo.pNext = &bindingFlagsInfo; - res = vkCreateDescriptorSetLayout(device, &layoutInfo, nullptr, &descriptorSetLayout); + res = vkCreateDescriptorSetLayout(device->device, &layoutInfo, nullptr, &descriptorSetLayout); vulkan_check(res); VkDescriptorSetAllocateInfo allocInfo = {}; @@ -540,13 +549,64 @@ namespace wi::graphics allocInfo.descriptorPool = descriptorPool; allocInfo.descriptorSetCount = 1; allocInfo.pSetLayouts = &descriptorSetLayout; - res = vkAllocateDescriptorSets(device, &allocInfo, &descriptorSet); + res = vkAllocateDescriptorSets(device->device, &allocInfo, &descriptorSet); vulkan_check(res); for (int i = 0; i < (int)descriptorCount; ++i) { freelist.push_back((int)descriptorCount - i - 1); } + + if (type != VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR) + { + // Descriptor safety feature: + // We init null descriptors for bindless index = 0 for access safety + // Because shader compiler sometimes incorrectly loads descriptor outside of safety branch + // Note: these are never freed, this is intentional + int index = allocate(); + wilog_assert(index == 0, "Descriptor safety feature error: descriptor index must be 0!"); + VkWriteDescriptorSet write = {}; + write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + write.descriptorType = type; + write.dstBinding = 0; + write.dstArrayElement = index; + write.descriptorCount = 1; + write.dstSet = descriptorSet; + + VkDescriptorImageInfo image_info = {}; + VkDescriptorBufferInfo buffer_info = {}; + + switch (type) + { + case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: + image_info.imageView = device->nullImageView2D; + image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + write.pImageInfo = &image_info; + break; + case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: + case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: + write.pTexelBufferView = &device->nullBufferView; + break; + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: + buffer_info.buffer = device->nullBuffer; + buffer_info.range = VK_WHOLE_SIZE; + write.pBufferInfo = &buffer_info; + break; + case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: + image_info.imageView = device->nullImageView2D; + image_info.imageLayout = VK_IMAGE_LAYOUT_GENERAL; + write.pImageInfo = &image_info; + break; + case VK_DESCRIPTOR_TYPE_SAMPLER: + image_info.sampler = device->nullSampler; + write.pImageInfo = &image_info; + break; + default: + wilog_assert(0, "Descriptor safety feature error: descriptor type not handled!"); + break; + } + vkUpdateDescriptorSets(device->device, 1, &write, 0, nullptr); + } } void destroy(VkDevice device) { @@ -630,7 +690,7 @@ namespace wi::graphics bindlessStorageTexelBuffers.destroy(device); bindlessSamplers.destroy(device); bindlessAccelerationStructures.destroy(device); - Update(~0, 0); // destroy all remaining + Update(~0ull, 0); // destroy all remaining vmaDestroyAllocator(allocator); vmaDestroyAllocator(externalAllocator); vkDestroyDevice(device, nullptr); diff --git a/WickedEngine/wiHairParticle.cpp b/WickedEngine/wiHairParticle.cpp index 850e77d29..eb15d5da6 100644 --- a/WickedEngine/wiHairParticle.cpp +++ b/WickedEngine/wiHairParticle.cpp @@ -111,7 +111,11 @@ namespace wi const size_t position_stride = GetFormatStride(position_format); const Format ib_format = GetIndexBufferFormatRaw(particleCount * 4); - const uint64_t alignment = device->GetMinOffsetAlignment(&bd); + const uint64_t alignment = + device->GetMinOffsetAlignment(&bd) * + sizeof(IndirectDrawArgsIndexedInstanced) * // additional alignment + sizeof(PatchSimulationData) // additional alignment + ; simulation_view.size = sizeof(PatchSimulationData) * particleCount; vb_pos[0].size = position_stride * 4 * particleCount; @@ -124,8 +128,8 @@ namespace wi vb_pos_raytracing.size = position_stride * 4 * particleCount; bd.size = - AlignTo(AlignTo(indirect_view.size, alignment), sizeof(IndirectDrawArgsIndexedInstanced)) + // additional structured buffer alignment - AlignTo(AlignTo(simulation_view.size, alignment), sizeof(PatchSimulationData)) + // additional structured buffer alignment + AlignTo(indirect_view.size, alignment) + + AlignTo(simulation_view.size, alignment) + AlignTo(vb_pos[0].size, alignment) + AlignTo(vb_pos[1].size, alignment) + AlignTo(vb_nor.size, alignment) + @@ -141,7 +145,6 @@ namespace wi uint64_t buffer_offset = 0ull; const uint32_t indirect_stride = sizeof(IndirectDrawArgsIndexedInstanced); - buffer_offset = AlignTo(buffer_offset, sizeof(IndirectDrawArgsIndexedInstanced)); // additional structured buffer alignment buffer_offset = AlignTo(buffer_offset, alignment); indirect_view.offset = buffer_offset; indirect_view.subresource_srv = device->CreateSubresource(&generalBuffer, SubresourceType::SRV, indirect_view.offset, indirect_view.size, nullptr, &indirect_stride); @@ -151,7 +154,6 @@ namespace wi buffer_offset += indirect_view.size; const uint32_t simulation_stride = sizeof(PatchSimulationData); - buffer_offset = AlignTo(buffer_offset, sizeof(PatchSimulationData)); // additional structured buffer alignment buffer_offset = AlignTo(buffer_offset, alignment); simulation_view.offset = buffer_offset; simulation_view.subresource_srv = device->CreateSubresource(&generalBuffer, SubresourceType::SRV, simulation_view.offset, simulation_view.size, nullptr, &simulation_stride); diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index ac061ebe8..efbce36a1 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -190,20 +190,6 @@ Texture texture_detailNoise; Texture texture_curlNoise; Texture texture_weatherMap; -// A dummy luminance buffer with exposure set to 1. -// This avoids having to branch in shaders that consume the exposure value -// when eye adaption is disabled. -// It also works around an apparent bug in the drivers for certain GTX 10xx cards -// where just testing if a bindless buffer descriptor is valid requires that it is valid. -// See: https://github.com/turanszkij/WickedEngine/issues/450 -GPUBuffer luminance_dummy; - -// Dummy buffers preinitialized to invalid scene structs, avoids possible GPU crash when -// shader compiler is incorrectly pulling buffer desciptor load outside valid branch -GPUBuffer instance_dummy; -GPUBuffer geometry_dummy; -GPUBuffer material_dummy; - // Direct reference to a renderable instance: struct RenderBatch { @@ -2113,61 +2099,6 @@ void LoadBuffers() device->SetName(&textures[TEXTYPE_2D_SHEENLUT], "textures[TEXTYPE_2D_SHEENLUT]"); } - { - // the dummy buffer is read-only so only the first 'exposure' value is needed, - // not the luminance or histogram values in the full version of the buffer used - // when eye adaption is enabled. - float values[1] = { 1 }; - - GPUBufferDesc desc; - desc.size = sizeof(values); - desc.bind_flags = BindFlag::SHADER_RESOURCE; - desc.misc_flags = ResourceMiscFlag::BUFFER_RAW; - device->CreateBuffer(&desc, values, &luminance_dummy); - device->SetName(&luminance_dummy, "luminance_dummy"); - - static_assert(LUMINANCE_BUFFER_OFFSET_EXPOSURE == 0); - } - - { - ShaderMeshInstance data; - data.init(); - - GPUBufferDesc desc; - desc.stride = sizeof(data); - desc.size = desc.stride; - desc.bind_flags = BindFlag::SHADER_RESOURCE; - desc.misc_flags = ResourceMiscFlag::BUFFER_STRUCTURED; - device->CreateBuffer(&desc, &data, &instance_dummy); - device->SetName(&instance_dummy, "instance_dummy"); - } - - { - ShaderGeometry data; - data.init(); - - GPUBufferDesc desc; - desc.stride = sizeof(data); - desc.size = desc.stride; - desc.bind_flags = BindFlag::SHADER_RESOURCE; - desc.misc_flags = ResourceMiscFlag::BUFFER_STRUCTURED; - device->CreateBuffer(&desc, &data, &geometry_dummy); - device->SetName(&geometry_dummy, "geometry_dummy"); - } - - { - ShaderMaterial data; - data.init(); - - GPUBufferDesc desc; - desc.stride = sizeof(data); - desc.size = desc.stride; - desc.bind_flags = BindFlag::SHADER_RESOURCE; - desc.misc_flags = ResourceMiscFlag::BUFFER_STRUCTURED; - device->CreateBuffer(&desc, &data, &material_dummy); - device->SetName(&material_dummy, "material_dummy"); - } - { TextureDesc desc; desc.type = TextureDesc::Type::TEXTURE_3D; @@ -2191,29 +2122,6 @@ void LoadBuffers() device->CreateTexture(&desc, nullptr, &textures[TEXTYPE_2D_CAUSTICS]); device->SetName(&textures[TEXTYPE_2D_CAUSTICS], "textures[TEXTYPE_2D_CAUSTICS]"); } - { - // Note: Create dummy shadow map atlas to avoid issue with AMD RX 6650 GPU - // It seems like it incorectly handles dynamic branch on descriptor index - TextureDesc desc; - desc.width = 1; - desc.height = 1; - desc.format = format_depthbuffer_shadowmap; - desc.bind_flags = BindFlag::DEPTH_STENCIL | BindFlag::SHADER_RESOURCE; - desc.layout = ResourceState::SHADER_RESOURCE; - desc.misc_flags = ResourceMiscFlag::TEXTURE_COMPATIBLE_COMPRESSION; - device->CreateTexture(&desc, nullptr, &shadowMapAtlas); - device->SetName(&shadowMapAtlas, "shadowMapAtlas"); - - desc.format = format_rendertarget_shadowmap; - desc.bind_flags = BindFlag::RENDER_TARGET | BindFlag::SHADER_RESOURCE; - desc.layout = ResourceState::SHADER_RESOURCE; - desc.clear.color[0] = 1; - desc.clear.color[1] = 1; - desc.clear.color[2] = 1; - desc.clear.color[3] = 0; - device->CreateTexture(&desc, nullptr, &shadowMapAtlas_Transparent); - device->SetName(&shadowMapAtlas_Transparent, "shadowMapAtlas_Transparent"); - } } void SetUpStates() { @@ -4074,10 +3982,13 @@ void UpdatePerFrameData( frameCB.texture_wind_prev_index = device->GetDescriptorIndex(&textures[TEXTYPE_3D_WIND_PREV], SubresourceType::SRV); frameCB.texture_caustics_index = device->GetDescriptorIndex(&textures[TEXTYPE_2D_CAUSTICS], SubresourceType::SRV); - frameCB.texture_shadowatlas_index = device->GetDescriptorIndex(&shadowMapAtlas, SubresourceType::SRV); - frameCB.texture_shadowatlas_transparent_index = device->GetDescriptorIndex(&shadowMapAtlas_Transparent, SubresourceType::SRV); - frameCB.shadow_atlas_resolution.x = shadowMapAtlas.desc.width; - frameCB.shadow_atlas_resolution.y = shadowMapAtlas.desc.height; + // Note: shadow maps always assumed to be valid to avoid shader branching logic + const Texture& shadowMap = shadowMapAtlas.IsValid() ? shadowMapAtlas : *wi::texturehelper::getBlack(); + const Texture& shadowMapTransparent = shadowMapAtlas_Transparent.IsValid() ? shadowMapAtlas_Transparent : *wi::texturehelper::getWhite(); + frameCB.texture_shadowatlas_index = device->GetDescriptorIndex(&shadowMap, SubresourceType::SRV); + frameCB.texture_shadowatlas_transparent_index = device->GetDescriptorIndex(&shadowMapTransparent, SubresourceType::SRV); + frameCB.shadow_atlas_resolution.x = shadowMap.desc.width; + frameCB.shadow_atlas_resolution.y = shadowMap.desc.height; frameCB.shadow_atlas_resolution_rcp.x = 1.0f / frameCB.shadow_atlas_resolution.x; frameCB.shadow_atlas_resolution_rcp.y = 1.0f / frameCB.shadow_atlas_resolution.y; @@ -4635,20 +4546,6 @@ void UpdatePerFrameData( frameCB.lights = ShaderEntityIterator(lightarray_offset, lightarray_count); frameCB.decals = ShaderEntityIterator(decalarray_offset, decalarray_count); frameCB.forces = ShaderEntityIterator(forcefieldarray_offset, forcefieldarray_count); - - // GPU crash workarounds, setting buffers with invalid data: - if (frameCB.scene.instancebuffer < 0) - { - frameCB.scene.instancebuffer = device->GetDescriptorIndex(&instance_dummy, SubresourceType::SRV); - } - if (frameCB.scene.geometrybuffer < 0) - { - frameCB.scene.geometrybuffer = device->GetDescriptorIndex(&geometry_dummy, SubresourceType::SRV); - } - if (frameCB.scene.materialbuffer < 0) - { - frameCB.scene.materialbuffer = device->GetDescriptorIndex(&material_dummy, SubresourceType::SRV); - } } void UpdateRenderData( const Visibility& vis, @@ -10822,7 +10719,7 @@ void ComputeBloom( bloom.exposure = exposure; bloom.texture_input = device->GetDescriptorIndex(&input, SubresourceType::SRV); bloom.texture_output = device->GetDescriptorIndex(&res.texture_bloom, SubresourceType::UAV); - bloom.buffer_input_luminance = device->GetDescriptorIndex((buffer_luminance == nullptr) ? &luminance_dummy : buffer_luminance, SubresourceType::SRV); + bloom.buffer_input_luminance = device->GetDescriptorIndex(buffer_luminance, SubresourceType::SRV); device->PushConstants(&bloom, sizeof(bloom), cmd); device->Dispatch( @@ -16505,7 +16402,7 @@ void Postprocess_Tonemap( } tonemap_push.flags_hdrcalibration |= XMConvertFloatToHalf(hdr_calibration) << 16u; tonemap_push.texture_input = device->GetDescriptorIndex(&input, SubresourceType::SRV); - tonemap_push.buffer_input_luminance = device->GetDescriptorIndex((buffer_luminance == nullptr) ? &luminance_dummy : buffer_luminance, SubresourceType::SRV); + tonemap_push.buffer_input_luminance = device->GetDescriptorIndex(buffer_luminance, SubresourceType::SRV); tonemap_push.texture_input_distortion = device->GetDescriptorIndex(texture_distortion, SubresourceType::SRV); tonemap_push.texture_input_distortion_overlay = device->GetDescriptorIndex(texture_distortion_overlay, SubresourceType::SRV); tonemap_push.texture_colorgrade_lookuptable = device->GetDescriptorIndex(texture_colorgradinglut, SubresourceType::SRV); @@ -18369,6 +18266,7 @@ wi::Resource CreatePaintableTexture(uint32_t width, uint32_t height, uint32_t mi } desc.format = Format::R8G8B8A8_UNORM; desc.bind_flags = BindFlag::SHADER_RESOURCE | BindFlag::UNORDERED_ACCESS | BindFlag::RENDER_TARGET; + desc.misc_flags = ResourceMiscFlag::TYPED_FORMAT_CASTING; wi::vector data(desc.width * desc.height); std::fill(data.begin(), data.end(), initialColor); SubresourceData initdata[32] = {}; diff --git a/WickedEngine/wiScene.cpp b/WickedEngine/wiScene.cpp index b0c1f1b0a..41af54d24 100644 --- a/WickedEngine/wiScene.cpp +++ b/WickedEngine/wiScene.cpp @@ -782,14 +782,13 @@ namespace wi::scene const uint64_t alignment = device->GetMinOffsetAlignment(&desc) * - sizeof(IndirectDrawArgsIndexedInstanced) * // additional alignment - sizeof(MeshComponent::Vertex_POS32) // additional alignment + sizeof(IndirectDrawArgsIndexedInstanced) // additional alignment ; desc.size = AlignTo(sizeof(IndirectDrawArgsIndexedInstanced), alignment) + // indirect args AlignTo(allocated_impostor_capacity * sizeof(uint) * 6, alignment) + // indices (must overestimate here for 32-bit indices, because we create 16 bit and 32 bit descriptors) - AlignTo(allocated_impostor_capacity * sizeof(MeshComponent::Vertex_POS32) * 4, alignment) + // vertices + AlignTo(allocated_impostor_capacity * sizeof(MeshComponent::Vertex_POS32W) * 4, alignment) + // vertices AlignTo(allocated_impostor_capacity * sizeof(MeshComponent::Vertex_NOR) * 4, alignment) + // vertices AlignTo(allocated_impostor_capacity * sizeof(uint2), alignment) // impostordata ; @@ -799,7 +798,6 @@ namespace wi::scene uint64_t buffer_offset = 0ull; const uint32_t indirect_stride = sizeof(IndirectDrawArgsIndexedInstanced); - buffer_offset = AlignTo(buffer_offset, sizeof(IndirectDrawArgsIndexedInstanced)); // additional structured buffer alignment buffer_offset = AlignTo(buffer_offset, alignment); impostor_indirect.offset = buffer_offset; impostor_indirect.size = sizeof(IndirectDrawArgsIndexedInstanced); @@ -826,9 +824,9 @@ namespace wi::scene buffer_offset = AlignTo(buffer_offset, alignment); impostor_vb_pos.offset = buffer_offset; - impostor_vb_pos.size = allocated_impostor_capacity * sizeof(MeshComponent::Vertex_POS32) * 4; - impostor_vb_pos.subresource_srv = device->CreateSubresource(&impostorBuffer, SubresourceType::SRV, impostor_vb_pos.offset, impostor_vb_pos.size, &MeshComponent::Vertex_POS32::FORMAT); - impostor_vb_pos.subresource_uav = device->CreateSubresource(&impostorBuffer, SubresourceType::UAV, impostor_vb_pos.offset, impostor_vb_pos.size); // can't have RGB32F format for UAV! + impostor_vb_pos.size = allocated_impostor_capacity * sizeof(MeshComponent::Vertex_POS32W) * 4; + impostor_vb_pos.subresource_srv = device->CreateSubresource(&impostorBuffer, SubresourceType::SRV, impostor_vb_pos.offset, impostor_vb_pos.size, &MeshComponent::Vertex_POS32W::FORMAT); + impostor_vb_pos.subresource_uav = device->CreateSubresource(&impostorBuffer, SubresourceType::UAV, impostor_vb_pos.offset, impostor_vb_pos.size, &MeshComponent::Vertex_POS32W::FORMAT); // can't have RGB32F format for UAV! impostor_vb_pos.descriptor_srv = device->GetDescriptorIndex(&impostorBuffer, SubresourceType::SRV, impostor_vb_pos.subresource_srv); impostor_vb_pos.descriptor_uav = device->GetDescriptorIndex(&impostorBuffer, SubresourceType::UAV, impostor_vb_pos.subresource_uav); buffer_offset += impostor_vb_pos.size; diff --git a/WickedEngine/wiScene_Components.cpp b/WickedEngine/wiScene_Components.cpp index 32e2b449d..f483ad3b2 100644 --- a/WickedEngine/wiScene_Components.cpp +++ b/WickedEngine/wiScene_Components.cpp @@ -1347,8 +1347,8 @@ namespace wi::scene const uint64_t alignment = device->GetMinOffsetAlignment(&desc) * sizeof(Vertex_POS32); // additional alignment for RGB32F desc.size = - AlignTo(vertex_positions.size() * sizeof(Vertex_POS32), alignment) + // pos - AlignTo(vertex_positions.size() * sizeof(Vertex_POS32), alignment) + // prevpos + AlignTo(vertex_positions.size() * sizeof(Vertex_POS32W), alignment) + // pos + AlignTo(vertex_positions.size() * sizeof(Vertex_POS32W), alignment) + // prevpos AlignTo(vertex_normals.size() * sizeof(Vertex_NOR), alignment) + AlignTo(vertex_tangents.size() * sizeof(Vertex_TAN), alignment) ; @@ -1360,18 +1360,18 @@ namespace wi::scene uint64_t buffer_offset = 0ull; so_pos.offset = buffer_offset; - so_pos.size = vertex_positions.size() * sizeof(Vertex_POS32); + so_pos.size = vertex_positions.size() * sizeof(Vertex_POS32W); buffer_offset += AlignTo(so_pos.size, alignment); - so_pos.subresource_srv = device->CreateSubresource(&streamoutBuffer, SubresourceType::SRV, so_pos.offset, so_pos.size, &Vertex_POS32::FORMAT); - so_pos.subresource_uav = device->CreateSubresource(&streamoutBuffer, SubresourceType::UAV, so_pos.offset, so_pos.size); // UAV can't have RGB32_F format! + so_pos.subresource_srv = device->CreateSubresource(&streamoutBuffer, SubresourceType::SRV, so_pos.offset, so_pos.size, &Vertex_POS32W::FORMAT); + so_pos.subresource_uav = device->CreateSubresource(&streamoutBuffer, SubresourceType::UAV, so_pos.offset, so_pos.size, &Vertex_POS32W::FORMAT); // UAV can't have RGB32_F format! so_pos.descriptor_srv = device->GetDescriptorIndex(&streamoutBuffer, SubresourceType::SRV, so_pos.subresource_srv); so_pos.descriptor_uav = device->GetDescriptorIndex(&streamoutBuffer, SubresourceType::UAV, so_pos.subresource_uav); so_pre.offset = buffer_offset; so_pre.size = so_pos.size; buffer_offset += AlignTo(so_pre.size, alignment); - so_pre.subresource_srv = device->CreateSubresource(&streamoutBuffer, SubresourceType::SRV, so_pre.offset, so_pre.size, &Vertex_POS32::FORMAT); - so_pre.subresource_uav = device->CreateSubresource(&streamoutBuffer, SubresourceType::UAV, so_pre.offset, so_pre.size); // UAV can't have RGB32_F format! + so_pre.subresource_srv = device->CreateSubresource(&streamoutBuffer, SubresourceType::SRV, so_pre.offset, so_pre.size, &Vertex_POS32W::FORMAT); + so_pre.subresource_uav = device->CreateSubresource(&streamoutBuffer, SubresourceType::UAV, so_pre.offset, so_pre.size, &Vertex_POS32W::FORMAT); // UAV can't have RGB32_F format! so_pre.descriptor_srv = device->GetDescriptorIndex(&streamoutBuffer, SubresourceType::SRV, so_pre.subresource_srv); so_pre.descriptor_uav = device->GetDescriptorIndex(&streamoutBuffer, SubresourceType::UAV, so_pre.subresource_uav); @@ -1441,8 +1441,8 @@ namespace wi::scene geometry.triangles.vertex_count = (uint32_t)vertex_positions.size(); if (so_pos.IsValid()) { - geometry.triangles.vertex_format = Vertex_POS32::FORMAT; - geometry.triangles.vertex_stride = sizeof(Vertex_POS32); + geometry.triangles.vertex_format = Format::R32G32B32_FLOAT; + geometry.triangles.vertex_stride = sizeof(Vertex_POS32W); } else { diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 2f5adea1b..08a056185 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -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 = 650; + const int revision = 651; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);