From ebac0143e0530b4238f5b121db93cf8a9f726cc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 12 Nov 2017 10:28:55 +0100 Subject: [PATCH] Vulkan: Use a device allocator for tesselation data textures. Add comment about better solutions. --- Common/Vulkan/VulkanContext.h | 6 +++--- GPU/Vulkan/DrawEngineVulkan.cpp | 10 ++++++---- GPU/Vulkan/DrawEngineVulkan.h | 2 ++ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Common/Vulkan/VulkanContext.h b/Common/Vulkan/VulkanContext.h index 07f82ead75..6dbef6e33b 100644 --- a/Common/Vulkan/VulkanContext.h +++ b/Common/Vulkan/VulkanContext.h @@ -272,7 +272,7 @@ private: VkPhysicalDeviceMemoryProperties memory_properties{}; // Custom collection of things that are good to know - VulkanPhysicalDeviceInfo deviceInfo_; + VulkanPhysicalDeviceInfo deviceInfo_{}; // Swap chain int width_ = 0; @@ -299,8 +299,8 @@ private: uint32_t queue_count = 0; - VkPhysicalDeviceFeatures featuresAvailable_; - VkPhysicalDeviceFeatures featuresEnabled_; + VkPhysicalDeviceFeatures featuresAvailable_{}; + VkPhysicalDeviceFeatures featuresEnabled_{}; std::vector cmdQueue_; }; diff --git a/GPU/Vulkan/DrawEngineVulkan.cpp b/GPU/Vulkan/DrawEngineVulkan.cpp index 4d5c5930ce..53676af9d6 100644 --- a/GPU/Vulkan/DrawEngineVulkan.cpp +++ b/GPU/Vulkan/DrawEngineVulkan.cpp @@ -1097,25 +1097,27 @@ void DrawEngineVulkan::UpdateUBOs(FrameData *frame) { } DrawEngineVulkan::TessellationDataTransferVulkan::TessellationDataTransferVulkan(VulkanContext *vulkan, Draw::DrawContext *draw) - : TessellationDataTransfer(), vulkan_(vulkan), draw_(draw) { + : TessellationDataTransfer(), vulkan_(vulkan), draw_(draw), tessAlloc_(vulkan_, 128 * 1024, 4096 * 1024) { CreateSampler(); } DrawEngineVulkan::TessellationDataTransferVulkan::~TessellationDataTransferVulkan() { for (int i = 0; i < 3; i++) delete data_tex[i]; + tessAlloc_.Destroy(); vulkan_->Delete().QueueDeleteSampler(sampler); } // TODO: Consolidate the three textures into one, with height 3. // This can be done for all the backends. +// TODO: Actually, even better, avoid the usage of textures altogether and just use shader storage buffers from the current pushbuffer. void DrawEngineVulkan::TessellationDataTransferVulkan::PrepareBuffers(float *&pos, float *&tex, float *&col, int size, bool hasColor, bool hasTexCoords) { assert(size > 0); VkCommandBuffer cmd = (VkCommandBuffer)draw_->GetNativeObject(Draw::NativeObject::INIT_COMMANDBUFFER); // Position delete data_tex[0]; - data_tex[0] = new VulkanTexture(vulkan_, nullptr); // TODO: Should really use an allocator. + data_tex[0] = new VulkanTexture(vulkan_, &tessAlloc_); bool success = data_tex[0]->CreateDirect(cmd, size, 1, 1, VK_FORMAT_R32G32B32A32_SFLOAT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); assert(success); @@ -1125,7 +1127,7 @@ void DrawEngineVulkan::TessellationDataTransferVulkan::PrepareBuffers(float *&po // Texcoords delete data_tex[1]; if (hasTexCoords) { - data_tex[1] = new VulkanTexture(vulkan_, nullptr); // TODO: Should really use an allocator. + data_tex[1] = new VulkanTexture(vulkan_, &tessAlloc_); success = data_tex[1]->CreateDirect(cmd, size, 1, 1, VK_FORMAT_R32G32B32A32_SFLOAT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); assert(success); @@ -1140,7 +1142,7 @@ void DrawEngineVulkan::TessellationDataTransferVulkan::PrepareBuffers(float *&po // Color colSize_ = hasColor ? size : 1; delete data_tex[2]; - data_tex[2] = new VulkanTexture(vulkan_, nullptr); // TODO: Should really use an allocator. + data_tex[2] = new VulkanTexture(vulkan_, &tessAlloc_); success = data_tex[2]->CreateDirect(cmd, colSize_, 1, 1, VK_FORMAT_R32G32B32A32_SFLOAT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); assert(success); diff --git a/GPU/Vulkan/DrawEngineVulkan.h b/GPU/Vulkan/DrawEngineVulkan.h index b91993e998..f8242f9619 100644 --- a/GPU/Vulkan/DrawEngineVulkan.h +++ b/GPU/Vulkan/DrawEngineVulkan.h @@ -33,6 +33,7 @@ #include #include "Common/Hashmaps.h" +#include "Common/Vulkan/VulkanMemory.h" #include "GPU/Vulkan/VulkanUtil.h" @@ -281,6 +282,7 @@ private: VulkanTexture *data_tex[3]{}; VkSampler sampler = VK_NULL_HANDLE; VulkanPushBuffer *push_; // Updated each frame. + VulkanDeviceAllocator tessAlloc_; int posSize_ = 0; uint32_t posOffset_ = 0;