2019-10-28 14:36:21 +00:00
|
|
|
// Copyright(c) 2019, NVIDIA CORPORATION. All rights reserved.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
//
|
|
|
|
// VulkanHpp Samples : PhysicalDeviceProperties
|
|
|
|
// Get properties per physical device.
|
|
|
|
|
|
|
|
#include "../utils/utils.hpp"
|
|
|
|
#include "vulkan/vulkan.hpp"
|
2020-04-12 19:49:12 +00:00
|
|
|
|
2019-10-28 14:36:21 +00:00
|
|
|
#include <iomanip>
|
|
|
|
#include <sstream>
|
|
|
|
#include <vector>
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
static char const * AppName = "PhysicalDeviceProperties";
|
|
|
|
static char const * EngineName = "Vulkan.hpp";
|
2019-10-28 14:36:21 +00:00
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
std::string decodeAPIVersion( uint32_t apiVersion )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
return std::to_string( VK_VERSION_MAJOR( apiVersion ) ) + "." + std::to_string( VK_VERSION_MINOR( apiVersion ) ) +
|
|
|
|
"." + std::to_string( VK_VERSION_PATCH( apiVersion ) );
|
2019-10-28 14:36:21 +00:00
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
std::string decodeDriverVersion( uint32_t driverVersion, uint32_t vendorID )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
switch ( vendorID )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
|
|
|
case 4318:
|
2020-04-12 19:49:12 +00:00
|
|
|
return std::to_string( ( driverVersion >> 22 ) & 0x3FF ) + "." +
|
|
|
|
std::to_string( ( driverVersion >> 14 ) & 0xFF ) + "." + std::to_string( ( driverVersion >> 6 ) & 0xFF ) +
|
|
|
|
"." + std::to_string( driverVersion & 0x3F );
|
2019-10-28 14:36:21 +00:00
|
|
|
case 0x8086:
|
2020-04-12 19:49:12 +00:00
|
|
|
return std::to_string( ( driverVersion >> 14 ) & 0x3FFFF ) + "." + std::to_string( ( driverVersion & 0x3FFF ) );
|
|
|
|
default: return decodeAPIVersion( driverVersion );
|
2019-10-28 14:36:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
std::string decodeVendorID( uint32_t vendorID )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
|
|
|
// below 0x10000 are the PCI vendor IDs (https://pcisig.com/membership/member-companies)
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vendorID < 0x10000 )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
switch ( vendorID )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
case 0x1022: return "Advanced Micro Devices";
|
|
|
|
case 0x10DE: return "NVidia Corporation";
|
|
|
|
case 0x8086: return "Intel Corporation";
|
|
|
|
default: return std::to_string( vendorID );
|
2019-10-28 14:36:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// above 0x10000 should be vkVendorIDs
|
2020-04-12 19:49:12 +00:00
|
|
|
return vk::to_string( vk::VendorId( vendorID ) );
|
2019-10-28 14:36:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace vk
|
|
|
|
{
|
|
|
|
namespace su
|
|
|
|
{
|
|
|
|
struct LUID
|
|
|
|
{
|
|
|
|
public:
|
2020-04-12 19:49:12 +00:00
|
|
|
LUID( uint8_t const data[VK_LUID_SIZE] )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
memcpy( m_data, data, VK_LUID_SIZE * sizeof( uint8_t ) );
|
2019-10-28 14:36:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
uint8_t m_data[VK_LUID_SIZE];
|
|
|
|
};
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
std::ostream & operator<<( std::ostream & os, LUID const & uuid )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
os << std::setfill( '0' ) << std::hex;
|
|
|
|
for ( int j = 0; j < VK_LUID_SIZE; ++j )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
os << std::setw( 2 ) << static_cast<uint32_t>( uuid.m_data[j] );
|
|
|
|
if ( j == 3 || j == 5 )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
|
|
|
std::cout << '-';
|
|
|
|
}
|
|
|
|
}
|
2020-04-12 19:49:12 +00:00
|
|
|
os << std::setfill( ' ' ) << std::dec;
|
2019-10-28 14:36:21 +00:00
|
|
|
return os;
|
|
|
|
}
|
2020-04-12 19:49:12 +00:00
|
|
|
} // namespace su
|
|
|
|
} // namespace vk
|
2019-10-28 14:36:21 +00:00
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
int main( int /*argc*/, char ** /*argv*/ )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::UniqueInstance instance = vk::su::createInstance( AppName, EngineName );
|
|
|
|
#if !defined( NDEBUG )
|
|
|
|
vk::UniqueDebugUtilsMessengerEXT debugUtilsMessenger = vk::su::createDebugUtilsMessenger( instance );
|
2019-10-28 14:36:21 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
// enumerate the physicalDevices
|
|
|
|
std::vector<vk::PhysicalDevice> physicalDevices = instance->enumeratePhysicalDevices();
|
|
|
|
|
|
|
|
/* VULKAN_KEY_START */
|
|
|
|
|
|
|
|
std::cout << std::boolalpha;
|
2020-04-12 19:49:12 +00:00
|
|
|
for ( size_t i = 0; i < physicalDevices.size(); i++ )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
|
|
|
// some properties are only valid, if a corresponding extension is available!
|
2020-04-12 19:49:12 +00:00
|
|
|
std::vector<vk::ExtensionProperties> extensionProperties =
|
|
|
|
physicalDevices[i].enumerateDeviceExtensionProperties();
|
2019-10-28 14:36:21 +00:00
|
|
|
|
|
|
|
std::cout << "PhysicalDevice " << i << "\n";
|
2020-04-12 19:49:12 +00:00
|
|
|
auto properties2 = physicalDevices[i]
|
|
|
|
.getProperties2<vk::PhysicalDeviceProperties2,
|
|
|
|
vk::PhysicalDeviceBlendOperationAdvancedPropertiesEXT,
|
|
|
|
vk::PhysicalDeviceConservativeRasterizationPropertiesEXT,
|
|
|
|
vk::PhysicalDeviceCooperativeMatrixPropertiesNV,
|
|
|
|
vk::PhysicalDeviceDepthStencilResolvePropertiesKHR,
|
|
|
|
vk::PhysicalDeviceDescriptorIndexingPropertiesEXT,
|
|
|
|
vk::PhysicalDeviceDiscardRectanglePropertiesEXT,
|
|
|
|
vk::PhysicalDeviceDriverPropertiesKHR,
|
|
|
|
vk::PhysicalDeviceExternalMemoryHostPropertiesEXT,
|
|
|
|
vk::PhysicalDeviceFloatControlsPropertiesKHR,
|
|
|
|
vk::PhysicalDeviceFragmentDensityMapPropertiesEXT,
|
|
|
|
vk::PhysicalDeviceIDProperties,
|
|
|
|
vk::PhysicalDeviceInlineUniformBlockPropertiesEXT,
|
|
|
|
vk::PhysicalDeviceLineRasterizationPropertiesEXT,
|
|
|
|
vk::PhysicalDeviceMaintenance3Properties,
|
|
|
|
vk::PhysicalDeviceMeshShaderPropertiesNV,
|
|
|
|
vk::PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX,
|
|
|
|
vk::PhysicalDeviceMultiviewProperties,
|
|
|
|
vk::PhysicalDevicePCIBusInfoPropertiesEXT,
|
|
|
|
vk::PhysicalDevicePointClippingProperties,
|
|
|
|
vk::PhysicalDeviceProtectedMemoryProperties,
|
|
|
|
vk::PhysicalDevicePushDescriptorPropertiesKHR,
|
|
|
|
vk::PhysicalDeviceRayTracingPropertiesNV,
|
|
|
|
vk::PhysicalDeviceSampleLocationsPropertiesEXT,
|
|
|
|
vk::PhysicalDeviceSamplerFilterMinmaxPropertiesEXT,
|
|
|
|
vk::PhysicalDeviceShaderCoreProperties2AMD,
|
|
|
|
vk::PhysicalDeviceShaderCorePropertiesAMD,
|
|
|
|
vk::PhysicalDeviceShaderSMBuiltinsPropertiesNV,
|
|
|
|
vk::PhysicalDeviceShadingRateImagePropertiesNV,
|
|
|
|
vk::PhysicalDeviceSubgroupProperties,
|
|
|
|
vk::PhysicalDeviceSubgroupSizeControlPropertiesEXT,
|
|
|
|
vk::PhysicalDeviceTimelineSemaphorePropertiesKHR,
|
|
|
|
vk::PhysicalDeviceTexelBufferAlignmentPropertiesEXT,
|
|
|
|
vk::PhysicalDeviceTransformFeedbackPropertiesEXT,
|
|
|
|
vk::PhysicalDeviceVertexAttributeDivisorPropertiesEXT>();
|
|
|
|
vk::PhysicalDeviceProperties const & properties = properties2.get<vk::PhysicalDeviceProperties2>().properties;
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "Properties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "apiVersion = " << decodeAPIVersion( properties.apiVersion ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "driverVersion = " << decodeDriverVersion( properties.driverVersion, properties.vendorID )
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "vendorID = " << decodeVendorID( properties.vendorID ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "deviceID = " << properties.deviceID << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "deviceType = " << vk::to_string( properties.deviceType ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "deviceName = " << properties.deviceName << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "pipelineCacheUUID = " << vk::su::UUID( properties.pipelineCacheUUID ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "limits:\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "bufferImageGranularity = " << properties.limits.bufferImageGranularity
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "discreteQueuePriorities = " << properties.limits.discreteQueuePriorities
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "framebufferColorSampleCounts = "
|
|
|
|
<< vk::to_string( properties.limits.framebufferColorSampleCounts ) << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "framebufferDepthSampleCounts = "
|
|
|
|
<< vk::to_string( properties.limits.framebufferDepthSampleCounts ) << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "framebufferNoAttachmentsSampleCounts = "
|
|
|
|
<< vk::to_string( properties.limits.framebufferNoAttachmentsSampleCounts ) << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "framebufferStencilSampleCounts = "
|
|
|
|
<< vk::to_string( properties.limits.framebufferStencilSampleCounts ) << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "lineWidthGranularity = " << properties.limits.lineWidthGranularity
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "lineWidthRange = "
|
|
|
|
<< "[" << properties.limits.lineWidthRange[0] << ", " << properties.limits.lineWidthRange[1] << "]"
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxBoundDescriptorSets = " << properties.limits.maxBoundDescriptorSets
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxClipDistances = " << properties.limits.maxClipDistances << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxColorAttachments = " << properties.limits.maxColorAttachments
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxCombinedClipAndCullDistances = "
|
|
|
|
<< properties.limits.maxCombinedClipAndCullDistances << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxComputeSharedMemorySize = " << properties.limits.maxComputeSharedMemorySize
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxComputeWorkGroupCount = "
|
|
|
|
<< "[" << properties.limits.maxComputeWorkGroupCount[0] << ", "
|
|
|
|
<< properties.limits.maxComputeWorkGroupCount[1] << ", "
|
|
|
|
<< properties.limits.maxComputeWorkGroupCount[2] << "]"
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxComputeWorkGroupInvocations = "
|
|
|
|
<< properties.limits.maxComputeWorkGroupInvocations << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxComputeWorkGroupSize = "
|
|
|
|
<< "[" << properties.limits.maxComputeWorkGroupSize[0] << ", "
|
|
|
|
<< properties.limits.maxComputeWorkGroupSize[1] << ", " << properties.limits.maxComputeWorkGroupSize[2]
|
|
|
|
<< "]"
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxCullDistances = " << properties.limits.maxCullDistances << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxDescriptorSetInputAttachments = "
|
|
|
|
<< properties.limits.maxDescriptorSetInputAttachments << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxDescriptorSetSampledImages = "
|
|
|
|
<< properties.limits.maxDescriptorSetSampledImages << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxDescriptorSetSamplers = " << properties.limits.maxDescriptorSetSamplers
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxDescriptorSetStorageBuffers = "
|
|
|
|
<< properties.limits.maxDescriptorSetStorageBuffers << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxDescriptorSetStorageBuffersDynamic = "
|
|
|
|
<< properties.limits.maxDescriptorSetStorageBuffersDynamic << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxDescriptorSetStorageImages = "
|
|
|
|
<< properties.limits.maxDescriptorSetStorageImages << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxDescriptorSetUniformBuffers = "
|
|
|
|
<< properties.limits.maxDescriptorSetUniformBuffers << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxDescriptorSetUniformBuffersDynamic = "
|
|
|
|
<< properties.limits.maxDescriptorSetUniformBuffersDynamic << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxDrawIndexedIndexValue = " << properties.limits.maxDrawIndexedIndexValue
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxDrawIndirectCount = " << properties.limits.maxDrawIndirectCount
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxFragmentCombinedOutputResources = "
|
|
|
|
<< properties.limits.maxFragmentCombinedOutputResources << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxFragmentDualSrcAttachments = "
|
|
|
|
<< properties.limits.maxFragmentDualSrcAttachments << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxFragmentInputComponents = " << properties.limits.maxFragmentInputComponents
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxFragmentOutputAttachments = "
|
|
|
|
<< properties.limits.maxFragmentOutputAttachments << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxFramebufferHeight = " << properties.limits.maxFramebufferHeight
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxFramebufferLayers = " << properties.limits.maxFramebufferLayers
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxFramebufferWidth = " << properties.limits.maxFramebufferWidth
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxGeometryInputComponents = " << properties.limits.maxGeometryInputComponents
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxGeometryOutputComponents = " << properties.limits.maxGeometryOutputComponents
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxGeometryOutputVertices = " << properties.limits.maxGeometryOutputVertices
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxGeometryShaderInvocations = "
|
|
|
|
<< properties.limits.maxGeometryShaderInvocations << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxGeometryTotalOutputComponents = "
|
|
|
|
<< properties.limits.maxGeometryTotalOutputComponents << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxImageArrayLayers = " << properties.limits.maxImageArrayLayers
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxImageDimension1D = " << properties.limits.maxImageDimension1D
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxImageDimension2D = " << properties.limits.maxImageDimension2D
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxImageDimension3D = " << properties.limits.maxImageDimension3D
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxImageDimensionCube = " << properties.limits.maxImageDimensionCube
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxInterpolationOffset = " << properties.limits.maxInterpolationOffset
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxMemoryAllocationCount = " << properties.limits.maxMemoryAllocationCount
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxPerStageDescriptorInputAttachments = "
|
|
|
|
<< properties.limits.maxPerStageDescriptorInputAttachments << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxPerStageDescriptorSampledImages = "
|
|
|
|
<< properties.limits.maxPerStageDescriptorSampledImages << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxPerStageDescriptorSamplers = "
|
|
|
|
<< properties.limits.maxPerStageDescriptorSamplers << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxPerStageDescriptorStorageBuffers = "
|
|
|
|
<< properties.limits.maxPerStageDescriptorStorageBuffers << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxPerStageDescriptorStorageImages = "
|
|
|
|
<< properties.limits.maxPerStageDescriptorStorageImages << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxPerStageDescriptorUniformBuffers = "
|
|
|
|
<< properties.limits.maxPerStageDescriptorUniformBuffers << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxPerStageResources = " << properties.limits.maxPerStageResources
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxPushConstantsSize = " << properties.limits.maxPushConstantsSize
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxSampleMaskWords = " << properties.limits.maxSampleMaskWords << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxSamplerAllocationCount = " << properties.limits.maxSamplerAllocationCount
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxSamplerAnisotropy = " << properties.limits.maxSamplerAnisotropy
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxSamplerLodBias = " << properties.limits.maxSamplerLodBias << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxStorageBufferRange = " << properties.limits.maxStorageBufferRange
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxTessellationControlPerPatchOutputComponents = "
|
|
|
|
<< properties.limits.maxTessellationControlPerPatchOutputComponents << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxTessellationControlPerVertexInputComponents = "
|
|
|
|
<< properties.limits.maxTessellationControlPerVertexInputComponents << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxTessellationControlPerVertexOutputComponents = "
|
|
|
|
<< properties.limits.maxTessellationControlPerVertexOutputComponents << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxTessellationControlTotalOutputComponents = "
|
|
|
|
<< properties.limits.maxTessellationControlTotalOutputComponents << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxTessellationEvaluationInputComponents = "
|
|
|
|
<< properties.limits.maxTessellationEvaluationInputComponents << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxTessellationEvaluationOutputComponents = "
|
|
|
|
<< properties.limits.maxTessellationEvaluationOutputComponents << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxTessellationGenerationLevel = "
|
|
|
|
<< properties.limits.maxTessellationGenerationLevel << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxTessellationPatchSize = " << properties.limits.maxTessellationPatchSize
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxTexelBufferElements = " << properties.limits.maxTexelBufferElements
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxTexelGatherOffset = " << properties.limits.maxTexelGatherOffset
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxTexelOffset = " << properties.limits.maxTexelOffset << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxUniformBufferRange = " << properties.limits.maxUniformBufferRange
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxVertexInputAttributeOffset = "
|
|
|
|
<< properties.limits.maxVertexInputAttributeOffset << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxVertexInputAttributes = " << properties.limits.maxVertexInputAttributes
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxVertexInputBindings = " << properties.limits.maxVertexInputBindings
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxVertexInputBindingStride = " << properties.limits.maxVertexInputBindingStride
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxVertexOutputComponents = " << properties.limits.maxVertexOutputComponents
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxViewportDimensions = "
|
|
|
|
<< "[" << properties.limits.maxViewportDimensions[0] << ", "
|
|
|
|
<< properties.limits.maxViewportDimensions[1] << "]"
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "maxViewports = " << properties.limits.maxViewports << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "minInterpolationOffset = " << properties.limits.minInterpolationOffset
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "minMemoryMapAlignment = " << properties.limits.minMemoryMapAlignment
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "minStorageBufferOffsetAlignment = "
|
|
|
|
<< properties.limits.minStorageBufferOffsetAlignment << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "minTexelBufferOffsetAlignment = "
|
|
|
|
<< properties.limits.minTexelBufferOffsetAlignment << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "minTexelGatherOffset = " << properties.limits.minTexelGatherOffset
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "minTexelOffset = " << properties.limits.minTexelOffset << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "minUniformBufferOffsetAlignment = "
|
|
|
|
<< properties.limits.minUniformBufferOffsetAlignment << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "mipmapPrecisionBits = " << properties.limits.mipmapPrecisionBits
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "nonCoherentAtomSize = " << properties.limits.nonCoherentAtomSize
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "optimalBufferCopyOffsetAlignment = "
|
|
|
|
<< properties.limits.optimalBufferCopyOffsetAlignment << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "optimalBufferCopyRowPitchAlignment = "
|
|
|
|
<< properties.limits.optimalBufferCopyRowPitchAlignment << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "pointSizeGranularity = " << properties.limits.pointSizeGranularity
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "pointSizeRange = "
|
|
|
|
<< "[" << properties.limits.pointSizeRange[0] << ", " << properties.limits.pointSizeRange[1] << "]"
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "sampledImageColorSampleCounts = "
|
|
|
|
<< vk::to_string( properties.limits.sampledImageColorSampleCounts ) << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "sampledImageDepthSampleCounts = "
|
|
|
|
<< vk::to_string( properties.limits.sampledImageDepthSampleCounts ) << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "sampledImageIntegerSampleCounts = "
|
|
|
|
<< vk::to_string( properties.limits.sampledImageIntegerSampleCounts ) << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "sampledImageStencilSampleCounts = "
|
|
|
|
<< vk::to_string( properties.limits.sampledImageStencilSampleCounts ) << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "sparseAddressSpaceSize = " << properties.limits.sparseAddressSpaceSize
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "standardSampleLocations = "
|
|
|
|
<< static_cast<bool>( properties.limits.standardSampleLocations ) << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "storageImageSampleCounts = "
|
|
|
|
<< vk::to_string( properties.limits.storageImageSampleCounts ) << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "strictLines = "
|
|
|
|
<< static_cast<bool>( properties.limits.strictLines ) << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "subPixelInterpolationOffsetBits = "
|
|
|
|
<< properties.limits.subPixelInterpolationOffsetBits << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "subPixelPrecisionBits = " << properties.limits.subPixelPrecisionBits
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "subTexelPrecisionBits = " << properties.limits.subTexelPrecisionBits
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "timestampComputeAndGraphics = "
|
|
|
|
<< static_cast<bool>( properties.limits.timestampComputeAndGraphics ) << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "timestampPeriod = " << properties.limits.timestampPeriod << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "viewportBoundsRange = "
|
|
|
|
<< "[" << properties.limits.viewportBoundsRange[0] << ", " << properties.limits.viewportBoundsRange[1]
|
|
|
|
<< "]"
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "viewportSubPixelBits = " << properties.limits.viewportSubPixelBits
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "sparseProperties:\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "residencyAlignedMipSize = "
|
|
|
|
<< static_cast<bool>( properties.sparseProperties.residencyAlignedMipSize ) << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "residencyNonResidentStrict = "
|
|
|
|
<< static_cast<bool>( properties.sparseProperties.residencyNonResidentStrict ) << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "residencyStandard2DBlockShape = "
|
|
|
|
<< static_cast<bool>( properties.sparseProperties.residencyStandard2DBlockShape ) << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "residencyStandard2DMultisampleBlockShape = "
|
|
|
|
<< static_cast<bool>( properties.sparseProperties.residencyStandard2DMultisampleBlockShape ) << "\n";
|
|
|
|
std::cout << "\t\t\t"
|
|
|
|
<< "residencyStandard3DBlockShape = "
|
|
|
|
<< static_cast<bool>( properties.sparseProperties.residencyStandard3DBlockShape ) << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_EXT_blend_operation_advanced" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceBlendOperationAdvancedPropertiesEXT const & blendOperationAdvancedProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceBlendOperationAdvancedPropertiesEXT>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "BlendOperationAdvancedProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "advancedBlendAllOperations = "
|
|
|
|
<< static_cast<bool>( blendOperationAdvancedProperties.advancedBlendAllOperations ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "advancedBlendCorrelatedOverlap = "
|
|
|
|
<< static_cast<bool>( blendOperationAdvancedProperties.advancedBlendCorrelatedOverlap ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "advancedBlendIndependentBlend = "
|
|
|
|
<< static_cast<bool>( blendOperationAdvancedProperties.advancedBlendIndependentBlend ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "advancedBlendMaxColorAttachments = "
|
|
|
|
<< blendOperationAdvancedProperties.advancedBlendMaxColorAttachments << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "advancedBlendNonPremultipliedDstColor = "
|
|
|
|
<< static_cast<bool>( blendOperationAdvancedProperties.advancedBlendNonPremultipliedDstColor )
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "advancedBlendNonPremultipliedSrcColor = "
|
|
|
|
<< static_cast<bool>( blendOperationAdvancedProperties.advancedBlendNonPremultipliedSrcColor )
|
|
|
|
<< "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_EXT_conservative_rasterization" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceConservativeRasterizationPropertiesEXT const & conservativeRasterizationProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceConservativeRasterizationPropertiesEXT>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "ConservativeRasterizationProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "conservativePointAndLineRasterization = "
|
|
|
|
<< static_cast<bool>( conservativeRasterizationProperties.conservativePointAndLineRasterization )
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "conservativeRasterizationPostDepthCoverage = "
|
|
|
|
<< static_cast<bool>( conservativeRasterizationProperties.conservativeRasterizationPostDepthCoverage )
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "degenerateLinesRasterized = "
|
|
|
|
<< static_cast<bool>( conservativeRasterizationProperties.degenerateLinesRasterized ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "degenerateTrianglesRasterized = "
|
|
|
|
<< static_cast<bool>( conservativeRasterizationProperties.degenerateTrianglesRasterized ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "extraPrimitiveOverestimationSizeGranularity = "
|
|
|
|
<< conservativeRasterizationProperties.extraPrimitiveOverestimationSizeGranularity << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "fullyCoveredFragmentShaderInputVariable = "
|
|
|
|
<< static_cast<bool>( conservativeRasterizationProperties.fullyCoveredFragmentShaderInputVariable )
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxExtraPrimitiveOverestimationSize = "
|
|
|
|
<< conservativeRasterizationProperties.maxExtraPrimitiveOverestimationSize << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "primitiveOverestimationSize = "
|
|
|
|
<< conservativeRasterizationProperties.primitiveOverestimationSize << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "primitiveUnderestimation = "
|
|
|
|
<< static_cast<bool>( conservativeRasterizationProperties.primitiveUnderestimation ) << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_NV_cooperative_matrix" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceCooperativeMatrixPropertiesNV const & cooperativeMatrixProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceCooperativeMatrixPropertiesNV>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "CooperativeMatrixProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "cooperativeMatrixSupportedStages = "
|
|
|
|
<< vk::to_string( cooperativeMatrixProperties.cooperativeMatrixSupportedStages ) << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_KHR_depth_stencil_resolve" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceDepthStencilResolvePropertiesKHR const & depthStencilResolveProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceDepthStencilResolvePropertiesKHR>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "DepthStencilResolveProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "independentResolve = "
|
|
|
|
<< static_cast<bool>( depthStencilResolveProperties.independentResolve ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "independentResolveNone = "
|
|
|
|
<< static_cast<bool>( depthStencilResolveProperties.independentResolveNone ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "supportedDepthResolveModes = "
|
|
|
|
<< vk::to_string( depthStencilResolveProperties.supportedDepthResolveModes ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "supportedStencilResolveModes = "
|
|
|
|
<< vk::to_string( depthStencilResolveProperties.supportedStencilResolveModes ) << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_EXT_descriptor_indexing" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceDescriptorIndexingPropertiesEXT const & descriptorIndexingProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceDescriptorIndexingPropertiesEXT>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "DescriptorIndexingProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxDescriptorSetUpdateAfterBindInputAttachments = "
|
|
|
|
<< descriptorIndexingProperties.maxDescriptorSetUpdateAfterBindInputAttachments << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxDescriptorSetUpdateAfterBindSampledImages = "
|
|
|
|
<< descriptorIndexingProperties.maxDescriptorSetUpdateAfterBindSampledImages << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxDescriptorSetUpdateAfterBindSamplers = "
|
|
|
|
<< descriptorIndexingProperties.maxDescriptorSetUpdateAfterBindSamplers << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxDescriptorSetUpdateAfterBindStorageBuffers = "
|
|
|
|
<< descriptorIndexingProperties.maxDescriptorSetUpdateAfterBindStorageBuffers << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = "
|
|
|
|
<< descriptorIndexingProperties.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxDescriptorSetUpdateAfterBindStorageImages = "
|
|
|
|
<< descriptorIndexingProperties.maxDescriptorSetUpdateAfterBindStorageImages << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxDescriptorSetUpdateAfterBindUniformBuffers = "
|
|
|
|
<< descriptorIndexingProperties.maxDescriptorSetUpdateAfterBindUniformBuffers << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = "
|
|
|
|
<< descriptorIndexingProperties.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxPerStageDescriptorUpdateAfterBindInputAttachments = "
|
|
|
|
<< descriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindInputAttachments << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxPerStageDescriptorUpdateAfterBindSampledImages = "
|
|
|
|
<< descriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindSampledImages << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxPerStageDescriptorUpdateAfterBindSamplers = "
|
|
|
|
<< descriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindSamplers << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxPerStageDescriptorUpdateAfterBindStorageBuffers = "
|
|
|
|
<< descriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindStorageBuffers << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxPerStageDescriptorUpdateAfterBindStorageImages = "
|
|
|
|
<< descriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindStorageImages << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxPerStageDescriptorUpdateAfterBindUniformBuffers = "
|
|
|
|
<< descriptorIndexingProperties.maxPerStageDescriptorUpdateAfterBindUniformBuffers << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxPerStageUpdateAfterBindResources = "
|
|
|
|
<< descriptorIndexingProperties.maxPerStageUpdateAfterBindResources << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxUpdateAfterBindDescriptorsInAllPools = "
|
|
|
|
<< descriptorIndexingProperties.maxUpdateAfterBindDescriptorsInAllPools << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "quadDivergentImplicitLod = "
|
|
|
|
<< static_cast<bool>( descriptorIndexingProperties.quadDivergentImplicitLod ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "robustBufferAccessUpdateAfterBind = "
|
|
|
|
<< static_cast<bool>( descriptorIndexingProperties.robustBufferAccessUpdateAfterBind ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderInputAttachmentArrayNonUniformIndexingNative = "
|
|
|
|
<< static_cast<bool>(
|
|
|
|
descriptorIndexingProperties.shaderInputAttachmentArrayNonUniformIndexingNative )
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderSampledImageArrayNonUniformIndexingNative = "
|
|
|
|
<< static_cast<bool>( descriptorIndexingProperties.shaderSampledImageArrayNonUniformIndexingNative )
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderStorageBufferArrayNonUniformIndexingNative = "
|
|
|
|
<< static_cast<bool>( descriptorIndexingProperties.shaderStorageBufferArrayNonUniformIndexingNative )
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderStorageImageArrayNonUniformIndexingNative = "
|
|
|
|
<< static_cast<bool>( descriptorIndexingProperties.shaderStorageImageArrayNonUniformIndexingNative )
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderUniformBufferArrayNonUniformIndexingNative = "
|
|
|
|
<< static_cast<bool>( descriptorIndexingProperties.shaderUniformBufferArrayNonUniformIndexingNative )
|
|
|
|
<< "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_EXT_discard_rectangles" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceDiscardRectanglePropertiesEXT const & discardRectangleProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceDiscardRectanglePropertiesEXT>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "DiscardRectangleProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxDiscardRectangles = " << discardRectangleProperties.maxDiscardRectangles << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_KHR_driver_properties" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceDriverPropertiesKHR const & driverProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceDriverPropertiesKHR>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "DriverProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "driverID = " << vk::to_string( driverProperties.driverID ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "driverName = " << driverProperties.driverName << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "driverInfo = " << driverProperties.driverInfo << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "conformanceVersion = " << static_cast<uint32_t>( driverProperties.conformanceVersion.major )
|
|
|
|
<< "." << static_cast<uint32_t>( driverProperties.conformanceVersion.minor ) << "."
|
|
|
|
<< static_cast<uint32_t>( driverProperties.conformanceVersion.subminor ) << "."
|
|
|
|
<< static_cast<uint32_t>( driverProperties.conformanceVersion.patch ) << std::dec << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_EXT_external_memory_host" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceExternalMemoryHostPropertiesEXT const & externalMemoryHostProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceExternalMemoryHostPropertiesEXT>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "ExternalMemoryHostProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "minImportedHostPointerAlignment = "
|
|
|
|
<< externalMemoryHostProperties.minImportedHostPointerAlignment << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_KHR_shader_float_controls" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceFloatControlsPropertiesKHR const & floatControlsProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceFloatControlsPropertiesKHR>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "FloatControlsProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "denormBehaviorIndependence = "
|
|
|
|
<< vk::to_string( floatControlsProperties.denormBehaviorIndependence ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "roundingModeIndependence = "
|
|
|
|
<< vk::to_string( floatControlsProperties.roundingModeIndependence ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderDenormFlushToZeroFloat16 = "
|
|
|
|
<< static_cast<bool>( floatControlsProperties.shaderDenormFlushToZeroFloat16 ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderDenormFlushToZeroFloat32 = "
|
|
|
|
<< static_cast<bool>( floatControlsProperties.shaderDenormFlushToZeroFloat32 ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderDenormFlushToZeroFloat64 = "
|
|
|
|
<< static_cast<bool>( floatControlsProperties.shaderDenormFlushToZeroFloat64 ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderDenormPreserveFloat16 = "
|
|
|
|
<< static_cast<bool>( floatControlsProperties.shaderDenormPreserveFloat16 ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderDenormPreserveFloat32 = "
|
|
|
|
<< static_cast<bool>( floatControlsProperties.shaderDenormPreserveFloat32 ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderDenormPreserveFloat64 = "
|
|
|
|
<< static_cast<bool>( floatControlsProperties.shaderDenormPreserveFloat64 ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderRoundingModeRTEFloat16 = "
|
|
|
|
<< static_cast<bool>( floatControlsProperties.shaderRoundingModeRTEFloat16 ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderRoundingModeRTEFloat32 = "
|
|
|
|
<< static_cast<bool>( floatControlsProperties.shaderRoundingModeRTEFloat32 ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderRoundingModeRTEFloat64 = "
|
|
|
|
<< static_cast<bool>( floatControlsProperties.shaderRoundingModeRTEFloat64 ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderRoundingModeRTZFloat16 = "
|
|
|
|
<< static_cast<bool>( floatControlsProperties.shaderRoundingModeRTZFloat16 ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderRoundingModeRTZFloat32 = "
|
|
|
|
<< static_cast<bool>( floatControlsProperties.shaderRoundingModeRTZFloat32 ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderRoundingModeRTZFloat64 = "
|
|
|
|
<< static_cast<bool>( floatControlsProperties.shaderRoundingModeRTZFloat64 ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderSignedZeroInfNanPreserveFloat16 = "
|
|
|
|
<< static_cast<bool>( floatControlsProperties.shaderSignedZeroInfNanPreserveFloat16 ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderSignedZeroInfNanPreserveFloat32 = "
|
|
|
|
<< static_cast<bool>( floatControlsProperties.shaderSignedZeroInfNanPreserveFloat32 ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderSignedZeroInfNanPreserveFloat64 = "
|
|
|
|
<< static_cast<bool>( floatControlsProperties.shaderSignedZeroInfNanPreserveFloat64 ) << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_EXT_fragment_density_map" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceFragmentDensityMapPropertiesEXT const & fragmentDensityMapProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceFragmentDensityMapPropertiesEXT>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "FragmentDensityProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "fragmentDensityInvocations = "
|
|
|
|
<< static_cast<bool>( fragmentDensityMapProperties.fragmentDensityInvocations ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxFragmentDensityTexelSize = " << fragmentDensityMapProperties.maxFragmentDensityTexelSize.width
|
|
|
|
<< " x " << fragmentDensityMapProperties.maxFragmentDensityTexelSize.height << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "minFragmentDensityTexelSize = " << fragmentDensityMapProperties.minFragmentDensityTexelSize.width
|
|
|
|
<< " x " << fragmentDensityMapProperties.minFragmentDensityTexelSize.height << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceIDProperties const & idProperties = properties2.get<vk::PhysicalDeviceIDProperties>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "IDProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "deviceUUID = " << vk::su::UUID( idProperties.deviceUUID ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "driverUUID = " << vk::su::UUID( idProperties.driverUUID ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "deviceLUID = " << vk::su::LUID( idProperties.deviceLUID ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "deviceNodeMask = " << std::hex << idProperties.deviceNodeMask << std::dec << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "deviceLUIDValid = " << static_cast<bool>( idProperties.deviceLUIDValid ) << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_EXT_inline_uniform_block" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceInlineUniformBlockPropertiesEXT const & inlineUniformBlockProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceInlineUniformBlockPropertiesEXT>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "InlineUniformBlockProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxDescriptorSetInlineUniformBlocks = "
|
|
|
|
<< inlineUniformBlockProperties.maxDescriptorSetInlineUniformBlocks << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxDescriptorSetUpdateAfterBindInlineUniformBlocks = "
|
|
|
|
<< inlineUniformBlockProperties.maxDescriptorSetUpdateAfterBindInlineUniformBlocks << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxInlineUniformBlockSize = "
|
|
|
|
<< inlineUniformBlockProperties.maxInlineUniformBlockSize << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxPerStageDescriptorInlineUniformBlocks = "
|
|
|
|
<< inlineUniformBlockProperties.maxPerStageDescriptorInlineUniformBlocks << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks = "
|
|
|
|
<< inlineUniformBlockProperties.maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_EXT_line_rasterization" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceLineRasterizationPropertiesEXT const & lineRasterizationProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceLineRasterizationPropertiesEXT>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "LineRasterizationProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "lineSubPixelPrecisionBits = " << lineRasterizationProperties.lineSubPixelPrecisionBits << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceMaintenance3Properties const & maintenance3Properties =
|
|
|
|
properties2.get<vk::PhysicalDeviceMaintenance3Properties>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "Maintenance3Properties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxMemoryAllocationSize = " << maintenance3Properties.maxMemoryAllocationSize << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxPerSetDescriptors = " << maintenance3Properties.maxPerSetDescriptors << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_NV_mesh_shader" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceMeshShaderPropertiesNV const & meshShaderProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceMeshShaderPropertiesNV>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "MeshShaderProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxDrawMeshTasksCount = " << meshShaderProperties.maxDrawMeshTasksCount << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxMeshMultiviewViewCount = " << meshShaderProperties.maxMeshMultiviewViewCount << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxMeshOutputPrimitives = " << meshShaderProperties.maxMeshOutputPrimitives << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxMeshOutputVertices = " << meshShaderProperties.maxMeshOutputVertices << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxMeshTotalMemorySize = " << meshShaderProperties.maxMeshTotalMemorySize << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxMeshWorkGroupInvocations = " << meshShaderProperties.maxMeshWorkGroupInvocations << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxMeshWorkGroupSize = "
|
|
|
|
<< "[" << meshShaderProperties.maxMeshWorkGroupSize[0] << ", "
|
|
|
|
<< meshShaderProperties.maxMeshWorkGroupSize[1] << ", "
|
|
|
|
<< meshShaderProperties.maxMeshWorkGroupSize[2] << "]"
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxTaskOutputCount = " << meshShaderProperties.maxTaskOutputCount << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxTaskTotalMemorySize = " << meshShaderProperties.maxTaskTotalMemorySize << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxTaskWorkGroupInvocations = " << meshShaderProperties.maxTaskWorkGroupInvocations << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxTaskWorkGroupSize = "
|
|
|
|
<< "[" << meshShaderProperties.maxTaskWorkGroupSize[0] << ", "
|
|
|
|
<< meshShaderProperties.maxTaskWorkGroupSize[1] << ", "
|
|
|
|
<< meshShaderProperties.maxTaskWorkGroupSize[2] << "]"
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "meshOutputPerPrimitiveGranularity = " << meshShaderProperties.meshOutputPerPrimitiveGranularity
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "meshOutputPerVertexGranularity = " << meshShaderProperties.meshOutputPerVertexGranularity
|
|
|
|
<< "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_NVX_multiview_per_view_attributes" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX const & multiviewPerViewAttributesProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "MultiviewPerViewAttributesProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "perViewPositionAllComponents = "
|
|
|
|
<< static_cast<bool>( multiviewPerViewAttributesProperties.perViewPositionAllComponents ) << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceMultiviewProperties const & multiviewProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceMultiviewProperties>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "MultiviewProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxMultiviewInstanceIndex = " << multiviewProperties.maxMultiviewInstanceIndex << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxMultiviewViewCount = " << multiviewProperties.maxMultiviewViewCount << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_EXT_pci_bus_info" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDevicePCIBusInfoPropertiesEXT const & pciBusInfoProperties =
|
|
|
|
properties2.get<vk::PhysicalDevicePCIBusInfoPropertiesEXT>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "PCIBusInfoProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "pciDomain = " << pciBusInfoProperties.pciDomain << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "pciBus = " << pciBusInfoProperties.pciBus << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "pciDevice = " << pciBusInfoProperties.pciDevice << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "pciFunction = " << pciBusInfoProperties.pciFunction << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_KHR_maintenance2" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDevicePointClippingProperties const & pointClippingProperties =
|
|
|
|
properties2.get<vk::PhysicalDevicePointClippingProperties>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "PointClippingProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "pointClippingBehavior = " << vk::to_string( pointClippingProperties.pointClippingBehavior )
|
|
|
|
<< "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceProtectedMemoryProperties const & protectedMemoryProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceProtectedMemoryProperties>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "ProtectedMemoryProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "protectedNoFault = " << static_cast<bool>( protectedMemoryProperties.protectedNoFault ) << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_KHR_push_descriptor" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDevicePushDescriptorPropertiesKHR const & pushDescriptorProperties =
|
|
|
|
properties2.get<vk::PhysicalDevicePushDescriptorPropertiesKHR>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "PushDescriptorProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxPushDescriptors = " << pushDescriptorProperties.maxPushDescriptors << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_NV_ray_tracing" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceRayTracingPropertiesNV const & rayTracingProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceRayTracingPropertiesNV>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "RayTracingProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxDescriptorSetAccelerationStructures = "
|
|
|
|
<< rayTracingProperties.maxDescriptorSetAccelerationStructures << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxGeometryCount = " << rayTracingProperties.maxGeometryCount << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxInstanceCount = " << rayTracingProperties.maxInstanceCount << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxRecursionDepth = " << rayTracingProperties.maxRecursionDepth << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxShaderGroupStride = " << rayTracingProperties.maxShaderGroupStride << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxTriangleCount = " << rayTracingProperties.maxTriangleCount << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderGroupBaseAlignment = " << rayTracingProperties.shaderGroupBaseAlignment
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderGroupHandleSize = " << rayTracingProperties.shaderGroupHandleSize << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_EXT_sample_locations" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceSampleLocationsPropertiesEXT const & sampleLocationProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceSampleLocationsPropertiesEXT>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "SampleLocationProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxSampleLocationGridSize = " << sampleLocationProperties.maxSampleLocationGridSize.width
|
|
|
|
<< " x " << sampleLocationProperties.maxSampleLocationGridSize.height << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "sampleLocationCoordinateRange = "
|
|
|
|
<< "[" << sampleLocationProperties.sampleLocationCoordinateRange[0] << ", "
|
|
|
|
<< sampleLocationProperties.sampleLocationCoordinateRange[1] << "]"
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "sampleLocationSampleCounts = "
|
|
|
|
<< vk::to_string( sampleLocationProperties.sampleLocationSampleCounts ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "sampleLocationSubPixelBits = " << sampleLocationProperties.sampleLocationSubPixelBits << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "variableSampleLocations = "
|
|
|
|
<< static_cast<bool>( sampleLocationProperties.variableSampleLocations ) << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_EXT_sampler_filter_minmax" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceSamplerFilterMinmaxPropertiesEXT const & samplerFilterMinmaxProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceSamplerFilterMinmaxPropertiesEXT>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "SamplerFilterMinmaxProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "filterMinmaxImageComponentMapping = "
|
|
|
|
<< static_cast<bool>( samplerFilterMinmaxProperties.filterMinmaxImageComponentMapping ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "filterMinmaxSingleComponentFormats = "
|
|
|
|
<< static_cast<bool>( samplerFilterMinmaxProperties.filterMinmaxSingleComponentFormats ) << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_AMD_shader_core_properties2" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceShaderCoreProperties2AMD const & shaderCoreProperties2 =
|
|
|
|
properties2.get<vk::PhysicalDeviceShaderCoreProperties2AMD>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "ShaderCoreProperties2:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "activeComputeUnitCount = " << shaderCoreProperties2.activeComputeUnitCount << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderCoreFeatures = " << vk::to_string( shaderCoreProperties2.shaderCoreFeatures ) << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_AMD_shader_core_properties2" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceShaderCorePropertiesAMD const & shaderCoreProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceShaderCorePropertiesAMD>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "ShaderCoreProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "computeUnitsPerShaderArray = " << shaderCoreProperties.computeUnitsPerShaderArray << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxSgprAllocation = " << shaderCoreProperties.maxSgprAllocation << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxVgprAllocation = " << shaderCoreProperties.maxVgprAllocation << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "minSgprAllocation = " << shaderCoreProperties.minSgprAllocation << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "minVgprAllocation = " << shaderCoreProperties.minVgprAllocation << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "sgprAllocationGranularity = " << shaderCoreProperties.sgprAllocationGranularity << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "sgprsPerSimd = " << shaderCoreProperties.sgprsPerSimd << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderArraysPerEngineCount = " << shaderCoreProperties.shaderArraysPerEngineCount << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderEngineCount = " << shaderCoreProperties.shaderEngineCount << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "simdPerComputeUnit = " << shaderCoreProperties.simdPerComputeUnit << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "vgprAllocationGranularity = " << shaderCoreProperties.vgprAllocationGranularity << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "vgprsPerSimd = " << shaderCoreProperties.vgprsPerSimd << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "wavefrontSize = " << shaderCoreProperties.wavefrontSize << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "wavefrontsPerSimd = " << shaderCoreProperties.wavefrontsPerSimd << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_NV_shader_sm_builtins" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceShaderSMBuiltinsPropertiesNV const & shaderSMBuiltinsProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceShaderSMBuiltinsPropertiesNV>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "ShaderSMBuiltinsProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderSMCount = " << shaderSMBuiltinsProperties.shaderSMCount << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shaderWarpsPerSM = " << shaderSMBuiltinsProperties.shaderWarpsPerSM << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_NV_shading_rate_image" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceShadingRateImagePropertiesNV const & shadingRageImageProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceShadingRateImagePropertiesNV>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "ShadingRateImageProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shadingRateMaxCoarseSamples = " << shadingRageImageProperties.shadingRateMaxCoarseSamples << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shadingRatePaletteSize = " << shadingRageImageProperties.shadingRatePaletteSize << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "shadingRatePaletteSize = "
|
|
|
|
<< "[" << shadingRageImageProperties.shadingRateTexelSize.width << " x "
|
|
|
|
<< shadingRageImageProperties.shadingRateTexelSize.height << "]"
|
|
|
|
<< "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceSubgroupProperties const & subgroupProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceSubgroupProperties>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "SubgroupProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "quadOperationsInAllStages = " << static_cast<bool>( subgroupProperties.quadOperationsInAllStages )
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "subgroupSize = " << subgroupProperties.subgroupSize << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "supportedOperations = " << vk::to_string( subgroupProperties.supportedOperations ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "supportedStages = " << vk::to_string( subgroupProperties.supportedStages ) << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_EXT_subgroup_size_control" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceSubgroupSizeControlPropertiesEXT const & subgroupSizeControlProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceSubgroupSizeControlPropertiesEXT>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "SubgroupSizeControlProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxComputeWorkgroupSubgroups = " << subgroupSizeControlProperties.maxComputeWorkgroupSubgroups
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxSubgroupSize = " << subgroupSizeControlProperties.maxSubgroupSize << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "minSubgroupSize = " << subgroupSizeControlProperties.minSubgroupSize << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "requiredSubgroupSizeStages = "
|
|
|
|
<< vk::to_string( subgroupSizeControlProperties.requiredSubgroupSizeStages ) << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_KHR_timeline_semaphore" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceTimelineSemaphorePropertiesKHR const & timelineSemaphoreProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceTimelineSemaphorePropertiesKHR>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "TimelineSemaphoreProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxTimelineSemaphoreValueDifference = "
|
|
|
|
<< timelineSemaphoreProperties.maxTimelineSemaphoreValueDifference << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_EXT_texel_buffer_alignment" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceTexelBufferAlignmentPropertiesEXT const & texelBufferAlignmentProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceTexelBufferAlignmentPropertiesEXT>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "TexelBufferAlignmentProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "storageTexelBufferOffsetAlignmentBytes = "
|
|
|
|
<< texelBufferAlignmentProperties.storageTexelBufferOffsetAlignmentBytes << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "storageTexelBufferOffsetSingleTexelAlignment = "
|
|
|
|
<< static_cast<bool>( texelBufferAlignmentProperties.storageTexelBufferOffsetSingleTexelAlignment )
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "uniformTexelBufferOffsetAlignmentBytes = "
|
|
|
|
<< texelBufferAlignmentProperties.uniformTexelBufferOffsetAlignmentBytes << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "uniformTexelBufferOffsetSingleTexelAlignment = "
|
|
|
|
<< static_cast<bool>( texelBufferAlignmentProperties.uniformTexelBufferOffsetSingleTexelAlignment )
|
|
|
|
<< "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_EXT_transform_feedback" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceTransformFeedbackPropertiesEXT const & transformFeedbackProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceTransformFeedbackPropertiesEXT>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "TransformFeedbackProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxTransformFeedbackBufferDataSize = "
|
|
|
|
<< transformFeedbackProperties.maxTransformFeedbackBufferDataSize << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxTransformFeedbackBufferDataStride = "
|
|
|
|
<< transformFeedbackProperties.maxTransformFeedbackBufferDataStride << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxTransformFeedbackBuffers = "
|
|
|
|
<< transformFeedbackProperties.maxTransformFeedbackBuffers << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxTransformFeedbackBufferSize = "
|
|
|
|
<< transformFeedbackProperties.maxTransformFeedbackBufferSize << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxTransformFeedbackStreamDataSize = "
|
|
|
|
<< transformFeedbackProperties.maxTransformFeedbackStreamDataSize << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxTransformFeedbackStreams = "
|
|
|
|
<< transformFeedbackProperties.maxTransformFeedbackStreams << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "transformFeedbackDraw = "
|
|
|
|
<< static_cast<bool>( transformFeedbackProperties.transformFeedbackDraw ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "transformFeedbackQueries = "
|
|
|
|
<< static_cast<bool>( transformFeedbackProperties.transformFeedbackQueries ) << "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "transformFeedbackRasterizationStreamSelect = "
|
|
|
|
<< static_cast<bool>( transformFeedbackProperties.transformFeedbackRasterizationStreamSelect )
|
|
|
|
<< "\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "transformFeedbackStreamsLinesTriangles = "
|
|
|
|
<< static_cast<bool>( transformFeedbackProperties.transformFeedbackStreamsLinesTriangles ) << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
|
2020-04-12 19:49:12 +00:00
|
|
|
if ( vk::su::contains( extensionProperties, "VK_EXT_vertex_attribute_divisor" ) )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-04-12 19:49:12 +00:00
|
|
|
vk::PhysicalDeviceVertexAttributeDivisorPropertiesEXT const & vertexAttributeDivisorProperties =
|
|
|
|
properties2.get<vk::PhysicalDeviceVertexAttributeDivisorPropertiesEXT>();
|
|
|
|
std::cout << "\t"
|
|
|
|
<< "VertexAttributeDivisorProperties:\n";
|
|
|
|
std::cout << "\t\t"
|
|
|
|
<< "maxVertexAttribDivisor = " << vertexAttributeDivisorProperties.maxVertexAttribDivisor << "\n";
|
2019-10-28 14:36:21 +00:00
|
|
|
std::cout << "\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* VULKAN_KEY_END */
|
|
|
|
}
|
2020-04-12 19:49:12 +00:00
|
|
|
catch ( vk::SystemError & err )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
|
|
|
std::cout << "vk::SystemError: " << err.what() << std::endl;
|
2020-04-12 19:49:12 +00:00
|
|
|
exit( -1 );
|
2019-10-28 14:36:21 +00:00
|
|
|
}
|
2020-07-08 08:58:37 +00:00
|
|
|
catch ( std::exception & err )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
2020-07-08 08:58:37 +00:00
|
|
|
std::cout << "std::exception: " << err.what() << std::endl;
|
2020-04-12 19:49:12 +00:00
|
|
|
exit( -1 );
|
2019-10-28 14:36:21 +00:00
|
|
|
}
|
2020-04-12 19:49:12 +00:00
|
|
|
catch ( ... )
|
2019-10-28 14:36:21 +00:00
|
|
|
{
|
|
|
|
std::cout << "unknown error\n";
|
2020-04-12 19:49:12 +00:00
|
|
|
exit( -1 );
|
2019-10-28 14:36:21 +00:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|