2020-10-21 11:43:18 +08:00
|
|
|
|
#include<hgl/graph/VKDeviceAttribute.h>
|
|
|
|
|
#include<hgl/graph/VKPhysicalDevice.h>
|
|
|
|
|
#include<hgl/graph/VKImageView.h>
|
|
|
|
|
#include<hgl/graph/VKTexture.h>
|
2019-04-13 15:34:34 +08:00
|
|
|
|
#include<iostream>
|
2019-04-11 02:29:21 +08:00
|
|
|
|
|
|
|
|
|
VK_NAMESPACE_BEGIN
|
2020-11-05 14:02:35 +08:00
|
|
|
|
void SavePipelineCacheData(VkDevice device,VkPipelineCache cache,const VkPhysicalDeviceProperties &pdp);
|
|
|
|
|
|
2021-09-23 22:13:57 +08:00
|
|
|
|
GPUDeviceAttribute::GPUDeviceAttribute(VulkanInstance *inst,const GPUPhysicalDevice *pd,VkSurfaceKHR s)
|
2019-04-11 02:29:21 +08:00
|
|
|
|
{
|
|
|
|
|
instance=inst;
|
|
|
|
|
physical_device=pd;
|
|
|
|
|
surface=s;
|
|
|
|
|
|
2021-12-15 19:54:07 +08:00
|
|
|
|
RefreshSurfaceCaps();
|
2021-12-16 17:27:33 +08:00
|
|
|
|
GetSurfaceFormatList();
|
|
|
|
|
GetSurfacePresentMode();
|
|
|
|
|
GetQueueFamily();
|
2019-06-13 15:23:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-10-21 12:39:22 +08:00
|
|
|
|
GPUDeviceAttribute::~GPUDeviceAttribute()
|
2019-06-13 15:23:16 +08:00
|
|
|
|
{
|
|
|
|
|
if(pipeline_cache)
|
2020-11-05 14:02:35 +08:00
|
|
|
|
{
|
|
|
|
|
SavePipelineCacheData(device,pipeline_cache,physical_device->GetProperties());
|
2019-06-13 15:23:16 +08:00
|
|
|
|
vkDestroyPipelineCache(device,pipeline_cache,nullptr);
|
2020-11-05 14:02:35 +08:00
|
|
|
|
}
|
2019-06-13 15:23:16 +08:00
|
|
|
|
|
|
|
|
|
if(desc_pool)
|
|
|
|
|
vkDestroyDescriptorPool(device,desc_pool,nullptr);
|
|
|
|
|
|
|
|
|
|
if(cmd_pool)
|
|
|
|
|
vkDestroyCommandPool(device,cmd_pool,nullptr);
|
|
|
|
|
|
|
|
|
|
if(device)
|
|
|
|
|
vkDestroyDevice(device,nullptr);
|
|
|
|
|
|
|
|
|
|
if(surface)
|
2021-09-23 22:13:57 +08:00
|
|
|
|
instance->DestroySurface(surface);
|
2019-06-13 15:23:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-10-21 12:39:22 +08:00
|
|
|
|
bool GPUDeviceAttribute::CheckMemoryType(uint32_t typeBits,VkMemoryPropertyFlags properties,uint32_t *typeIndex) const
|
2019-06-13 15:23:16 +08:00
|
|
|
|
{
|
2019-06-25 22:26:09 +08:00
|
|
|
|
return physical_device->CheckMemoryType(typeBits,properties,typeIndex);
|
2019-06-13 15:23:16 +08:00
|
|
|
|
}
|
2019-04-13 15:34:34 +08:00
|
|
|
|
|
2021-12-15 19:54:07 +08:00
|
|
|
|
void GPUDeviceAttribute::RefreshSurfaceCaps()
|
2019-06-13 15:23:16 +08:00
|
|
|
|
{
|
|
|
|
|
VkPhysicalDevice pdevice = *physical_device;
|
|
|
|
|
|
|
|
|
|
vkGetPhysicalDeviceSurfaceCapabilitiesKHR(pdevice, surface, &surface_caps);
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
if (surface_caps.supportedTransforms & VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR)
|
|
|
|
|
preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
|
2019-04-11 20:24:09 +08:00
|
|
|
|
else
|
2019-06-13 15:23:16 +08:00
|
|
|
|
preTransform = surface_caps.currentTransform;
|
2019-04-11 20:24:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
2021-12-16 17:27:33 +08:00
|
|
|
|
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
|
|
|
|
|
};
|
2019-04-11 20:24:09 +08:00
|
|
|
|
|
2020-11-05 14:02:35 +08:00
|
|
|
|
for(auto flags:compositeAlphaFlags)
|
|
|
|
|
if (surface_caps.supportedCompositeAlpha & flags)
|
2019-04-11 20:24:09 +08:00
|
|
|
|
{
|
2020-11-05 14:02:35 +08:00
|
|
|
|
compositeAlpha = flags;
|
2019-04-11 20:24:09 +08:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-12-16 17:27:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GPUDeviceAttribute::GetSurfaceFormatList()
|
|
|
|
|
{
|
|
|
|
|
VkPhysicalDevice pdevice = *physical_device;
|
2019-04-11 20:24:09 +08:00
|
|
|
|
|
2019-04-11 02:29:21 +08:00
|
|
|
|
{
|
|
|
|
|
uint32_t format_count;
|
2021-09-23 15:19:09 +08:00
|
|
|
|
|
2021-09-24 00:53:27 +08:00
|
|
|
|
surface_format.format = PF_A2BGR10UN;
|
2021-09-23 15:19:09 +08:00
|
|
|
|
surface_format.colorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
|
|
|
|
|
|
2021-09-23 19:09:03 +08:00
|
|
|
|
if (vkGetPhysicalDeviceSurfaceFormatsKHR(pdevice, surface, &format_count, nullptr) == VK_SUCCESS)
|
|
|
|
|
{
|
|
|
|
|
surface_formats_list.SetCount(format_count);
|
|
|
|
|
|
|
|
|
|
if (vkGetPhysicalDeviceSurfaceFormatsKHR(pdevice, surface, &format_count, surface_formats_list.GetData()) != VK_SUCCESS)
|
|
|
|
|
{
|
|
|
|
|
surface_formats_list.Clear();
|
|
|
|
|
}
|
|
|
|
|
//else
|
|
|
|
|
//{
|
|
|
|
|
// VkSurfaceFormatKHR *sf = surface_formats_list.GetData();
|
|
|
|
|
|
|
|
|
|
// if (format_count == 1 && sf->format == VK_FORMAT_UNDEFINED)
|
|
|
|
|
// {
|
|
|
|
|
// }
|
|
|
|
|
// else
|
|
|
|
|
// {
|
|
|
|
|
// surface_format.format=VK_FORMAT_UNDEFINED;
|
|
|
|
|
|
|
|
|
|
// for(uint32_t i=0;i<format_count;i++)
|
|
|
|
|
// {
|
|
|
|
|
// if(sf->format>surface_format.format
|
|
|
|
|
// &&sf->colorSpace==VK_COLOR_SPACE_SRGB_NONLINEAR_KHR)
|
|
|
|
|
// surface_format=*sf;
|
|
|
|
|
|
|
|
|
|
// ++sf;
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
//}
|
|
|
|
|
}
|
2019-04-11 02:29:21 +08:00
|
|
|
|
}
|
2021-12-16 17:27:33 +08:00
|
|
|
|
}
|
2019-04-11 02:29:21 +08:00
|
|
|
|
|
2021-12-16 17:27:33 +08:00
|
|
|
|
void GPUDeviceAttribute::GetSurfacePresentMode()
|
|
|
|
|
{
|
|
|
|
|
uint32_t mode_count;
|
|
|
|
|
|
|
|
|
|
VkPhysicalDevice pdevice = *physical_device;
|
|
|
|
|
|
|
|
|
|
if (!vkGetPhysicalDeviceSurfacePresentModesKHR(pdevice, surface, &mode_count, nullptr) == VK_SUCCESS)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
present_modes.SetCount(mode_count);
|
|
|
|
|
|
|
|
|
|
if (vkGetPhysicalDeviceSurfacePresentModesKHR(pdevice, surface, &mode_count, present_modes.GetData()) != VK_SUCCESS)
|
|
|
|
|
present_modes.Clear();
|
2021-12-15 19:54:07 +08:00
|
|
|
|
}
|
2019-04-11 02:29:21 +08:00
|
|
|
|
|
2021-12-16 17:27:33 +08:00
|
|
|
|
void GPUDeviceAttribute::GetQueueFamily()
|
2021-12-15 19:54:07 +08:00
|
|
|
|
{
|
|
|
|
|
VkPhysicalDevice pdevice = *physical_device;
|
|
|
|
|
|
|
|
|
|
uint32_t family_count;
|
|
|
|
|
vkGetPhysicalDeviceQueueFamilyProperties(pdevice, &family_count, nullptr);
|
|
|
|
|
family_properties.SetCount(family_count);
|
|
|
|
|
vkGetPhysicalDeviceQueueFamilyProperties(pdevice, &family_count, family_properties.GetData());
|
2019-04-11 02:29:21 +08:00
|
|
|
|
|
2021-12-15 19:54:07 +08:00
|
|
|
|
{
|
|
|
|
|
supports_present.SetCount(family_count);
|
|
|
|
|
VkBool32 *sp = supports_present.GetData();
|
|
|
|
|
for (uint32_t i = 0; i < family_count; i++)
|
2019-04-11 02:29:21 +08:00
|
|
|
|
{
|
2021-12-15 19:54:07 +08:00
|
|
|
|
vkGetPhysicalDeviceSurfaceSupportKHR(pdevice, i, surface, sp);
|
|
|
|
|
++sp;
|
2019-04-11 20:24:09 +08:00
|
|
|
|
}
|
2021-12-15 19:54:07 +08:00
|
|
|
|
}
|
2019-04-11 02:29:21 +08:00
|
|
|
|
|
2021-12-15 19:54:07 +08:00
|
|
|
|
{
|
|
|
|
|
VkQueueFamilyProperties *fp = family_properties.GetData();
|
|
|
|
|
VkBool32 *sp = supports_present.GetData();
|
|
|
|
|
for (uint32_t i = 0; i < family_count; i++)
|
2019-04-11 20:24:09 +08:00
|
|
|
|
{
|
2021-12-15 19:54:07 +08:00
|
|
|
|
if (fp->queueFlags & VK_QUEUE_GRAPHICS_BIT)
|
2019-04-11 02:29:21 +08:00
|
|
|
|
{
|
2021-12-15 19:54:07 +08:00
|
|
|
|
if (graphics_family == ERROR_FAMILY_INDEX)
|
|
|
|
|
graphics_family = i;
|
|
|
|
|
|
|
|
|
|
if (*sp)
|
2019-04-11 20:24:09 +08:00
|
|
|
|
{
|
2021-12-15 19:54:07 +08:00
|
|
|
|
graphics_family = i;
|
|
|
|
|
present_family = i;
|
|
|
|
|
break;
|
2019-04-11 20:24:09 +08:00
|
|
|
|
}
|
2019-04-11 02:29:21 +08:00
|
|
|
|
}
|
2021-12-15 19:54:07 +08:00
|
|
|
|
|
|
|
|
|
++fp;
|
|
|
|
|
++sp;
|
2019-04-11 20:24:09 +08:00
|
|
|
|
}
|
2021-12-15 19:54:07 +08:00
|
|
|
|
}
|
2019-04-11 02:29:21 +08:00
|
|
|
|
|
2021-12-15 19:54:07 +08:00
|
|
|
|
if (present_family == ERROR_FAMILY_INDEX)
|
|
|
|
|
{
|
|
|
|
|
VkBool32 *sp = supports_present.GetData();
|
|
|
|
|
for (uint32_t i = 0; i < family_count; i++)
|
2019-04-11 20:24:09 +08:00
|
|
|
|
{
|
2021-12-15 19:54:07 +08:00
|
|
|
|
if (*sp)
|
2019-04-11 20:24:09 +08:00
|
|
|
|
{
|
2021-12-15 19:54:07 +08:00
|
|
|
|
present_family = i;
|
|
|
|
|
break;
|
2019-04-11 20:24:09 +08:00
|
|
|
|
}
|
2021-12-15 19:54:07 +08:00
|
|
|
|
++sp;
|
2019-04-11 02:29:21 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
VK_NAMESPACE_END
|