建立独立的VKDeviceSwapchain.cpp将交换链创建相关代码移到这里

This commit is contained in:
hyzboy 2019-11-26 00:22:54 +08:00
parent 5846913197
commit f5cafb91b8
9 changed files with 153 additions and 151 deletions

View File

@ -1,7 +1,7 @@
macro(CreateProject name) macro(CreateProject name)
add_executable(${name} ${ARGN} VulkanAppFramework.h) add_executable(${name} ${ARGN} VulkanAppFramework.h)
target_link_libraries(${name} ${ULRE}) target_link_libraries(${name} ${ULRE})
IF(WIN32) IF(WIN32)
set_target_properties(${name} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY ${ULRE_RUNTIME_PATH}) set_target_properties(${name} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY ${ULRE_RUNTIME_PATH})
ENDIF() ENDIF()
@ -12,7 +12,7 @@ endmacro()
CreateProject(00.triangle first_triangle.cpp) CreateProject(00.triangle first_triangle.cpp)
CreateProject(01.indices_rect indices_rect.cpp) CreateProject(01.indices_rect indices_rect.cpp)
CreateProject(02.1.texture_rect texture_rect.cpp TGATexture.cpp) CreateProject(02.1.texture_rect texture_rect.cpp TGATexture.cpp)
CreateProject(02.2.texture_linear texture_linear.cpp TGATexture.cpp) #CreateProject(02.2.texture_linear texture_linear.cpp TGATexture.cpp)
CreateProject(03.HQFilterTexture HQFilterTexture.cpp TGATexture.cpp) CreateProject(03.HQFilterTexture HQFilterTexture.cpp TGATexture.cpp)
CreateProject(04.Geometry2D Geometry2D.cpp) CreateProject(04.Geometry2D Geometry2D.cpp)
CreateProject(05.Geometry3D Geometry3D.cpp) CreateProject(05.Geometry3D Geometry3D.cpp)
@ -29,6 +29,6 @@ CreateProject(10.PBRBasic PBRBasic.cpp)
CreateProject(11.Deferred Deferred.cpp TGATexture.cpp) CreateProject(11.Deferred Deferred.cpp TGATexture.cpp)
CreateProject(12.DeferredModel DeferredModel.cpp TGATexture.cpp) #CreateProject(12.DeferredModel DeferredModel.cpp TGATexture.cpp)
CreateProject(13.TextureFormat TextureFormat.cpp) CreateProject(13.TextureFormat TextureFormat.cpp)

View File

@ -260,7 +260,7 @@ Texture2D *LoadTGATexture(const OSString &filename,Device *device,bool use_optim
} }
else else
{ {
device->CreateTexture2DLinear(format,buf,header.width, header.height); //device->CreateTexture2DLinear(format,buf,header.width, header.height);
} }
if(tex) if(tex)

View File

@ -10,7 +10,7 @@ using namespace hgl;
using namespace hgl::graph; using namespace hgl::graph;
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
Texture2D *LoadTGATexture(const OSString &filename,Device *device); Texture2D *LoadTGATexture(const OSString &filename,Device *device,bool use_optimal=true);
VK_NAMESPACE_END VK_NAMESPACE_END
constexpr uint32_t SCREEN_WIDTH=128; constexpr uint32_t SCREEN_WIDTH=128;

View File

@ -22,6 +22,11 @@ class Device
Swapchain *swapchain; Swapchain *swapchain;
SwapchainRenderTarget *swapchainRT; SwapchainRenderTarget *swapchainRT;
bool CreateSwapchainColorTexture();
bool CreateSwapchainDepthTexture();
Swapchain *CreateSwapchain(const VkExtent2D &acquire_extent);
private: private:
friend Device *CreateRenderDevice(VkInstance inst,const PhysicalDevice *physical_device,VkSurfaceKHR surface,const VkExtent2D &extent); friend Device *CreateRenderDevice(VkInstance inst,const PhysicalDevice *physical_device,VkSurfaceKHR surface,const VkExtent2D &extent);

View File

@ -93,8 +93,5 @@ public:
// uint32_t width,height,count; // uint32_t width,height,count;
//};//class TextureCubemapArray:public Texture //};//class TextureCubemapArray:public Texture
Texture2D *CreateTexture2D(VkDevice device,VkFormat format,uint32_t width,uint32_t height,VkImageAspectFlagBits aspectMask,VkImage image,VkImageLayout image_layout);
Texture2D *CreateTexture2D(VkDevice device,const PhysicalDevice *pd,const VkFormat format,uint32_t width,uint32_t height,const VkImageAspectFlags aspectMask,const uint usage,const VkImageLayout image_layout,const VkImageTiling tiling);
VK_NAMESPACE_END VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_TEXTURE_INCLUDE #endif//HGL_GRAPH_VULKAN_TEXTURE_INCLUDE

View File

@ -14,6 +14,7 @@ SET(RENDER_DEVICE_VULKAN_SOURCE VKFormat.cpp
VKDeviceBuffer.cpp VKDeviceBuffer.cpp
VKDeviceImage.cpp VKDeviceImage.cpp
VKDeviceTexture.cpp VKDeviceTexture.cpp
VKDeviceSwapchain.cpp
VKDeviceRenderPass.cpp VKDeviceRenderPass.cpp
VKBuffer.cpp VKBuffer.cpp
VKDescriptorSets.cpp VKDescriptorSets.cpp

View File

@ -11,8 +11,6 @@
#include<hgl/graph/vulkan/VKDescriptorSets.h> #include<hgl/graph/vulkan/VKDescriptorSets.h>
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
Swapchain *CreateSwapchain(const DeviceAttribute *attr,const VkExtent2D &acquire_extent);
Device::Device(DeviceAttribute *da) Device::Device(DeviceAttribute *da)
{ {
attr=da; attr=da;
@ -45,7 +43,7 @@ bool Device::Resize(const VkExtent2D &extent)
SAFE_CLEAR(texture_cmd_buf); SAFE_CLEAR(texture_cmd_buf);
attr->Refresh(); attr->Refresh();
swapchain=CreateSwapchain(attr,extent); swapchain=CreateSwapchain(extent);
texture_cmd_buf=CreateCommandBuffer(extent,0); texture_cmd_buf=CreateCommandBuffer(extent,0);
textureSQ=new SubmitQueue(this,attr->graphics_queue,1); textureSQ=new SubmitQueue(this,attr->graphics_queue,1);

View File

@ -0,0 +1,141 @@
#include<hgl/graph/vulkan/VKDevice.h>
#include<hgl/graph/vulkan/VKDeviceAttribute.h>
#include<hgl/graph/vulkan/VKPhysicalDevice.h>
VK_NAMESPACE_BEGIN
namespace
{
VkExtent2D SwapchainExtentClamp(const VkSurfaceCapabilitiesKHR &surface_caps,const VkExtent2D &acquire_extent)
{
VkExtent2D swapchain_extent;
swapchain_extent.width =hgl_clamp(acquire_extent.width, surface_caps.minImageExtent.width, surface_caps.maxImageExtent.width );
swapchain_extent.height =hgl_clamp(acquire_extent.height, surface_caps.minImageExtent.height, surface_caps.maxImageExtent.height );
return swapchain_extent;
}
VkSwapchainKHR CreateSwapChain(const DeviceAttribute *dev_attr,const VkExtent2D &extent)
{
VkSwapchainCreateInfoKHR swapchain_ci;
swapchain_ci.sType =VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
swapchain_ci.pNext =nullptr;
swapchain_ci.flags =0;
swapchain_ci.surface =dev_attr->surface;
swapchain_ci.minImageCount =3;//rsa->surface_caps.minImageCount;
swapchain_ci.imageFormat =dev_attr->format;
swapchain_ci.imageColorSpace =VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
swapchain_ci.imageExtent =extent;
swapchain_ci.imageArrayLayers =1;
swapchain_ci.imageUsage =VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
swapchain_ci.queueFamilyIndexCount =0;
swapchain_ci.pQueueFamilyIndices =nullptr;
swapchain_ci.preTransform =dev_attr->preTransform;
swapchain_ci.compositeAlpha =dev_attr->compositeAlpha;
swapchain_ci.presentMode =VK_PRESENT_MODE_FIFO_KHR;
swapchain_ci.clipped =VK_TRUE;
swapchain_ci.oldSwapchain =VK_NULL_HANDLE;
if(dev_attr->surface_caps.supportedUsageFlags&VK_IMAGE_USAGE_TRANSFER_SRC_BIT)
swapchain_ci.imageUsage|=VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
if(dev_attr->surface_caps.supportedUsageFlags&VK_IMAGE_USAGE_TRANSFER_DST_BIT)
swapchain_ci.imageUsage|=VK_IMAGE_USAGE_TRANSFER_DST_BIT;
uint32_t queueFamilyIndices[2]={dev_attr->graphics_family, dev_attr->present_family};
if(dev_attr->graphics_family!=dev_attr->present_family)
{
// If the graphics and present queues are from different queue families,
// we either have to explicitly transfer ownership of images between
// the queues, or we have to create the swapchain with imageSharingMode
// as VK_SHARING_MODE_CONCURRENT
swapchain_ci.imageSharingMode=VK_SHARING_MODE_CONCURRENT;
swapchain_ci.queueFamilyIndexCount=2;
swapchain_ci.pQueueFamilyIndices=queueFamilyIndices;
}
else
{
swapchain_ci.imageSharingMode=VK_SHARING_MODE_EXCLUSIVE;
}
VkSwapchainKHR swap_chain;
if(vkCreateSwapchainKHR(dev_attr->device,&swapchain_ci,nullptr,&swap_chain)==VK_SUCCESS)
return(swap_chain);
return(VK_NULL_HANDLE);
}
}//namespace
bool Device::CreateSwapchainColorTexture()
{
if(vkGetSwapchainImagesKHR(attr->device,swapchain->swap_chain,&(swapchain->swap_chain_count),nullptr)!=VK_SUCCESS)
return(false);
AutoDeleteArray<VkImage> sc_images=new VkImage[swapchain->swap_chain_count];
if(vkGetSwapchainImagesKHR(attr->device,swapchain->swap_chain,&(swapchain->swap_chain_count),sc_images)!=VK_SUCCESS)
{
delete sc_images;
return(false);
}
VkImage *ip=sc_images;
Texture2D *tex;
for(uint32_t i=0; i<swapchain->swap_chain_count; i++)
{
tex=CreateTexture2D(attr->format,
swapchain->extent.width,
swapchain->extent.height,
VK_IMAGE_ASPECT_COLOR_BIT,
*ip,
VK_IMAGE_LAYOUT_UNDEFINED);
swapchain->sc_color.Add(tex);
++ip;
}
return(true);
}
bool Device::CreateSwapchainDepthTexture()
{
const VkFormat depth_format=attr->physical_device->GetDepthFormat();
const VkFormatProperties props=attr->physical_device->GetFormatProperties(depth_format);
swapchain->sc_depth=CreateTexture2D(depth_format,
swapchain->extent.width,
swapchain->extent.height,
VK_IMAGE_ASPECT_DEPTH_BIT,
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
VK_IMAGE_LAYOUT_UNDEFINED,
(props.optimalTilingFeatures&VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)?VK_IMAGE_TILING_OPTIMAL:VK_IMAGE_TILING_LINEAR);
return swapchain->sc_depth;
}
Swapchain *Device::CreateSwapchain(const VkExtent2D &acquire_extent)
{
AutoDelete<Swapchain> sc=new Swapchain;
sc->device =attr->device;
sc->extent =SwapchainExtentClamp(attr->surface_caps,acquire_extent);
sc->graphics_queue =attr->graphics_queue;
sc->swap_chain =CreateSwapChain(attr,sc->extent);
if(!sc->swap_chain)
return(nullptr);
if(!CreateSwapchainColorTexture())
return(nullptr);
if(!CreateSwapchainDepthTexture())
return(nullptr);
return sc.Finish();
}
VK_NAMESPACE_END

View File

@ -1,6 +1,4 @@
#include<hgl/graph/vulkan/VKSwapchain.h> #include<hgl/graph/vulkan/VKSwapchain.h>
#include<hgl/graph/vulkan/VKDeviceAttribute.h>
#include<hgl/graph/vulkan/VKPhysicalDevice.h>
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
Swapchain::~Swapchain() Swapchain::~Swapchain()
@ -16,142 +14,4 @@ Swapchain::~Swapchain()
swap_chain_count=0; swap_chain_count=0;
} }
namespace
{
VkExtent2D SwapchainExtentClamp(const VkSurfaceCapabilitiesKHR &surface_caps,const VkExtent2D &acquire_extent)
{
VkExtent2D swapchain_extent;
swapchain_extent.width =hgl_clamp(acquire_extent.width, surface_caps.minImageExtent.width, surface_caps.maxImageExtent.width );
swapchain_extent.height =hgl_clamp(acquire_extent.height, surface_caps.minImageExtent.height, surface_caps.maxImageExtent.height );
return swapchain_extent;
}
VkSwapchainKHR CreateSwapChain(const DeviceAttribute *dev_attr,const VkExtent2D &extent)
{
VkSwapchainCreateInfoKHR swapchain_ci;
swapchain_ci.sType =VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
swapchain_ci.pNext =nullptr;
swapchain_ci.flags =0;
swapchain_ci.surface =dev_attr->surface;
swapchain_ci.minImageCount =3;//rsa->surface_caps.minImageCount;
swapchain_ci.imageFormat =dev_attr->format;
swapchain_ci.imageColorSpace =VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
swapchain_ci.imageExtent =extent;
swapchain_ci.imageArrayLayers =1;
swapchain_ci.imageUsage =VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
swapchain_ci.queueFamilyIndexCount =0;
swapchain_ci.pQueueFamilyIndices =nullptr;
swapchain_ci.preTransform =dev_attr->preTransform;
swapchain_ci.compositeAlpha =dev_attr->compositeAlpha;
swapchain_ci.presentMode =VK_PRESENT_MODE_FIFO_KHR;
swapchain_ci.clipped =VK_TRUE;
swapchain_ci.oldSwapchain =VK_NULL_HANDLE;
if(dev_attr->surface_caps.supportedUsageFlags&VK_IMAGE_USAGE_TRANSFER_SRC_BIT)
swapchain_ci.imageUsage|=VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
if(dev_attr->surface_caps.supportedUsageFlags&VK_IMAGE_USAGE_TRANSFER_DST_BIT)
swapchain_ci.imageUsage|=VK_IMAGE_USAGE_TRANSFER_DST_BIT;
uint32_t queueFamilyIndices[2]={dev_attr->graphics_family, dev_attr->present_family};
if(dev_attr->graphics_family!=dev_attr->present_family)
{
// If the graphics and present queues are from different queue families,
// we either have to explicitly transfer ownership of images between
// the queues, or we have to create the swapchain with imageSharingMode
// as VK_SHARING_MODE_CONCURRENT
swapchain_ci.imageSharingMode=VK_SHARING_MODE_CONCURRENT;
swapchain_ci.queueFamilyIndexCount=2;
swapchain_ci.pQueueFamilyIndices=queueFamilyIndices;
}
else
{
swapchain_ci.imageSharingMode=VK_SHARING_MODE_EXCLUSIVE;
}
VkSwapchainKHR swap_chain;
if(vkCreateSwapchainKHR(dev_attr->device,&swapchain_ci,nullptr,&swap_chain)==VK_SUCCESS)
return(swap_chain);
return(VK_NULL_HANDLE);
}
bool CreateSwapchainColorTexture(Swapchain *sa,const DeviceAttribute *dev_attr)
{
if(vkGetSwapchainImagesKHR(dev_attr->device,sa->swap_chain,&(sa->swap_chain_count),nullptr)!=VK_SUCCESS)
return(false);
AutoDeleteArray<VkImage> sc_images=new VkImage[sa->swap_chain_count];
if(vkGetSwapchainImagesKHR(dev_attr->device,sa->swap_chain,&(sa->swap_chain_count),sc_images)!=VK_SUCCESS)
{
delete sc_images;
return(false);
}
VkImage *ip=sc_images;
Texture2D *tex;
for(uint32_t i=0; i<sa->swap_chain_count; i++)
{
tex=VK_NAMESPACE::CreateTexture2D( dev_attr->device,
dev_attr->format,
sa->extent.width,
sa->extent.height,
VK_IMAGE_ASPECT_COLOR_BIT,
*ip,
VK_IMAGE_LAYOUT_UNDEFINED);
sa->sc_color.Add(tex);
++ip;
}
return(true);
}
bool CreateSwapchainDepthTexture(Swapchain *sa,const DeviceAttribute *dev_attr)
{
const VkFormat depth_format=dev_attr->physical_device->GetDepthFormat();
const VkFormatProperties props=dev_attr->physical_device->GetFormatProperties(depth_format);
sa->sc_depth=VK_NAMESPACE::CreateTexture2D( dev_attr->device,dev_attr->physical_device,
depth_format,
sa->extent.width,
sa->extent.height,
VK_IMAGE_ASPECT_DEPTH_BIT,
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
VK_IMAGE_LAYOUT_UNDEFINED,
(props.optimalTilingFeatures&VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)?VK_IMAGE_TILING_OPTIMAL:VK_IMAGE_TILING_LINEAR);
return sa->sc_depth;
}
}//namespace
Swapchain *CreateSwapchain(const DeviceAttribute *attr,const VkExtent2D &acquire_extent)
{
AutoDelete<Swapchain> sc=new Swapchain;
sc->device =attr->device;
sc->extent =SwapchainExtentClamp(attr->surface_caps,acquire_extent);
sc->graphics_queue =attr->graphics_queue;
sc->swap_chain =CreateSwapChain(attr,sc->extent);
if(!sc->swap_chain)
return(nullptr);
if(!CreateSwapchainColorTexture(sc,attr))
return(nullptr);
if(!CreateSwapchainDepthTexture(sc,attr))
return(nullptr);
return sc.Finish();
}
VK_NAMESPACE_END VK_NAMESPACE_END