From 4bd3310b641f7b4f6bde1b80ca5f232dad21ff54 Mon Sep 17 00:00:00 2001 From: Pursche Date: Tue, 7 Apr 2026 20:29:41 +0200 Subject: [PATCH 1/2] Descriptor Set Validation fixes Apply fixes after reenabling descriptor set validation in engine submodule --- Source/Game-Lib/Game-Lib/Editor/Viewport.h | 2 +- .../Game-Lib/Rendering/CulledRenderer.cpp | 5 +-- .../Game-Lib/Rendering/CullingResources.cpp | 4 +-- .../Rendering/Debug/DebugRenderer.cpp | 3 -- .../Rendering/Material/MaterialRenderer.cpp | 1 + .../Rendering/Model/ModelRenderer.cpp | 1 + .../Rendering/Terrain/TerrainRenderer.cpp | 7 ++-- .../Rendering/Texture/TextureRenderer.cpp | 1 + Source/Shaders/Shaders.lua | 2 +- .../Shaders/DescriptorSet/Model.inc.slang | 16 +++++----- .../Include/VisibilityBuffers.inc.slang | 11 ++++--- .../Shaders/Material/MaterialPass.cs.slang | 2 +- Source/Shaders/Shaders/Model/Draw.ps.slang | 2 +- Source/Shaders/Shaders/Model/Draw.vs.slang | 13 ++++---- .../Shaders/Shaders/Model/DrawSkybox.ps.slang | 3 +- .../Shaders/Shaders/Model/DrawSkybox.vs.slang | 9 +++--- .../Shaders/Model/DrawTransparent.ps.slang | 4 ++- .../Shaders/Model/DrawTransparent.vs.slang | 9 +++--- .../Shaders/Model/ModelShared.inc.slang | 32 ++++++------------- .../Shaders/Shaders/Terrain/Culling.cs.slang | 3 +- .../Shaders/Utils/CullingInstanced.cs.slang | 4 +-- .../Shaders/Utils/ObjectQuery.cs.slang | 4 ++- 22 files changed, 67 insertions(+), 71 deletions(-) diff --git a/Source/Game-Lib/Game-Lib/Editor/Viewport.h b/Source/Game-Lib/Game-Lib/Editor/Viewport.h index 3001aa5e..dc4c8fac 100644 --- a/Source/Game-Lib/Game-Lib/Editor/Viewport.h +++ b/Source/Game-Lib/Game-Lib/Editor/Viewport.h @@ -37,7 +37,7 @@ namespace Editor vec2 _lastPanelSize = vec2(1920, 1080); vec2 _viewportPos = vec2(0, 0); - vec2 _viewportSize = vec2(0, 0); + vec2 _viewportSize = vec2(1920, 1080); bool _rightClickStartedInViewport = false; }; diff --git a/Source/Game-Lib/Game-Lib/Rendering/CulledRenderer.cpp b/Source/Game-Lib/Game-Lib/Rendering/CulledRenderer.cpp index 13efee20..94865ff3 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/CulledRenderer.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/CulledRenderer.cpp @@ -120,7 +120,6 @@ void CulledRenderer::OccluderPass(OccluderPassParams& params) params.occluderFillDescriptorSet.Bind("_culledDrawCallsBitMask"_h, params.culledDrawCallsBitMaskBuffer); // Bind descriptorset - params.commandList->BindDescriptorSet(params.globalDescriptorSet, params.frameIndex); params.commandList->BindDescriptorSet(params.occluderFillDescriptorSet, params.frameIndex); params.commandList->Dispatch((numInstances + 31) / 32, 1, 1); @@ -166,7 +165,6 @@ void CulledRenderer::OccluderPass(OccluderPassParams& params) cullConstants->drawCallDataSize = params.drawCallDataSize; params.commandList->PushConstant(cullConstants, 0, sizeof(CullConstants)); - params.commandList->BindDescriptorSet(params.globalDescriptorSet, params.frameIndex); params.commandList->BindDescriptorSet(params.createIndirectDescriptorSet, params.frameIndex); if (debugOrdered) @@ -453,7 +451,6 @@ void CulledRenderer::CullingPass(CullingPassParams& params) params.commandList->PushConstant(cullConstants, 0, sizeof(CullConstants)); params.commandList->BindDescriptorSet(params.debugDescriptorSet, params.frameIndex); - params.commandList->BindDescriptorSet(params.globalDescriptorSet, params.frameIndex); params.commandList->BindDescriptorSet(params.createIndirectAfterCullSet, params.frameIndex); if (debugOrdered) @@ -604,7 +601,7 @@ void CulledRenderer::GeometryPass(GeometryPassParams& params) FillDrawCallConstants* fillConstants = params.graphResources->FrameNew(); fillConstants->numTotalDraws = numDrawCalls; fillConstants->bitmaskOffset = i * params.cullingResources->GetBitMaskBufferUintsPerView(); - fillConstants->diffAgainstPrev = 1; // Geomeyry should diff against prev + fillConstants->diffAgainstPrev = 1; // Geometry should diff against prev params.commandList->PushConstant(fillConstants, 0, sizeof(FillDrawCallConstants)); params.fillDescriptorSet.Bind("_culledDrawCallsBitMask"_h, params.culledDrawCallsBitMaskBuffer); diff --git a/Source/Game-Lib/Game-Lib/Rendering/CullingResources.cpp b/Source/Game-Lib/Game-Lib/Rendering/CullingResources.cpp index c0e9a50b..f81feabc 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/CullingResources.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/CullingResources.cpp @@ -280,7 +280,7 @@ bool CullingResourcesIndexedBase::SyncToGPU(bool forceRecount) _cullingDescriptorSet.Bind("_drawCalls"_h, _drawCalls.GetBuffer()); if (_materialPassDescriptorSet != nullptr) { - _materialPassDescriptorSet->Bind("_modelDraws"_h, _drawCalls.GetBuffer()); + _materialPassDescriptorSet->Bind("_opaqueModelDraws"_h, _drawCalls.GetBuffer()); } // (Re)create Culled Instance Counts Buffer @@ -435,7 +435,7 @@ bool CullingResourcesNonIndexedBase::SyncToGPU(bool forceRecount) _cullingDescriptorSet.Bind("_drawCalls"_h, _drawCalls.GetBuffer()); if (_materialPassDescriptorSet != nullptr) { - _materialPassDescriptorSet->Bind("_modelDraws"_h, _drawCalls.GetBuffer()); + _materialPassDescriptorSet->Bind("_opaqueModelDraws"_h, _drawCalls.GetBuffer()); } // (Re)create Culled Instance Counts Buffer diff --git a/Source/Game-Lib/Game-Lib/Rendering/Debug/DebugRenderer.cpp b/Source/Game-Lib/Game-Lib/Rendering/Debug/DebugRenderer.cpp index ae5f8088..edfe7046 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Debug/DebugRenderer.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/Debug/DebugRenderer.cpp @@ -301,7 +301,6 @@ void DebugRenderer::Add2DPass(Renderer::RenderGraph* renderGraph, RenderResource { commandList.BeginPipeline(pipeline); - //commandList.BindDescriptorSet2(data.globalSet, frameIndex); // TODO: Enable this with validation layers and find a way to print a better warning that this shader doesn't need this descriptorset commandList.BindDescriptorSet(data.drawSolid2DSet, frameIndex); // Draw @@ -319,7 +318,6 @@ void DebugRenderer::Add2DPass(Renderer::RenderGraph* renderGraph, RenderResource { commandList.BeginPipeline(pipeline); - //commandList.BindDescriptorSet2(data.globalSet, frameIndex); // TODO: Enable this with validation layers and find a way to print a better warning that this shader doesn't need this descriptorset commandList.BindDescriptorSet(data.draw2DSet, frameIndex); // Draw @@ -333,7 +331,6 @@ void DebugRenderer::Add2DPass(Renderer::RenderGraph* renderGraph, RenderResource { commandList.BeginPipeline(pipeline); - //commandList.BindDescriptorSet2(data.globalSet, frameIndex); // TODO: Enable this with validation layers and find a way to print a better warning that this shader doesn't need this descriptorset commandList.BindDescriptorSet(data.draw2DIndirectSet, frameIndex); // Draw diff --git a/Source/Game-Lib/Game-Lib/Rendering/Material/MaterialRenderer.cpp b/Source/Game-Lib/Game-Lib/Rendering/Material/MaterialRenderer.cpp index 54850ea8..7e492a0d 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Material/MaterialRenderer.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/Material/MaterialRenderer.cpp @@ -324,6 +324,7 @@ void MaterialRenderer::CreatePermanentResources() samplerDesc.shaderVisibility = Renderer::ShaderVisibility::ALL; _sampler = _renderer->CreateSampler(samplerDesc); + _preEffectsPassDescriptorSet.Bind("_sampler"_h, _sampler); _materialPassDescriptorSet.Bind("_sampler"_h, _sampler); _directionalLights.SetDebugName("Directional Lights"); diff --git a/Source/Game-Lib/Game-Lib/Rendering/Model/ModelRenderer.cpp b/Source/Game-Lib/Game-Lib/Rendering/Model/ModelRenderer.cpp index 5ab48cf5..5a36b3ff 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Model/ModelRenderer.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/Model/ModelRenderer.cpp @@ -1174,6 +1174,7 @@ void ModelRenderer::RegisterMaterialPassBufferUsage(Renderer::RenderGraphBuilder builder.Read(_opaqueCullingResources.GetDrawCalls().GetBuffer(), BufferUsage::COMPUTE); builder.Read(_opaqueCullingResources.GetDrawCallDatas().GetBuffer(), BufferUsage::COMPUTE); builder.Read(_opaqueCullingResources.GetInstanceRefs().GetBuffer(), BufferUsage::COMPUTE); + builder.Read(_opaqueCullingResources.GetCulledInstanceLookupTableBuffer(), BufferUsage::COMPUTE); builder.Read(_vertices.GetBuffer(), BufferUsage::COMPUTE); builder.Read(_indices.GetBuffer(), BufferUsage::COMPUTE); builder.Read(_textureDatas.GetBuffer(), BufferUsage::COMPUTE); diff --git a/Source/Game-Lib/Game-Lib/Rendering/Terrain/TerrainRenderer.cpp b/Source/Game-Lib/Game-Lib/Rendering/Terrain/TerrainRenderer.cpp index 1dd23df2..25dcd340 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Terrain/TerrainRenderer.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/Terrain/TerrainRenderer.cpp @@ -164,6 +164,7 @@ void TerrainRenderer::AddOccluderPass(Renderer::RenderGraph* renderGraph, Render builder.Read(_instanceDatas.GetBuffer(), BufferUsage::COMPUTE | BufferUsage::GRAPHICS); builder.Read(_vertices.GetBuffer(), BufferUsage::GRAPHICS); builder.Read(_cellDatas.GetBuffer(), BufferUsage::GRAPHICS); + builder.Read(_chunkDatas.GetBuffer(), BufferUsage::GRAPHICS); builder.Read(resources.cameras.GetBuffer(), BufferUsage::GRAPHICS); data.culledInstanceBuffer = builder.Write(_culledInstanceBuffer, BufferUsage::TRANSFER | BufferUsage::COMPUTE | BufferUsage::GRAPHICS); @@ -457,9 +458,10 @@ void TerrainRenderer::AddGeometryPass(Renderer::RenderGraph* renderGraph, Render builder.Read(resources.cameras.GetBuffer(), BufferUsage::GRAPHICS); builder.Read(_vertices.GetBuffer(), BufferUsage::GRAPHICS); builder.Read(_cellDatas.GetBuffer(), BufferUsage::GRAPHICS); + builder.Read(_chunkDatas.GetBuffer(), BufferUsage::GRAPHICS); if (cullingEnabled) { - builder.Read(_instanceDatas.GetBuffer(), BufferUsage::COMPUTE); + builder.Read(_instanceDatas.GetBuffer(), BufferUsage::COMPUTE | BufferUsage::GRAPHICS); } data.argumentBuffer = builder.Write(_argumentBuffer, BufferUsage::TRANSFER | BufferUsage::GRAPHICS | BufferUsage::COMPUTE); @@ -1124,7 +1126,7 @@ void TerrainRenderer::SyncToGPU() if (_instanceDatas.SyncToGPU(_renderer)) { - resources.terrainDescriptorSet.Bind("_instanceDatas", _instanceDatas.GetBuffer()); + resources.terrainDescriptorSet.Bind("_instanceDatas"_h, _instanceDatas.GetBuffer()); _occluderFillPassDescriptorSet.Bind("_instances"_h, _instanceDatas.GetBuffer()); _geometryFillPassDescriptorSet.Bind("_instances"_h, _instanceDatas.GetBuffer()); _cullingPassDescriptorSet.Bind("_instances"_h, _instanceDatas.GetBuffer()); @@ -1136,6 +1138,7 @@ void TerrainRenderer::SyncToGPU() desc.name = "TerrainCulledInstanceBuffer"; _culledInstanceBuffer = _renderer->CreateBuffer(_culledInstanceBuffer, desc); + resources.terrainDescriptorSet.Bind("_culledInstanceDatas"_h, _culledInstanceBuffer); _cullingPassDescriptorSet.Bind("_culledInstances"_h, _culledInstanceBuffer); _occluderFillPassDescriptorSet.Bind("_culledInstances"_h, _culledInstanceBuffer); _geometryFillPassDescriptorSet.Bind("_culledInstances"_h, _culledInstanceBuffer); diff --git a/Source/Game-Lib/Game-Lib/Rendering/Texture/TextureRenderer.cpp b/Source/Game-Lib/Game-Lib/Rendering/Texture/TextureRenderer.cpp index c052010f..6aaf2989 100644 --- a/Source/Game-Lib/Game-Lib/Rendering/Texture/TextureRenderer.cpp +++ b/Source/Game-Lib/Game-Lib/Rendering/Texture/TextureRenderer.cpp @@ -176,6 +176,7 @@ void TextureRenderer::AddTexturePass(Renderer::RenderGraph* renderGraph, RenderR Renderer::TextureID textureID = Renderer::TextureID(texture); ResolveMips(graphResources, commandList, frameIndex, data.mipResolveDescriptorSet, textureID); } + //commandList.ImageBarrier() // Reset the viewport and scissor vec2 renderSize = _renderer->GetRenderSize(); diff --git a/Source/Shaders/Shaders.lua b/Source/Shaders/Shaders.lua index feabfea7..a995ed28 100644 --- a/Source/Shaders/Shaders.lua +++ b/Source/Shaders/Shaders.lua @@ -29,6 +29,6 @@ Solution.Util.CreateProject(mod.Name, "Utility", Solution.Projects.Current.BinDi end) vpaths { - ["/*"] = { "*.lua", mod.Name .. "/**" } + ["/*"] = { "*.lua", mod.Name } } end) \ No newline at end of file diff --git a/Source/Shaders/Shaders/DescriptorSet/Model.inc.slang b/Source/Shaders/Shaders/DescriptorSet/Model.inc.slang index 13c59407..eb9b47de 100644 --- a/Source/Shaders/Shaders/DescriptorSet/Model.inc.slang +++ b/Source/Shaders/Shaders/DescriptorSet/Model.inc.slang @@ -10,14 +10,14 @@ [[vk::binding(0, MODEL)]] StructuredBuffer _opaqueCulledInstanceLookupTable; // One uint per instance, contains instanceRefID of what survives culling, and thus can get reordered [[vk::binding(1, MODEL)]] StructuredBuffer _opaqueInstanceRefTable; -[[vk::binding(2, MODEL)]] StructuredBuffer _packedModelTextureDatas; -[[vk::binding(3, MODEL)]] StructuredBuffer _packedModelVertices; -[[vk::binding(4, MODEL)]] StructuredBuffer _modelInstanceDatas; -[[vk::binding(5, MODEL)]] StructuredBuffer _modelInstanceMatrices; -[[vk::binding(6, MODEL)]] StructuredBuffer _instanceBoneMatrices; -[[vk::binding(7, MODEL)]] StructuredBuffer _instanceTextureTransformMatrices; -[[vk::binding(8, MODEL)]] RWStructuredBuffer _animatedModelVertexPositions; -[[vk::binding(9, MODEL)]] StructuredBuffer _modelDraws; +[[vk::binding(2, MODEL)]] StructuredBuffer _opaqueModelDraws; +[[vk::binding(3, MODEL)]] StructuredBuffer _packedModelTextureDatas; +[[vk::binding(4, MODEL)]] StructuredBuffer _packedModelVertices; +[[vk::binding(5, MODEL)]] StructuredBuffer _modelInstanceDatas; +[[vk::binding(6, MODEL)]] StructuredBuffer _modelInstanceMatrices; +[[vk::binding(7, MODEL)]] StructuredBuffer _instanceBoneMatrices; +[[vk::binding(8, MODEL)]] StructuredBuffer _instanceTextureTransformMatrices; +[[vk::binding(9, MODEL)]] RWStructuredBuffer _animatedModelVertexPositions; [[vk::binding(10, MODEL)]] StructuredBuffer _modelIndices; [[vk::binding(11, MODEL)]] StructuredBuffer _modelTextureUnits; [[vk::binding(12, MODEL)]] SamplerState _samplers[MAX_MODEL_SAMPLERS]; diff --git a/Source/Shaders/Shaders/Include/VisibilityBuffers.inc.slang b/Source/Shaders/Shaders/Include/VisibilityBuffers.inc.slang index 100772b8..95d7aee6 100644 --- a/Source/Shaders/Shaders/Include/VisibilityBuffers.inc.slang +++ b/Source/Shaders/Shaders/Include/VisibilityBuffers.inc.slang @@ -2,6 +2,7 @@ #define VISIBILITYBUFFERS_INCLUDED #include "DescriptorSet/Global.inc.slang" +#include "DescriptorSet/Model.inc.slang" #include "Model/ModelShared.inc.slang" #include "Terrain/TerrainShared.inc.slang" @@ -423,22 +424,22 @@ PixelVertexData GetPixelVertexDataTerrain(const uint2 pixelPos, const Visibility PixelVertexData GetPixelVertexDataModel(const uint2 pixelPos, const VisibilityBuffer vBuffer, const uint cameraIndex, float2 renderSize) { - InstanceRef instanceRef = GetOpaqueModelInstanceID(vBuffer.instanceID); + InstanceRef instanceRef = _opaqueInstanceRefTable[vBuffer.instanceID]; uint instanceID = instanceRef.instanceID; uint drawID = instanceRef.drawID; ModelInstanceData instanceData = _modelInstanceDatas[instanceID]; - IndexedDraw draw = _modelDraws[drawID]; + IndexedDraw draw = _opaqueModelDraws[drawID]; uint3 vertexIDs = GetVertexIDs(vBuffer.triangleID, draw, _modelIndices); ModelVertex vertices[3]; [unroll] - for (uint i = 0; i < 3; i++) + for (uint i = 0; i < 3; i++) { - vertices[i] = LoadModelVertex(vertexIDs[i]); + vertices[i] = LoadModelVertex(_packedModelVertices, vertexIDs[i]); if (instanceData.boneMatrixOffset != 4294967295) { - float4x4 boneTransformMatrix = CalcBoneTransformMatrix(instanceData, vertices[i]); + float4x4 boneTransformMatrix = CalcBoneTransformMatrix(_instanceBoneMatrices, instanceData, vertices[i]); vertices[i].position = mul(float4(vertices[i].position, 1.0f), boneTransformMatrix).xyz; vertices[i].normal = mul(vertices[i].normal, (float3x3)boneTransformMatrix); } diff --git a/Source/Shaders/Shaders/Material/MaterialPass.cs.slang b/Source/Shaders/Shaders/Material/MaterialPass.cs.slang index 22369993..68864f19 100644 --- a/Source/Shaders/Shaders/Material/MaterialPass.cs.slang +++ b/Source/Shaders/Shaders/Material/MaterialPass.cs.slang @@ -237,7 +237,7 @@ float4 ShadeModel(const uint2 pixelPos, const float2 screenUV, const VisibilityB // Get the interpolated vertex data from the visibility buffer PixelVertexData pixelVertexData = GetPixelVertexDataModel(pixelPos, vBuffer, 0, _constants.renderInfo.xy); - TextureData textureData = LoadModelTextureData(pixelVertexData.extraID); + TextureData textureData = LoadModelTextureData(_packedModelTextureDatas, pixelVertexData.extraID); // Shade float4 color = float4(0, 0, 0, 0); diff --git a/Source/Shaders/Shaders/Model/Draw.ps.slang b/Source/Shaders/Shaders/Model/Draw.ps.slang index aea5e5d8..0d0fcadd 100644 --- a/Source/Shaders/Shaders/Model/Draw.ps.slang +++ b/Source/Shaders/Shaders/Model/Draw.ps.slang @@ -34,7 +34,7 @@ PSOutput main(PSInput input) uint textureDataID = input.drawIDInstanceIDTextureDataIDInstanceRefID.z; uint instanceRefID = input.drawIDInstanceIDTextureDataIDInstanceRefID.w; - TextureData textureData = LoadModelTextureData(textureDataID); + TextureData textureData = LoadModelTextureData(_packedModelTextureDatas, textureDataID); for (uint textureUnitIndex = textureData.textureUnitOffset; textureUnitIndex < textureData.textureUnitOffset + textureData.numTextureUnits; textureUnitIndex++) { diff --git a/Source/Shaders/Shaders/Model/Draw.vs.slang b/Source/Shaders/Shaders/Model/Draw.vs.slang index cf68c216..fc780812 100644 --- a/Source/Shaders/Shaders/Model/Draw.vs.slang +++ b/Source/Shaders/Shaders/Model/Draw.vs.slang @@ -3,6 +3,7 @@ permutation SHADOW_PASS = [0, 1]; #define GEOMETRY_PASS 1 #include "DescriptorSet/Global.inc.slang" +#include "DescriptorSet/Model.inc.slang" #include "Include/Common.inc.slang" #include "Model/ModelShared.inc.slang" @@ -32,16 +33,16 @@ struct VSOutput [shader("vertex")] VSOutput main(VSInput input) { - uint instanceRefID = GetOpaqueInstanceRefID(input.culledInstanceID); - InstanceRef instanceRef = GetOpaqueModelInstanceID(instanceRefID); + uint instanceRefID = _opaqueCulledInstanceLookupTable[input.culledInstanceID]; + InstanceRef instanceRef = _opaqueInstanceRefTable[instanceRefID]; uint instanceID = instanceRef.instanceID; uint drawID = instanceRef.drawID; ModelInstanceData instanceData = _modelInstanceDatas[instanceID]; // Skin this vertex - ModelVertex vertex = LoadModelVertex(input.vertexID); - float4x4 boneTransformMatrix = CalcBoneTransformMatrix(instanceData, vertex); + ModelVertex vertex = LoadModelVertex(_packedModelVertices, input.vertexID); + float4x4 boneTransformMatrix = CalcBoneTransformMatrix(_instanceBoneMatrices, instanceData, vertex); float4 position = mul(float4(vertex.position, 1.0f), boneTransformMatrix); // Save the skinned vertex position (in model-space) if this vertex was animated @@ -50,7 +51,7 @@ VSOutput main(VSInput input) uint localVertexID = input.vertexID - instanceData.modelVertexOffset; // This gets the local vertex ID relative to the model uint animatedVertexID = localVertexID + instanceData.animatedVertexOffset; // This makes it relative to the animated instance - StoreAnimatedVertexPosition(animatedVertexID, position.xyz); + StoreAnimatedVertexPosition(_animatedModelVertexPositions, animatedVertexID, position.xyz); } float4x4 instanceMatrix = _modelInstanceMatrices[instanceID]; @@ -67,7 +68,7 @@ VSOutput main(VSInput input) if (instanceData.textureTransformMatrixOffset != 4294967295) { - TextureData textureData = LoadModelTextureData(instanceRef.extraID); + TextureData textureData = LoadModelTextureData(_packedModelTextureDatas, instanceRef.extraID); uint numTextureUnits = textureData.numTextureUnits; if (numTextureUnits > 0) diff --git a/Source/Shaders/Shaders/Model/DrawSkybox.ps.slang b/Source/Shaders/Shaders/Model/DrawSkybox.ps.slang index 4dc03c77..c72898a7 100644 --- a/Source/Shaders/Shaders/Model/DrawSkybox.ps.slang +++ b/Source/Shaders/Shaders/Model/DrawSkybox.ps.slang @@ -2,6 +2,7 @@ permutation TRANSPARENCY = [0, 1]; #define GEOMETRY_PASS 1 #include "DescriptorSet/Global.inc.slang" +#include "DescriptorSet/Model.inc.slang" #include "Include/Common.inc.slang" #include "Include/OIT.inc.slang" @@ -28,7 +29,7 @@ struct PSOutput [shader("fragment")] PSOutput main(PSInput input) { - TextureData textureData = LoadModelTextureData(input.textureDataID); + TextureData textureData = LoadModelTextureData(_packedModelTextureDatas, input.textureDataID); float4 color = float4(0, 0, 0, 0); diff --git a/Source/Shaders/Shaders/Model/DrawSkybox.vs.slang b/Source/Shaders/Shaders/Model/DrawSkybox.vs.slang index c10acfcc..830c8f67 100644 --- a/Source/Shaders/Shaders/Model/DrawSkybox.vs.slang +++ b/Source/Shaders/Shaders/Model/DrawSkybox.vs.slang @@ -1,5 +1,6 @@ #include "DescriptorSet/Global.inc.slang" +#include "DescriptorSet/Model.inc.slang" #include "Include/Common.inc.slang" #include "Model/ModelShared.inc.slang" @@ -32,8 +33,8 @@ VSOutput main(VSInput input) ModelInstanceData instanceData = _modelInstanceDatas[instanceID]; // Skin this vertex - ModelVertex vertex = LoadModelVertex(input.vertexID); - float4x4 boneTransformMatrix = CalcBoneTransformMatrix(instanceData, vertex); + ModelVertex vertex = LoadModelVertex(_packedModelVertices, input.vertexID); + float4x4 boneTransformMatrix = CalcBoneTransformMatrix(_instanceBoneMatrices, instanceData, vertex); float4 position = mul(float4(vertex.position, 1.0f), boneTransformMatrix); // Save the skinned vertex position (in model-space) if this vertex was animated @@ -42,7 +43,7 @@ VSOutput main(VSInput input) uint localVertexID = input.vertexID - instanceData.modelVertexOffset; // This gets the local vertex ID relative to the model uint animatedVertexID = localVertexID + instanceData.animatedVertexOffset; // This makes it relative to the animated instance - StoreAnimatedVertexPosition(animatedVertexID, position.xyz); + StoreAnimatedVertexPosition(_animatedModelVertexPositions, animatedVertexID, position.xyz); } float4x4 instanceMatrix = _modelInstanceMatrices[instanceID]; @@ -52,7 +53,7 @@ VSOutput main(VSInput input) if (instanceData.textureTransformMatrixOffset != 4294967295) { - TextureData textureData = LoadModelTextureData(textureDataID); + TextureData textureData = LoadModelTextureData(_packedModelTextureDatas, textureDataID); uint numTextureUnits = textureData.numTextureUnits; if (numTextureUnits > 0) diff --git a/Source/Shaders/Shaders/Model/DrawTransparent.ps.slang b/Source/Shaders/Shaders/Model/DrawTransparent.ps.slang index 5954d107..77895cd1 100644 --- a/Source/Shaders/Shaders/Model/DrawTransparent.ps.slang +++ b/Source/Shaders/Shaders/Model/DrawTransparent.ps.slang @@ -1,7 +1,9 @@ #define GEOMETRY_PASS 1 +#define MAX_MODEL_SAMPLERS 4 #include "DescriptorSet/Global.inc.slang" +#include "DescriptorSet/Model.inc.slang" #include "Include/Common.inc.slang" #include "Include/OIT.inc.slang" @@ -25,7 +27,7 @@ struct PSOutput [shader("fragment")] PSOutput main(PSInput input) { - TextureData textureData = LoadModelTextureData(input.textureDataID); + TextureData textureData = LoadModelTextureData(_packedModelTextureDatas, input.textureDataID); float4 color = float4(0, 0, 0, 0); diff --git a/Source/Shaders/Shaders/Model/DrawTransparent.vs.slang b/Source/Shaders/Shaders/Model/DrawTransparent.vs.slang index 5f13919e..75fb90dc 100644 --- a/Source/Shaders/Shaders/Model/DrawTransparent.vs.slang +++ b/Source/Shaders/Shaders/Model/DrawTransparent.vs.slang @@ -1,5 +1,6 @@ #include "DescriptorSet/Global.inc.slang" +#include "DescriptorSet/Model.inc.slang" #include "Include/Common.inc.slang" #include "Model/ModelShared.inc.slang" @@ -34,8 +35,8 @@ VSOutput main(VSInput input) ModelInstanceData instanceData = _modelInstanceDatas[instanceID]; // Skin this vertex - ModelVertex vertex = LoadModelVertex(input.vertexID); - float4x4 boneTransformMatrix = CalcBoneTransformMatrix(instanceData, vertex); + ModelVertex vertex = LoadModelVertex(_packedModelVertices, input.vertexID); + float4x4 boneTransformMatrix = CalcBoneTransformMatrix(_instanceBoneMatrices, instanceData, vertex); float4 position = mul(float4(vertex.position, 1.0f), boneTransformMatrix); // Save the skinned vertex position (in model-space) if this vertex was animated @@ -44,7 +45,7 @@ VSOutput main(VSInput input) uint localVertexID = input.vertexID - instanceData.modelVertexOffset; // This gets the local vertex ID relative to the model uint animatedVertexID = localVertexID + instanceData.animatedVertexOffset; // This makes it relative to the animated instance - StoreAnimatedVertexPosition(animatedVertexID, position.xyz); + StoreAnimatedVertexPosition(_animatedModelVertexPositions, animatedVertexID, position.xyz); } float4x4 instanceMatrix = _modelInstanceMatrices[instanceID]; @@ -54,7 +55,7 @@ VSOutput main(VSInput input) if (instanceData.textureTransformMatrixOffset != 4294967295) { - TextureData textureData = LoadModelTextureData(textureDataID); + TextureData textureData = LoadModelTextureData(_packedModelTextureDatas, textureDataID); uint numTextureUnits = textureData.numTextureUnits; if (numTextureUnits > 0) diff --git a/Source/Shaders/Shaders/Model/ModelShared.inc.slang b/Source/Shaders/Shaders/Model/ModelShared.inc.slang index 6f9b43cb..90a952ce 100644 --- a/Source/Shaders/Shaders/Model/ModelShared.inc.slang +++ b/Source/Shaders/Shaders/Model/ModelShared.inc.slang @@ -1,8 +1,6 @@ #ifndef MODEL_SHARED_INCLUDED #define MODEL_SHARED_INCLUDED -#include "DescriptorSet/Model.inc.slang" - #include "Include/Common.inc.slang" #ifndef GEOMETRY_PASS @@ -42,19 +40,9 @@ struct InstanceRef uint padding; }; -uint GetOpaqueInstanceRefID(uint culledInstanceID) -{ - return _opaqueCulledInstanceLookupTable[culledInstanceID]; -} - -InstanceRef GetOpaqueModelInstanceID(uint instanceRefID) -{ - return _opaqueInstanceRefTable[instanceRefID]; -} - -TextureData LoadModelTextureData(uint textureDataID) +TextureData LoadModelTextureData(StructuredBuffer packedModelTextureDatas, uint textureDataID) { - PackedTextureData packedTextureData = _packedModelTextureDatas[textureDataID]; + PackedTextureData packedTextureData = packedModelTextureDatas[textureDataID]; TextureData textureData; textureData.textureUnitOffset = packedTextureData.textureUnitOffset; @@ -143,9 +131,9 @@ float4 UnpackModelBoneWeights(PackedModelVertex packedVertex) return boneWeights; } -ModelVertex LoadModelVertex(uint vertexID) +ModelVertex LoadModelVertex(StructuredBuffer packedModelVertices, uint vertexID) { - PackedModelVertex packedVertex = _packedModelVertices[vertexID]; + PackedModelVertex packedVertex = packedModelVertices[vertexID]; ModelVertex vertex; vertex.position = float3(UnpackModelPosition(packedVertex).x, UnpackModelPosition(packedVertex).y, UnpackModelPosition(packedVertex).z); @@ -169,19 +157,19 @@ struct PackedAnimatedVertexPosition uint packed1; // half position.z, padding }; -void StoreAnimatedVertexPosition(uint animatedVertexID, float3 position) +void StoreAnimatedVertexPosition(RWStructuredBuffer animatedModelVertexPositions, uint animatedVertexID, float3 position) { PackedAnimatedVertexPosition packedAnimatedVertexPosition; packedAnimatedVertexPosition.packed0 = f32tof16(position.x); packedAnimatedVertexPosition.packed0 |= f32tof16(position.y) << 16; packedAnimatedVertexPosition.packed1 = f32tof16(position.z); - _animatedModelVertexPositions[animatedVertexID] = packedAnimatedVertexPosition; + animatedModelVertexPositions[animatedVertexID] = packedAnimatedVertexPosition; } -float3 LoadAnimatedVertexPosition(uint animatedVertexID) +float3 LoadAnimatedVertexPosition(RWStructuredBuffer animatedModelVertexPositions, uint animatedVertexID) { - PackedAnimatedVertexPosition packedAnimatedVertexPosition = _animatedModelVertexPositions[animatedVertexID]; + PackedAnimatedVertexPosition packedAnimatedVertexPosition = animatedModelVertexPositions[animatedVertexID]; float3 position; position.x = f16tof32(packedAnimatedVertexPosition.packed0); @@ -190,7 +178,7 @@ float3 LoadAnimatedVertexPosition(uint animatedVertexID) return position; } -float4x4 CalcBoneTransformMatrix(const ModelInstanceData instanceData, ModelVertex vertex) +float4x4 CalcBoneTransformMatrix(StructuredBuffer instanceBoneMatrices, const ModelInstanceData instanceData, ModelVertex vertex) { float4x4 boneTransformMatrix = float4x4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); @@ -202,7 +190,7 @@ float4x4 CalcBoneTransformMatrix(const ModelInstanceData instanceData, ModelVert for (int j = 0; j < 4; j++) { //boneTransformMatrix += mul(vertex.boneWeights[j], _instanceBoneMatrices[instanceData.boneMatrixOffset + vertex.boneIndices[j]]); // Previous line, Slang did not like this - boneTransformMatrix += _instanceBoneMatrices[instanceData.boneMatrixOffset + vertex.boneIndices[j]] * vertex.boneWeights[j]; + boneTransformMatrix += instanceBoneMatrices[instanceData.boneMatrixOffset + vertex.boneIndices[j]] * vertex.boneWeights[j]; } } diff --git a/Source/Shaders/Shaders/Terrain/Culling.cs.slang b/Source/Shaders/Shaders/Terrain/Culling.cs.slang index 4b002d1e..57067122 100644 --- a/Source/Shaders/Shaders/Terrain/Culling.cs.slang +++ b/Source/Shaders/Shaders/Terrain/Culling.cs.slang @@ -33,8 +33,7 @@ struct HeightRange // Outputs [[vk::binding(5, PER_PASS)]] RWStructuredBuffer _culledInstancesBitMask; -[[vk::binding(6, PER_PASS)]] RWByteAddressBuffer _arguments; -[[vk::binding(7, PER_PASS)]] RWByteAddressBuffer _culledInstances; +[[vk::binding(6, PER_PASS)]] RWByteAddressBuffer _culledInstances; float2 ReadHeightRange(uint instanceIndex) { diff --git a/Source/Shaders/Shaders/Utils/CullingInstanced.cs.slang b/Source/Shaders/Shaders/Utils/CullingInstanced.cs.slang index 548471f3..b1859241 100644 --- a/Source/Shaders/Shaders/Utils/CullingInstanced.cs.slang +++ b/Source/Shaders/Shaders/Utils/CullingInstanced.cs.slang @@ -54,13 +54,13 @@ struct CullingData [[vk::binding(5, PER_PASS)]] SamplerState _depthSampler; [[vk::binding(6, PER_PASS)]] Texture2D _depthPyramid; // TODO: Occlusion culling for shadow cascades? -//#if USE_BITMASKS +#if USE_BITMASKS // TODO: When instanceCounts resizes we need to invalidate (zero out) _prevCulledInstancesBitMask since a single index in current and prev would point to different actual drawcalls [[vk::binding(7, PER_PASS)]] StructuredBuffer _prevCulledDrawCallsBitMask; // TODO: Rename to _prevCulledInstancesBitMask, with instanced rendering we need to count these per instance instead of per draw // Outputs [[vk::binding(8, PER_PASS)]] RWStructuredBuffer _culledDrawCallsBitMask; // TODO: Rename to _culledInstancesBitMask, with instanced rendering we need to count these per instance instead of per draw -//#endif +#endif [[vk::binding(9, PER_PASS)]] RWByteAddressBuffer _culledInstanceCounts; // One uint per draw call [[vk::binding(12, PER_PASS)]] RWStructuredBuffer _culledInstanceLookupTable; // One uint per instance, contains instanceRefID of what survives culling, and thus can get reordered diff --git a/Source/Shaders/Shaders/Utils/ObjectQuery.cs.slang b/Source/Shaders/Shaders/Utils/ObjectQuery.cs.slang index 0938f87a..5185b823 100644 --- a/Source/Shaders/Shaders/Utils/ObjectQuery.cs.slang +++ b/Source/Shaders/Shaders/Utils/ObjectQuery.cs.slang @@ -1,4 +1,6 @@ +#include "DescriptorSet/Model.inc.slang" + #include "Include/VisibilityBuffers.inc.slang" #include "Model/ModelShared.inc.slang" #include "Terrain/TerrainShared.inc.slang" @@ -41,7 +43,7 @@ void main(uint3 dispatchThreadId : SV_DispatchThreadID) } else { - InstanceRef instanceRef = GetOpaqueModelInstanceID(vBuffer.instanceID); + InstanceRef instanceRef = _opaqueInstanceRefTable[vBuffer.instanceID]; objectID = instanceRef.instanceID; } From 91ed37bb4d5f32b5411094f8558e569018715668 Mon Sep 17 00:00:00 2001 From: Pursche Date: Tue, 7 Apr 2026 20:32:11 +0200 Subject: [PATCH 2/2] Update Engine submodule Update Engine submodule --- Submodules/Engine | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Submodules/Engine b/Submodules/Engine index b4c1d7f0..67e495f3 160000 --- a/Submodules/Engine +++ b/Submodules/Engine @@ -1 +1 @@ -Subproject commit b4c1d7f05a3c22576776bca2ecb21ea518fb7343 +Subproject commit 67e495f3d28e6a30826b706f82dab69c82de65b8