diff --git a/src/common/rendering/vulkan/renderer/vk_descriptorset.cpp b/src/common/rendering/vulkan/renderer/vk_descriptorset.cpp index a6cfcb41e..ac8f1db7f 100644 --- a/src/common/rendering/vulkan/renderer/vk_descriptorset.cpp +++ b/src/common/rendering/vulkan/renderer/vk_descriptorset.cpp @@ -39,6 +39,8 @@ VkDescriptorSetManager::VkDescriptorSetManager(VulkanFrameBuffer* fb) : fb(fb) { + CreateHWBufferSetLayout(); + CreateFixedSetLayout(); } VkDescriptorSetManager::~VkDescriptorSetManager() @@ -49,52 +51,74 @@ VkDescriptorSetManager::~VkDescriptorSetManager() void VkDescriptorSetManager::Init() { - CreateFixedSet(); - CreateDynamicSet(); + UpdateFixedSet(); + UpdateHWBufferSet(); } -void VkDescriptorSetManager::CreateDynamicSet() +void VkDescriptorSetManager::Deinit() +{ + while (!Materials.empty()) + RemoveMaterial(Materials.back()); +} + +void VkDescriptorSetManager::BeginFrame() +{ + UpdateFixedSet(); + UpdateHWBufferSet(); +} + +void VkDescriptorSetManager::CreateHWBufferSetLayout() { DescriptorSetLayoutBuilder builder; builder.addBinding(0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT); builder.addBinding(1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT); builder.addBinding(2, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT); - DynamicSetLayout = builder.create(fb->device); - DynamicSetLayout->SetDebugName("VkDescriptorSetManager.DynamicSetLayout"); + builder.addBinding(3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); + HWBufferSetLayout = builder.create(fb->device); + HWBufferSetLayout->SetDebugName("VkDescriptorSetManager.HWBufferSetLayout"); +} + +void VkDescriptorSetManager::UpdateHWBufferSet() +{ + fb->GetCommands()->DrawDeleteList->Add(std::move(HWBufferSet)); + fb->GetCommands()->DrawDeleteList->Add(std::move(HWBufferDescriptorPool)); DescriptorPoolBuilder poolbuilder; poolbuilder.addPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 3); + poolbuilder.addPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1); poolbuilder.setMaxSets(1); - DynamicDescriptorPool = poolbuilder.create(fb->device); - DynamicDescriptorPool->SetDebugName("VkDescriptorSetManager.DynamicDescriptorPool"); + HWBufferDescriptorPool = poolbuilder.create(fb->device); + HWBufferDescriptorPool->SetDebugName("VkDescriptorSetManager.HWBufferDescriptorPool"); - DynamicSet = DynamicDescriptorPool->allocate(DynamicSetLayout.get()); - if (!DynamicSet) - I_FatalError("CreateDynamicSet failed.\n"); -} + HWBufferSet = HWBufferDescriptorPool->allocate(HWBufferSetLayout.get()); + if (!HWBufferSet) + I_FatalError("CreateHWBufferSet failed.\n"); -void VkDescriptorSetManager::UpdateDynamicSet() -{ WriteDescriptors update; - update.addBuffer(DynamicSet.get(), 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->ViewpointUBO->mBuffer.get(), 0, sizeof(HWViewpointUniforms)); - update.addBuffer(DynamicSet.get(), 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->MatrixBuffer->UniformBuffer->mBuffer.get(), 0, sizeof(MatricesUBO)); - update.addBuffer(DynamicSet.get(), 2, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->StreamBuffer->UniformBuffer->mBuffer.get(), 0, sizeof(StreamUBO)); + update.addBuffer(HWBufferSet.get(), 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->ViewpointUBO->mBuffer.get(), 0, sizeof(HWViewpointUniforms)); + update.addBuffer(HWBufferSet.get(), 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->MatrixBuffer->UniformBuffer->mBuffer.get(), 0, sizeof(MatricesUBO)); + update.addBuffer(HWBufferSet.get(), 2, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->StreamBuffer->UniformBuffer->mBuffer.get(), 0, sizeof(StreamUBO)); + update.addBuffer(HWBufferSet.get(), 3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetBufferManager()->LightBufferSSO->mBuffer.get()); update.updateSets(fb->device); } -void VkDescriptorSetManager::CreateFixedSet() +void VkDescriptorSetManager::CreateFixedSetLayout() { DescriptorSetLayoutBuilder builder; builder.addBinding(0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); builder.addBinding(1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); - builder.addBinding(2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT); if (fb->device->SupportsDeviceExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME)) - builder.addBinding(3, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1, VK_SHADER_STAGE_FRAGMENT_BIT); + builder.addBinding(2, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1, VK_SHADER_STAGE_FRAGMENT_BIT); FixedSetLayout = builder.create(fb->device); FixedSetLayout->SetDebugName("VkDescriptorSetManager.FixedSetLayout"); +} + +void VkDescriptorSetManager::UpdateFixedSet() +{ + fb->GetCommands()->DrawDeleteList->Add(std::move(FixedSet)); + fb->GetCommands()->DrawDeleteList->Add(std::move(FixedDescriptorPool)); DescriptorPoolBuilder poolbuilder; - poolbuilder.addPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1); poolbuilder.addPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2); if (fb->device->SupportsDeviceExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME)) poolbuilder.addPoolSize(VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 1); @@ -105,16 +129,12 @@ void VkDescriptorSetManager::CreateFixedSet() FixedSet = FixedDescriptorPool->allocate(FixedSetLayout.get()); if (!FixedSet) I_FatalError("CreateFixedSet failed.\n"); -} -void VkDescriptorSetManager::UpdateFixedSet() -{ 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.addBuffer(FixedSet.get(), 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetBufferManager()->LightBufferSSO->mBuffer.get()); if (fb->device->SupportsDeviceExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME)) - update.addAccelerationStructure(FixedSet.get(), 3, fb->GetRaytrace()->GetAccelStruct()); + update.addAccelerationStructure(FixedSet.get(), 2, fb->GetRaytrace()->GetAccelStruct()); update.updateSets(fb->device); } diff --git a/src/common/rendering/vulkan/renderer/vk_descriptorset.h b/src/common/rendering/vulkan/renderer/vk_descriptorset.h index c80e1a4c9..be9f1fd60 100644 --- a/src/common/rendering/vulkan/renderer/vk_descriptorset.h +++ b/src/common/rendering/vulkan/renderer/vk_descriptorset.h @@ -16,15 +16,17 @@ public: ~VkDescriptorSetManager(); void Init(); + void Deinit(); + void BeginFrame(); void UpdateFixedSet(); - void UpdateDynamicSet(); + void UpdateHWBufferSet(); void ResetHWTextureSets(); - VulkanDescriptorSetLayout* GetDynamicSetLayout() { return DynamicSetLayout.get(); } + VulkanDescriptorSetLayout* GetHWBufferSetLayout() { return HWBufferSetLayout.get(); } VulkanDescriptorSetLayout* GetFixedSetLayout() { return FixedSetLayout.get(); } VulkanDescriptorSetLayout* GetTextureSetLayout(int numLayers); - VulkanDescriptorSet* GetDynamicDescriptorSet() { return DynamicSet.get(); } + VulkanDescriptorSet* GetHWBufferDescriptorSet() { return HWBufferSet.get(); } VulkanDescriptorSet* GetFixedDescriptorSet() { return FixedSet.get(); } VulkanDescriptorSet* GetNullTextureDescriptorSet(); @@ -36,18 +38,18 @@ public: void RemoveMaterial(VkMaterial* texture); private: - void CreateDynamicSet(); - void CreateFixedSet(); + void CreateHWBufferSetLayout(); + void CreateFixedSetLayout(); std::unique_ptr AllocatePPDescriptorSet(VulkanDescriptorSetLayout* layout); VulkanFrameBuffer* fb = nullptr; - std::unique_ptr DynamicSetLayout; + std::unique_ptr HWBufferSetLayout; std::unique_ptr FixedSetLayout; std::vector> TextureSetLayouts; - std::unique_ptr DynamicDescriptorPool; + std::unique_ptr HWBufferDescriptorPool; std::unique_ptr FixedDescriptorPool; std::unique_ptr PPDescriptorPool; @@ -56,7 +58,7 @@ private: int TextureDescriptorsLeft = 0; std::vector> TextureDescriptorPools; - std::unique_ptr DynamicSet; + std::unique_ptr HWBufferSet; std::unique_ptr FixedSet; std::unique_ptr NullTextureDescriptorSet; diff --git a/src/common/rendering/vulkan/renderer/vk_raytrace.cpp b/src/common/rendering/vulkan/renderer/vk_raytrace.cpp index c7f2961f7..65e0533ec 100644 --- a/src/common/rendering/vulkan/renderer/vk_raytrace.cpp +++ b/src/common/rendering/vulkan/renderer/vk_raytrace.cpp @@ -28,57 +28,40 @@ VkRaytrace::VkRaytrace(VulkanFrameBuffer* fb) : fb(fb) { + NullMesh.MeshVertices.Push({ -1.0f, -1.0f, -1.0f }); + NullMesh.MeshVertices.Push({ 1.0f, -1.0f, -1.0f }); + NullMesh.MeshVertices.Push({ 1.0f, 1.0f, -1.0f }); + NullMesh.MeshVertices.Push({ -1.0f, -1.0f, -1.0f }); + NullMesh.MeshVertices.Push({ -1.0f, 1.0f, -1.0f }); + NullMesh.MeshVertices.Push({ 1.0f, 1.0f, -1.0f }); + NullMesh.MeshVertices.Push({ -1.0f, -1.0f, 1.0f }); + NullMesh.MeshVertices.Push({ 1.0f, -1.0f, 1.0f }); + NullMesh.MeshVertices.Push({ 1.0f, 1.0f, 1.0f }); + NullMesh.MeshVertices.Push({ -1.0f, -1.0f, 1.0f }); + NullMesh.MeshVertices.Push({ -1.0f, 1.0f, 1.0f }); + NullMesh.MeshVertices.Push({ 1.0f, 1.0f, 1.0f }); + for (int i = 0; i < 3 * 4; i++) + NullMesh.MeshElements.Push(i); + + SetLevelMesh(nullptr); } void VkRaytrace::SetLevelMesh(hwrenderer::LevelMesh* mesh) { + if (!mesh) + mesh = &NullMesh; + if (mesh != Mesh) { Reset(); Mesh = mesh; - if (Mesh) + if (fb->device->SupportsDeviceExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME)) { - if (fb->device->SupportsDeviceExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME)) - { - CreateVulkanObjects(); - } + CreateVulkanObjects(); } } } -VulkanAccelerationStructure* VkRaytrace::GetAccelStruct() -{ - if (tlAccelStruct) - return tlAccelStruct.get(); - - // We need a dummy accel struct to keep vulkan happy: - hwrenderer::LevelMesh dummy; - - dummy.MeshVertices.Push({ -1.0f, -1.0f, -1.0f }); - dummy.MeshVertices.Push({ 1.0f, -1.0f, -1.0f }); - dummy.MeshVertices.Push({ 1.0f, 1.0f, -1.0f }); - - dummy.MeshVertices.Push({ -1.0f, -1.0f, -1.0f }); - dummy.MeshVertices.Push({ -1.0f, 1.0f, -1.0f }); - dummy.MeshVertices.Push({ 1.0f, 1.0f, -1.0f }); - - dummy.MeshVertices.Push({ -1.0f, -1.0f, 1.0f }); - dummy.MeshVertices.Push({ 1.0f, -1.0f, 1.0f }); - dummy.MeshVertices.Push({ 1.0f, 1.0f, 1.0f }); - - dummy.MeshVertices.Push({ -1.0f, -1.0f, 1.0f }); - dummy.MeshVertices.Push({ -1.0f, 1.0f, 1.0f }); - dummy.MeshVertices.Push({ 1.0f, 1.0f, 1.0f }); - - for (int i = 0; i < 3 * 4; i++) - dummy.MeshElements.Push(i); - - Mesh = &dummy; - CreateVulkanObjects(); - Mesh = nullptr; - return tlAccelStruct.get(); -} - void VkRaytrace::Reset() { auto deletelist = fb->GetCommands()->DrawDeleteList.get(); diff --git a/src/common/rendering/vulkan/renderer/vk_raytrace.h b/src/common/rendering/vulkan/renderer/vk_raytrace.h index 5a4db0e5f..ae6f34ac9 100644 --- a/src/common/rendering/vulkan/renderer/vk_raytrace.h +++ b/src/common/rendering/vulkan/renderer/vk_raytrace.h @@ -13,7 +13,7 @@ public: void SetLevelMesh(hwrenderer::LevelMesh* mesh); - VulkanAccelerationStructure* GetAccelStruct(); + VulkanAccelerationStructure* GetAccelStruct() { return tlAccelStruct.get(); } private: void Reset(); @@ -24,6 +24,7 @@ private: VulkanFrameBuffer* fb = nullptr; + hwrenderer::LevelMesh NullMesh; hwrenderer::LevelMesh* Mesh = nullptr; std::unique_ptr vertexBuffer; diff --git a/src/common/rendering/vulkan/renderer/vk_renderpass.cpp b/src/common/rendering/vulkan/renderer/vk_renderpass.cpp index 1233a0131..d7f9d5a21 100644 --- a/src/common/rendering/vulkan/renderer/vk_renderpass.cpp +++ b/src/common/rendering/vulkan/renderer/vk_renderpass.cpp @@ -113,7 +113,7 @@ VulkanPipelineLayout* VkRenderPassManager::GetPipelineLayout(int numLayers) PipelineLayoutBuilder builder; builder.addSetLayout(descriptors->GetFixedSetLayout()); - builder.addSetLayout(descriptors->GetDynamicSetLayout()); + builder.addSetLayout(descriptors->GetHWBufferSetLayout()); if (numLayers != 0) builder.addSetLayout(descriptors->GetTextureSetLayout(numLayers)); builder.addPushConstantRange(VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(PushConstants)); diff --git a/src/common/rendering/vulkan/renderer/vk_renderstate.cpp b/src/common/rendering/vulkan/renderer/vk_renderstate.cpp index 6d1a1ab01..c8a10d30d 100644 --- a/src/common/rendering/vulkan/renderer/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/renderer/vk_renderstate.cpp @@ -458,7 +458,7 @@ void VkRenderState::ApplyDynamicSet() auto descriptors = fb->GetDescriptorSetManager(); uint32_t offsets[3] = { mViewpointOffset, matrixOffset, streamDataOffset }; - mCommandBuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, passManager->GetPipelineLayout(mPipelineKey.NumTextureLayers), 1, descriptors->GetDynamicDescriptorSet(), 3, offsets); + mCommandBuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, passManager->GetPipelineLayout(mPipelineKey.NumTextureLayers), 1, descriptors->GetHWBufferDescriptorSet(), 3, offsets); mLastViewpointOffset = mViewpointOffset; mLastMatricesOffset = matrixOffset; diff --git a/src/common/rendering/vulkan/renderer/vk_streambuffer.cpp b/src/common/rendering/vulkan/renderer/vk_streambuffer.cpp index b2bc402dd..1be05b5d1 100644 --- a/src/common/rendering/vulkan/renderer/vk_streambuffer.cpp +++ b/src/common/rendering/vulkan/renderer/vk_streambuffer.cpp @@ -28,7 +28,7 @@ VkStreamBufferWriter::VkStreamBufferWriter(VulkanFrameBuffer* fb) { - mBuffer = fb->GetBufferManager()->StreamBuffer; + mBuffer = fb->GetBufferManager()->StreamBuffer.get(); } bool VkStreamBufferWriter::Write(const StreamData& data) @@ -57,7 +57,7 @@ void VkStreamBufferWriter::Reset() VkMatrixBufferWriter::VkMatrixBufferWriter(VulkanFrameBuffer* fb) { - mBuffer = fb->GetBufferManager()->MatrixBuffer; + mBuffer = fb->GetBufferManager()->MatrixBuffer.get(); mIdentityMatrix.loadIdentity(); } diff --git a/src/common/rendering/vulkan/shaders/vk_ppshader.cpp b/src/common/rendering/vulkan/shaders/vk_ppshader.cpp index 66e167414..d0261a60f 100644 --- a/src/common/rendering/vulkan/shaders/vk_ppshader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_ppshader.cpp @@ -21,11 +21,13 @@ */ #include "vk_ppshader.h" +#include "vk_shader.h" #include "vulkan/system/vk_framebuffer.h" #include "vulkan/system/vk_builders.h" +#include "vulkan/system/vk_commandbuffer.h" #include "filesystem.h" -VkPPShader::VkPPShader(VulkanFrameBuffer* fb, PPShader *shader) +VkPPShader::VkPPShader(VulkanFrameBuffer* fb, PPShader *shader) : fb(fb) { FString prolog; if (!shader->Uniforms.empty()) @@ -41,6 +43,23 @@ VkPPShader::VkPPShader(VulkanFrameBuffer* fb, PPShader *shader) fragbuilder.setFragmentShader(LoadShaderCode(shader->FragmentShader, prolog, shader->Version)); FragmentShader = fragbuilder.create(shader->FragmentShader.GetChars(), fb->device); FragmentShader->SetDebugName(shader->FragmentShader.GetChars()); + + fb->GetShaderManager()->AddVkPPShader(this); +} + +VkPPShader::~VkPPShader() +{ + if (fb) + fb->GetShaderManager()->RemoveVkPPShader(this); +} + +void VkPPShader::Reset() +{ + if (fb) + { + fb->GetCommands()->DrawDeleteList->Add(std::move(VertexShader)); + fb->GetCommands()->DrawDeleteList->Add(std::move(FragmentShader)); + } } FString VkPPShader::LoadShaderCode(const FString &lumpName, const FString &defines, int version) diff --git a/src/common/rendering/vulkan/shaders/vk_ppshader.h b/src/common/rendering/vulkan/shaders/vk_ppshader.h index dec2f6656..77bc2ea83 100644 --- a/src/common/rendering/vulkan/shaders/vk_ppshader.h +++ b/src/common/rendering/vulkan/shaders/vk_ppshader.h @@ -3,6 +3,7 @@ #include "hwrenderer/postprocessing/hw_postprocess.h" #include "vulkan/system/vk_objects.h" +#include class VulkanFrameBuffer; @@ -10,6 +11,12 @@ class VkPPShader : public PPShaderBackend { public: VkPPShader(VulkanFrameBuffer* fb, PPShader *shader); + ~VkPPShader(); + + void Reset(); + + VulkanFrameBuffer* fb = nullptr; + std::list::iterator it; std::unique_ptr VertexShader; std::unique_ptr FragmentShader; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index 6e1f9a8ae..20c536f0d 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -124,6 +124,12 @@ VkShaderManager::~VkShaderManager() ShFinalize(); } +void VkShaderManager::Deinit() +{ + while (!PPShaders.empty()) + RemoveVkPPShader(PPShaders.back()); +} + VkShaderProgram *VkShaderManager::GetEffect(int effect, EPassType passType) { if (compileIndex == -1 && effect >= 0 && effect < MAX_EFFECTS && mEffectShaders[passType][effect].frag) @@ -152,15 +158,8 @@ static const char *shaderBindings = R"( layout(set = 0, binding = 0) uniform sampler2D ShadowMap; layout(set = 0, binding = 1) uniform sampler2DArray LightMap; - - // light buffers - layout(set = 0, binding = 2, std430) buffer LightBufferSSO - { - vec4 lights[]; - }; - #ifdef SUPPORTS_RAYTRACING - layout(set = 0, binding = 3) uniform accelerationStructureEXT TopLevelAS; + layout(set = 0, binding = 2) uniform accelerationStructureEXT TopLevelAS; #endif // This must match the HWViewpointUniforms struct @@ -223,6 +222,12 @@ static const char *shaderBindings = R"( StreamData data[MAX_STREAM_DATA]; }; + // light buffers + layout(set = 1, binding = 3, std430) buffer LightBufferSSO + { + vec4 lights[]; + }; + // textures layout(set = 2, binding = 0) uniform sampler2D tex; layout(set = 2, binding = 1) uniform sampler2D texture2; @@ -465,3 +470,15 @@ VkPPShader* VkShaderManager::GetVkShader(PPShader* shader) shader->Backend = std::make_unique(fb, shader); return static_cast(shader->Backend.get()); } + +void VkShaderManager::AddVkPPShader(VkPPShader* shader) +{ + shader->it = PPShaders.insert(PPShaders.end(), shader); +} + +void VkShaderManager::RemoveVkPPShader(VkPPShader* shader) +{ + shader->Reset(); + shader->fb = nullptr; + PPShaders.erase(shader->it); +} diff --git a/src/common/rendering/vulkan/shaders/vk_shader.h b/src/common/rendering/vulkan/shaders/vk_shader.h index 4c365f176..765594ab8 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.h +++ b/src/common/rendering/vulkan/shaders/vk_shader.h @@ -7,6 +7,7 @@ #include "matrix.h" #include "name.h" #include "hw_renderstate.h" +#include #define SHADER_MIN_REQUIRED_TEXTURE_LAYERS 8 @@ -66,12 +67,17 @@ public: VkShaderManager(VulkanFrameBuffer* fb); ~VkShaderManager(); + void Deinit(); + VkShaderProgram *GetEffect(int effect, EPassType passType); VkShaderProgram *Get(unsigned int eff, bool alphateston, EPassType passType); bool CompileNextShader(); VkPPShader* GetVkShader(PPShader* shader); + void AddVkPPShader(VkPPShader* shader); + void RemoveVkPPShader(VkPPShader* shader); + private: std::unique_ptr LoadVertShader(FString shadername, const char *vert_lump, const char *defines); std::unique_ptr LoadFragShader(FString shadername, const char *frag_lump, const char *material_lump, const char *light_lump, const char *defines, bool alphatest, bool gbufferpass); @@ -87,4 +93,6 @@ private: std::vector mEffectShaders[MAX_PASS_TYPES]; uint8_t compilePass = 0, compileState = 0; int compileIndex = 0; + + std::list PPShaders; }; diff --git a/src/common/rendering/vulkan/system/vk_buffer.cpp b/src/common/rendering/vulkan/system/vk_buffer.cpp index 1ae8cc65b..db7bc4ea8 100644 --- a/src/common/rendering/vulkan/system/vk_buffer.cpp +++ b/src/common/rendering/vulkan/system/vk_buffer.cpp @@ -31,18 +31,22 @@ VkBufferManager::VkBufferManager(VulkanFrameBuffer* fb) : fb(fb) VkBufferManager::~VkBufferManager() { - delete MatrixBuffer; - delete StreamBuffer; } void VkBufferManager::Init() { - MatrixBuffer = new VkStreamBuffer(this, sizeof(MatricesUBO), 50000); - StreamBuffer = new VkStreamBuffer(this, sizeof(StreamUBO), 300); + MatrixBuffer.reset(new VkStreamBuffer(this, sizeof(MatricesUBO), 50000)); + StreamBuffer.reset(new VkStreamBuffer(this, sizeof(StreamUBO), 300)); CreateFanToTrisIndexBuffer(); } +void VkBufferManager::Deinit() +{ + while (!Buffers.empty()) + RemoveBuffer(Buffers.back()); +} + void VkBufferManager::AddBuffer(VkHardwareBuffer* buffer) { buffer->it = Buffers.insert(Buffers.end(), buffer); diff --git a/src/common/rendering/vulkan/system/vk_buffer.h b/src/common/rendering/vulkan/system/vk_buffer.h index 210f8307c..39cc1ce15 100644 --- a/src/common/rendering/vulkan/system/vk_buffer.h +++ b/src/common/rendering/vulkan/system/vk_buffer.h @@ -19,6 +19,7 @@ public: ~VkBufferManager(); void Init(); + void Deinit(); IVertexBuffer* CreateVertexBuffer(); IIndexBuffer* CreateIndexBuffer(); @@ -33,8 +34,8 @@ public: VkHardwareDataBuffer* LightLines = nullptr; VkHardwareDataBuffer* LightList = nullptr; - VkStreamBuffer* MatrixBuffer = nullptr; - VkStreamBuffer* StreamBuffer = nullptr; + std::unique_ptr MatrixBuffer; + std::unique_ptr StreamBuffer; std::unique_ptr FanToTrisIndexBuffer; diff --git a/src/common/rendering/vulkan/system/vk_commandbuffer.h b/src/common/rendering/vulkan/system/vk_commandbuffer.h index 635d1f27b..b97a44dbe 100644 --- a/src/common/rendering/vulkan/system/vk_commandbuffer.h +++ b/src/common/rendering/vulkan/system/vk_commandbuffer.h @@ -36,6 +36,7 @@ public: std::vector> AccelStructs; std::vector> DescriptorPools; std::vector> Descriptors; + std::vector> Shaders; std::vector> CommandBuffers; size_t TotalSize = 0; @@ -48,6 +49,7 @@ public: void Add(std::unique_ptr obj) { if (obj) { DescriptorPools.push_back(std::move(obj)); } } void Add(std::unique_ptr obj) { if (obj) { Descriptors.push_back(std::move(obj)); } } void Add(std::unique_ptr obj) { if (obj) { CommandBuffers.push_back(std::move(obj)); } } + void Add(std::unique_ptr obj) { if (obj) { Shaders.push_back(std::move(obj)); } } }; std::unique_ptr TransferDeleteList = std::make_unique(); diff --git a/src/common/rendering/vulkan/system/vk_framebuffer.cpp b/src/common/rendering/vulkan/system/vk_framebuffer.cpp index 02f7aa252..a04abbcd3 100644 --- a/src/common/rendering/vulkan/system/vk_framebuffer.cpp +++ b/src/common/rendering/vulkan/system/vk_framebuffer.cpp @@ -98,6 +98,11 @@ VulkanFrameBuffer::~VulkanFrameBuffer() delete mLights; mShadowMap.Reset(); + mDescriptorSetManager->Deinit(); + mTextureManager->Deinit(); + mBufferManager->Deinit(); + mShaderManager->Deinit(); + mCommands->DeleteFrameObjects(); } @@ -405,16 +410,12 @@ TArray VulkanFrameBuffer::GetScreenshotBuffer(int &pitch, ESSType &colo void VulkanFrameBuffer::BeginFrame() { SetViewportRects(nullptr); + mCommands->BeginFrame(); mTextureManager->BeginFrame(); mScreenBuffers->BeginFrame(screen->mScreenViewport.width, screen->mScreenViewport.height, screen->mSceneViewport.width, screen->mSceneViewport.height); mSaveBuffers->BeginFrame(SAVEPICWIDTH, SAVEPICHEIGHT, SAVEPICWIDTH, SAVEPICHEIGHT); mRenderState->BeginFrame(); - - WaitForCommands(false); - mDescriptorSetManager->UpdateFixedSet(); - mDescriptorSetManager->UpdateDynamicSet(); - - mCommands->BeginFrame(); + mDescriptorSetManager->BeginFrame(); } void VulkanFrameBuffer::InitLightmap(int LMTextureSize, int LMTextureCount, TArray& LMTextureData) diff --git a/src/common/rendering/vulkan/system/vk_hwbuffer.cpp b/src/common/rendering/vulkan/system/vk_hwbuffer.cpp index f6b19a6f3..73987b138 100644 --- a/src/common/rendering/vulkan/system/vk_hwbuffer.cpp +++ b/src/common/rendering/vulkan/system/vk_hwbuffer.cpp @@ -179,7 +179,7 @@ void VkHardwareBuffer::Resize(size_t newsize) // Transfer data from old to new fb->GetCommands()->GetTransferCommands()->copyBuffer(oldBuffer.get(), mBuffer.get(), 0, 0, oldsize); fb->GetCommands()->WaitForCommands(false); - fb->GetDescriptorSetManager()->UpdateDynamicSet(); // Old buffer may be part of the dynamic set + fb->GetDescriptorSetManager()->UpdateHWBufferSet(); // Old buffer may be part of the bound descriptor set // Fetch pointer to new buffer map = mBuffer->Map(0, newsize); diff --git a/src/common/rendering/vulkan/textures/vk_pptexture.cpp b/src/common/rendering/vulkan/textures/vk_pptexture.cpp index 4ca971758..0b954e794 100644 --- a/src/common/rendering/vulkan/textures/vk_pptexture.cpp +++ b/src/common/rendering/vulkan/textures/vk_pptexture.cpp @@ -25,7 +25,7 @@ #include "vulkan/system/vk_framebuffer.h" #include "vulkan/system/vk_commandbuffer.h" -VkPPTexture::VkPPTexture(VulkanFrameBuffer* fb, PPTexture *texture) +VkPPTexture::VkPPTexture(VulkanFrameBuffer* fb, PPTexture *texture) : fb(fb) { VkFormat format; int pixelsize; diff --git a/src/common/rendering/vulkan/textures/vk_texture.cpp b/src/common/rendering/vulkan/textures/vk_texture.cpp index 361cddaec..bb9ca23d6 100644 --- a/src/common/rendering/vulkan/textures/vk_texture.cpp +++ b/src/common/rendering/vulkan/textures/vk_texture.cpp @@ -42,6 +42,14 @@ VkTextureManager::~VkTextureManager() RemovePPTexture(PPTextures.back()); } +void VkTextureManager::Deinit() +{ + while (!Textures.empty()) + RemoveTexture(Textures.back()); + while (!PPTextures.empty()) + RemovePPTexture(PPTextures.back()); +} + void VkTextureManager::BeginFrame() { if (!Shadowmap.Image || Shadowmap.Image->width != gl_shadowmap_quality) diff --git a/src/common/rendering/vulkan/textures/vk_texture.h b/src/common/rendering/vulkan/textures/vk_texture.h index fc19827da..47f698f6d 100644 --- a/src/common/rendering/vulkan/textures/vk_texture.h +++ b/src/common/rendering/vulkan/textures/vk_texture.h @@ -19,6 +19,8 @@ public: VkTextureManager(VulkanFrameBuffer* fb); ~VkTextureManager(); + void Deinit(); + void BeginFrame(); void SetLightmap(int LMTextureSize, int LMTextureCount, const TArray& LMTextureData); diff --git a/wadsrc/static/shaders/glsl/main.fp b/wadsrc/static/shaders/glsl/main.fp index 71a97e346..275fc5f46 100644 --- a/wadsrc/static/shaders/glsl/main.fp +++ b/wadsrc/static/shaders/glsl/main.fp @@ -352,7 +352,7 @@ float shadowAttenuation(vec4 lightpos, float lightcolorA) vec3 origin = pixelpos.xyz; vec3 direction = normalize(lightpos.xyz - pixelpos.xyz); float lightDistance = distance(pixelpos.xyz, lightpos.xyz); - +/* rayQueryEXT rayQuery; rayQueryInitializeEXT(rayQuery, TopLevelAS, gl_RayFlagsTerminateOnFirstHitEXT, 0xFF, origin, 0.01f, direction, lightDistance); @@ -364,7 +364,7 @@ float shadowAttenuation(vec4 lightpos, float lightcolorA) { return 0.0; } - +*/ return 1.0; }