增加RenderSurface::CreateBuffer与VKBuffer封装

This commit is contained in:
HuYingzhuo 2019-04-11 22:40:13 +08:00
parent fef0addac7
commit 30edac78bd
6 changed files with 147 additions and 7 deletions

View File

@ -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})

View File

@ -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)

View File

@ -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

View File

@ -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

33
example/Vulkan/VKBuffer.h Normal file
View File

@ -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

View File

@ -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;