From c9b50e35c73603113fb21690d908ade8c4cf2fc2 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Thu, 16 Dec 2021 17:27:33 +0800 Subject: [PATCH] append codes that they can output queue family properties of physical device. --- inc/hgl/graph/VKDevice.h | 12 +++ inc/hgl/graph/VKDeviceAttribute.h | 5 +- inc/hgl/graph/VKPhysicalDevice.h | 31 ++++---- .../Vulkan/VKCommandBufferRender.cpp | 4 +- src/SceneGraph/Vulkan/VKDeviceAttribute.cpp | 53 +++++++------ src/SceneGraph/Vulkan/VKDeviceCreater.cpp | 6 +- src/SceneGraph/Vulkan/VKInstance.cpp | 1 - src/SceneGraph/Vulkan/VKPhysicalDevice.cpp | 75 +++++++++++++++++-- 8 files changed, 139 insertions(+), 48 deletions(-) diff --git a/inc/hgl/graph/VKDevice.h b/inc/hgl/graph/VKDevice.h index 73c04d1a..6a118355 100644 --- a/inc/hgl/graph/VKDevice.h +++ b/inc/hgl/graph/VKDevice.h @@ -27,6 +27,18 @@ namespace hgl }//namespace hgl VK_NAMESPACE_BEGIN +/* + * GPU设备创建信息 + */ +struct GPUDeviceCreateInfo +{ + VkPhysicalDeviceType device_type =VK_PHYSICAL_DEVICE_TYPE_MAX_ENUM; + + uint32_t swapchain_image_count =0; + VkSurfaceFormatKHR color_format ={PF_A2BGR10UN,VK_COLOR_SPACE_SRGB_NONLINEAR_KHR}; + VkFormat depth_format =VK_FORMAT_UNDEFINED; +};//struct GPUDeviceCreateInfo + class GPUDevice { GPUDeviceAttribute *attr; diff --git a/inc/hgl/graph/VKDeviceAttribute.h b/inc/hgl/graph/VKDeviceAttribute.h index c5eea50d..669d7f65 100644 --- a/inc/hgl/graph/VKDeviceAttribute.h +++ b/inc/hgl/graph/VKDeviceAttribute.h @@ -59,8 +59,9 @@ public: private: - void RefreshSurface(); - void RefreshQueueFamily(); + void GetSurfaceFormatList(); + void GetSurfacePresentMode(); + void GetQueueFamily(); public: diff --git a/inc/hgl/graph/VKPhysicalDevice.h b/inc/hgl/graph/VKPhysicalDevice.h index 6159b98d..e6cf9947 100644 --- a/inc/hgl/graph/VKPhysicalDevice.h +++ b/inc/hgl/graph/VKPhysicalDevice.h @@ -15,6 +15,7 @@ class GPUPhysicalDevice VkPhysicalDeviceMemoryProperties memory_properties; List layer_properties; List extension_properties; + List queue_family_properties; public: @@ -48,20 +49,6 @@ public: const uint32_t GetConstantSize ()const{return properties.limits.maxPushConstantsSize;} - // support != open, so please don't direct use GetFeatures(). - // open any features in CreateDevice()&SetDeviceFeatures() functions. - const bool IsSupportMDI ()const - { - // I found a few device support MDI, but its MaxDrawIndirectCount is 1. - - return (features.multiDrawIndirect&&properties.limits.maxDrawIndirectCount>1); - } - - const uint32_t GetMaxMDICount ()const - { - return properties.limits.maxDrawIndirectCount; - } - public: /** @@ -112,9 +99,23 @@ public: public: const VkBool32 SupportGeometryShader ()const{return features.geometryShader;} - const VkBool32 SupportMultiDrawIndirect ()const{return features.multiDrawIndirect;} const VkBool32 SupportCubeMapArray ()const{return features.imageCubeArray;} + + // support != open, so please don't direct use GetFeatures(). + // open any features in CreateDevice()&SetDeviceFeatures() functions. + const bool SupportMDI ()const + { + // I found a few device support MDI, but its MaxDrawIndirectCount is 1. + + return (features.multiDrawIndirect&&properties.limits.maxDrawIndirectCount>1); + } + + const uint32_t GetMaxMDICount ()const + { + return properties.limits.maxDrawIndirectCount; + } + const uint32_t GetMaxImage1D ()const{return properties.limits.maxImageDimension1D;} const uint32_t GetMaxImage2D ()const{return properties.limits.maxImageDimension2D;} const uint32_t GetMaxImage3D ()const{return properties.limits.maxImageDimension3D;} diff --git a/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp b/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp index af6f6703..e26e2350 100644 --- a/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp +++ b/src/SceneGraph/Vulkan/VKCommandBufferRender.cpp @@ -170,7 +170,7 @@ void RenderCmdBuffer::DrawIndirect( VkBuffer buffer, uint32_t drawCount, uint32_t stride) { - if(this->dev_attr->physical_device->IsSupportMDI()) + if(this->dev_attr->physical_device->SupportMDI()) vkCmdDrawIndirect(cmd_buf,buffer,offset,drawCount,stride); else for(uint32_t i=0;idev_attr->physical_device->IsSupportMDI()) + if(this->dev_attr->physical_device->SupportMDI()) vkCmdDrawIndexedIndirect(cmd_buf,buffer,offset,drawCount,stride); else for(uint32_t i=0;i VK_NAMESPACE_BEGIN +namespace +{ + void debug_queue_family_properties_out(const char *front,const List &qfp_list) + { + constexpr char *queue_bit_name[]= + { + "Graphics", + "Compute", + "Transfer", + "SparseBinding", + "Protected", + "VideoDecode", + "VideoEncode" + }; + + const int count=qfp_list.GetCount(); + + if(count<=0)return; + + const VkQueueFamilyProperties *p=qfp_list.GetData(); + + for(int i=0;iqueueCount + <<", timestampValidBits: "<timestampValidBits + <<", minImageTransferGranularity [" <minImageTransferGranularity.width<<"," + <minImageTransferGranularity.height<<"," + <minImageTransferGranularity.depth<<"], queueFlags["; + + uint32_t bits=p->queueFlags; + + for(uint i=0;i<7;i++) + { + if(bits&1) + { + std::cout<>=1; + if(bits>0)std::cout<<","; + } + else + { + bits>>=1; + } + } + + std::cout<<"]"<