VKDevice建立独立的texture提交专用fence,以避免和绘图用冲突

This commit is contained in:
hyzboy 2019-05-20 13:50:11 +08:00
parent 476a60b99e
commit 5c913dd792
4 changed files with 34 additions and 8 deletions

View File

@ -81,7 +81,7 @@ public:
void Submit(const VkCommandBuffer cmd_buf)
{
device->QueueSubmit(&cmd_buf);
device->SubmitDraw(&cmd_buf);
device->Wait();
device->QueuePresent();
}

View File

@ -15,7 +15,9 @@ class Device
DeviceAttribute *attr;
Semaphore *image_acquired_semaphore;
Fence *draw_fence;
Fence *draw_fence,*texture_fence;
VkSubmitInfo texture_submitInfo;
RenderPass *main_rp;
ObjectList<Framebuffer> main_fb;
@ -103,7 +105,8 @@ public: //Command Buffer 相关
public: //提交相关
bool AcquireNextImage ();
bool QueueSubmit (const VkCommandBuffer *,const uint32_t count=1);
bool SubmitDraw (const VkCommandBuffer *,const uint32_t count=1);
bool SubmitTexture (const VkCommandBuffer *cmd_bufs,const uint32_t count=1);
bool Wait (bool wait_all=VK_TRUE,uint64_t time_out=HGL_NANO_SEC_PER_SEC*0.1);
bool QueuePresent ();
};//class Device

View File

@ -21,6 +21,10 @@ Device::Device(DeviceAttribute *da)
image_acquired_semaphore=this->CreateSem();
draw_fence=this->CreateFence();
texture_fence=this->CreateFence();
hgl_zero(texture_submitInfo);
texture_submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
present.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
present.pNext = nullptr;
@ -42,6 +46,7 @@ Device::~Device()
delete main_rp;
delete image_acquired_semaphore;
delete texture_fence;
delete draw_fence;
delete attr;
@ -217,9 +222,9 @@ bool Device::AcquireNextImage()
return(vkAcquireNextImageKHR(attr->device,attr->swap_chain,UINT64_MAX,*image_acquired_semaphore,VK_NULL_HANDLE,&current_frame)==VK_SUCCESS);
}
bool Device::QueueSubmit(const VkCommandBuffer *cmd_bufs,const uint32_t count)
bool Device::SubmitDraw(const VkCommandBuffer *cmd_bufs,const uint32_t count)
{
if(!cmd_bufs)
if(!cmd_bufs||count<=0)
return(false);
VkPipelineStageFlags pipe_stage_flags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;

View File

@ -2,6 +2,7 @@
#include<hgl/graph/vulkan/VKSampler.h>
#include<hgl/graph/vulkan/VKDevice.h>
#include<hgl/graph/vulkan/VKPhysicalDevice.h>
#include<hgl/graph/vulkan/VKFence.h>
#include<hgl/graph/vulkan/VKBuffer.h>
#include<hgl/graph/vulkan/VKCommandBuffer.h>
VK_NAMESPACE_BEGIN
@ -59,7 +60,7 @@ Texture2D *Device::CreateTexture2D(const VkFormat video_format,void *data,uint32
}
else
{
#define VK_CHECK_RESULT(func) if(func!=VK_SUCCESS){delete tex_data;return(nullptr);}
#define VK_CHECK_RESULT(func) if(func!=VK_SUCCESS){delete tex_data;delete buf;return(nullptr);}
Buffer *buf=CreateBuffer(VK_BUFFER_USAGE_TRANSFER_SRC_BIT,size,data);
@ -152,8 +153,9 @@ Texture2D *Device::CreateTexture2D(const VkFormat video_format,void *data,uint32
1, &imageMemoryBarrier);
cmd_buf->End();
QueueSubmit(*cmd_buf);
Wait();
SubmitTexture(*cmd_buf);
delete buf;
tex_data->image_view=CreateImageView2D(attr->device,video_format,VK_IMAGE_ASPECT_COLOR_BIT,tex_data->image);
@ -164,6 +166,22 @@ Texture2D *Device::CreateTexture2D(const VkFormat video_format,void *data,uint32
return(new Texture2D(width,height,attr->device,tex_data));
}
bool Device::SubmitTexture(const VkCommandBuffer *cmd_bufs,const uint32_t count)
{
if(!cmd_bufs||count<=0)
return(false);
texture_submitInfo.commandBufferCount = count;
texture_submitInfo.pCommandBuffers = cmd_bufs;
VkFence fence=*texture_fence;
if(vkQueueSubmit(attr->graphics_queue, 1, &texture_submitInfo, fence))return(false);
if(vkWaitForFences(attr->device, 1, &fence, VK_TRUE, HGL_NANO_SEC_PER_SEC*0.1)!=VK_SUCCESS)return(false);
return(true);
}
Sampler *Device::CreateSampler(VkSamplerCreateInfo *sci)
{
if(!sci)return(nullptr);