#include #include #include VK_NAMESPACE_BEGIN GPUDevice::GPUDevice(VkDevAttr *da) { attr=da; } GPUDevice::~GPUDevice() { delete attr; } VkCommandBuffer GPUDevice::CreateCommandBuffer(const AnsiString &name) { if(!attr->cmd_pool) return(VK_NULL_HANDLE); CommandBufferAllocateInfo cmd; cmd.commandPool =attr->cmd_pool; cmd.level =VK_COMMAND_BUFFER_LEVEL_PRIMARY; cmd.commandBufferCount =1; VkCommandBuffer cmd_buf; VkResult res=vkAllocateCommandBuffers(attr->device,&cmd,&cmd_buf); if(res!=VK_SUCCESS) return(VK_NULL_HANDLE); #ifdef _DEBUG if(attr->debug_utils) attr->debug_utils->SetCommandBuffer(cmd_buf,name); #endif//_DEBUG return cmd_buf; } RenderCmdBuffer *GPUDevice::CreateRenderCommandBuffer(const AnsiString &name) { VkCommandBuffer cb=CreateCommandBuffer(name); if(cb==VK_NULL_HANDLE)return(nullptr); return(new RenderCmdBuffer(attr,cb)); } TextureCmdBuffer *GPUDevice::CreateTextureCommandBuffer(const AnsiString &name) { VkCommandBuffer cb=CreateCommandBuffer(name); if(cb==VK_NULL_HANDLE)return(nullptr); return(new TextureCmdBuffer(attr,cb)); } /** * 创建栅栏 * @param create_signaled 是否创建初始信号 */ Fence *GPUDevice::CreateFence(bool create_signaled) { FenceCreateInfo fenceInfo(create_signaled?VK_FENCE_CREATE_SIGNALED_BIT:0); VkFence fence; if(vkCreateFence(attr->device, &fenceInfo, nullptr, &fence)!=VK_SUCCESS) return(nullptr); return(new Fence(attr->device,fence)); } Semaphore *GPUDevice::CreateGPUSemaphore() { SemaphoreCreateInfo SemaphoreCreateInfo; VkSemaphore sem; if(vkCreateSemaphore(attr->device, &SemaphoreCreateInfo, nullptr, &sem)!=VK_SUCCESS) return(nullptr); return(new Semaphore(attr->device,sem)); } DeviceQueue *GPUDevice::CreateQueue(const uint32_t fence_count,const bool create_signaled) { if(fence_count<=0)return(nullptr); Fence **fence_list=new Fence *[fence_count]; for(uint32_t i=0;idevice,attr->graphics_queue,fence_list,fence_count)); } VK_NAMESPACE_END