From f8fd08a6231397bbdce68a11e109b08758e29074 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Fri, 20 Oct 2023 19:01:25 +0200 Subject: [PATCH] Clean up VkDescriptorSetManager a bit and bind the surface uniforms when drawing with gl_levelmesh --- .../vulkan/accelstructs/vk_lightmap.cpp | 4 +- .../descriptorsets/vk_descriptorset.cpp | 203 ++++++++++-------- .../vulkan/descriptorsets/vk_descriptorset.h | 92 +++++--- .../vulkan/pipelines/vk_renderpass.cpp | 16 +- .../vulkan/pipelines/vk_renderpass.h | 4 +- .../vulkan/textures/vk_hwtexture.cpp | 2 +- .../rendering/vulkan/vk_renderdevice.cpp | 49 +---- .../rendering/vulkan/vk_renderstate.cpp | 14 +- src/rendering/hwrenderer/doom_levelmesh.cpp | 59 ++++- src/rendering/hwrenderer/doom_levelmesh.h | 2 + .../shaders/scene/binding_rsbuffers.glsl | 9 +- .../static/shaders/scene/layout_shared.glsl | 2 +- 12 files changed, 266 insertions(+), 190 deletions(-) diff --git a/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp b/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp index b3ae224eb..29991d3c1 100644 --- a/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp +++ b/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp @@ -173,7 +173,7 @@ void VkLightmap::Render() cmdbuffer->bindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, raytrace.pipeline[GetRaytracePipelineIndex()].get()); cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, raytrace.pipelineLayout.get(), 0, raytrace.descriptorSet0.get()); cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, raytrace.pipelineLayout.get(), 1, raytrace.descriptorSet1.get()); - cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, raytrace.pipelineLayout.get(), 2, fb->GetDescriptorSetManager()->GetBindlessDescriptorSet()); + cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, raytrace.pipelineLayout.get(), 2, fb->GetDescriptorSetManager()->GetBindlessSet()); VkViewport viewport = {}; viewport.maxDepth = 1; @@ -728,7 +728,7 @@ void VkLightmap::CreateRaytracePipeline() raytrace.pipelineLayout = PipelineLayoutBuilder() .AddSetLayout(raytrace.descriptorSetLayout0.get()) .AddSetLayout(raytrace.descriptorSetLayout1.get()) - .AddSetLayout(fb->GetDescriptorSetManager()->GetBindlessSetLayout()) + .AddSetLayout(fb->GetDescriptorSetManager()->GetBindlessLayout()) #ifndef USE_DRAWINDIRECT .AddPushConstantRange(VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(LightmapRaytracePC)) #endif diff --git a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp index 80a2247d8..850b316a5 100644 --- a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp +++ b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp @@ -40,11 +40,13 @@ VkDescriptorSetManager::VkDescriptorSetManager(VulkanRenderDevice* fb) : fb(fb) { - CreateRSBufferSetLayout(); - CreateFixedSetLayout(); + CreateLevelMeshLayout(); + CreateRSBufferLayout(); + CreateFixedLayout(); + CreateLevelMeshPool(); CreateRSBufferPool(); - CreateFixedSetPool(); - CreateBindlessDescriptorSet(); + CreateFixedPool(); + CreateBindlessSet(); } VkDescriptorSetManager::~VkDescriptorSetManager() @@ -57,19 +59,18 @@ void VkDescriptorSetManager::Init() { UpdateFixedSet(); + RSBuffer.Set = RSBuffer.Pool->allocate(RSBuffer.Layout.get()); + LevelMesh.Set = LevelMesh.Pool->allocate(LevelMesh.Layout.get()); + auto rsbuffers = fb->GetBufferManager()->GetRSBuffers(); - auto rsbufferset = RSBufferDescriptorPool->allocate(RSBufferSetLayout.get()); - WriteDescriptors() - .AddBuffer(rsbufferset.get(), 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, rsbuffers->Viewpoint.UBO.get(), 0, sizeof(HWViewpointUniforms)) - .AddBuffer(rsbufferset.get(), 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, rsbuffers->MatrixBuffer->UBO(), 0, sizeof(MatricesUBO)) - .AddBuffer(rsbufferset.get(), 2, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, rsbuffers->SurfaceUniformsBuffer->UBO(), 0, sizeof(SurfaceUniformsUBO)) - .AddBuffer(rsbufferset.get(), 3, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, rsbuffers->Lightbuffer.UBO.get(), 0, sizeof(LightBufferUBO)) - .AddBuffer(rsbufferset.get(), 4, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, rsbuffers->Fogballbuffer.UBO.get(), 0, sizeof(FogballBufferUBO)) - .AddBuffer(rsbufferset.get(), 5, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, rsbuffers->Bonebuffer.SSO.get()) + .AddBuffer(RSBuffer.Set.get(), 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, rsbuffers->Viewpoint.UBO.get(), 0, sizeof(HWViewpointUniforms)) + .AddBuffer(RSBuffer.Set.get(), 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, rsbuffers->MatrixBuffer->UBO(), 0, sizeof(MatricesUBO)) + .AddBuffer(RSBuffer.Set.get(), 2, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, rsbuffers->SurfaceUniformsBuffer->UBO(), 0, sizeof(SurfaceUniformsUBO)) + .AddBuffer(RSBuffer.Set.get(), 3, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, rsbuffers->Lightbuffer.UBO.get(), 0, sizeof(LightBufferUBO)) + .AddBuffer(RSBuffer.Set.get(), 4, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, rsbuffers->Fogballbuffer.UBO.get(), 0, sizeof(FogballBufferUBO)) + .AddBuffer(RSBuffer.Set.get(), 5, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, rsbuffers->Bonebuffer.SSO.get()) .Execute(fb->GetDevice()); - - RSBufferSet = std::move(rsbufferset); } void VkDescriptorSetManager::Deinit() @@ -83,29 +84,41 @@ void VkDescriptorSetManager::BeginFrame() UpdateFixedSet(); } +void VkDescriptorSetManager::UpdateLevelMeshSet() +{ + auto rsbuffers = fb->GetBufferManager()->GetRSBuffers(); + WriteDescriptors() + .AddBuffer(LevelMesh.Set.get(), 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, rsbuffers->Viewpoint.UBO.get(), 0, sizeof(HWViewpointUniforms)) + .AddBuffer(LevelMesh.Set.get(), 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, rsbuffers->MatrixBuffer->UBO(), 0, sizeof(MatricesUBO)) + .AddBuffer(LevelMesh.Set.get(), 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetRaytrace()->GetSurfaceUniformsBuffer()) + .AddBuffer(LevelMesh.Set.get(), 3, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, rsbuffers->Lightbuffer.UBO.get(), 0, sizeof(LightBufferUBO)) + .AddBuffer(LevelMesh.Set.get(), 4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, rsbuffers->Bonebuffer.SSO.get()) + .Execute(fb->GetDevice()); +} + void VkDescriptorSetManager::UpdateFixedSet() { - fb->GetCommands()->DrawDeleteList->Add(std::move(FixedSet)); + fb->GetCommands()->DrawDeleteList->Add(std::move(Fixed.Set)); - FixedSet = FixedDescriptorPool->tryAllocate(FixedSetLayout.get()); - if (!FixedSet) + Fixed.Set = Fixed.Pool->tryAllocate(Fixed.Layout.get()); + if (!Fixed.Set) { fb->GetCommands()->WaitForCommands(false); - FixedSet = FixedDescriptorPool->allocate(FixedSetLayout.get()); + Fixed.Set = Fixed.Pool->allocate(Fixed.Layout.get()); } WriteDescriptors update; - update.AddCombinedImageSampler(FixedSet.get(), 0, fb->GetTextureManager()->Shadowmap.View.get(), fb->GetSamplerManager()->ShadowmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - update.AddCombinedImageSampler(FixedSet.get(), 1, fb->GetTextureManager()->Lightmap.View.get(), fb->GetSamplerManager()->LightmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + update.AddCombinedImageSampler(Fixed.Set.get(), 0, fb->GetTextureManager()->Shadowmap.View.get(), fb->GetSamplerManager()->ShadowmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + update.AddCombinedImageSampler(Fixed.Set.get(), 1, fb->GetTextureManager()->Lightmap.View.get(), fb->GetSamplerManager()->LightmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); if (fb->GetDevice()->SupportsExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME) && fb->GetDevice()->PhysicalDevice.Features.RayQuery.rayQuery) { - update.AddAccelerationStructure(FixedSet.get(), 2, fb->GetRaytrace()->GetAccelStruct()); + update.AddAccelerationStructure(Fixed.Set.get(), 2, fb->GetRaytrace()->GetAccelStruct()); } else { - update.AddBuffer(FixedSet.get(), 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetRaytrace()->GetNodeBuffer()); - update.AddBuffer(FixedSet.get(), 3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetRaytrace()->GetVertexBuffer()); - update.AddBuffer(FixedSet.get(), 4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetRaytrace()->GetIndexBuffer()); + update.AddBuffer(Fixed.Set.get(), 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetRaytrace()->GetNodeBuffer()); + update.AddBuffer(Fixed.Set.get(), 3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetRaytrace()->GetVertexBuffer()); + update.AddBuffer(Fixed.Set.get(), 4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetRaytrace()->GetIndexBuffer()); } update.Execute(fb->GetDevice()); } @@ -116,62 +129,62 @@ void VkDescriptorSetManager::ResetHWTextureSets() mat->DeleteDescriptors(); auto deleteList = fb->GetCommands()->DrawDeleteList.get(); - for (auto& desc : TextureDescriptorPools) + for (auto& desc : Texture.Pools) { deleteList->Add(std::move(desc)); } - deleteList->Add(std::move(NullTextureDescriptorSet)); + deleteList->Add(std::move(Texture.NullSet)); - TextureDescriptorPools.clear(); - TextureDescriptorSetsLeft = 0; - TextureDescriptorsLeft = 0; + Texture.Pools.clear(); + Texture.SetsLeft = 0; + Texture.DescriptorsLeft = 0; - WriteBindless = WriteDescriptors(); - NextBindlessIndex = 0; + Bindless.Writer = WriteDescriptors(); + Bindless.NextIndex = 0; } -VulkanDescriptorSet* VkDescriptorSetManager::GetNullTextureDescriptorSet() +VulkanDescriptorSet* VkDescriptorSetManager::GetNullTextureSet() { - if (!NullTextureDescriptorSet) + if (!Texture.NullSet) { - NullTextureDescriptorSet = AllocateTextureDescriptorSet(SHADER_MIN_REQUIRED_TEXTURE_LAYERS); + Texture.NullSet = AllocateTextureSet(SHADER_MIN_REQUIRED_TEXTURE_LAYERS); WriteDescriptors update; for (int i = 0; i < SHADER_MIN_REQUIRED_TEXTURE_LAYERS; i++) { - update.AddCombinedImageSampler(NullTextureDescriptorSet.get(), i, fb->GetTextureManager()->GetNullTextureView(), fb->GetSamplerManager()->Get(CLAMP_XY_NOMIP), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + update.AddCombinedImageSampler(Texture.NullSet.get(), i, fb->GetTextureManager()->GetNullTextureView(), fb->GetSamplerManager()->Get(CLAMP_XY_NOMIP), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); } update.Execute(fb->GetDevice()); } - return NullTextureDescriptorSet.get(); + return Texture.NullSet.get(); } -std::unique_ptr VkDescriptorSetManager::AllocateTextureDescriptorSet(int numLayers) +std::unique_ptr VkDescriptorSetManager::AllocateTextureSet(int numLayers) { - if (TextureDescriptorSetsLeft == 0 || TextureDescriptorsLeft < numLayers) + if (Texture.SetsLeft == 0 || Texture.DescriptorsLeft < numLayers) { - TextureDescriptorSetsLeft = 1000; - TextureDescriptorsLeft = 2000; + Texture.SetsLeft = 1000; + Texture.DescriptorsLeft = 2000; - TextureDescriptorPools.push_back(DescriptorPoolBuilder() - .AddPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, TextureDescriptorsLeft) - .MaxSets(TextureDescriptorSetsLeft) - .DebugName("VkDescriptorSetManager.TextureDescriptorPool") + Texture.Pools.push_back(DescriptorPoolBuilder() + .AddPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, Texture.DescriptorsLeft) + .MaxSets(Texture.SetsLeft) + .DebugName("VkDescriptorSetManager.Texture.Pool") .Create(fb->GetDevice())); } - TextureDescriptorSetsLeft--; - TextureDescriptorsLeft -= numLayers; - return TextureDescriptorPools.back()->allocate(GetTextureSetLayout(numLayers)); + Texture.SetsLeft--; + Texture.DescriptorsLeft -= numLayers; + return Texture.Pools.back()->allocate(GetTextureLayout(numLayers)); } -VulkanDescriptorSetLayout* VkDescriptorSetManager::GetTextureSetLayout(int numLayers) +VulkanDescriptorSetLayout* VkDescriptorSetManager::GetTextureLayout(int numLayers) { - if (TextureSetLayouts.size() < (size_t)numLayers) - TextureSetLayouts.resize(numLayers); + if (Texture.Layouts.size() < (size_t)numLayers) + Texture.Layouts.resize(numLayers); - auto& layout = TextureSetLayouts[numLayers - 1]; + auto& layout = Texture.Layouts[numLayers - 1]; if (layout) return layout.get(); @@ -180,7 +193,7 @@ VulkanDescriptorSetLayout* VkDescriptorSetManager::GetTextureSetLayout(int numLa { builder.AddBinding(i, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); } - builder.DebugName("VkDescriptorSetManager.TextureSetLayout"); + builder.DebugName("VkDescriptorSetManager.Texture.SetLayout"); layout = builder.Create(fb->GetDevice()); return layout.get(); } @@ -199,7 +212,7 @@ void VkDescriptorSetManager::RemoveMaterial(VkMaterial* texture) VulkanDescriptorSet* VkDescriptorSetManager::GetInput(VkPPRenderPassSetup* passSetup, const TArray& textures, bool bindShadowMapBuffers) { - auto descriptors = AllocatePPDescriptorSet(passSetup->DescriptorLayout.get()); + auto descriptors = AllocatePPSet(passSetup->DescriptorLayout.get()); descriptors->SetDebugName("VkPostprocess.descriptors"); WriteDescriptors write; @@ -230,41 +243,53 @@ VulkanDescriptorSet* VkDescriptorSetManager::GetInput(VkPPRenderPassSetup* passS return set; } -std::unique_ptr VkDescriptorSetManager::AllocatePPDescriptorSet(VulkanDescriptorSetLayout* layout) +std::unique_ptr VkDescriptorSetManager::AllocatePPSet(VulkanDescriptorSetLayout* layout) { - if (PPDescriptorPool) + if (Postprocess.Pool) { - auto descriptors = PPDescriptorPool->tryAllocate(layout); + auto descriptors = Postprocess.Pool->tryAllocate(layout); if (descriptors) return descriptors; - fb->GetCommands()->DrawDeleteList->Add(std::move(PPDescriptorPool)); + fb->GetCommands()->DrawDeleteList->Add(std::move(Postprocess.Pool)); } - PPDescriptorPool = DescriptorPoolBuilder() + Postprocess.Pool = DescriptorPoolBuilder() .AddPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 200) .AddPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 4) .MaxSets(100) .DebugName("PPDescriptorPool") .Create(fb->GetDevice()); - return PPDescriptorPool->allocate(layout); + return Postprocess.Pool->allocate(layout); } -void VkDescriptorSetManager::CreateRSBufferSetLayout() +void VkDescriptorSetManager::CreateLevelMeshLayout() { - RSBufferSetLayout = DescriptorSetLayoutBuilder() + LevelMesh.Layout = DescriptorSetLayoutBuilder() + .AddBinding(0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT) + .AddBinding(1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT) + .AddBinding(2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT) + .AddBinding(3, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT) + .AddBinding(4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT) + .DebugName("VkDescriptorSetManager.LevelMesh.Layout") + .Create(fb->GetDevice()); +} + +void VkDescriptorSetManager::CreateRSBufferLayout() +{ + RSBuffer.Layout = DescriptorSetLayoutBuilder() .AddBinding(0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT) .AddBinding(1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT) .AddBinding(2, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT) .AddBinding(3, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT) .AddBinding(4, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT) .AddBinding(5, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT) - .DebugName("VkDescriptorSetManager.RSBufferSetLayout") + .DebugName("VkDescriptorSetManager.RSBuffer.Layout") .Create(fb->GetDevice()); } -void VkDescriptorSetManager::CreateFixedSetLayout() +void VkDescriptorSetManager::CreateFixedLayout() { DescriptorSetLayoutBuilder builder; builder.AddBinding(0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); @@ -279,68 +304,78 @@ void VkDescriptorSetManager::CreateFixedSetLayout() builder.AddBinding(3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); builder.AddBinding(4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); } - builder.DebugName("VkDescriptorSetManager.FixedSetLayout"); - FixedSetLayout = builder.Create(fb->GetDevice()); + builder.DebugName("VkDescriptorSetManager.Fixed.SetLayout"); + Fixed.Layout = builder.Create(fb->GetDevice()); +} + +void VkDescriptorSetManager::CreateLevelMeshPool() +{ + LevelMesh.Pool = DescriptorPoolBuilder() + .AddPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 3) + .AddPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2) + .MaxSets(1) + .DebugName("VkDescriptorSetManager.LevelMesh.Pool") + .Create(fb->GetDevice()); } void VkDescriptorSetManager::CreateRSBufferPool() { - RSBufferDescriptorPool = DescriptorPoolBuilder() + RSBuffer.Pool = DescriptorPoolBuilder() .AddPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 5) .AddPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1) .MaxSets(1) - .DebugName("VkDescriptorSetManager.RSBufferDescriptorPool") + .DebugName("VkDescriptorSetManager.RSBuffer.Pool") .Create(fb->GetDevice()); } -void VkDescriptorSetManager::CreateFixedSetPool() +void VkDescriptorSetManager::CreateFixedPool() { DescriptorPoolBuilder poolbuilder; - poolbuilder.AddPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2 * maxSets); + poolbuilder.AddPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2 * MaxFixedSets); if (fb->GetDevice()->SupportsExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME) && fb->GetDevice()->PhysicalDevice.Features.RayQuery.rayQuery) { - poolbuilder.AddPoolSize(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1 * maxSets); + poolbuilder.AddPoolSize(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1 * MaxFixedSets); } else { - poolbuilder.AddPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 3 * maxSets); + poolbuilder.AddPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 3 * MaxFixedSets); } - poolbuilder.MaxSets(maxSets); - poolbuilder.DebugName("VkDescriptorSetManager.FixedDescriptorPool"); - FixedDescriptorPool = poolbuilder.Create(fb->GetDevice()); + poolbuilder.MaxSets(MaxFixedSets); + poolbuilder.DebugName("VkDescriptorSetManager.Fixed.Pool"); + Fixed.Pool = poolbuilder.Create(fb->GetDevice()); } -void VkDescriptorSetManager::CreateBindlessDescriptorSet() +void VkDescriptorSetManager::CreateBindlessSet() { - BindlessDescriptorPool = DescriptorPoolBuilder() + Bindless.Pool = DescriptorPoolBuilder() .Flags(VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT) .AddPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, MaxBindlessTextures) .MaxSets(MaxBindlessTextures) - .DebugName("BindlessDescriptorPool") + .DebugName("Bindless.Pool") .Create(fb->GetDevice()); - BindlessDescriptorSetLayout = DescriptorSetLayoutBuilder() + Bindless.Layout = DescriptorSetLayoutBuilder() .Flags(VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT) .AddBinding( 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, MaxBindlessTextures, VK_SHADER_STAGE_FRAGMENT_BIT, VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT | VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT | VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT) - .DebugName("BindlessDescriptorSetLayout") + .DebugName("Bindless.Layout") .Create(fb->GetDevice()); - BindlessDescriptorSet = BindlessDescriptorPool->allocate(BindlessDescriptorSetLayout.get(), MaxBindlessTextures); + Bindless.Set = Bindless.Pool->allocate(Bindless.Layout.get(), MaxBindlessTextures); } void VkDescriptorSetManager::UpdateBindlessDescriptorSet() { - WriteBindless.Execute(fb->GetDevice()); - WriteBindless = WriteDescriptors(); + Bindless.Writer.Execute(fb->GetDevice()); + Bindless.Writer = WriteDescriptors(); } int VkDescriptorSetManager::AddBindlessTextureIndex(VulkanImageView* imageview, VulkanSampler* sampler) { - int index = NextBindlessIndex++; - WriteBindless.AddCombinedImageSampler(BindlessDescriptorSet.get(), 0, index, imageview, sampler, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + int index = Bindless.NextIndex++; + Bindless.Writer.AddCombinedImageSampler(Bindless.Set.get(), 0, index, imageview, sampler, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); return index; } diff --git a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.h b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.h index ac2f0a441..33b90ab28 100644 --- a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.h +++ b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.h @@ -21,18 +21,21 @@ public: void Deinit(); void BeginFrame(); void ResetHWTextureSets(); + void UpdateLevelMeshSet(); - VulkanDescriptorSetLayout* GetRSBufferSetLayout() { return RSBufferSetLayout.get(); } - VulkanDescriptorSetLayout* GetFixedSetLayout() { return FixedSetLayout.get(); } - VulkanDescriptorSetLayout* GetTextureSetLayout(int numLayers); - VulkanDescriptorSetLayout* GetBindlessSetLayout() { return BindlessDescriptorSetLayout.get(); } + VulkanDescriptorSetLayout* GetLevelMeshLayout() { return LevelMesh.Layout.get(); } + VulkanDescriptorSetLayout* GetRSBufferLayout() { return RSBuffer.Layout.get(); } + VulkanDescriptorSetLayout* GetFixedLayout() { return Fixed.Layout.get(); } + VulkanDescriptorSetLayout* GetTextureLayout(int numLayers); + VulkanDescriptorSetLayout* GetBindlessLayout() { return Bindless.Layout.get(); } - VulkanDescriptorSet* GetRSBufferDescriptorSet() { return RSBufferSet.get(); } - VulkanDescriptorSet* GetFixedDescriptorSet() { return FixedSet.get(); } - VulkanDescriptorSet* GetNullTextureDescriptorSet(); - VulkanDescriptorSet* GetBindlessDescriptorSet() { return BindlessDescriptorSet.get(); } + VulkanDescriptorSet* GetLevelMeshSet() { return LevelMesh.Set.get(); } + VulkanDescriptorSet* GetRSBufferSet() { return RSBuffer.Set.get(); } + VulkanDescriptorSet* GetFixedSet() { return Fixed.Set.get(); } + VulkanDescriptorSet* GetNullTextureSet(); + VulkanDescriptorSet* GetBindlessSet() { return Bindless.Set.get(); } - std::unique_ptr AllocateTextureDescriptorSet(int numLayers); + std::unique_ptr AllocateTextureSet(int numLayers); VulkanDescriptorSet* GetInput(VkPPRenderPassSetup* passSetup, const TArray& textures, bool bindShadowMapBuffers); @@ -43,42 +46,65 @@ public: int AddBindlessTextureIndex(VulkanImageView* imageview, VulkanSampler* sampler); private: - void CreateRSBufferSetLayout(); - void CreateFixedSetLayout(); + void CreateLevelMeshLayout(); + void CreateRSBufferLayout(); + void CreateFixedLayout(); + void CreateLevelMeshPool(); void CreateRSBufferPool(); - void CreateFixedSetPool(); - void CreateBindlessDescriptorSet(); + void CreateFixedPool(); + void CreateBindlessSet(); void UpdateFixedSet(); - std::unique_ptr AllocatePPDescriptorSet(VulkanDescriptorSetLayout* layout); + std::unique_ptr AllocatePPSet(VulkanDescriptorSetLayout* layout); VulkanRenderDevice* fb = nullptr; - std::unique_ptr RSBufferSetLayout; - std::unique_ptr FixedSetLayout; - std::vector> TextureSetLayouts; + struct + { + std::unique_ptr Layout; + std::unique_ptr Pool; + std::unique_ptr Set; + } LevelMesh; - std::unique_ptr RSBufferDescriptorPool; - std::unique_ptr FixedDescriptorPool; + struct + { + std::unique_ptr Layout; + std::unique_ptr Pool; + std::unique_ptr Set; + } RSBuffer; - std::unique_ptr PPDescriptorPool; + struct + { + std::unique_ptr Layout; + std::unique_ptr Pool; + std::unique_ptr Set; + } Fixed; - int TextureDescriptorSetsLeft = 0; - int TextureDescriptorsLeft = 0; - std::vector> TextureDescriptorPools; + struct + { + std::unique_ptr Pool; + std::unique_ptr Set; + std::unique_ptr Layout; + WriteDescriptors Writer; + int NextIndex = 0; + } Bindless; - std::unique_ptr RSBufferSet; - std::unique_ptr FixedSet; - std::unique_ptr NullTextureDescriptorSet; + struct + { + std::vector> Layouts; + int SetsLeft = 0; + int DescriptorsLeft = 0; + std::vector> Pools; + std::unique_ptr NullSet; + } Texture; + + struct + { + std::unique_ptr Pool; + } Postprocess; std::list Materials; - std::unique_ptr BindlessDescriptorPool; - std::unique_ptr BindlessDescriptorSet; - std::unique_ptr BindlessDescriptorSetLayout; - WriteDescriptors WriteBindless; - int NextBindlessIndex = 0; - - static const int maxSets = 100; + static const int MaxFixedSets = 100; static const int MaxBindlessTextures = 16536; }; diff --git a/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp b/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp index 262298cf5..1c1adb76c 100644 --- a/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp +++ b/src/common/rendering/vulkan/pipelines/vk_renderpass.cpp @@ -137,22 +137,22 @@ VkVertexFormat *VkRenderPassManager::GetVertexFormat(int index) return &VertexFormats[index]; } -VulkanPipelineLayout* VkRenderPassManager::GetPipelineLayout(int numLayers) +VulkanPipelineLayout* VkRenderPassManager::GetPipelineLayout(int numLayers, bool levelmesh) { - if (PipelineLayouts.size() <= (size_t)numLayers) - PipelineLayouts.resize(numLayers + 1); + if (PipelineLayouts[levelmesh].size() <= (size_t)numLayers) + PipelineLayouts[levelmesh].resize(numLayers + 1); - auto &layout = PipelineLayouts[numLayers]; + auto &layout = PipelineLayouts[levelmesh][numLayers]; if (layout) return layout.get(); auto descriptors = fb->GetDescriptorSetManager(); PipelineLayoutBuilder builder; - builder.AddSetLayout(descriptors->GetFixedSetLayout()); - builder.AddSetLayout(descriptors->GetRSBufferSetLayout()); + builder.AddSetLayout(descriptors->GetFixedLayout()); + builder.AddSetLayout(levelmesh ? descriptors->GetLevelMeshLayout() : descriptors->GetRSBufferLayout()); if (numLayers != 0) - builder.AddSetLayout(descriptors->GetTextureSetLayout(numLayers)); + builder.AddSetLayout(descriptors->GetTextureLayout(numLayers)); builder.AddPushConstantRange(VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(PushConstants)); builder.DebugName("VkRenderPassManager.PipelineLayout"); layout = builder.Create(fb->GetDevice()); @@ -317,7 +317,7 @@ std::unique_ptr VkRenderPassSetup::CreatePipeline(const VkPipeli builder.SubpassColorAttachmentCount(PassKey.DrawBuffers); builder.RasterizationSamples((VkSampleCountFlagBits)PassKey.Samples); - builder.Layout(fb->GetRenderPassManager()->GetPipelineLayout(key.NumTextureLayers)); + builder.Layout(fb->GetRenderPassManager()->GetPipelineLayout(key.NumTextureLayers, key.ShaderKey.UseLevelMesh)); builder.RenderPass(GetRenderPass(0)); builder.DebugName("VkRenderPassSetup.Pipeline"); diff --git a/src/common/rendering/vulkan/pipelines/vk_renderpass.h b/src/common/rendering/vulkan/pipelines/vk_renderpass.h index ef4d1408e..35df3f466 100644 --- a/src/common/rendering/vulkan/pipelines/vk_renderpass.h +++ b/src/common/rendering/vulkan/pipelines/vk_renderpass.h @@ -109,7 +109,7 @@ public: VkRenderPassSetup *GetRenderPass(const VkRenderPassKey &key); int GetVertexFormat(int numBindingPoints, int numAttributes, size_t stride, const FVertexBufferAttribute *attrs); VkVertexFormat *GetVertexFormat(int index); - VulkanPipelineLayout* GetPipelineLayout(int numLayers); + VulkanPipelineLayout* GetPipelineLayout(int numLayers, bool levelmesh); VkPPRenderPassSetup* GetPPRenderPass(const VkPPRenderPassKey& key); @@ -119,7 +119,7 @@ private: VulkanRenderDevice* fb = nullptr; std::map> RenderPassSetup; - std::vector> PipelineLayouts; + std::vector> PipelineLayouts[2]; std::vector VertexFormats; std::map> PPRenderPassSetup; diff --git a/src/common/rendering/vulkan/textures/vk_hwtexture.cpp b/src/common/rendering/vulkan/textures/vk_hwtexture.cpp index 39faf76e6..af1463933 100644 --- a/src/common/rendering/vulkan/textures/vk_hwtexture.cpp +++ b/src/common/rendering/vulkan/textures/vk_hwtexture.cpp @@ -353,7 +353,7 @@ VkMaterial::DescriptorEntry& VkMaterial::GetDescriptorEntry(const FMaterialState int numLayers = NumLayers(); auto descriptors = fb->GetDescriptorSetManager(); - auto descriptor = descriptors->AllocateTextureDescriptorSet(max(numLayers, SHADER_MIN_REQUIRED_TEXTURE_LAYERS)); + auto descriptor = descriptors->AllocateTextureSet(max(numLayers, SHADER_MIN_REQUIRED_TEXTURE_LAYERS)); descriptor->SetDebugName("VkHardwareTexture.mDescriptorSets"); diff --git a/src/common/rendering/vulkan/vk_renderdevice.cpp b/src/common/rendering/vulkan/vk_renderdevice.cpp index ec1fbbef5..6bc730e45 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.cpp +++ b/src/common/rendering/vulkan/vk_renderdevice.cpp @@ -616,6 +616,8 @@ void VulkanRenderDevice::DrawLevelMesh(const HWViewpointUniforms& viewpoint) auto buffers = GetBuffers(); auto descriptors = GetDescriptorSetManager(); + descriptors->UpdateLevelMeshSet(); + VkRenderPassKey key = {}; key.DrawBufferFormat = VK_FORMAT_R16G16B16A16_SFLOAT; key.Samples = buffers->GetSceneSamples(); @@ -692,7 +694,7 @@ void VulkanRenderDevice::DrawLevelMesh(const HWViewpointUniforms& viewpoint) pipelineKey.ShaderKey.GBufferPass = key.DrawBuffers > 1; pipelineKey.ShaderKey.UseLevelMesh = true; - VulkanPipelineLayout* layout = GetRenderPassManager()->GetPipelineLayout(pipelineKey.NumTextureLayers); + VulkanPipelineLayout* layout = GetRenderPassManager()->GetPipelineLayout(pipelineKey.NumTextureLayers, pipelineKey.ShaderKey.UseLevelMesh); cmdbuffer->bindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, passSetup->GetPipeline(pipelineKey)); @@ -700,40 +702,6 @@ void VulkanRenderDevice::DrawLevelMesh(const HWViewpointUniforms& viewpoint) memcpy(((char*)rsbuffers->Viewpoint.Data) + rsbuffers->Viewpoint.UploadIndex * rsbuffers->Viewpoint.BlockAlign, &viewpoint, sizeof(HWViewpointUniforms)); int viewpointIndex = rsbuffers->Viewpoint.UploadIndex++; - SurfaceUniforms surfaceUniforms = {}; - surfaceUniforms.uFogColor = toFVector4(PalEntry(0xffffffff)); - surfaceUniforms.uDesaturationFactor = 0.0f; - surfaceUniforms.uAlphaThreshold = 0.5f; - surfaceUniforms.uAddColor = toFVector4(PalEntry(0)); - surfaceUniforms.uObjectColor = toFVector4(PalEntry(0xffffffff)); - surfaceUniforms.uObjectColor2 = toFVector4(PalEntry(0)); - surfaceUniforms.uTextureBlendColor = toFVector4(PalEntry(0)); - surfaceUniforms.uTextureAddColor = toFVector4(PalEntry(0)); - surfaceUniforms.uTextureModulateColor = toFVector4(PalEntry(0)); - surfaceUniforms.uLightDist = 0.0f; - surfaceUniforms.uLightFactor = 0.0f; - surfaceUniforms.uFogDensity = 0.0f; - surfaceUniforms.uLightLevel = 255.0f;// -1.0f; - surfaceUniforms.uInterpolationFactor = 0; - surfaceUniforms.uVertexColor = { 1.0f, 1.0f, 1.0f, 1.0f }; - surfaceUniforms.uGlowTopColor = { 0.0f, 0.0f, 0.0f, 0.0f }; - surfaceUniforms.uGlowBottomColor = { 0.0f, 0.0f, 0.0f, 0.0f }; - surfaceUniforms.uGlowTopPlane = { 0.0f, 0.0f, 0.0f, 0.0f }; - surfaceUniforms.uGlowBottomPlane = { 0.0f, 0.0f, 0.0f, 0.0f }; - surfaceUniforms.uGradientTopPlane = { 0.0f, 0.0f, 0.0f, 0.0f }; - surfaceUniforms.uGradientBottomPlane = { 0.0f, 0.0f, 0.0f, 0.0f }; - surfaceUniforms.uSplitTopPlane = { 0.0f, 0.0f, 0.0f, 0.0f }; - surfaceUniforms.uSplitBottomPlane = { 0.0f, 0.0f, 0.0f, 0.0f }; - surfaceUniforms.uDynLightColor = { 0.0f, 0.0f, 0.0f, 1.0f }; - surfaceUniforms.uDetailParms = { 0.0f, 0.0f, 0.0f, 0.0f }; -#ifdef NPOT_EMULATION - surfaceUniforms.uNpotEmulation = { 0,0,0,0 }; -#endif - surfaceUniforms.uClipSplit.X = -1000000.f; - surfaceUniforms.uClipSplit.Y = 1000000.f; - - rsbuffers->SurfaceUniformsBuffer->Write(surfaceUniforms); - MatricesUBO matrices = {}; matrices.ModelMatrix.loadIdentity(); matrices.NormalModelMatrix.loadIdentity(); @@ -742,15 +710,14 @@ void VulkanRenderDevice::DrawLevelMesh(const HWViewpointUniforms& viewpoint) uint32_t viewpointOffset = viewpointIndex * rsbuffers->Viewpoint.BlockAlign; uint32_t matrixOffset = rsbuffers->MatrixBuffer->Offset(); - uint32_t surfaceUniformsOffset = rsbuffers->SurfaceUniformsBuffer->Offset(); uint32_t lightsOffset = 0; - uint32_t offsets[4] = { viewpointOffset, matrixOffset, surfaceUniformsOffset, lightsOffset }; - cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 0, descriptors->GetFixedDescriptorSet()); - cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 1, descriptors->GetRSBufferDescriptorSet(), 4, offsets); - cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 2, descriptors->GetNullTextureDescriptorSet()); + uint32_t offsets[] = { viewpointOffset, matrixOffset, lightsOffset }; + cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 0, descriptors->GetFixedSet()); + cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 1, descriptors->GetLevelMeshSet(), 3, offsets); + cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 2, descriptors->GetNullTextureSet()); PushConstants pushConstants = {}; - pushConstants.uDataIndex = rsbuffers->SurfaceUniformsBuffer->DataIndex(); + pushConstants.uDataIndex = 0; pushConstants.uLightIndex = -1; pushConstants.uBoneIndexBase = -1; cmdbuffer->pushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, (uint32_t)sizeof(PushConstants), &pushConstants); diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index b65c3a0d2..3f61457e8 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -423,7 +423,7 @@ void VkRenderState::ApplyPushConstants() mPushConstants.uBoneIndexBase = mBoneIndexBase; mPushConstants.uFogballIndex = mFogballIndex >= 0 ? (mFogballIndex % MAX_FOGBALL_DATA) : -1; - mCommandBuffer->pushConstants(fb->GetRenderPassManager()->GetPipelineLayout(mPipelineKey.NumTextureLayers), VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, (uint32_t)sizeof(PushConstants), &mPushConstants); + mCommandBuffer->pushConstants(fb->GetRenderPassManager()->GetPipelineLayout(mPipelineKey.NumTextureLayers, mPipelineKey.ShaderKey.UseLevelMesh), VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, (uint32_t)sizeof(PushConstants), &mPushConstants); } void VkRenderState::ApplyMatrices() @@ -484,14 +484,14 @@ void VkRenderState::ApplyMaterial() if (mMaterial.mChanged) { auto descriptors = fb->GetDescriptorSetManager(); - VulkanPipelineLayout* layout = fb->GetRenderPassManager()->GetPipelineLayout(mPipelineKey.NumTextureLayers); + VulkanPipelineLayout* layout = fb->GetRenderPassManager()->GetPipelineLayout(mPipelineKey.NumTextureLayers, mPipelineKey.ShaderKey.UseLevelMesh); if (mMaterial.mMaterial && mMaterial.mMaterial->Source()->isHardwareCanvas()) static_cast(mMaterial.mMaterial->Source()->GetTexture())->NeedUpdate(); - VulkanDescriptorSet* descriptorset = mMaterial.mMaterial ? static_cast(mMaterial.mMaterial)->GetDescriptorSet(mMaterial) : descriptors->GetNullTextureDescriptorSet(); + VulkanDescriptorSet* descriptorset = mMaterial.mMaterial ? static_cast(mMaterial.mMaterial)->GetDescriptorSet(mMaterial) : descriptors->GetNullTextureSet(); - mCommandBuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 0, descriptors->GetFixedDescriptorSet()); + mCommandBuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 0, descriptors->GetFixedSet()); mCommandBuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 2, descriptorset); mMaterial.mChanged = false; } @@ -506,11 +506,11 @@ void VkRenderState::ApplyBufferSets() if (mViewpointOffset != mLastViewpointOffset || matrixOffset != mLastMatricesOffset || surfaceUniformsOffset != mLastSurfaceUniformsOffset || lightsOffset != mLastLightsOffset || fogballsOffset != mLastFogballsOffset) { auto descriptors = fb->GetDescriptorSetManager(); - VulkanPipelineLayout* layout = fb->GetRenderPassManager()->GetPipelineLayout(mPipelineKey.NumTextureLayers); + VulkanPipelineLayout* layout = fb->GetRenderPassManager()->GetPipelineLayout(mPipelineKey.NumTextureLayers, mPipelineKey.ShaderKey.UseLevelMesh); uint32_t offsets[5] = { mViewpointOffset, matrixOffset, surfaceUniformsOffset, lightsOffset, fogballsOffset }; - mCommandBuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 0, descriptors->GetFixedDescriptorSet()); - mCommandBuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 1, descriptors->GetRSBufferDescriptorSet(), 5, offsets); + mCommandBuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 0, descriptors->GetFixedSet()); + mCommandBuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 1, descriptors->GetRSBufferSet(), 5, offsets); mLastViewpointOffset = mViewpointOffset; mLastMatricesOffset = matrixOffset; diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index 7bbfd1166..bf647b85f 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -7,8 +7,9 @@ #include "c_dispatch.h" #include "g_levellocals.h" #include "a_dynlight.h" +#include "hw_renderstate.h" #include "common/rendering/vulkan/accelstructs/vk_lightmap.h" -#include +#include "common/rendering/vulkan/accelstructs/halffloat.h" VSMatrix GetPlaneTextureRotationMatrix(FGameTexture* gltexture, const sector_t* sector, int plane); void GetTexCoordInfo(FGameTexture* tex, FTexCoordInfo* tci, side_t* side, int texpos); @@ -665,7 +666,8 @@ void DoomLevelSubmesh::CreateLinePortalSurface(FLevelLocals& doomMap, side_t* si surf.sectorGroup = sectorGroup[front->Index()]; surf.AlwaysUpdate = !!(front->Flags & SECF_LM_DYNAMIC); - SurfaceUniforms uniforms = {}; + SurfaceUniforms uniforms = DefaultUniforms(); + uniforms.uLightLevel = front->lightlevel; SetSideTextureUVs(surf, side, side_t::top, v1Top, v1Bottom, v2Top, v2Bottom); @@ -764,7 +766,8 @@ void DoomLevelSubmesh::CreateLineHorizonSurface(FLevelLocals& doomMap, side_t* s surf.sectorGroup = sectorGroup[front->Index()]; surf.AlwaysUpdate = !!(front->Flags & SECF_LM_DYNAMIC); - SurfaceUniforms uniforms = {}; + SurfaceUniforms uniforms = DefaultUniforms(); + uniforms.uLightLevel = front->lightlevel; SetSideTextureUVs(surf, side, side_t::top, v1Top, v1Bottom, v2Top, v2Bottom); @@ -821,7 +824,7 @@ void DoomLevelSubmesh::CreateFrontWallSurface(FLevelLocals& doomMap, side_t* sid surf.texture = side->textures[side_t::mid].texture; surf.AlwaysUpdate = !!(front->Flags & SECF_LM_DYNAMIC); - SurfaceUniforms uniforms = {}; + SurfaceUniforms uniforms = DefaultUniforms(); uniforms.uLightLevel = front->lightlevel; SetSideTextureUVs(surf, side, side_t::top, v1Top, v1Bottom, v2Top, v2Bottom); @@ -914,7 +917,7 @@ void DoomLevelSubmesh::CreateMidWallSurface(FLevelLocals& doomMap, side_t* side) surf.alpha = float(side->linedef->alpha); surf.AlwaysUpdate = !!(front->Flags & SECF_LM_DYNAMIC); - SurfaceUniforms uniforms = {}; + SurfaceUniforms uniforms = DefaultUniforms(); uniforms.uLightLevel = front->lightlevel; SetSideTextureUVs(surf, side, side_t::top, verts[2].z, verts[0].z, verts[3].z, verts[1].z); @@ -988,7 +991,7 @@ void DoomLevelSubmesh::Create3DFloorWallSurfaces(FLevelLocals& doomMap, side_t* surf.texture = side->textures[side_t::mid].texture; surf.AlwaysUpdate = !!(front->Flags & SECF_LM_DYNAMIC); - SurfaceUniforms uniforms = {}; + SurfaceUniforms uniforms = DefaultUniforms(); uniforms.uLightLevel = front->lightlevel; SetSideTextureUVs(surf, side, side_t::top, tlZ, blZ, trZ, brZ); @@ -1044,7 +1047,7 @@ void DoomLevelSubmesh::CreateTopWallSurface(FLevelLocals& doomMap, side_t* side) surf.texture = side->textures[side_t::top].texture; surf.AlwaysUpdate = !!(front->Flags & SECF_LM_DYNAMIC); - SurfaceUniforms uniforms = {}; + SurfaceUniforms uniforms = DefaultUniforms(); uniforms.uLightLevel = front->lightlevel; SetSideTextureUVs(surf, side, side_t::top, v1Top, v1TopBack, v2Top, v2TopBack); @@ -1098,7 +1101,7 @@ void DoomLevelSubmesh::CreateBottomWallSurface(FLevelLocals& doomMap, side_t* si surf.texture = side->textures[side_t::bottom].texture; surf.AlwaysUpdate = !!(front->Flags & SECF_LM_DYNAMIC); - SurfaceUniforms uniforms = {}; + SurfaceUniforms uniforms = DefaultUniforms(); uniforms.uLightLevel = front->lightlevel; SetSideTextureUVs(surf, side, side_t::bottom, v1BottomBack, v1Bottom, v2BottomBack, v2Bottom); @@ -1200,7 +1203,7 @@ void DoomLevelSubmesh::CreateFloorSurface(FLevelLocals &doomMap, subsector_t *su surf.sectorGroup = sectorGroup[sector->Index()]; surf.AlwaysUpdate = !!(sector->Flags & SECF_LM_DYNAMIC); - SurfaceUniforms uniforms = {}; + SurfaceUniforms uniforms = DefaultUniforms(); uniforms.uLightLevel = sector->lightlevel; MeshSurfaceUniforms.Push(uniforms); @@ -1259,7 +1262,7 @@ void DoomLevelSubmesh::CreateCeilingSurface(FLevelLocals& doomMap, subsector_t* surf.sectorGroup = sectorGroup[sector->Index()]; surf.AlwaysUpdate = !!(sector->Flags & SECF_LM_DYNAMIC); - SurfaceUniforms uniforms = {}; + SurfaceUniforms uniforms = DefaultUniforms(); uniforms.uLightLevel = sector->lightlevel; MeshSurfaceUniforms.Push(uniforms); @@ -1639,3 +1642,39 @@ void DoomLevelSubmesh::BuildSurfaceParams(int lightMapTextureWidth, int lightMap surface.AtlasTile.Width = width; surface.AtlasTile.Height = height; } + +SurfaceUniforms DoomLevelSubmesh::DefaultUniforms() +{ + SurfaceUniforms surfaceUniforms = {}; + surfaceUniforms.uFogColor = toFVector4(PalEntry(0xffffffff)); + surfaceUniforms.uDesaturationFactor = 0.0f; + surfaceUniforms.uAlphaThreshold = 0.5f; + surfaceUniforms.uAddColor = toFVector4(PalEntry(0)); + surfaceUniforms.uObjectColor = toFVector4(PalEntry(0xffffffff)); + surfaceUniforms.uObjectColor2 = toFVector4(PalEntry(0)); + surfaceUniforms.uTextureBlendColor = toFVector4(PalEntry(0)); + surfaceUniforms.uTextureAddColor = toFVector4(PalEntry(0)); + surfaceUniforms.uTextureModulateColor = toFVector4(PalEntry(0)); + surfaceUniforms.uLightDist = 0.0f; + surfaceUniforms.uLightFactor = 0.0f; + surfaceUniforms.uFogDensity = 0.0f; + surfaceUniforms.uLightLevel = 255.0f;// -1.0f; + surfaceUniforms.uInterpolationFactor = 0; + surfaceUniforms.uVertexColor = { 1.0f, 1.0f, 1.0f, 1.0f }; + surfaceUniforms.uGlowTopColor = { 0.0f, 0.0f, 0.0f, 0.0f }; + surfaceUniforms.uGlowBottomColor = { 0.0f, 0.0f, 0.0f, 0.0f }; + surfaceUniforms.uGlowTopPlane = { 0.0f, 0.0f, 0.0f, 0.0f }; + surfaceUniforms.uGlowBottomPlane = { 0.0f, 0.0f, 0.0f, 0.0f }; + surfaceUniforms.uGradientTopPlane = { 0.0f, 0.0f, 0.0f, 0.0f }; + surfaceUniforms.uGradientBottomPlane = { 0.0f, 0.0f, 0.0f, 0.0f }; + surfaceUniforms.uSplitTopPlane = { 0.0f, 0.0f, 0.0f, 0.0f }; + surfaceUniforms.uSplitBottomPlane = { 0.0f, 0.0f, 0.0f, 0.0f }; + surfaceUniforms.uDynLightColor = { 0.0f, 0.0f, 0.0f, 1.0f }; + surfaceUniforms.uDetailParms = { 0.0f, 0.0f, 0.0f, 0.0f }; +#ifdef NPOT_EMULATION + surfaceUniforms.uNpotEmulation = { 0,0,0,0 }; +#endif + surfaceUniforms.uClipSplit.X = -1000000.f; + surfaceUniforms.uClipSplit.Y = 1000000.f; + return surfaceUniforms; +} diff --git a/src/rendering/hwrenderer/doom_levelmesh.h b/src/rendering/hwrenderer/doom_levelmesh.h index 254e64dba..d956ef235 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.h +++ b/src/rendering/hwrenderer/doom_levelmesh.h @@ -128,6 +128,8 @@ private: static FVector2 ToFVector2(const DVector2& v) { return FVector2((float)v.X, (float)v.Y); } static FVector3 ToFVector3(const DVector3& v) { return FVector3((float)v.X, (float)v.Y, (float)v.Z); } static FVector4 ToFVector4(const DVector4& v) { return FVector4((float)v.X, (float)v.Y, (float)v.Z, (float)v.W); } + + static SurfaceUniforms DefaultUniforms(); }; static_assert(alignof(FVector2) == alignof(float[2]) && sizeof(FVector2) == sizeof(float) * 2); diff --git a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl index 5ded2c8ce..59742e767 100644 --- a/wadsrc/static/shaders/scene/binding_rsbuffers.glsl +++ b/wadsrc/static/shaders/scene/binding_rsbuffers.glsl @@ -72,10 +72,17 @@ struct SurfaceUniforms float padding3; }; -layout(set = 1, binding = 2, std140) uniform StreamUBO +#ifdef USE_LEVELMESH +layout(set = 1, binding = 2, std430) buffer SurfaceUniformsSSO +{ + SurfaceUniforms data[]; +}; +#else +layout(set = 1, binding = 2, std140) uniform SurfaceUniformsUBO { SurfaceUniforms data[MAX_SURFACE_UNIFORMS]; }; +#endif // light buffers layout(set = 1, binding = 3, std140) uniform LightBufferUBO diff --git a/wadsrc/static/shaders/scene/layout_shared.glsl b/wadsrc/static/shaders/scene/layout_shared.glsl index 40085a269..ae29f0164 100644 --- a/wadsrc/static/shaders/scene/layout_shared.glsl +++ b/wadsrc/static/shaders/scene/layout_shared.glsl @@ -6,7 +6,7 @@ // This must match the PushConstants struct layout(push_constant) uniform PushConstants { - int uDataIndex; // streamdata index + int uDataIndex; // surfaceuniforms index int uLightIndex; // dynamic lights int uBoneIndexBase; // bone animation int uFogballIndex; // fog balls