拆分VKDevice中的Buffer/material到独立的.cpp中
This commit is contained in:
parent
066bc4952c
commit
19034291b2
@ -15,6 +15,8 @@ SET(VULKAN_TEST_SOURCE_FILES main.cpp
|
||||
VKDeviceAttribute.cpp
|
||||
VKDeviceCreater.cpp
|
||||
VKDevice.cpp
|
||||
VKDeviceBuffer.cpp
|
||||
VKDeviceMaterial.cpp
|
||||
VKBuffer.cpp
|
||||
VKDescriptorSets.cpp
|
||||
VKPipelineLayout.cpp
|
||||
|
@ -9,70 +9,11 @@
|
||||
#include"VKFence.h"
|
||||
#include"VKSemaphore.h"
|
||||
#include"VKShader.h"
|
||||
#include"VKShaderModuleManage.h"
|
||||
#include"VKMaterial.h"
|
||||
#include"VKDescriptorSets.h"
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
namespace
|
||||
{
|
||||
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;
|
||||
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;
|
||||
|
||||
if(vkCreateBuffer(rsa->device,&buf_info,nullptr,&vb.buffer)!=VK_SUCCESS)
|
||||
return(false);
|
||||
|
||||
VkMemoryRequirements mem_reqs;
|
||||
vkGetBufferMemoryRequirements(rsa->device,vb.buffer,&mem_reqs);
|
||||
|
||||
VkMemoryAllocateInfo alloc_info={};
|
||||
alloc_info.sType=VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
||||
alloc_info.pNext=nullptr;
|
||||
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))
|
||||
{
|
||||
if(vkAllocateMemory(rsa->device,&alloc_info,nullptr,&vb.memory)==VK_SUCCESS)
|
||||
{
|
||||
if(vkBindBufferMemory(rsa->device,vb.buffer,vb.memory,0)==VK_SUCCESS)
|
||||
{
|
||||
vb.info.buffer=vb.buffer;
|
||||
vb.info.offset=0;
|
||||
vb.info.range=size;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
vkDestroyBuffer(rsa->device,vb.buffer,nullptr);
|
||||
return(false);
|
||||
}
|
||||
}//namespace
|
||||
|
||||
Device::Device(DeviceAttribute *da)
|
||||
{
|
||||
attr=da;
|
||||
@ -98,9 +39,13 @@ Device::Device(DeviceAttribute *da)
|
||||
for(int i=0;i<sc_count;i++)
|
||||
main_fb.Add(vulkan::CreateFramebuffer(this,main_rp,attr->sc_image_views[i],attr->depth.view));
|
||||
}
|
||||
|
||||
shader_module_manage=new ShaderModuleManage(attr->device);
|
||||
}
|
||||
|
||||
Device::~Device()
|
||||
{
|
||||
delete shader_module_manage;
|
||||
main_fb.Clear();
|
||||
|
||||
delete main_rp;
|
||||
@ -111,54 +56,6 @@ Device::~Device()
|
||||
delete attr;
|
||||
}
|
||||
|
||||
VertexBuffer *Device::CreateVBO(VkFormat format,uint32_t count,const void *data,VkSharingMode sharing_mode)
|
||||
{
|
||||
const uint32_t stride=GetStrideByFormat(format);
|
||||
|
||||
if(stride==0)
|
||||
{
|
||||
std::cerr<<"format["<<format<<"] stride length is 0,please use \"Device::CreateBuffer(VkBufferUsageFlags,VkDeviceSize,VkSharingMode)\" function.";
|
||||
return(nullptr);
|
||||
}
|
||||
|
||||
const VkDeviceSize size=stride*count;
|
||||
|
||||
VulkanBuffer vb;
|
||||
|
||||
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,const void *data,VkSharingMode sharing_mode)
|
||||
{
|
||||
uint32_t stride;
|
||||
|
||||
if(index_type==VK_INDEX_TYPE_UINT16)stride=2;else
|
||||
if(index_type==VK_INDEX_TYPE_UINT32)stride=4;else
|
||||
return(nullptr);
|
||||
|
||||
const VkDeviceSize size=stride*count;
|
||||
|
||||
VulkanBuffer vb;
|
||||
|
||||
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,const void *data,VkSharingMode sharing_mode)
|
||||
{
|
||||
VulkanBuffer vb;
|
||||
|
||||
if(!CreateVulkanBuffer(vb,attr,buf_usage,size,data,sharing_mode))
|
||||
return(nullptr);
|
||||
|
||||
return(new Buffer(attr->device,vb));
|
||||
}
|
||||
|
||||
CommandBuffer *Device::CreateCommandBuffer()
|
||||
{
|
||||
if(!attr->cmd_pool)
|
||||
@ -300,29 +197,6 @@ Semaphore *Device::CreateSem()
|
||||
return(new Semaphore(attr->device,sem));
|
||||
}
|
||||
|
||||
ShaderModule *Device::CreateShaderModule(const VkShaderStageFlagBits shader_stage_bit,const void *spv_data,const uint32_t spv_size)
|
||||
{
|
||||
VkPipelineShaderStageCreateInfo shader_stage;
|
||||
shader_stage.sType=VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
||||
shader_stage.pNext=nullptr;
|
||||
shader_stage.pSpecializationInfo=nullptr;
|
||||
shader_stage.flags=0;
|
||||
shader_stage.stage=shader_stage_bit;
|
||||
shader_stage.pName="main";
|
||||
|
||||
VkShaderModuleCreateInfo moduleCreateInfo;
|
||||
moduleCreateInfo.sType=VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
||||
moduleCreateInfo.pNext=nullptr;
|
||||
moduleCreateInfo.flags=0;
|
||||
moduleCreateInfo.codeSize=spv_size;
|
||||
moduleCreateInfo.pCode=(const uint32_t *)spv_data;
|
||||
|
||||
if(vkCreateShaderModule(attr->device,&moduleCreateInfo,nullptr,&shader_stage.module)!=VK_SUCCESS)
|
||||
return(nullptr);
|
||||
|
||||
return(new ShaderModule(device,shader_stage));
|
||||
}
|
||||
|
||||
bool Device::AcquireNextImage()
|
||||
{
|
||||
return(vkAcquireNextImageKHR(attr->device,attr->swap_chain,UINT64_MAX,*image_acquired_semaphore,VK_NULL_HANDLE,¤t_frame)==VK_SUCCESS);
|
||||
@ -370,11 +244,4 @@ bool Device::QueuePresent()
|
||||
|
||||
return(vkQueuePresentKHR(attr->present_queue, &present)==VK_SUCCESS);
|
||||
}
|
||||
|
||||
//Material *Device::CreateMaterial(Shader *shader)
|
||||
//{
|
||||
// DescriptorSetLayoutCreater *dslc=new DescriptorSetLayoutCreater(this);
|
||||
//
|
||||
// return(new Material(shader,dslc));
|
||||
//}
|
||||
VK_NAMESPACE_END
|
||||
|
@ -17,6 +17,7 @@ class RenderPass;
|
||||
class Fence;
|
||||
class Semaphore;
|
||||
class ShaderModule;
|
||||
class ShaderModuleManage;
|
||||
class Material;
|
||||
|
||||
#define MAX_FRAMES_IN_FLIGHT 2
|
||||
@ -35,6 +36,8 @@ class Device
|
||||
|
||||
VkPresentInfoKHR present;
|
||||
|
||||
ShaderModuleManage *shader_module_manage;
|
||||
|
||||
private:
|
||||
|
||||
friend Device *CreateRenderDevice(VkInstance,const PhysicalDevice *,Window *);
|
||||
@ -66,7 +69,7 @@ public:
|
||||
RenderPass * GetRenderPass () {return main_rp;}
|
||||
Framebuffer * GetFramebuffer (int index) {return main_fb[index];}
|
||||
|
||||
public:
|
||||
public: //Buffer相关
|
||||
|
||||
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);}
|
||||
@ -91,15 +94,19 @@ public:
|
||||
|
||||
#undef CREATE_BUFFER_OBJECT
|
||||
|
||||
ShaderModule * CreateShaderModule(const VkShaderStageFlagBits shader_stage_bit,const void *spv_data,const uint32_t spv_size);
|
||||
public: //material相关
|
||||
|
||||
//Material * CreateMaterial();
|
||||
|
||||
Material * CreateMaterial(Shader *);
|
||||
public: //Command Buffer 相关
|
||||
|
||||
CommandBuffer * CreateCommandBuffer();
|
||||
RenderPass * CreateRenderPass(VkFormat color_format,VkFormat depth_format);
|
||||
Fence * CreateFence();
|
||||
Semaphore * CreateSem();
|
||||
|
||||
public: //提交相关
|
||||
|
||||
bool AcquireNextImage ();
|
||||
bool QueueSubmit (CommandBuffer *);
|
||||
bool Wait (bool wait_all=VK_TRUE,uint64_t time_out=HGL_NANO_SEC_PER_SEC*0.1);
|
||||
|
111
example/Vulkan/VKDeviceBuffer.cpp
Normal file
111
example/Vulkan/VKDeviceBuffer.cpp
Normal file
@ -0,0 +1,111 @@
|
||||
#include"VKDevice.h"
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
namespace
|
||||
{
|
||||
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;
|
||||
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;
|
||||
|
||||
if(vkCreateBuffer(rsa->device,&buf_info,nullptr,&vb.buffer)!=VK_SUCCESS)
|
||||
return(false);
|
||||
|
||||
VkMemoryRequirements mem_reqs;
|
||||
vkGetBufferMemoryRequirements(rsa->device,vb.buffer,&mem_reqs);
|
||||
|
||||
VkMemoryAllocateInfo alloc_info={};
|
||||
alloc_info.sType=VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
|
||||
alloc_info.pNext=nullptr;
|
||||
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))
|
||||
{
|
||||
if(vkAllocateMemory(rsa->device,&alloc_info,nullptr,&vb.memory)==VK_SUCCESS)
|
||||
{
|
||||
if(vkBindBufferMemory(rsa->device,vb.buffer,vb.memory,0)==VK_SUCCESS)
|
||||
{
|
||||
vb.info.buffer=vb.buffer;
|
||||
vb.info.offset=0;
|
||||
vb.info.range=size;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
vkDestroyBuffer(rsa->device,vb.buffer,nullptr);
|
||||
return(false);
|
||||
}
|
||||
}//namespace
|
||||
|
||||
VertexBuffer *Device::CreateVBO(VkFormat format,uint32_t count,const void *data,VkSharingMode sharing_mode)
|
||||
{
|
||||
const uint32_t stride=GetStrideByFormat(format);
|
||||
|
||||
if(stride==0)
|
||||
{
|
||||
std::cerr<<"format["<<format<<"] stride length is 0,please use \"Device::CreateBuffer(VkBufferUsageFlags,VkDeviceSize,VkSharingMode)\" function.";
|
||||
return(nullptr);
|
||||
}
|
||||
|
||||
const VkDeviceSize size=stride*count;
|
||||
|
||||
VulkanBuffer vb;
|
||||
|
||||
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,const void *data,VkSharingMode sharing_mode)
|
||||
{
|
||||
uint32_t stride;
|
||||
|
||||
if(index_type==VK_INDEX_TYPE_UINT16)stride=2;else
|
||||
if(index_type==VK_INDEX_TYPE_UINT32)stride=4;else
|
||||
return(nullptr);
|
||||
|
||||
const VkDeviceSize size=stride*count;
|
||||
|
||||
VulkanBuffer vb;
|
||||
|
||||
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,const void *data,VkSharingMode sharing_mode)
|
||||
{
|
||||
VulkanBuffer vb;
|
||||
|
||||
if(!CreateVulkanBuffer(vb,attr,buf_usage,size,data,sharing_mode))
|
||||
return(nullptr);
|
||||
|
||||
return(new Buffer(attr->device,vb));
|
||||
}
|
||||
VK_NAMESPACE_END
|
10
example/Vulkan/VKDeviceMaterial.cpp
Normal file
10
example/Vulkan/VKDeviceMaterial.cpp
Normal file
@ -0,0 +1,10 @@
|
||||
#include"VKDevice.h"
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
//Material *Device::CreateMaterial(Shader *shader)
|
||||
//{
|
||||
// DescriptorSetLayoutCreater *dslc=new DescriptorSetLayoutCreater(this);
|
||||
//
|
||||
// return(new Material(shader,dslc));
|
||||
//}
|
||||
VK_NAMESPACE_END
|
@ -62,7 +62,7 @@ bool LoadShader(vulkan::Shader *sc,const char *filename,VkShaderStageFlagBits sh
|
||||
if(!data)
|
||||
return(false);
|
||||
|
||||
if(!sc->Add(shader_flag,data,size))
|
||||
if(!sc->CreateShader(shader_flag,data,size))
|
||||
return(false);
|
||||
|
||||
delete[] data;
|
||||
|
Loading…
x
Reference in New Issue
Block a user