From e26fb04adf0b3aa4728c2b7b7bedc44f9fe43661 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 6 Jun 2022 05:46:57 +0200 Subject: [PATCH] Some minor bug fixes --- .../rendering/hwrenderer/data/hw_levelmesh.h | 2 +- .../rendering/vulkan/renderer/vk_raytrace.cpp | 44 +++++++++++-------- .../rendering/vulkan/shaders/vk_shader.cpp | 5 +-- .../rendering/vulkan/system/vk_builders.cpp | 2 +- .../rendering/vulkan/system/vk_device.cpp | 1 + 5 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index 2626293e8..c385f8738 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -14,7 +14,7 @@ public: TArray MeshVertices; TArray MeshUVIndex; - TArray MeshElements; + TArray MeshElements; TArray MeshSurfaces; }; diff --git a/src/common/rendering/vulkan/renderer/vk_raytrace.cpp b/src/common/rendering/vulkan/renderer/vk_raytrace.cpp index cb73c7466..6f9fbb2e5 100644 --- a/src/common/rendering/vulkan/renderer/vk_raytrace.cpp +++ b/src/common/rendering/vulkan/renderer/vk_raytrace.cpp @@ -48,16 +48,26 @@ VulkanAccelerationStructure* VkRaytrace::GetAccelStruct() // We need a dummy accel struct to keep vulkan happy: hwrenderer::LevelMesh dummy; - dummy.MeshVertices.Push({ 0.0f, 0.0f, 0.0f }); - dummy.MeshVertices.Push({ 0.0f, 1.0f, 0.0f }); - dummy.MeshVertices.Push({ 1.0f, 0.0f, 0.0f }); - dummy.MeshUVIndex.Push(0); - dummy.MeshUVIndex.Push(1); - dummy.MeshUVIndex.Push(2); - dummy.MeshElements.Push(0); - dummy.MeshElements.Push(1); - dummy.MeshElements.Push(2); - dummy.MeshSurfaces.Push(0); + + 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; @@ -87,10 +97,6 @@ void VkRaytrace::CreateVulkanObjects() CreateBottomLevelAccelerationStructure(); CreateTopLevelAccelerationStructure(); - //CreateShaders(); - //CreatePipeline(); - //CreateDescriptorSet(); - PipelineBarrier finishbuildbarrier; finishbuildbarrier.addMemory(VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR, VK_ACCESS_SHADER_READ_BIT); finishbuildbarrier.execute(GetVulkanFrameBuffer()->GetTransferCommands(), VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); @@ -98,6 +104,8 @@ void VkRaytrace::CreateVulkanObjects() void VkRaytrace::CreateVertexAndIndexBuffers() { + static_assert(sizeof(FVector3) == 3 * 4, "sizeof(FVector3) is not 12 bytes!"); + size_t vertexbuffersize = (size_t)Mesh->MeshVertices.Size() * sizeof(FVector3); size_t indexbuffersize = (size_t)Mesh->MeshElements.Size() * sizeof(uint32_t); size_t transferbuffersize = vertexbuffersize + indexbuffersize; @@ -126,8 +134,8 @@ void VkRaytrace::CreateVertexAndIndexBuffers() memcpy(data + indexoffset, Mesh->MeshElements.Data(), indexbuffersize); transferBuffer->Unmap(); - GetVulkanFrameBuffer()->GetTransferCommands()->copyBuffer(transferBuffer.get(), vertexBuffer.get(), vertexoffset, 0, vertexbuffersize); - GetVulkanFrameBuffer()->GetTransferCommands()->copyBuffer(transferBuffer.get(), indexBuffer.get(), indexoffset, 0, indexbuffersize); + GetVulkanFrameBuffer()->GetTransferCommands()->copyBuffer(transferBuffer.get(), vertexBuffer.get(), vertexoffset); + GetVulkanFrameBuffer()->GetTransferCommands()->copyBuffer(transferBuffer.get(), indexBuffer.get(), indexoffset); VkMemoryBarrier barrier = { VK_STRUCTURE_TYPE_MEMORY_BARRIER }; barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; @@ -151,7 +159,7 @@ void VkRaytrace::CreateBottomLevelAccelerationStructure() triangles.vertexStride = sizeof(FVector3); triangles.indexType = VK_INDEX_TYPE_UINT32; triangles.indexData.deviceAddress = indexAddress; - triangles.maxVertex = Mesh->MeshVertices.Size(); + triangles.maxVertex = Mesh->MeshVertices.Size() - 1; VkAccelerationStructureGeometryKHR accelStructBLDesc = { VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR }; accelStructBLDesc.geometryType = VK_GEOMETRY_TYPE_TRIANGLES_KHR; @@ -164,7 +172,7 @@ void VkRaytrace::CreateBottomLevelAccelerationStructure() VkAccelerationStructureBuildGeometryInfoKHR buildInfo = { VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR }; buildInfo.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR; buildInfo.mode = VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR; - buildInfo.flags = accelStructBLDesc.flags | VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR; + buildInfo.flags = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR; buildInfo.geometryCount = 1; buildInfo.pGeometries = &accelStructBLDesc; diff --git a/src/common/rendering/vulkan/shaders/vk_shader.cpp b/src/common/rendering/vulkan/shaders/vk_shader.cpp index aaab9b6a9..544fe2a24 100644 --- a/src/common/rendering/vulkan/shaders/vk_shader.cpp +++ b/src/common/rendering/vulkan/shaders/vk_shader.cpp @@ -429,10 +429,7 @@ FString VkShaderManager::GetTargetGlslVersion() { if (device->ApiVersion == VK_API_VERSION_1_2) { - return R"(#version 460 - #extension GL_EXT_ray_tracing : enable - #extension GL_EXT_ray_query : enable - )"; + return "#version 460\n#extension GL_EXT_ray_query : enable\n"; } else { diff --git a/src/common/rendering/vulkan/system/vk_builders.cpp b/src/common/rendering/vulkan/system/vk_builders.cpp index e426f9dec..61f6fa67e 100644 --- a/src/common/rendering/vulkan/system/vk_builders.cpp +++ b/src/common/rendering/vulkan/system/vk_builders.cpp @@ -160,7 +160,7 @@ std::unique_ptr ShaderBuilder::create(const char *shadername, Vulk glslang::TShader shader(stage); shader.setStrings(sources, 1); shader.setEnvInput(glslang::EShSourceGlsl, stage, glslang::EShClientVulkan, 100); - if (device->ApiVersion == VK_API_VERSION_1_2) + if (device->ApiVersion >= VK_API_VERSION_1_2) { shader.setEnvClient(glslang::EShClientVulkan, glslang::EShTargetVulkan_1_2); shader.setEnvTarget(glslang::EShTargetSpv, glslang::EShTargetSpv_1_4); diff --git a/src/common/rendering/vulkan/system/vk_device.cpp b/src/common/rendering/vulkan/system/vk_device.cpp index 28297afbc..c61f91337 100644 --- a/src/common/rendering/vulkan/system/vk_device.cpp +++ b/src/common/rendering/vulkan/system/vk_device.cpp @@ -216,6 +216,7 @@ bool VulkanDevice::SupportsDeviceExtension(const char *ext) const void VulkanDevice::CreateAllocator() { VmaAllocatorCreateInfo allocinfo = {}; + allocinfo.vulkanApiVersion = ApiVersion; if (SupportsDeviceExtension(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME) && SupportsDeviceExtension(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME)) allocinfo.flags |= VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT; if (SupportsDeviceExtension(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME))