diff --git a/example/Vulkan/CMakeLists.txt b/example/Vulkan/CMakeLists.txt index 2b7074d9..6bcb5d26 100644 --- a/example/Vulkan/CMakeLists.txt +++ b/example/Vulkan/CMakeLists.txt @@ -1,5 +1,5 @@ 锘縨acro(CreateProject name) - add_executable(${name} ${ARGN}) + add_executable(${name} ${ARGN} VulkanAppFramework.h) target_link_libraries(${name} ${ULRE}) endmacro() @@ -10,7 +10,7 @@ CreateProject(3.Geometry2D Geometry2D.cpp) CreateProject(4.Geometry3D Geometry3D.cpp) CreateProject(5.SceneTree SceneTree.cpp) -CreateProject(6.LoadModel LoadModel.cpp TGATexture.cpp AssimpLoaderMesh.h AssimpLoaderMesh.cpp) +CreateProject(6.LoadModel LoadModel.cpp TGATexture.cpp AssimpLoaderMesh.h AssimpLoaderMesh.cpp ViewModelFramework.h) target_link_libraries(6.LoadModel assimp) CreateProject(7.InlineGeometryScene InlineGeometryScene.cpp) \ No newline at end of file diff --git a/example/Vulkan/Geometry2D.cpp b/example/Vulkan/Geometry2D.cpp index 6dae5e36..1b894bd7 100644 --- a/example/Vulkan/Geometry2D.cpp +++ b/example/Vulkan/Geometry2D.cpp @@ -66,7 +66,7 @@ private: rci.scope.Set(10,10,20,20); - ro_rectangle=CreateRectangle(db,material,&rci); + ro_rectangle=CreateRenderableRectangle(db,material,&rci); } { @@ -76,7 +76,7 @@ private: rrci.radius=5; rrci.round_per=5; - ro_round_rectangle=CreateRoundRectangle(db,material,&rrci); + ro_round_rectangle=CreateRenderableRoundRectangle(db,material,&rrci); } { @@ -90,7 +90,7 @@ private: cci.field_count=8; - ro_circle=CreateCircle(db,material,&cci); + ro_circle=CreateRenderableCircle(db,material,&cci); } } @@ -138,7 +138,6 @@ private: render_root.Add(db->CreateRenderableInstance(pipeline,descriptor_sets,ro_circle)); render_root.ExpendToList(&render_list); - BuildCommandBuffer(&render_list); return(true); } @@ -167,10 +166,16 @@ public: return(true); } - void Resize(int,int)override + void Resize(int w,int h) { BuildCommandBuffer(&render_list); } + + void Draw() + { + AcquireNextImage(); + VulkanApplicationFramework::Draw(); + } };//class TestApp:public VulkanApplicationFramework int main(int,char **) diff --git a/example/Vulkan/Geometry3D.cpp b/example/Vulkan/Geometry3D.cpp index f409433a..34af30f1 100644 --- a/example/Vulkan/Geometry3D.cpp +++ b/example/Vulkan/Geometry3D.cpp @@ -61,16 +61,16 @@ private: pgci.color.Set(0.75,0,0,1); pgci.side_color.Set(1,0,0,1); - ro_plane_grid[0]=CreatePlaneGrid(db,material,&pgci); + ro_plane_grid[0]=CreateRenderablePlaneGrid(db,material,&pgci); pgci.color.Set(0,0.75,0,1); pgci.side_color.Set(0,1,0,1); - ro_plane_grid[1]=CreatePlaneGrid(db,material,&pgci); + ro_plane_grid[1]=CreateRenderablePlaneGrid(db,material,&pgci); pgci.color.Set(0,0,0.75,1); pgci.side_color.Set(0,0,1,1); - ro_plane_grid[2]=CreatePlaneGrid(db,material,&pgci); + ro_plane_grid[2]=CreateRenderablePlaneGrid(db,material,&pgci); } bool InitUBO() @@ -114,7 +114,6 @@ private: render_root.RefreshMatrix(); render_root.ExpendToList(&render_list); - BuildCommandBuffer(&render_list); return(true); } @@ -142,9 +141,9 @@ public: return(true); } - void Resize(int,int)override + void BuildCommandBuffer(uint32 index) { - BuildCommandBuffer(&render_list); + VulkanApplicationFramework::BuildCommandBuffer(index,&render_list); } };//class TestApp:public CameraAppFramework diff --git a/example/Vulkan/InlineGeometryScene.cpp b/example/Vulkan/InlineGeometryScene.cpp index 4c3596ab..16840dce 100644 --- a/example/Vulkan/InlineGeometryScene.cpp +++ b/example/Vulkan/InlineGeometryScene.cpp @@ -178,7 +178,6 @@ private: render_root.RefreshMatrix(); render_root.ExpendToList(&render_list); - BuildCommandBuffer(&render_list); return(true); } @@ -205,10 +204,14 @@ public: return(true); } - - void Resize(int,int)override + + void BuildCommandBuffer(uint32_t index) override { - BuildCommandBuffer(&render_list); + render_root.RefreshMatrix(); + render_list.Clear(); + render_root.ExpendToList(&render_list); + + VulkanApplicationFramework::BuildCommandBuffer(index,&render_list); } };//class TestApp:public CameraAppFramework diff --git a/example/Vulkan/SceneTree.cpp b/example/Vulkan/SceneTree.cpp index a3321770..1c014e52 100644 --- a/example/Vulkan/SceneTree.cpp +++ b/example/Vulkan/SceneTree.cpp @@ -58,10 +58,9 @@ private: void CreateRenderObject() { - //struct CubeCreateInfo cci; + struct CubeCreateInfo cci; - //renderable_object=CreateCube(db,material,&cci); - renderable_object=CreateRenderableSphere(db,material,16); + renderable_object=CreateRenderableCube(db,material,&cci); } bool InitUBO() @@ -121,8 +120,6 @@ private: render_root.RefreshMatrix(); render_list.Clear(); render_root.ExpendToList(&render_list); - - BuildCommandBuffer(&render_list); return(true); } @@ -159,15 +156,11 @@ public: render_root.RefreshMatrix(&rot); render_list.Clear(); render_root.ExpendToList(&render_list); - - BuildCommandBuffer(&render_list); } - - void Resize(int w,int h)override + + void BuildCommandBuffer(uint32 index) { - CameraAppFramework::Resize(w,h); - - BuildCommandBuffer(&render_list); + VulkanApplicationFramework::BuildCommandBuffer(index,&render_list); } };//class TestApp:public CameraAppFramework diff --git a/example/Vulkan/ViewModelFramework.h b/example/Vulkan/ViewModelFramework.h index ac58ea88..08a08cf8 100644 --- a/example/Vulkan/ViewModelFramework.h +++ b/example/Vulkan/ViewModelFramework.h @@ -82,6 +82,8 @@ public: virtual void Draw()override { + const uint32_t index=AcquireNextImage(); + camera.Refresh(); //更新相机矩阵 ubo_world_matrix->Write(&camera.matrix); //写入缓冲区 @@ -89,9 +91,9 @@ public: render_list.Clear(); render_root.ExpendToList(&render_list); - BuildCommandBuffer(&render_list); + BuildCommandBuffer(index,&render_list); - VulkanApplicationFramework::Draw(); + SubmitDraw(index); if(key_status[kbW])camera.Forward (move_speed);else if(key_status[kbS])camera.Backward (move_speed);else diff --git a/example/Vulkan/VulkanAppFramework.h b/example/Vulkan/VulkanAppFramework.h index 000d2483..5aacd93b 100644 --- a/example/Vulkan/VulkanAppFramework.h +++ b/example/Vulkan/VulkanAppFramework.h @@ -149,60 +149,91 @@ public: } } - void BuildCommandBuffer(vulkan::Pipeline *p,vulkan::DescriptorSets *ds,vulkan::Renderable *r) + void BuildCommandBuffer(uint32_t index,vulkan::Pipeline *p,vulkan::DescriptorSets *ds,vulkan::Renderable *r) { if(!p||!ds||!r) return; const vulkan::IndexBuffer *ib=r->GetIndexBuffer(); - for(uint i=0;iBegin(); - cmd_buf[i]->BeginRenderPass(device->GetRenderPass(),device->GetFramebuffer(i)); - cmd_buf[i]->Bind(p); - cmd_buf[i]->Bind(ds); - cmd_buf[i]->Bind(r); + vulkan::CommandBuffer *cb=cmd_buf[index]; + + cb->Begin(); + cb->BeginRenderPass(device->GetRenderPass(),device->GetFramebuffer(index)); + cb->Bind(p); + cb->Bind(ds); + cb->Bind(r); - if (ib) - cmd_buf[i]->DrawIndexed(ib->GetCount()); - else - cmd_buf[i]->Draw(r->GetDrawCount()); + if (ib) + cb->DrawIndexed(ib->GetCount()); + else + cb->Draw(r->GetDrawCount()); - cmd_buf[i]->EndRenderPass(); - cmd_buf[i]->End(); - } + cb->EndRenderPass(); + cb->End(); + } + + void BuildCommandBuffer(vulkan::Pipeline *p,vulkan::DescriptorSets *ds,vulkan::Renderable *r) + { + for(uint32_t i=0;iGetCurrentFrameIndices(),p,ds,r); + } + + void BuildCommandBuffer(uint32_t index,RenderList *rl) + { + if(!rl)return; + + vulkan::CommandBuffer *cb=cmd_buf[index]; + + cb->Begin(); + cb->BeginRenderPass(device->GetRenderPass(),device->GetFramebuffer(index)); + rl->Render(cb); + cb->EndRenderPass(); + cb->End(); } void BuildCommandBuffer(RenderList *rl) { - if(!rl)return; - - for(uint i=0;iBegin(); - cmd_buf[i]->BeginRenderPass(device->GetRenderPass(),device->GetFramebuffer(i)); - rl->Render(cmd_buf[i]); - cmd_buf[i]->EndRenderPass(); - cmd_buf[i]->End(); - } + for(uint32_t i=0;iGetCurrentFrameIndices(),rl); } public: - virtual void Draw() + int AcquireNextImage() { - device->Wait(); - device->AcquireNextImage(); + if(device->Wait()) + if(device->AcquireNextImage()) + return device->GetCurrentFrameIndices(); - uint32_t index=device->GetCurrentFrameIndices(); + return -1; + } + void SubmitDraw(int index) + { VkCommandBuffer cb=*cmd_buf[index]; device->SubmitDraw(&cb); device->QueuePresent(); } + virtual void Draw() + { + int index=AcquireNextImage(); + + SubmitDraw(index); + } + bool Run() { if(!win->Update())return(false); @@ -267,12 +298,18 @@ public: return desc_set->BindUBO(world_matrix_bindpoint,*ubo_world_matrix); } + virtual void BuildCommandBuffer(uint32_t index)=0; + virtual void Draw()override { + const uint32_t index=AcquireNextImage(); + camera.Refresh(); //鏇存柊鐩告満鐭╅樀 ubo_world_matrix->Write(&camera.matrix); //鍐欏叆缂撳啿鍖 - VulkanApplicationFramework::Draw(); + BuildCommandBuffer(index); + + SubmitDraw(index); if(key_status[kbW])camera.Forward (move_speed);else if(key_status[kbS])camera.Backward (move_speed);else diff --git a/src/RenderDevice/Vulkan/VKDevice.cpp b/src/RenderDevice/Vulkan/VKDevice.cpp index 701db5e7..9f510f6c 100644 --- a/src/RenderDevice/Vulkan/VKDevice.cpp +++ b/src/RenderDevice/Vulkan/VKDevice.cpp @@ -245,8 +245,22 @@ ShaderModuleManage *Device::CreateShaderModuleManage() return(new ShaderModuleManage(this)); } +bool Device::Wait(bool wait_all,uint64_t time_out) +{ + VkFence fence=*fence_list[current_fence]; + + VkResult result; + + result=vkWaitForFences(attr->device,1,&fence,wait_all,time_out); + result=vkResetFences(attr->device,1,&fence); + + return(true); +} + 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); } @@ -261,21 +275,11 @@ 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); - - return(result==VK_SUCCESS); -} - -bool Device::Wait(bool wait_all,uint64_t time_out) -{ - VkFence fence=*fence_list[current_fence]; - vkWaitForFences(attr->device,1,&fence,wait_all,time_out); - vkResetFences(attr->device,1,&fence); - if(++current_fence==swap_chain_count) current_fence=0; - return(true); + return(result==VK_SUCCESS); } bool Device::QueuePresent() diff --git a/src/SceneGraph/InlineGeometry.cpp b/src/SceneGraph/InlineGeometry.cpp index 15865678..d973c328 100644 --- a/src/SceneGraph/InlineGeometry.cpp +++ b/src/SceneGraph/InlineGeometry.cpp @@ -157,8 +157,6 @@ namespace hgl { GeometryCreater2D gc(db,mtl); - if(rci->radius==0||rci->round_per<=1) //杩欐槸瑕佺敾鐭╁舰 - if(rci->radius==0||rci->round_per<=1) //杩欐槸瑕佺敾鐭╁舰 { if(!gc.Init(4))