diff --git a/example/Vulkan/CMakeLists.txt b/example/Vulkan/CMakeLists.txt index 7f5ac11f..167d4290 100644 --- a/example/Vulkan/CMakeLists.txt +++ b/example/Vulkan/CMakeLists.txt @@ -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 diff --git a/example/Vulkan/VKDevice.cpp b/example/Vulkan/VKDevice.cpp index d7a095bf..6186cae9 100644 --- a/example/Vulkan/VKDevice.cpp +++ b/example/Vulkan/VKDevice.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;isc_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["<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 diff --git a/example/Vulkan/VKDevice.h b/example/Vulkan/VKDevice.h index 9428e05c..b3b9b138 100644 --- a/example/Vulkan/VKDevice.h +++ b/example/Vulkan/VKDevice.h @@ -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); diff --git a/example/Vulkan/VKDeviceBuffer.cpp b/example/Vulkan/VKDeviceBuffer.cpp new file mode 100644 index 00000000..46553b40 --- /dev/null +++ b/example/Vulkan/VKDeviceBuffer.cpp @@ -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["<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 diff --git a/example/Vulkan/VKDeviceMaterial.cpp b/example/Vulkan/VKDeviceMaterial.cpp new file mode 100644 index 00000000..a21bb686 --- /dev/null +++ b/example/Vulkan/VKDeviceMaterial.cpp @@ -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 diff --git a/example/Vulkan/main.cpp b/example/Vulkan/main.cpp index f72b0a0d..f73302c5 100644 --- a/example/Vulkan/main.cpp +++ b/example/Vulkan/main.cpp @@ -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;