**未完成**建立swapchain类,将VKDevice部分功能移到VKSwapchain类中

This commit is contained in:
hyzboy 2019-07-13 02:37:19 +08:00
parent 62c1ed785d
commit 2a2cb0db5f
14 changed files with 314 additions and 268 deletions

View File

@ -1,4 +1,5 @@
#include"AssimpLoaderMesh.h"
#include<hgl/graph/Coordinate.h>
#include<assimp/postprocess.h>
#include<assimp/cimport.h>
#include<assimp/scene.h>
@ -48,25 +49,6 @@ namespace
inline const vec pos_to_vec(const aiVector3D &v3d){return vec(v3d.x,v3d.y,v3d.z,1.0);}
void VecFlipY(List<Vector3f> &target,const aiVector3D *source,const uint count)
{
target.SetCount(count);
if(count<=0)return;
Vector3f *tp=target.GetData();
for(uint i=0;i<count;i++)
{
tp->x=source->x;
tp->y=source->y;
tp->z=source->z;
++source;
++tp;
}
}
void VecCopy(List<Vector3f> &target,const aiVector3D *source,const uint count)
{
target.SetCount(count);
@ -159,8 +141,6 @@ class AssimpLoaderMesh
ModelData *model_data;
Matrix4f OpenGLCoord2VulkanCoordMatrix;
private:
void GetBoundingBox(const aiNode * node,
@ -199,7 +179,7 @@ private:
void AssimpLoaderMesh::GetBoundingBox(const aiNode *node,aiVector3D *min_pos,aiVector3D *max_pos)
{
Matrix4f root_matrix=OpenGLCoord2VulkanCoordMatrix;
Matrix4f root_matrix=hgl::graph::MATRIX_FROM_OPENGL_COORDINATE;
min_pos->x = min_pos->y = min_pos->z = 1e10f;
max_pos->x = max_pos->y = max_pos->z = -1e10f;
@ -211,8 +191,6 @@ public:
AssimpLoaderMesh(const OSString &fn,const aiScene *s):filename(fn),scene(s)
{
OpenGLCoord2VulkanCoordMatrix=scale(1,-1,1)*rotate(hgl_ang2rad(90),Vector3f(1,0,0));
model_data=new ModelData;
aiVector3D scene_min,scene_max;
@ -236,11 +214,11 @@ private:
md->name=mesh->mName.C_Str();
if(mesh->HasPositions())
VecFlipY(md->position,mesh->mVertices,mesh->mNumVertices);
VecCopy(md->position,mesh->mVertices,mesh->mNumVertices);
if(mesh->HasNormals())
{
VecFlipY(md->normal,mesh->mNormals,mesh->mNumVertices);
VecCopy(md->normal,mesh->mNormals,mesh->mNumVertices);
if(mesh->HasTangentsAndBitangents())
{
@ -325,7 +303,7 @@ public:
if(!Load(model_data->root_node,scene->mRootNode))
return(false);
model_data->root_node->local_matrix=OpenGLCoord2VulkanCoordMatrix*model_data->root_node->local_matrix;
model_data->root_node->local_matrix=hgl::graph::MATRIX_FROM_OPENGL_COORDINATE*model_data->root_node->local_matrix;
return(true);
}
};//class AssimpLoaderMesh

View File

@ -6,19 +6,6 @@ namespace hgl
{
namespace graph
{
/*
* OpenGL Coordinate System Vulkan Coordinate System My Coordinate System
*
* /Z
* Y| /Z / Z| /Y
* | / / | /
* | / *------------ | /
* | / | X | /
* |/ | |/
* *------------ | *------------
* X | Y X
*/
/**
*
*/

View File

@ -0,0 +1,27 @@
#ifndef HGL_GRAPH_COORDINATE_INCLUDE
#define HGL_GRAPH_COORDINATE_INCLUDE
#include<hgl/math/Math.h>
namespace hgl
{
namespace graph
{
/*
* OpenGL Coordinate System Vulkan Coordinate System My Coordinate System
*
* /Z
* Y| /Z / Z| /Y
* | / / | /
* | / *------------ | /
* | / | X | /
* |/ | |/
* *------------ | *------------
* X | Y X
*/
extern Matrix4f MATRIX_FROM_OPENGL_COORDINATE; //OpenGL坐标系数据到我方坐标系数据变换用矩阵
}//namespace graph
}//namespace hgl
#endif//HGL_GRAPH_COORDINATE_INCLUDE

View File

@ -31,9 +31,9 @@ public:
void SetRenderArea(const VkRect2D &ra){render_area=ra;}
void SetViewport(const VkViewport &vp){viewport=vp;}
void SetClearColor(int index,float r,float g,float b,float a=1.0f)
void SetClearColor(uint32_t index,float r,float g,float b,float a=1.0f)
{
if(index<0||index>cv_count)return;
if(index>=cv_count)return;
VkClearValue *cv=clear_values+index;
@ -43,9 +43,9 @@ public:
cv->color.float32[3]=a;
}
void SetClearDepthStencil(int index,float d=1.0f,float s=0)
void SetClearDepthStencil(uint32_t index,float d=1.0f,float s=0)
{
if(index<0||index>cv_count)return;
if(index>=cv_count)return;
VkClearValue *cv=clear_values+index;

View File

@ -7,9 +7,7 @@
#include<hgl/platform/Window.h>
#include<hgl/graph/vulkan/VK.h>
#include<hgl/graph/vulkan/VKDeviceAttribute.h>
#include<hgl/graph/vulkan/VKFramebuffer.h>
#include<hgl/graph/vulkan/VKFence.h>
#include<hgl/graph/vulkan/VKSemaphore.h>
#include<hgl/graph/vulkan/VKSwapchain.h>
#include<hgl/graph/VertexBufferCreater.h>
VK_NAMESPACE_BEGIN
@ -17,32 +15,12 @@ class Device
{
DeviceAttribute *attr;
uint swap_chain_count;
Semaphore *present_complete_semaphore=nullptr,
*render_complete_semaphore=nullptr;
VkPipelineStageFlags pipe_stage_flags;
VkSubmitInfo submit_info;
Fence *texture_fence;
VkSubmitInfo texture_submit_info;
CommandBuffer *texture_cmd_buf;
RenderPass *main_rp;
uint32_t current_frame;
ObjectList<Framebuffer> render_frame;
uint32_t current_fence;
ObjectList<Fence> fence_list;
VkPresentInfoKHR present_info;
private:
void RecreateDevice();
Swapchain *swapchain;
private:
@ -54,26 +32,23 @@ public:
virtual ~Device();
operator VkDevice () {return attr->device;}
operator VkDevice () {return attr->device;}
VkSurfaceKHR GetSurface () {return attr->surface;}
VkDevice GetDevice () {return attr->device;}
const PhysicalDevice *GetPhysicalDevice ()const {return attr->physical_device;}
const VkExtent2D & GetExtent ()const {return attr->swapchain_extent;}
VkSurfaceKHR GetSurface () {return attr->surface;}
VkDevice GetDevice () {return attr->device;}
const PhysicalDevice * GetPhysicalDevice ()const {return attr->physical_device;}
VkDescriptorPool GetDescriptorPool () {return attr->desc_pool;}
VkPipelineCache GetPipelineCache () {return attr->pipeline_cache;}
VkDescriptorPool GetDescriptorPool () {return attr->desc_pool;}
VkPipelineCache GetPipelineCache () {return attr->pipeline_cache;}
const VkFormat GetSurfaceFormat ()const {return attr->format;}
VkQueue GetGraphicsQueue () {return attr->graphics_queue;}
Swapchain * GetSwapchain () {return swapchain;}
public:
const uint32_t GetSwapChainImageCount ()const {return attr->sc_texture.GetCount();}
RenderPass * GetMainRenderPass () {return main_rp;}
Framebuffer * GetFramebuffer (int index) {return render_frame[index];}
const uint32_t GetCurrentFrameIndices () {return current_frame;}
Framebuffer * GetCurrentFramebuffer () {return render_frame[current_frame];}
bool Resize (uint,uint);
bool Resize (const VkExtent2D &);
public: //内存相关
@ -164,7 +139,7 @@ public: //material相关
public: //Command Buffer 相关
CommandBuffer * CreateCommandBuffer(const VkExtent2D *extent,const uint32_t atta_count);
CommandBuffer * CreateCommandBuffer(const VkExtent2D &extent,const uint32_t atta_count);
bool CreateAttachment( List<VkAttachmentReference> &ref_list,
List<VkAttachmentDescription> &desc_list,
@ -194,27 +169,6 @@ public: //Command Buffer 相关
Fence * CreateFence(bool);
Semaphore * CreateSem();
public: //提交相关
bool Wait (bool wait_all=VK_TRUE,uint64_t time_out=HGL_NANO_SEC_PER_SEC*0.1); ///<等待队列完成
/**
*
*/
bool AcquireNextImage (VkSemaphore); ///<请求获得下一帧的索引
/**
*
* @param cmd_list
* @param wait_sems
* @param complete_semaphores
*/
bool SubmitDraw (List<VkCommandBuffer> &cmd_list,List<VkSemaphore> &wait_sems,List<VkSemaphore> &complete_semaphores); ///<提交绘制指令
bool SubmitTexture (const VkCommandBuffer *cmd_bufs,const uint32_t count=1); ///<提交纹理处理到队列
bool PresentBackbuffer (); ///<等待绘制队列完成,并将后台缓冲区呈现到前台
};//class Device
VK_NAMESPACE_END
#endif//HGL_GRAPH_RENDER_SURFACE_INCLUDE

View File

@ -13,7 +13,6 @@ struct DeviceAttribute
VkSurfaceKHR surface =VK_NULL_HANDLE;
VkSurfaceCapabilitiesKHR surface_caps;
VkExtent2D swapchain_extent;
uint32_t graphics_family =ERROR_FAMILY_INDEX;
uint32_t present_family =ERROR_FAMILY_INDEX;
@ -33,10 +32,6 @@ struct DeviceAttribute
VkDevice device =VK_NULL_HANDLE;
VkCommandPool cmd_pool =VK_NULL_HANDLE;
VkSwapchainKHR swap_chain =VK_NULL_HANDLE;
ObjectList<Texture2D> sc_texture;
Texture2D * sc_depth =nullptr;
VkDescriptorPool desc_pool =VK_NULL_HANDLE;
@ -49,7 +44,6 @@ public:
bool CheckMemoryType(uint32_t typeBits,VkMemoryPropertyFlags properties,uint32_t *typeIndex) const;
void ClearSwapchain();
void Refresh();
};//class DeviceAttribute
VK_NAMESPACE_END

View File

@ -0,0 +1,82 @@
#ifndef HGL_GRAPH_VULKAN_SWAP_CHAIN_INCLUDE
#define HGL_GRAPH_VULKAN_SWAP_CHAIN_INCLUDE
#include<hgl/graph/Vulkan/VK.h>
#include<hgl/graph/vulkan/VKFramebuffer.h>
#include<hgl/graph/vulkan/VKFence.h>
#include<hgl/graph/vulkan/VKSemaphore.h>
VK_NAMESPACE_BEGIN
class Swapchain
{
protected:
Device *device;
VkExtent2D extent;
VkQueue graphics_queue =VK_NULL_HANDLE;
VkSwapchainKHR swap_chain =VK_NULL_HANDLE;
uint32_t swap_chain_count;
ObjectList<Texture2D> sc_texture;
Texture2D * sc_depth =nullptr;
protected:
VkPipelineStageFlags pipe_stage_flags;
uint32_t current_frame;
ObjectList<Framebuffer> render_frame;
uint32_t current_fence;
ObjectList<Fence> fence_list;
RenderPass *main_rp =nullptr;
Semaphore *present_complete_semaphore =nullptr,
*render_complete_semaphore =nullptr;
VkSubmitInfo submit_info;
VkPresentInfoKHR present_info;
public:
const VkExtent2D & GetExtent ()const {return extent;}
const uint32_t GetImageCount ()const {return sc_texture.GetCount();}
RenderPass * GetMainRenderPass () {return main_rp;}
Framebuffer * GetFramebuffer (int index) {return render_frame[index];}
const uint32_t GetCurrentFrameIndices () {return current_frame;}
Framebuffer * GetCurrentFramebuffer () {return render_frame[current_frame];}
public:
Swapchain(Device *);
virtual ~Swapchain();
void Clear ();
void Recreate ();
bool Wait (bool wait_all=VK_TRUE,uint64_t time_out=HGL_NANO_SEC_PER_SEC*0.1); ///<等待队列完成
/**
*
*/
bool AcquireNextImage (VkSemaphore); ///<请求获得下一帧的索引
/**
*
* @param cmd_list
* @param wait_sems
* @param complete_semaphores
*/
bool SubmitDraw (List<VkCommandBuffer> &cmd_list,List<VkSemaphore> &wait_sems,List<VkSemaphore> &complete_semaphores); ///<提交绘制指令
bool SubmitTexture (const VkCommandBuffer *cmd_bufs,const uint32_t count=1); ///<提交纹理处理到队列
bool PresentBackbuffer (); ///<等待绘制队列完成,并将后台缓冲区呈现到前台
};//class Swapchain
VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_SWAP_CHAIN_INCLUDE

View File

@ -22,6 +22,7 @@
${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKShaderModule.h
${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKShaderModuleManage.h
${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKSurfaceExtensionName.h
${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKSwapchain.h
${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKVertexAttributeBinding.h
${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKTexture.h
${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKSampler.h
@ -56,7 +57,7 @@ SET(RENDER_DEVICE_VULKAN_SOURCE VKFormat.cpp
VKRenderable.cpp
VKTexture.cpp
VKSampler.cpp
#VKRenderTarget.cpp
VKSwapchain.cpp
)
SET(RENDER_DEVICE_VULKAN_POD_SOURCE pod/VKPipelineCreateInfo.POD.cpp)

View File

@ -10,97 +10,45 @@
#include<hgl/graph/vulkan/VKDescriptorSets.h>
VK_NAMESPACE_BEGIN
bool ResizeRenderDevice(DeviceAttribute *attr,uint width,uint height);
Swapchain *CreateSwapchain(DeviceAttribute *attr,const VkExtent2D &);
Device::Device(DeviceAttribute *da)
{
attr=da;
current_frame=0;
texture_fence=this->CreateFence(false);
hgl_zero(texture_submit_info);
texture_submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
main_rp=nullptr;
texture_cmd_buf=nullptr;
pipe_stage_flags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
present_complete_semaphore =this->CreateSem();
render_complete_semaphore =this->CreateSem();
submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
submit_info.pNext = nullptr;
submit_info.waitSemaphoreCount = 1;
submit_info.pWaitSemaphores = *present_complete_semaphore;
submit_info.pWaitDstStageMask = &pipe_stage_flags;
submit_info.signalSemaphoreCount = 1;
submit_info.pSignalSemaphores = *render_complete_semaphore;
present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
present_info.pNext = nullptr;
present_info.waitSemaphoreCount = 1;
present_info.pWaitSemaphores = *render_complete_semaphore;
present_info.swapchainCount = 1;
present_info.pResults = nullptr;
RecreateDevice();
Resize(attr->surface_caps.currentExtent);
}
Device::~Device()
{
fence_list.Clear();
render_frame.Clear();
delete present_complete_semaphore;
delete render_complete_semaphore;
delete main_rp;
delete texture_cmd_buf;
delete texture_fence;
delete attr;
}
void Device::RecreateDevice()
bool Device::Resize(const VkExtent2D &extent)
{
fence_list.Clear();
render_frame.Clear();
if(swapchain)
delete swapchain;
if(main_rp)delete main_rp;
swapchain=CreateSwapchain(attr,extent);
if(texture_cmd_buf)delete texture_cmd_buf;
present_info.pSwapchains=&attr->swap_chain;
texture_cmd_buf=CreateCommandBuffer(swapchain->GetExtent(),0);
main_rp=CreateRenderPass(attr->format,attr->sc_depth->GetFormat());
swap_chain_count=attr->sc_texture.GetCount();
for(uint i=0;i<swap_chain_count;i++)
{
render_frame.Add(vulkan::CreateFramebuffer(this,main_rp,attr->sc_texture[i]->GetImageView(),attr->sc_depth->GetImageView()));
fence_list.Add(this->CreateFence(true));
}
texture_cmd_buf=CreateCommandBuffer(nullptr,0);
current_frame=0;
current_fence=0;
}
bool Device::Resize(uint width,uint height)
{
if(!ResizeRenderDevice(attr,width,height))
return(false);
RecreateDevice();
return(true);
}
CommandBuffer *Device::CreateCommandBuffer(const VkExtent2D *extent,const uint32_t atta_count)
CommandBuffer *Device::CreateCommandBuffer(const VkExtent2D &extent,const uint32_t atta_count)
{
if(!attr->cmd_pool)
return(nullptr);
@ -119,7 +67,7 @@ CommandBuffer *Device::CreateCommandBuffer(const VkExtent2D *extent,const uint32
if(res!=VK_SUCCESS)
return(nullptr);
return(new CommandBuffer(attr->device,extent?*extent:attr->swapchain_extent,atta_count,attr->cmd_pool,cmd_buf));
return(new CommandBuffer(attr->device,extent,atta_count,attr->cmd_pool,cmd_buf));
}
/**
@ -159,68 +107,4 @@ 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(VkSemaphore present_complete_semaphore)
{
return(vkAcquireNextImageKHR(attr->device,attr->swap_chain,UINT64_MAX,present_complete_semaphore,VK_NULL_HANDLE,&current_frame)==VK_SUCCESS);
}
bool Device::SubmitDraw(List<VkCommandBuffer> &cmd_lists,List<VkSemaphore> &wait_sems,List<VkSemaphore> &complete_sems)
{
if(cmd_lists.GetCount()<=0)
return(false);
submit_info.waitSemaphoreCount =wait_sems.GetCount();
submit_info.pWaitSemaphores =wait_sems.GetData();
submit_info.commandBufferCount =cmd_lists.GetCount();
submit_info.pCommandBuffers =cmd_lists.GetData();
submit_info.signalSemaphoreCount=complete_sems.GetCount();
submit_info.pSignalSemaphores =complete_sems.GetData();
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);
}
bool Device::PresentBackbuffer()
{
present_info.pImageIndices=&current_frame;
VkResult result=vkQueuePresentKHR(attr->graphics_queue,&present_info);
if (!((result == VK_SUCCESS) || (result == VK_SUBOPTIMAL_KHR)))
{
if (result == VK_ERROR_OUT_OF_DATE_KHR) {
// Swap chain is no longer compatible with the surface and needs to be recreated
return false;
}
}
result=vkQueueWaitIdle(attr->graphics_queue);
if(result!=VK_SUCCESS)
return(false);
return(true);
}
VK_NAMESPACE_END

View File

@ -5,7 +5,6 @@
#include<iostream>
VK_NAMESPACE_BEGIN
DeviceAttribute::DeviceAttribute(VkInstance inst,const PhysicalDevice *pd,VkSurfaceKHR s)
{
instance=inst;
@ -23,8 +22,6 @@ DeviceAttribute::~DeviceAttribute()
if(desc_pool)
vkDestroyDescriptorPool(device,desc_pool,nullptr);
ClearSwapchain();
if(cmd_pool)
vkDestroyCommandPool(device,cmd_pool,nullptr);
@ -40,18 +37,6 @@ bool DeviceAttribute::CheckMemoryType(uint32_t typeBits,VkMemoryPropertyFlags pr
return physical_device->CheckMemoryType(typeBits,properties,typeIndex);
}
void DeviceAttribute::ClearSwapchain()
{
SAFE_CLEAR(sc_depth);
sc_texture.Clear();
if(swap_chain)
{
vkDestroySwapchainKHR(device,swap_chain,nullptr);
swap_chain=VK_NULL_HANDLE;
}
}
void DeviceAttribute::Refresh()
{
VkPhysicalDevice pdevice = *physical_device;
@ -70,7 +55,7 @@ void DeviceAttribute::Refresh()
}
{
constexpr VkCompositeAlphaFlagBitsKHR compositeAlphaFlags[4] = { VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR,
constexpr VkCompositeAlphaFlagBitsKHR compositeAlphaFlags[4]={VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR,
VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR,
VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR,
VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR };

View File

@ -20,14 +20,14 @@ namespace
return cur;
}
VkExtent2D GetSwapchainExtent(VkSurfaceCapabilitiesKHR &surface_caps,uint32_t width,uint32_t height)
VkExtent2D GetSwapchainExtent(VkSurfaceCapabilitiesKHR &surface_caps,const VkExtent2D &acquire_extent)
{
if(surface_caps.currentExtent.width==UINT32_MAX)
{
VkExtent2D swapchain_extent;
swapchain_extent.width=Clamp(width,surface_caps.minImageExtent.width,surface_caps.maxImageExtent.width);
swapchain_extent.height=Clamp(height,surface_caps.minImageExtent.height,surface_caps.maxImageExtent.height);
swapchain_extent.width =Clamp(acquire_extent.width, surface_caps.minImageExtent.width, surface_caps.maxImageExtent.width );
swapchain_extent.height =Clamp(acquire_extent.height, surface_caps.minImageExtent.height, surface_caps.maxImageExtent.height );
return swapchain_extent;
}
@ -549,17 +549,11 @@ Device *CreateRenderDevice(VkInstance inst,const PhysicalDevice *physical_device
return(new Device(attr));
}
bool ResizeRenderDevice(DeviceAttribute *attr,uint width,uint height)
Swapchain *CreateSwapchain(DeviceAttribute *attr,const VkExtent2D &acquire_extent)
{
if(attr->swapchain_extent.width==width
&&attr->swapchain_extent.height==height)
return(true);
attr->ClearSwapchain();
attr->Refresh();
attr->swapchain_extent=GetSwapchainExtent(attr->surface_caps,width,height);
VkExtent2D extent=GetSwapchainExtent(attr->surface_caps,acquire_extent);
return CreateSwapchinAndDepthBuffer(attr);
}

View File

@ -0,0 +1,147 @@
#include<hgl/graph/vulkan/VKSwapchain.h>
#include<hgl/graph/vulkan/VKDevice.h>
#include<hgl/graph/vulkan/VKRenderPass.h>
VK_NAMESPACE_BEGIN
Swapchain::Swapchain(Device *dev)
{
device=dev;
pipe_stage_flags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
current_frame=0;
main_rp=nullptr;
present_complete_semaphore =device->CreateSem();
render_complete_semaphore =device->CreateSem();
submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
submit_info.pNext = nullptr;
submit_info.waitSemaphoreCount = 1;
submit_info.pWaitSemaphores = *present_complete_semaphore;
submit_info.pWaitDstStageMask = &pipe_stage_flags;
submit_info.signalSemaphoreCount = 1;
submit_info.pSignalSemaphores = *render_complete_semaphore;
present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
present_info.pNext = nullptr;
present_info.waitSemaphoreCount = 1;
present_info.pWaitSemaphores = *render_complete_semaphore;
present_info.swapchainCount = 1;
present_info.pResults = nullptr;
graphics_queue=device->GetGraphicsQueue();
}
Swapchain::~Swapchain()
{
fence_list.Clear();
render_frame.Clear();
delete present_complete_semaphore;
delete render_complete_semaphore;
delete main_rp;
Clear();
}
void Swapchain::Clear()
{
SAFE_CLEAR(sc_depth);
sc_texture.Clear();
if(swap_chain)
{
vkDestroySwapchainKHR(device->GetDevice(),swap_chain,nullptr);
swap_chain=VK_NULL_HANDLE;
}
}
void Swapchain::Recreate()
{
fence_list.Clear();
render_frame.Clear();
if(main_rp)delete main_rp;
present_info.pSwapchains=&swap_chain;
main_rp=device->CreateRenderPass(device->GetSurfaceFormat(),sc_depth->GetFormat());
swap_chain_count=sc_texture.GetCount();
for(uint i=0;i<swap_chain_count;i++)
{
render_frame.Add(vulkan::CreateFramebuffer(device,main_rp,sc_texture[i]->GetImageView(),sc_depth->GetImageView()));
fence_list.Add(device->CreateFence(true));
}
current_frame=0;
current_fence=0;
}
bool Swapchain::Wait(bool wait_all,uint64_t time_out)
{
VkFence fence=*fence_list[current_fence];
VkResult result;
result=vkWaitForFences(device->GetDevice(),1,&fence,wait_all,time_out);
result=vkResetFences(device->GetDevice(),1,&fence);
return(true);
}
bool Swapchain::AcquireNextImage(VkSemaphore present_complete_semaphore)
{
return(vkAcquireNextImageKHR(device->GetDevice(),swap_chain,UINT64_MAX,present_complete_semaphore,VK_NULL_HANDLE,&current_frame)==VK_SUCCESS);
}
bool Swapchain::SubmitDraw(List<VkCommandBuffer> &cmd_lists,List<VkSemaphore> &wait_sems,List<VkSemaphore> &complete_sems)
{
if(cmd_lists.GetCount()<=0)
return(false);
submit_info.waitSemaphoreCount =wait_sems.GetCount();
submit_info.pWaitSemaphores =wait_sems.GetData();
submit_info.commandBufferCount =cmd_lists.GetCount();
submit_info.pCommandBuffers =cmd_lists.GetData();
submit_info.signalSemaphoreCount=complete_sems.GetCount();
submit_info.pSignalSemaphores =complete_sems.GetData();
VkFence fence=*fence_list[current_fence];
VkResult result=vkQueueSubmit(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);
}
bool Swapchain::PresentBackbuffer()
{
present_info.pImageIndices=&current_frame;
VkResult result=vkQueuePresentKHR(graphics_queue,&present_info);
if (!((result == VK_SUCCESS) || (result == VK_SUBOPTIMAL_KHR)))
{
if (result == VK_ERROR_OUT_OF_DATE_KHR) {
// Swap chain is no longer compatible with the surface and needs to be recreated
return false;
}
}
result=vkQueueWaitIdle(graphics_queue);
if(result!=VK_SUCCESS)
return(false);
return(true);
}
VK_NAMESPACE_END

View File

@ -1,4 +1,5 @@
SET(SCENE_GRAPH_HEADER ${ROOT_INCLUDE_PATH}/hgl/graph/AABox.h
SET(SCENE_GRAPH_HEADER ${ROOT_INCLUDE_PATH}/hgl/graph/Coordinate.h
${ROOT_INCLUDE_PATH}/hgl/graph/AABox.h
${ROOT_INCLUDE_PATH}/hgl/graph/Camera.h
${ROOT_INCLUDE_PATH}/hgl/graph/Light.h
${ROOT_INCLUDE_PATH}/hgl/graph/SceneDB.h
@ -15,11 +16,12 @@
#${ROOT_INCLUDE_PATH}/hgl/graph/Spline.h
)
SET(SCENE_GRAPH_SOURCE AABox.cpp
SET(SCENE_GRAPH_SOURCE Coordinate.cpp
AABox.cpp
Camera.cpp
RenderList.cpp
SceneDB.cpp
SceneNode.cpp
SceneNode.cpp
SceneOrient.cpp
InlineGeometry.cpp
#InlinePipeline.cpp

View File

@ -0,0 +1,11 @@
#include<hgl/graph/Coordinate.h>
namespace hgl
{
namespace graph
{
Matrix4f MATRIX_FROM_OPENGL_COORDINATE=scale(1,-1,1)*rotate(hgl_ang2rad(90),Vector3f(1,0,0));
}//namespace graph
}//namespace hgl