From 30edac78bd66d34f54dc7bb2a60a96558a70ee64 Mon Sep 17 00:00:00 2001 From: HuYingzhuo Date: Thu, 11 Apr 2019 22:40:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0RenderSurface::CreateBuffer?= =?UTF-8?q?=E4=B8=8EVKBuffer=E5=B0=81=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Vulkan/CMakeLists.txt | 28 +++++++++++++----- example/Vulkan/RenderSurface.cpp | 51 ++++++++++++++++++++++++++++++++ example/Vulkan/RenderSurface.h | 8 +++++ example/Vulkan/VKBuffer.cpp | 23 ++++++++++++++ example/Vulkan/VKBuffer.h | 33 +++++++++++++++++++++ example/Vulkan/main.cpp | 11 +++++++ 6 files changed, 147 insertions(+), 7 deletions(-) create mode 100644 example/Vulkan/VKBuffer.cpp create mode 100644 example/Vulkan/VKBuffer.h diff --git a/example/Vulkan/CMakeLists.txt b/example/Vulkan/CMakeLists.txt index c6d5a46f..3e6a2aa0 100644 --- a/example/Vulkan/CMakeLists.txt +++ b/example/Vulkan/CMakeLists.txt @@ -5,12 +5,26 @@ ELSEIF(WIN32) SET(RENDER_WINDOW_SOURCE WinWindow.cpp) ENDIF() -add_executable(VulkanTest main.cpp - ${RENDER_WINDOW_SOURCE} - VKInstance.cpp - VKCommandBuffer.cpp - RenderSurfaceAttribute.cpp - RenderSurfaceCreater.cpp - RenderSurface.cpp) +SET(VULKAN_TEST_SOURCE_FILES main.cpp + ${RENDER_WINDOW_SOURCE} + VKInstance.cpp + VKCommandBuffer.cpp + RenderSurfaceAttribute.cpp + RenderSurfaceCreater.cpp + RenderSurface.cpp + VKBuffer.cpp) + +SET(VULKAN_TEST_HEADER_FILES VK.h + VKInstance.h + VKSurfaceExtensionName.h + RenderSurfaceAttribute.h + RenderSurface.h + VKBuffer.h + Window.h) + +SOURCE_GROUP("Header Files" FILES ${VULKAN_TEST_HEADER_FILES}) +SOURCE_GROUP("Source Files" FILES ${VULKAN_TEST_SOURCE_FILES}) + +add_executable(VulkanTest ${VULKAN_TEST_HEADER_FILES} ${VULKAN_TEST_SOURCE_FILES}) target_link_libraries(VulkanTest PRIVATE ${ULRE} ${VULKAN_LIB} ${RENDER_WINDOW_LIBRARY}) diff --git a/example/Vulkan/RenderSurface.cpp b/example/Vulkan/RenderSurface.cpp index 2a589a6c..1dbcb38f 100644 --- a/example/Vulkan/RenderSurface.cpp +++ b/example/Vulkan/RenderSurface.cpp @@ -2,6 +2,57 @@ VK_NAMESPACE_BEGIN +Buffer *RenderSurface::CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,VkSharingMode sharing_mode) +{ + VkBufferCreateInfo buf_info={}; + buf_info.sType=VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + buf_info.pNext=nullptr; + buf_info.usage=buf_usage; + buf_info.size=size; + buf_info.queueFamilyIndexCount=0; + buf_info.pQueueFamilyIndices=nullptr; + buf_info.sharingMode=sharing_mode; + buf_info.flags=0; + + VkBuffer buf; + + if(vkCreateBuffer(rsa->device,&buf_info,nullptr,&buf)!=VK_SUCCESS) + return(nullptr); + + VkMemoryRequirements mem_reqs; + vkGetBufferMemoryRequirements(rsa->device,buf,&mem_reqs); + + VkMemoryAllocateInfo alloc_info={}; + alloc_info.sType=VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + alloc_info.pNext=NULL; + alloc_info.memoryTypeIndex=0; + alloc_info.allocationSize=mem_reqs.size; + + if(rsa->CheckMemoryType(mem_reqs.memoryTypeBits,VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,&alloc_info.memoryTypeIndex)) + { + VkDeviceMemory mem; + + if(vkAllocateMemory(rsa->device,&alloc_info,nullptr,&mem)==VK_SUCCESS) + { + if(vkBindBufferMemory(rsa->device,buf,mem,0)==VK_SUCCESS) + { + VkDescriptorBufferInfo buf_info; + + buf_info.buffer=buf; + buf_info.offset=0; + buf_info.range=size; + + return(new Buffer(rsa->device,buf,mem,buf_info)); + } + + vkFreeMemory(rsa->device,mem,nullptr); + } + } + + vkDestroyBuffer(rsa->device,buf,nullptr); + return(nullptr); +} + CommandBuffer *RenderSurface::CreateCommandBuffer() { if(!rsa->cmd_pool) diff --git a/example/Vulkan/RenderSurface.h b/example/Vulkan/RenderSurface.h index 2f7df16a..a00a8045 100644 --- a/example/Vulkan/RenderSurface.h +++ b/example/Vulkan/RenderSurface.h @@ -5,6 +5,7 @@ #include"VK.h" #include"Window.h" #include"RenderSurfaceAttribute.h" +#include"VKBuffer.h" #include"VKCommandBuffer.h" VK_NAMESPACE_BEGIN @@ -33,6 +34,13 @@ public: public: + Buffer * CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE); + + Buffer * CreateUBO(VkDeviceSize size,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE) + { + return CreateBuffer(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,size,sharing_mode); + } + CommandBuffer * CreateCommandBuffer (); };//class RenderSurface VK_NAMESPACE_END diff --git a/example/Vulkan/VKBuffer.cpp b/example/Vulkan/VKBuffer.cpp new file mode 100644 index 00000000..36fce2b9 --- /dev/null +++ b/example/Vulkan/VKBuffer.cpp @@ -0,0 +1,23 @@ +#include"VKBuffer.h" + +VK_NAMESPACE_BEGIN +Buffer::~Buffer() +{ + vkDestroyBuffer(device,buf,nullptr); + vkFreeMemory(device,mem,nullptr); +} + +uint8_t *Buffer::Map() +{ + uint8_t *p; + + if(vkMapMemory(device,mem,0,buffer_info.range,0,(void **)&p)==VK_SUCCESS) + return p; + + return nullptr; +} +void Buffer::Unmap() +{ + vkUnmapMemory(device,mem); +} +VK_NAMESPACE_END diff --git a/example/Vulkan/VKBuffer.h b/example/Vulkan/VKBuffer.h new file mode 100644 index 00000000..b153ac79 --- /dev/null +++ b/example/Vulkan/VKBuffer.h @@ -0,0 +1,33 @@ +#ifndef HGL_GRAPH_VULKAN_BUFFER_INCLUDE +#define HGL_GRAPH_VULKAN_BUFFER_INCLUDE + +#include"VK.h" +VK_NAMESPACE_BEGIN +class Buffer +{ + VkDevice device; + VkBuffer buf; + VkDeviceMemory mem; + VkDescriptorBufferInfo buffer_info; + +private: + + friend class RenderSurface; + + Buffer(VkDevice d,VkBuffer b,VkDeviceMemory dm,VkDescriptorBufferInfo dbi) + { + device=d; + buf=b; + mem=dm; + buffer_info=dbi; + } + +public: + + virtual ~Buffer(); + + uint8_t *Map(); + void Unmap(); +};//class Buffer +VK_NAMESPACE_END +#endif//HGL_GRAPH_VULKAN_BUFFER_INCLUDE diff --git a/example/Vulkan/main.cpp b/example/Vulkan/main.cpp index 022dff48..dedf8698 100644 --- a/example/Vulkan/main.cpp +++ b/example/Vulkan/main.cpp @@ -22,6 +22,17 @@ int main(int,char **) vulkan::RenderSurface *render=inst->CreateSurface(win); vulkan::CommandBuffer *cmd_buf=render->CreateCommandBuffer(); + vulkan::Buffer *ubo=render->CreateUBO(1024); + + uint8_t *p=ubo->Map(); + + if(p) + { + memset(p,0,1024); + ubo->Unmap(); + } + + delete ubo; delete cmd_buf; delete render;