diff --git a/inc/hgl/graph/vulkan/VKDevice.h b/inc/hgl/graph/vulkan/VKDevice.h index 346f6f58..79f52615 100644 --- a/inc/hgl/graph/vulkan/VKDevice.h +++ b/inc/hgl/graph/vulkan/VKDevice.h @@ -167,7 +167,7 @@ public: //Command Buffer 相关 VkImageLayout color_final_layout=VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, VkImageLayout depth_final_layout=VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); - Fence * CreateFence(); + Fence * CreateFence(bool); Semaphore * CreateSem(); public: //提交相关 diff --git a/src/RenderDevice/Vulkan/VKDevice.cpp b/src/RenderDevice/Vulkan/VKDevice.cpp index 2eba5e6c..f61c1fa5 100644 --- a/src/RenderDevice/Vulkan/VKDevice.cpp +++ b/src/RenderDevice/Vulkan/VKDevice.cpp @@ -17,7 +17,7 @@ Device::Device(DeviceAttribute *da) current_frame=0; - texture_fence=this->CreateFence(); + texture_fence=this->CreateFence(false); hgl_zero(texture_submit_info); texture_submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; @@ -81,7 +81,7 @@ void Device::RecreateDevice() for(uint i=0;isc_image_views[i],attr->depth.view)); - fence_list.Add(this->CreateFence()); + fence_list.Add(this->CreateFence(true)); } texture_cmd_buf=CreateCommandBuffer(); @@ -121,12 +121,16 @@ CommandBuffer *Device::CreateCommandBuffer() return(new CommandBuffer(attr->device,attr->swapchain_extent,attr->cmd_pool,cmd_buf)); } -Fence *Device::CreateFence() +/** + * 创建栅栏 + * @param create_signaled 是否创建初始信号 + */ +Fence *Device::CreateFence(bool create_signaled) { VkFenceCreateInfo fenceInfo; fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; fenceInfo.pNext = nullptr; - fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT; + fenceInfo.flags = create_signaled?VK_FENCE_CREATE_SIGNALED_BIT:0; VkFence fence; @@ -169,8 +173,6 @@ bool Device::Wait(bool wait_all,uint64_t time_out) bool Device::AcquireNextImage() { - //VkFence fence=*fence_list[current_fence]; - return(vkAcquireNextImageKHR(attr->device,attr->swap_chain,UINT64_MAX,*present_complete_semaphore,VK_NULL_HANDLE,¤t_frame)==VK_SUCCESS); } @@ -185,10 +187,12 @@ bool Device::SubmitDraw(const VkCommandBuffer *cmd_bufs,const uint32_t count) VkFence fence=*fence_list[current_fence]; VkResult result=vkQueueSubmit(attr->graphics_queue,1,&submit_info,fence); - + if(++current_fence==swap_chain_count) current_fence=0; + //不在这里立即等待fence完成,是因为有可能queue submit需要久一点工作时间,我们这个时间可以去干别的。等在AcquireNextImage时再去等待fence,而且是另一帧的fence。这样有利于异步处理 + return(result==VK_SUCCESS); } diff --git a/src/RenderDevice/Vulkan/VKDeviceTexture.cpp b/src/RenderDevice/Vulkan/VKDeviceTexture.cpp index c9d6868f..948f5b7a 100644 --- a/src/RenderDevice/Vulkan/VKDeviceTexture.cpp +++ b/src/RenderDevice/Vulkan/VKDeviceTexture.cpp @@ -78,7 +78,7 @@ Texture2D *Device::CreateTexture2D(const VkFormat video_format,uint32_t width,ui TextureData *tex_data=new TextureData; tex_data->ref = false; - tex_data->mip_levels = 1; + tex_data->mip_levels = 0; tex_data->memory = memory; tex_data->image_layout = image_layout; tex_data->image = image; @@ -220,9 +220,9 @@ bool Device::SubmitTexture(const VkCommandBuffer *cmd_bufs,const uint32_t count) VkFence fence=*texture_fence; - vkResetFences(attr->device,1,&fence); if(vkQueueSubmit(attr->graphics_queue, 1, &texture_submit_info, fence))return(false); - if(vkWaitForFences(attr->device, 1, &fence, VK_TRUE, HGL_NANO_SEC_PER_SEC*0.1)!=VK_SUCCESS)return(false); + if(vkWaitForFences(attr->device, 1, &fence, VK_TRUE, HGL_NANO_SEC_PER_SEC*0.1)!=VK_SUCCESS)return(false); + vkResetFences(attr->device,1,&fence); return(true); }