diff --git a/example/Vulkan/VKDevice.cpp b/example/Vulkan/VKDevice.cpp index 0b14fe7c..e1e84139 100644 --- a/example/Vulkan/VKDevice.cpp +++ b/example/Vulkan/VKDevice.cpp @@ -55,6 +55,11 @@ namespace } }//namespace +Device::~Device() +{ + delete attr; +} + VertexBuffer *Device::CreateBuffer(VkBufferUsageFlags buf_usage,VkFormat format,uint32_t count,VkSharingMode sharing_mode) { const uint32_t stride=GetStrideByFormat(format); @@ -69,42 +74,42 @@ VertexBuffer *Device::CreateBuffer(VkBufferUsageFlags buf_usage,VkFormat format, VulkanBuffer vb; - if(!CreateVulkanBuffer(vb,rsa,buf_usage,size,sharing_mode)) + if(!CreateVulkanBuffer(vb,attr,buf_usage,size,sharing_mode)) return(nullptr); - return(new VertexBuffer(rsa->device,vb,format,stride,count)); + return(new VertexBuffer(attr->device,vb,format,stride,count)); } Buffer *Device::CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,VkSharingMode sharing_mode) { VulkanBuffer vb; - if(!CreateVulkanBuffer(vb,rsa,buf_usage,size,sharing_mode)) + if(!CreateVulkanBuffer(vb,attr,buf_usage,size,sharing_mode)) return(nullptr); - return(new Buffer(rsa->device,vb)); + return(new Buffer(attr->device,vb)); } CommandBuffer *Device::CreateCommandBuffer() { - if(!rsa->cmd_pool) + if(!attr->cmd_pool) return(nullptr); VkCommandBufferAllocateInfo cmd={}; cmd.sType=VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; cmd.pNext=nullptr; - cmd.commandPool=rsa->cmd_pool; + cmd.commandPool=attr->cmd_pool; cmd.level=VK_COMMAND_BUFFER_LEVEL_PRIMARY; cmd.commandBufferCount=1; VkCommandBuffer cmd_buf; - VkResult res=vkAllocateCommandBuffers(rsa->device,&cmd,&cmd_buf); + VkResult res=vkAllocateCommandBuffers(attr->device,&cmd,&cmd_buf); if(res!=VK_SUCCESS) return(nullptr); - return(new CommandBuffer(rsa->device,rsa->cmd_pool,cmd_buf)); + return(new CommandBuffer(attr->device,attr->cmd_pool,cmd_buf)); } //DescriptorSet *Device::CreateDescSet(int count) @@ -125,7 +130,7 @@ CommandBuffer *Device::CreateCommandBuffer() RenderPass *Device::CreateRenderPass() { VkAttachmentDescription attachments[2]; - attachments[0].format=rsa->format; + attachments[0].format=attr->format; attachments[0].samples=VK_SAMPLE_COUNT_1_BIT; attachments[0].loadOp=VK_ATTACHMENT_LOAD_OP_CLEAR; attachments[0].storeOp=VK_ATTACHMENT_STORE_OP_STORE; @@ -135,7 +140,7 @@ RenderPass *Device::CreateRenderPass() attachments[0].finalLayout=VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; attachments[0].flags=0; - attachments[1].format=rsa->depth.format; + attachments[1].format=attr->depth.format; attachments[1].samples=VK_SAMPLE_COUNT_1_BIT; attachments[1].loadOp=VK_ATTACHMENT_LOAD_OP_CLEAR; attachments[1].storeOp=VK_ATTACHMENT_STORE_OP_DONT_CARE; @@ -172,9 +177,9 @@ RenderPass *Device::CreateRenderPass() VkRenderPass render_pass; - if(vkCreateRenderPass(rsa->device,&rp_info,nullptr,&render_pass)!=VK_SUCCESS) + if(vkCreateRenderPass(attr->device,&rp_info,nullptr,&render_pass)!=VK_SUCCESS) return(nullptr); - return(new RenderPass(rsa->device,render_pass)); + return(new RenderPass(attr->device,render_pass)); } VK_NAMESPACE_END diff --git a/example/Vulkan/VKDevice.h b/example/Vulkan/VKDevice.h index 94cbcbab..318d2c3b 100644 --- a/example/Vulkan/VKDevice.h +++ b/example/Vulkan/VKDevice.h @@ -13,29 +13,27 @@ class VertexBuffer; class CommandBuffer; class RenderPass; -using RefDeviceAttribute=SharedPtr; - class Device { - RefDeviceAttribute rsa; + DeviceAttribute *attr; private: friend Device *CreateRenderDevice(VkInstance,const PhysicalDevice *,Window *); - Device(RefDeviceAttribute &ref_rsa) + Device(DeviceAttribute *da) { - rsa=ref_rsa; + attr=da; } public: - virtual ~Device()=default; + virtual ~Device(); - VkSurfaceKHR GetSurface () {return rsa->surface;} - VkDevice GetDevice () {return rsa->device;} - const PhysicalDevice *GetPhysicalDevice ()const {return rsa->physical_device;} - const VkExtent2D & GetExtent ()const {return rsa->swapchain_extent;} + VkSurfaceKHR GetSurface () {return attr->surface;} + VkDevice GetDevice () {return attr->device;} + const PhysicalDevice *GetPhysicalDevice ()const {return attr->physical_device;} + const VkExtent2D & GetExtent ()const {return attr->swapchain_extent;} public: diff --git a/example/Vulkan/VKDeviceCreater.cpp b/example/Vulkan/VKDeviceCreater.cpp index ef507c35..0ed7f53f 100644 --- a/example/Vulkan/VKDeviceCreater.cpp +++ b/example/Vulkan/VKDeviceCreater.cpp @@ -1,10 +1,8 @@ #include"VKDevice.h" #include"VKInstance.h" #include"VKPhysicalDevice.h" -#include VK_NAMESPACE_BEGIN - VkSurfaceKHR CreateRenderDevice(VkInstance,Window *); namespace @@ -288,6 +286,26 @@ namespace return desc_pool; } + + struct RenderDeviceCreater + { + DeviceAttribute *attr; + + public: + + RenderDeviceCreater(VkInstance inst,const PhysicalDevice *pd,VkSurfaceKHR sur) + { + attr=new DeviceAttribute(inst,pd,sur); + } + + ~RenderDeviceCreater() + { + if(attr) + delete attr; + } + + DeviceAttribute *operator -> (){return attr;} + };//struct RenderDeviceCreater }//namespace Device *CreateRenderDevice(VkInstance inst,const PhysicalDevice *physical_device,Window *win) @@ -297,39 +315,42 @@ Device *CreateRenderDevice(VkInstance inst,const PhysicalDevice *physical_device if(!surface) return(nullptr); - RefDeviceAttribute rsa=new DeviceAttribute(inst,physical_device,surface); + RenderDeviceCreater rdc(inst,physical_device,surface); - rsa->swapchain_extent=GetSwapchainExtent(rsa->surface_caps,win->GetWidth(),win->GetHeight()); + rdc->swapchain_extent=GetSwapchainExtent(rdc->surface_caps,win->GetWidth(),win->GetHeight()); - if(rsa->graphics_family==ERROR_FAMILY_INDEX) + if(rdc->graphics_family==ERROR_FAMILY_INDEX) return(nullptr); - rsa->device=CreateDevice(inst,physical_device->physical_device,rsa->graphics_family); + rdc->device=CreateDevice(inst,physical_device->physical_device,rdc->graphics_family); - if(!rsa->device) + if(!rdc->device) return(nullptr); - rsa->cmd_pool=CreateCommandPool(rsa->device,rsa->graphics_family); + rdc->cmd_pool=CreateCommandPool(rdc->device,rdc->graphics_family); - if(!rsa->cmd_pool) + if(!rdc->cmd_pool) return(nullptr); - rsa->swap_chain=CreateSwapChain(rsa); + rdc->swap_chain=CreateSwapChain(rdc.attr); - if(!rsa->swap_chain) + if(!rdc->swap_chain) return(nullptr); - if(!CreateSwapchainImageView(rsa)) + if(!CreateSwapchainImageView(rdc.attr)) return(nullptr); - if(!CreateDepthBuffer(rsa)) + if(!CreateDepthBuffer(rdc.attr)) return(nullptr); - rsa->desc_pool=CreateDescriptorPool(rsa->device,1); + rdc->desc_pool=CreateDescriptorPool(rdc->device,1); - if(!rsa->desc_pool) + if(!rdc->desc_pool) return(nullptr); - return(new Device(rsa)); + Device *dev=new Device(rdc.attr); + rdc.attr=nullptr; + + return dev; } VK_NAMESPACE_END