修改Fence管理

This commit is contained in:
hyzboy 2019-06-16 00:08:42 +08:00
parent ddf0f3682d
commit 204322e1b8
3 changed files with 26 additions and 35 deletions

View File

@ -192,8 +192,8 @@ public:
virtual void Draw() virtual void Draw()
{ {
device->AcquireNextImage();
device->Wait(); device->Wait();
device->AcquireNextImage();
uint32_t index=device->GetCurrentFrameIndices(); uint32_t index=device->GetCurrentFrameIndices();

View File

@ -17,29 +17,14 @@ class Device
{ {
DeviceAttribute *attr; DeviceAttribute *attr;
uint swap_chain_count;
Semaphore *present_complete_semaphore=nullptr, Semaphore *present_complete_semaphore=nullptr,
*render_complete_semaphore=nullptr; *render_complete_semaphore=nullptr;
VkPipelineStageFlags pipe_stage_flags; VkPipelineStageFlags pipe_stage_flags;
VkSubmitInfo submit_info; VkSubmitInfo submit_info;
struct RenderFrame
{
Framebuffer *frame_buffer=nullptr;
Fence *draw_fence=nullptr;
public:
~RenderFrame()
{
SAFE_CLEAR(frame_buffer);
SAFE_CLEAR(draw_fence);
}
};//struct RenderFrame
void Create(RenderFrame *);
Fence *texture_fence; Fence *texture_fence;
VkSubmitInfo texture_submit_info; VkSubmitInfo texture_submit_info;
@ -48,7 +33,10 @@ class Device
RenderPass *main_rp; RenderPass *main_rp;
uint32_t current_frame; uint32_t current_frame;
ObjectList<RenderFrame> render_frame; ObjectList<Framebuffer> render_frame;
uint32_t current_fence;
ObjectList<Fence> fence_list;
VkPresentInfoKHR present_info; VkPresentInfoKHR present_info;
@ -83,9 +71,9 @@ public:
ImageView *GetDepthImageView () {return attr->depth.view;} ImageView *GetDepthImageView () {return attr->depth.view;}
RenderPass * GetRenderPass () {return main_rp;} RenderPass * GetRenderPass () {return main_rp;}
Framebuffer * GetFramebuffer (int index) {return render_frame[index]->frame_buffer;} Framebuffer * GetFramebuffer (int index) {return render_frame[index];}
const uint32_t GetCurrentFrameIndices () {return current_frame;} const uint32_t GetCurrentFrameIndices () {return current_frame;}
Framebuffer * GetCurrentFramebuffer () {return render_frame[current_frame]->frame_buffer;} Framebuffer * GetCurrentFramebuffer () {return render_frame[current_frame];}
bool Resize (uint,uint); bool Resize (uint,uint);

View File

@ -50,6 +50,7 @@ Device::Device(DeviceAttribute *da)
Device::~Device() Device::~Device()
{ {
fence_list.Clear();
render_frame.Clear(); render_frame.Clear();
delete present_complete_semaphore; delete present_complete_semaphore;
@ -65,7 +66,9 @@ Device::~Device()
void Device::RecreateDevice() void Device::RecreateDevice()
{ {
fence_list.Clear();
render_frame.Clear(); render_frame.Clear();
if(main_rp)delete main_rp; if(main_rp)delete main_rp;
if(texture_cmd_buf)delete texture_cmd_buf; if(texture_cmd_buf)delete texture_cmd_buf;
@ -73,19 +76,17 @@ void Device::RecreateDevice()
main_rp=CreateRenderPass(attr->sc_image_views[0]->GetFormat(),attr->depth.view->GetFormat()); main_rp=CreateRenderPass(attr->sc_image_views[0]->GetFormat(),attr->depth.view->GetFormat());
const int sc_count=attr->sc_image_views.GetCount(); swap_chain_count=attr->sc_image_views.GetCount();
for(int i=0;i<sc_count;i++) for(uint i=0;i<swap_chain_count;i++)
{ {
RenderFrame *rf=new RenderFrame; render_frame.Add(vulkan::CreateFramebuffer(this,main_rp,attr->sc_image_views[i],attr->depth.view));
fence_list.Add(this->CreateFence());
rf->frame_buffer =vulkan::CreateFramebuffer(this,main_rp,attr->sc_image_views[i],attr->depth.view);
rf->draw_fence =this->CreateFence();
render_frame.Add(rf);
} }
texture_cmd_buf=CreateCommandBuffer(); texture_cmd_buf=CreateCommandBuffer();
current_fence=0;
} }
bool Device::Resize(uint width,uint height) bool Device::Resize(uint width,uint height)
@ -214,7 +215,7 @@ Fence *Device::CreateFence()
VkFenceCreateInfo fenceInfo; VkFenceCreateInfo fenceInfo;
fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
fenceInfo.pNext = nullptr; fenceInfo.pNext = nullptr;
fenceInfo.flags = 0; fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
VkFence fence; VkFence fence;
@ -256,20 +257,22 @@ bool Device::SubmitDraw(const VkCommandBuffer *cmd_bufs,const uint32_t count)
submit_info.commandBufferCount = count; submit_info.commandBufferCount = count;
submit_info.pCommandBuffers = cmd_bufs; submit_info.pCommandBuffers = cmd_bufs;
VkFence fence=*(render_frame[current_frame]->draw_fence); VkFence fence=*fence_list[current_fence];
VkResult result=vkQueueSubmit(attr->graphics_queue,1,&submit_info,fence); VkResult result=vkQueueSubmit(attr->graphics_queue,1,&submit_info,fence);
if(++current_fence==swap_chain_count)
current_fence=0;
return(result==VK_SUCCESS); return(result==VK_SUCCESS);
} }
bool Device::Wait(bool wait_all,uint64_t time_out) bool Device::Wait(bool wait_all,uint64_t time_out)
{ {
VkFence fence=*(render_frame[current_frame]->draw_fence); VkFence fence=*fence_list[current_fence];
VkResult result=vkWaitForFences(attr->device,1,&fence,wait_all,time_out); vkWaitForFences(attr->device,1,&fence,wait_all,time_out);
vkResetFences(attr->device,1,&fence);
result=vkResetFences(attr->device,1,&fence);
return(true); return(true);
} }