From 6246c80dd82f84d3dff4ba767e20c6323d7c2530 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tur=C3=A1nszki=20J=C3=A1nos?= Date: Sat, 29 Jul 2023 10:53:15 +0200 Subject: [PATCH] enitity and matrix arrays changed to structured buffers --- WickedEngine/shaders/globals.hlsli | 20 +++++++++----------- WickedEngine/wiRenderer.cpp | 7 ++++--- WickedEngine/wiVersion.cpp | 2 +- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/WickedEngine/shaders/globals.hlsli b/WickedEngine/shaders/globals.hlsli index 4281fddf5..83e4ad2d8 100644 --- a/WickedEngine/shaders/globals.hlsli +++ b/WickedEngine/shaders/globals.hlsli @@ -62,7 +62,9 @@ "SRV(t0, space = 34, offset = 0, numDescriptors = unbounded, flags = DESCRIPTORS_VOLATILE | DATA_VOLATILE)," \ "SRV(t0, space = 35, offset = 0, numDescriptors = unbounded, flags = DESCRIPTORS_VOLATILE | DATA_VOLATILE)," \ "SRV(t0, space = 36, offset = 0, numDescriptors = unbounded, flags = DESCRIPTORS_VOLATILE | DATA_VOLATILE)," \ - "SRV(t0, space = 37, offset = 0, numDescriptors = unbounded, flags = DESCRIPTORS_VOLATILE | DATA_VOLATILE)" \ + "SRV(t0, space = 37, offset = 0, numDescriptors = unbounded, flags = DESCRIPTORS_VOLATILE | DATA_VOLATILE)," \ + "SRV(t0, space = 38, offset = 0, numDescriptors = unbounded, flags = DESCRIPTORS_VOLATILE | DATA_VOLATILE)," \ + "SRV(t0, space = 39, offset = 0, numDescriptors = unbounded, flags = DESCRIPTORS_VOLATILE | DATA_VOLATILE)" \ "), " \ "StaticSampler(s100, addressU = TEXTURE_ADDRESS_CLAMP, addressV = TEXTURE_ADDRESS_CLAMP, addressW = TEXTURE_ADDRESS_CLAMP, filter = FILTER_MIN_MAG_MIP_LINEAR)," \ "StaticSampler(s101, addressU = TEXTURE_ADDRESS_WRAP, addressV = TEXTURE_ADDRESS_WRAP, addressW = TEXTURE_ADDRESS_WRAP, filter = FILTER_MIN_MAG_MIP_LINEAR)," \ @@ -186,11 +188,15 @@ RWTexture2D bindless_rwtextures_uint[] : register(space33); [[vk::binding(0, DESCRIPTOR_SET_BINDLESS_STORAGE_BUFFER)]] StructuredBuffer bindless_buffers_geometry[]; [[vk::binding(0, DESCRIPTOR_SET_BINDLESS_STORAGE_BUFFER)]] StructuredBuffer bindless_buffers_meshlet[]; [[vk::binding(0, DESCRIPTOR_SET_BINDLESS_STORAGE_BUFFER)]] StructuredBuffer bindless_buffers_material[]; +[[vk::binding(0, DESCRIPTOR_SET_BINDLESS_STORAGE_BUFFER)]] StructuredBuffer bindless_buffers_entity[]; +[[vk::binding(0, DESCRIPTOR_SET_BINDLESS_STORAGE_BUFFER)]] StructuredBuffer bindless_buffers_matrix[]; #else StructuredBuffer bindless_buffers_meshinstance[] : register(space34); StructuredBuffer bindless_buffers_geometry[] : register(space35); StructuredBuffer bindless_buffers_meshlet[] : register(space36); StructuredBuffer bindless_buffers_material[] : register(space37); +StructuredBuffer bindless_buffers_entity[] : register(space38); +StructuredBuffer bindless_buffers_matrix[] : register(space39); #endif // SPIRV inline FrameCB GetFrame() @@ -235,19 +241,11 @@ uint load_entitytile(uint tileIndex) } inline ShaderEntity load_entity(uint entityIndex) { - return bindless_buffers[GetFrame().buffer_entity_index].Load(entityIndex * sizeof(ShaderEntity)); + return bindless_buffers_entity[GetFrame().buffer_entity_index][entityIndex]; } inline float4x4 load_entitymatrix(uint matrixIndex) { - // Workaround for: https://github.com/microsoft/DirectXShaderCompiler/issues/4738 - ByteAddressBuffer buffer = bindless_buffers[GetFrame().buffer_entity_index]; - const uint offset = sizeof(ShaderEntity) * SHADER_ENTITY_COUNT + matrixIndex * sizeof(float4x4); - return transpose(float4x4( - buffer.Load(offset + 0 * sizeof(float4)), - buffer.Load(offset + 1 * sizeof(float4)), - buffer.Load(offset + 2 * sizeof(float4)), - buffer.Load(offset + 3 * sizeof(float4)) - )); + return bindless_buffers_matrix[GetFrame().buffer_entity_index][SHADER_ENTITY_COUNT + matrixIndex]; } struct PrimitiveID diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index bffad88ca..f53446dd7 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -1827,10 +1827,11 @@ void LoadBuffers() device->CreateBuffer(&bd, nullptr, &buffers[BUFFERTYPE_FRAMECB]); device->SetName(&buffers[BUFFERTYPE_FRAMECB], "buffers[BUFFERTYPE_FRAMECB]"); - bd.usage = Usage::DEFAULT; - bd.size = sizeof(ShaderEntity) * SHADER_ENTITY_COUNT + sizeof(XMMATRIX) * MATRIXARRAY_COUNT; + static_assert(sizeof(ShaderEntity) == sizeof(float4x4)); // stores both entities and matrices in same structured buffer + bd.stride = sizeof(ShaderEntity); + bd.size = bd.stride * (SHADER_ENTITY_COUNT + MATRIXARRAY_COUNT); bd.bind_flags = BindFlag::SHADER_RESOURCE; - bd.misc_flags = ResourceMiscFlag::BUFFER_RAW; + bd.misc_flags = ResourceMiscFlag::BUFFER_STRUCTURED; device->CreateBuffer(&bd, nullptr, &buffers[BUFFERTYPE_ENTITY]); device->SetName(&buffers[BUFFERTYPE_ENTITY], "buffers[BUFFERTYPE_ENTITY]"); diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 80b50c5b3..7e6325a66 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 = 264; + const int revision = 265; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);