From 09a256628208bf244e9ffde30acfad6b185d02f6 Mon Sep 17 00:00:00 2001 From: HuYingzhuo Date: Thu, 25 Apr 2019 14:33:50 +0800 Subject: [PATCH] =?UTF-8?q?VKDevice=E6=8F=90=E4=BE=9B=E5=88=9B=E5=BB=BABUF?= =?UTF-8?q?FER=E6=97=B6=E7=9B=B4=E6=8E=A5=E4=BC=A0=E5=85=A5=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=9D=97=E7=9A=84=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Vulkan/VKDevice.cpp | 28 ++++++++++++++++++++-------- example/Vulkan/VKDevice.h | 19 +++++++++++++------ example/Vulkan/main.cpp | 20 ++------------------ 3 files changed, 35 insertions(+), 32 deletions(-) diff --git a/example/Vulkan/VKDevice.cpp b/example/Vulkan/VKDevice.cpp index 422e9590..60b5a3cf 100644 --- a/example/Vulkan/VKDevice.cpp +++ b/example/Vulkan/VKDevice.cpp @@ -14,7 +14,7 @@ VK_NAMESPACE_BEGIN namespace { - bool CreateVulkanBuffer(VulkanBuffer &vb,const DeviceAttribute *rsa,VkBufferUsageFlags buf_usage,VkDeviceSize size,VkSharingMode sharing_mode) + bool CreateVulkanBuffer(VulkanBuffer &vb,const DeviceAttribute *rsa,VkBufferUsageFlags buf_usage,VkDeviceSize size,const void *data,VkSharingMode sharing_mode) { VkBufferCreateInfo buf_info={}; buf_info.sType=VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; @@ -48,7 +48,19 @@ namespace vb.info.offset=0; vb.info.range=size; - return(true); + if(!data) + return(true); + + { + void *dst; + + if(vkMapMemory(rsa->device,vb.memory,0,size,0,&dst)==VK_SUCCESS) + { + memcpy(dst,data,size); + vkUnmapMemory(rsa->device,vb.memory); + return(true); + } + } } vkFreeMemory(rsa->device,vb.memory,nullptr); @@ -98,7 +110,7 @@ Device::~Device() delete attr; } -VertexBuffer *Device::CreateVBO(VkFormat format,uint32_t count,VkSharingMode sharing_mode) +VertexBuffer *Device::CreateVBO(VkFormat format,uint32_t count,const void *data,VkSharingMode sharing_mode) { const uint32_t stride=GetStrideByFormat(format); @@ -112,13 +124,13 @@ VertexBuffer *Device::CreateVBO(VkFormat format,uint32_t count,VkSharingMode sha VulkanBuffer vb; - if(!CreateVulkanBuffer(vb,attr,VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,size,sharing_mode)) + if(!CreateVulkanBuffer(vb,attr,VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,size,data,sharing_mode)) return(nullptr); return(new VertexBuffer(attr->device,vb,format,stride,count)); } -IndexBuffer *Device::CreateIBO(VkIndexType index_type,uint32_t count,VkSharingMode sharing_mode) +IndexBuffer *Device::CreateIBO(VkIndexType index_type,uint32_t count,const void *data,VkSharingMode sharing_mode) { uint32_t stride; @@ -130,17 +142,17 @@ IndexBuffer *Device::CreateIBO(VkIndexType index_type,uint32_t count,VkSharingMo VulkanBuffer vb; - if(!CreateVulkanBuffer(vb,attr,VK_BUFFER_USAGE_INDEX_BUFFER_BIT,size,sharing_mode)) + if(!CreateVulkanBuffer(vb,attr,VK_BUFFER_USAGE_INDEX_BUFFER_BIT,size,data,sharing_mode)) return(nullptr); return(new IndexBuffer(attr->device,vb,index_type,count)); } -Buffer *Device::CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,VkSharingMode sharing_mode) +Buffer *Device::CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,const void *data,VkSharingMode sharing_mode) { VulkanBuffer vb; - if(!CreateVulkanBuffer(vb,attr,buf_usage,size,sharing_mode)) + if(!CreateVulkanBuffer(vb,attr,buf_usage,size,data,sharing_mode)) return(nullptr); return(new Buffer(attr->device,vb)); diff --git a/example/Vulkan/VKDevice.h b/example/Vulkan/VKDevice.h index 70c20669..d189922a 100644 --- a/example/Vulkan/VKDevice.h +++ b/example/Vulkan/VKDevice.h @@ -68,15 +68,22 @@ public: public: - Buffer * CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE); + Buffer * CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,const void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE); + Buffer * CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateBuffer(buf_usage,size,nullptr,sharing_mode);} - VertexBuffer * CreateVBO(VkFormat format,uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE); + VertexBuffer * CreateVBO(VkFormat format,uint32_t count,const void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE); + VertexBuffer * CreateVBO(VkFormat format,uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateVBO(format,count,nullptr,sharing_mode);} - IndexBuffer * CreateIBO(VkIndexType index_type,uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE); - IndexBuffer * CreateIBO16(uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT16,count,sharing_mode);} - IndexBuffer * CreateIBO32(uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT32,count,sharing_mode);} + IndexBuffer * CreateIBO(VkIndexType index_type,uint32_t count,const void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE); + IndexBuffer * CreateIBO16(uint32_t count,const void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT16,count,data,sharing_mode);} + IndexBuffer * CreateIBO32(uint32_t count,const void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT32,count,data,sharing_mode);} -#define CREATE_BUFFER_OBJECT(LargeName,type) Buffer *Create##LargeName(VkDeviceSize size,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateBuffer(VK_BUFFER_USAGE_##type##_BUFFER_BIT,size,sharing_mode);} + IndexBuffer * CreateIBO(VkIndexType index_type,uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(index_type,count,nullptr,sharing_mode);} + IndexBuffer * CreateIBO16(uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT16,count,nullptr,sharing_mode);} + IndexBuffer * CreateIBO32(uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT32,count,nullptr,sharing_mode);} + +#define CREATE_BUFFER_OBJECT(LargeName,type) Buffer *Create##LargeName(VkDeviceSize size,void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateBuffer(VK_BUFFER_USAGE_##type##_BUFFER_BIT,size,data,sharing_mode);} \ + Buffer *Create##LargeName(VkDeviceSize size,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateBuffer(VK_BUFFER_USAGE_##type##_BUFFER_BIT,size,nullptr,sharing_mode);} CREATE_BUFFER_OBJECT(UBO,UNIFORM) CREATE_BUFFER_OBJECT(SSBO,STORAGE) diff --git a/example/Vulkan/main.cpp b/example/Vulkan/main.cpp index 9fcb1728..b82a2d01 100644 --- a/example/Vulkan/main.cpp +++ b/example/Vulkan/main.cpp @@ -115,24 +115,8 @@ vulkan::VertexBuffer *color_buffer=nullptr; vulkan::VertexInput *CreateVertexBuffer(vulkan::Device *dev) { - vertex_buffer=dev->CreateVBO(FMT_RG32F,6*sizeof(float)); - color_buffer=dev->CreateVBO(FMT_RGB32F,9*sizeof(float)); - - { - float *p=(float *)vertex_buffer->Map(); - - memcpy(p,vertex_data,6*sizeof(float)); - - vertex_buffer->Unmap(); - } - - { - float *p=(float *)color_buffer->Map(); - - memcpy(p,color_data,9*sizeof(float)); - - color_buffer->Unmap(); - } + vertex_buffer=dev->CreateVBO(FMT_RG32F,3,vertex_data); + color_buffer=dev->CreateVBO(FMT_RGB32F,3,color_data); vulkan::VertexInput *vi=new vulkan::VertexInput();