From 4083306b6726eb4df6fb8acd6281f73faa7aabb1 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Wed, 26 Jun 2019 15:18:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=B0=E7=9A=84VkMemory?= =?UTF-8?q?=E5=B0=81=E8=A3=85=EF=BC=8C=E5=B9=B6=E5=B0=86=E8=B4=B4=E5=9B=BE?= =?UTF-8?q?=E7=9A=84=E6=98=BE=E5=AD=98=E5=88=86=E9=85=8D=E8=BD=AC=E7=A7=BB?= =?UTF-8?q?=E5=88=B0=E4=B8=8A=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/hgl/graph/vulkan/VK.h | 1 + inc/hgl/graph/vulkan/VKDevice.h | 4 ++ inc/hgl/graph/vulkan/VKMemory.h | 48 +++++++++++++++++++++ inc/hgl/graph/vulkan/VKTexture.h | 4 +- src/RenderDevice/Vulkan/CMakeLists.txt | 3 ++ src/RenderDevice/Vulkan/VKBuffer.cpp | 1 + src/RenderDevice/Vulkan/VKDeviceMemory.cpp | 25 +++++++++++ src/RenderDevice/Vulkan/VKDeviceTexture.cpp | 16 +++---- src/RenderDevice/Vulkan/VKMemory.cpp | 42 ++++++++++++++++++ src/RenderDevice/Vulkan/VKTexture.cpp | 3 +- 10 files changed, 133 insertions(+), 14 deletions(-) create mode 100644 inc/hgl/graph/vulkan/VKMemory.h create mode 100644 src/RenderDevice/Vulkan/VKDeviceMemory.cpp create mode 100644 src/RenderDevice/Vulkan/VKMemory.cpp diff --git a/inc/hgl/graph/vulkan/VK.h b/inc/hgl/graph/vulkan/VK.h index c03da839..a7d2eb01 100644 --- a/inc/hgl/graph/vulkan/VK.h +++ b/inc/hgl/graph/vulkan/VK.h @@ -31,6 +31,7 @@ class TextureCubemapArray; class Sampler; +class Memory; class Buffer; class VertexBuffer; class IndexBuffer; diff --git a/inc/hgl/graph/vulkan/VKDevice.h b/inc/hgl/graph/vulkan/VKDevice.h index 0d18948c..4b8478e6 100644 --- a/inc/hgl/graph/vulkan/VKDevice.h +++ b/inc/hgl/graph/vulkan/VKDevice.h @@ -77,6 +77,10 @@ public: bool Resize (uint,uint); +public: //内存相关 + + Memory *Device::CreateMemory(const VkMemoryRequirements &,uint32_t properties); + public: //Buffer相关 Buffer * CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,const void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE); diff --git a/inc/hgl/graph/vulkan/VKMemory.h b/inc/hgl/graph/vulkan/VKMemory.h new file mode 100644 index 00000000..76971550 --- /dev/null +++ b/inc/hgl/graph/vulkan/VKMemory.h @@ -0,0 +1,48 @@ +#ifndef HGL_GRAPH_VULKAN_MEMORY_INCLUDE +#define HGL_GRAPH_VULKAN_MEMORY_INCLUDE + +#include +VK_NAMESPACE_BEGIN +class Memory +{ + VkDevice device; + VkDeviceMemory memory; + VkMemoryRequirements req; + uint32_t index; + uint32_t properties; + +private: + + friend class Device; + + Memory(VkDevice dev,VkDeviceMemory dm,const VkMemoryRequirements &mr,const uint32 i,const uint32_t p) + { + device=dev; + memory=dm; + req=mr; + index=i; + properties=p; + } + +public: + + virtual ~Memory(); + + operator VkDeviceMemory(){return memory;} + + const VkMemoryRequirements &GetRequirements ()const{return req;} + + const uint32_t GetType ()const{return req.memoryTypeBits;} + const VkDeviceSize GetSize ()const{return req.size;} + const VkDeviceSize GetAligment ()const{return req.alignment;} + const uint32_t GetTypeIndex ()const{return index;} + const uint32_t GetProperties ()const{return properties;} + + void *Map(); + void *Map(VkDeviceSize offset,VkDeviceSize map_size); + void Unmap(); + + bool Bind(VkImage image); +};//class Memory +VK_NAMESPACE_END +#endif//HGL_GRAPH_VULKAN_MEMORY_INCLUDE diff --git a/inc/hgl/graph/vulkan/VKTexture.h b/inc/hgl/graph/vulkan/VKTexture.h index 00bbca72..ddb3d4ef 100644 --- a/inc/hgl/graph/vulkan/VKTexture.h +++ b/inc/hgl/graph/vulkan/VKTexture.h @@ -6,7 +6,7 @@ VK_NAMESPACE_BEGIN struct TextureData { - VkDeviceMemory memory =nullptr; + Memory * memory =nullptr; VkImage image =nullptr; VkImageLayout image_layout=VK_IMAGE_LAYOUT_UNDEFINED; ImageView * image_view =nullptr; @@ -30,7 +30,7 @@ public: operator TextureData * (){return data;} - operator VkDeviceMemory (){return data?data->memory:nullptr;} + operator Memory * (){return data?data->memory:nullptr;} operator VkImage (){return data?data->image:nullptr;} operator VkImageLayout (){return data?data->image_layout:VK_IMAGE_LAYOUT_UNDEFINED;} operator VkImageView (){return data?data->image_view->operator VkImageView():nullptr;} diff --git a/src/RenderDevice/Vulkan/CMakeLists.txt b/src/RenderDevice/Vulkan/CMakeLists.txt index bf6069d6..464e723b 100644 --- a/src/RenderDevice/Vulkan/CMakeLists.txt +++ b/src/RenderDevice/Vulkan/CMakeLists.txt @@ -1,4 +1,5 @@ SET(RENDER_DEVICE_VULKAN_HEADER ${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VK.h + ${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKMemory.h ${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKBuffer.h ${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKBufferData.h ${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKCommandBuffer.h @@ -27,6 +28,7 @@ ${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKRenderTarget.h) SET(RENDER_DEVICE_VULKAN_SOURCE VKFormat.cpp + VKMemory.cpp VKInstance.cpp VKPhysicalDevice.cpp VKImageView.cpp @@ -34,6 +36,7 @@ SET(RENDER_DEVICE_VULKAN_SOURCE VKFormat.cpp VKDeviceAttribute.cpp VKDeviceCreater.cpp VKDevice.cpp + VKDeviceMemory.cpp VKDeviceBuffer.cpp VKDeviceTexture.cpp VKDeviceRenderPass.cpp diff --git a/src/RenderDevice/Vulkan/VKBuffer.cpp b/src/RenderDevice/Vulkan/VKBuffer.cpp index 8d75c707..8a9473d3 100644 --- a/src/RenderDevice/Vulkan/VKBuffer.cpp +++ b/src/RenderDevice/Vulkan/VKBuffer.cpp @@ -23,6 +23,7 @@ uint8_t *Buffer::Map(uint32_t start,uint32_t size) return nullptr; } + void Buffer::Unmap() { vkUnmapMemory(device,buf.memory); diff --git a/src/RenderDevice/Vulkan/VKDeviceMemory.cpp b/src/RenderDevice/Vulkan/VKDeviceMemory.cpp new file mode 100644 index 00000000..0cd97d81 --- /dev/null +++ b/src/RenderDevice/Vulkan/VKDeviceMemory.cpp @@ -0,0 +1,25 @@ +#include +#include +VK_NAMESPACE_BEGIN +Memory *Device::CreateMemory(const VkMemoryRequirements &req,uint32_t properties) +{ + uint32_t index; + + if(!attr->CheckMemoryType(req.memoryTypeBits,properties,&index)) + return(false); + + VkMemoryAllocateInfo alloc_info; + + alloc_info.sType =VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + alloc_info.pNext =nullptr; + alloc_info.memoryTypeIndex =index; + alloc_info.allocationSize =req.size; + + VkDeviceMemory memory; + + if(vkAllocateMemory(attr->device,&alloc_info,nullptr,&memory)!=VK_SUCCESS) + return(nullptr); + + return(new Memory(attr->device,memory,req,index,properties)); +} +VK_NAMESPACE_END diff --git a/src/RenderDevice/Vulkan/VKDeviceTexture.cpp b/src/RenderDevice/Vulkan/VKDeviceTexture.cpp index 948f5b7a..9f56471a 100644 --- a/src/RenderDevice/Vulkan/VKDeviceTexture.cpp +++ b/src/RenderDevice/Vulkan/VKDeviceTexture.cpp @@ -5,6 +5,7 @@ #include #include #include +#include VK_NAMESPACE_BEGIN namespace { @@ -55,21 +56,13 @@ Texture2D *Device::CreateTexture2D(const VkFormat video_format,uint32_t width,ui if(vkCreateImage(attr->device, &imageCreateInfo, nullptr, &image)!=VK_SUCCESS) return(nullptr); - VkDeviceMemory memory; - - VkMemoryAllocateInfo memAllocInfo; VkMemoryRequirements memReqs; - memAllocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; - memAllocInfo.pNext = nullptr; - vkGetImageMemoryRequirements(attr->device, image, &memReqs); - memAllocInfo.allocationSize = memReqs.size; - attr->CheckMemoryType(memReqs.memoryTypeBits,VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,&memAllocInfo.memoryTypeIndex); + Memory *dm=CreateMemory(memReqs,VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); - if(vkAllocateMemory(attr->device, &memAllocInfo, nullptr, &memory)==VK_SUCCESS) - if(vkBindImageMemory(attr->device, image, memory, 0)==VK_SUCCESS) + if(dm&&dm->Bind(image)) { ImageView *image_view=CreateImageView2D(attr->device,video_format,aspectMask,image); @@ -79,7 +72,7 @@ Texture2D *Device::CreateTexture2D(const VkFormat video_format,uint32_t width,ui tex_data->ref = false; tex_data->mip_levels = 0; - tex_data->memory = memory; + tex_data->memory = dm; tex_data->image_layout = image_layout; tex_data->image = image; tex_data->image_view = image_view; @@ -91,6 +84,7 @@ Texture2D *Device::CreateTexture2D(const VkFormat video_format,uint32_t width,ui } } + delete dm; vkDestroyImage(attr->device,image,nullptr); return(nullptr); } diff --git a/src/RenderDevice/Vulkan/VKMemory.cpp b/src/RenderDevice/Vulkan/VKMemory.cpp new file mode 100644 index 00000000..5b355115 --- /dev/null +++ b/src/RenderDevice/Vulkan/VKMemory.cpp @@ -0,0 +1,42 @@ +#include +VK_NAMESPACE_BEGIN +Memory::~Memory() +{ + vkFreeMemory(device,memory,nullptr); +} + +void *Memory::Map() +{ + void *result; + + if(vkMapMemory(device,memory,0,req.size,0,&result)==VK_SUCCESS) + return result; + + return(nullptr); +} + +void *Memory::Map(const VkDeviceSize offset,const VkDeviceSize size) +{ + if(offset<0||offset+size>=req.size) + return(nullptr); + + void *result; + + if(vkMapMemory(device,memory,0,size,0,&result)==VK_SUCCESS) + return result; + + return(nullptr); +} + +void Memory::Unmap() +{ + vkUnmapMemory(device,memory); +} + +bool Memory::Bind(VkImage image) +{ + if(!image)return(false); + + return(vkBindImageMemory(device,image,memory,0)==VK_SUCCESS); +} +VK_NAMESPACE_END diff --git a/src/RenderDevice/Vulkan/VKTexture.cpp b/src/RenderDevice/Vulkan/VKTexture.cpp index 1eebd010..d8fde5d8 100644 --- a/src/RenderDevice/Vulkan/VKTexture.cpp +++ b/src/RenderDevice/Vulkan/VKTexture.cpp @@ -1,5 +1,6 @@ #include #include +#include VK_NAMESPACE_BEGIN Texture::~Texture() { @@ -14,6 +15,6 @@ Texture::~Texture() vkDestroyImage(device,data->image,nullptr); if(data->memory) - vkFreeMemory(device,data->memory,nullptr); + delete data->memory; } VK_NAMESPACE_END