+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES: {
+ VkPhysicalDeviceSubgroupProperties *properties =
+ (VkPhysicalDeviceSubgroupProperties*)ext;
+ properties->subgroupSize = 64;
+ properties->supportedStages = VK_SHADER_STAGE_ALL;
+ properties->supportedOperations =
+ VK_SUBGROUP_FEATURE_BASIC_BIT |
+ VK_SUBGROUP_FEATURE_BALLOT_BIT |
+ VK_SUBGROUP_FEATURE_QUAD_BIT |
+ VK_SUBGROUP_FEATURE_VOTE_BIT;
+ if (pdevice->rad_info.chip_class >= VI) {
+ properties->supportedOperations |=
+ VK_SUBGROUP_FEATURE_SHUFFLE_BIT |
+ VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT;
+ }
+ properties->quadOperationsInAllStages = true;
+ break;
+ }
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES: {
+ VkPhysicalDeviceMaintenance3Properties *properties =
+ (VkPhysicalDeviceMaintenance3Properties*)ext;
+ /* Make sure everything is addressable by a signed 32-bit int, and
+ * our largest descriptors are 96 bytes. */
+ properties->maxPerSetDescriptors = (1ull << 31) / 96;
+ /* Our buffer size fields allow only this much */
+ properties->maxMemoryAllocationSize = 0xFFFFFFFFull;
+ break;
+ }
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT: {
+ VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT *properties =
+ (VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT *)ext;
+ /* GFX6-8 only support single channel min/max filter. */
+ properties->filterMinmaxImageComponentMapping = pdevice->rad_info.chip_class >= GFX9;
+ properties->filterMinmaxSingleComponentFormats = true;
+ break;
+ }
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD: {
+ VkPhysicalDeviceShaderCorePropertiesAMD *properties =
+ (VkPhysicalDeviceShaderCorePropertiesAMD *)ext;
+
+ /* Shader engines. */
+ properties->shaderEngineCount =
+ pdevice->rad_info.max_se;
+ properties->shaderArraysPerEngineCount =
+ pdevice->rad_info.max_sh_per_se;
+ properties->computeUnitsPerShaderArray =
+ pdevice->rad_info.num_good_compute_units /
+ (pdevice->rad_info.max_se *
+ pdevice->rad_info.max_sh_per_se);
+ properties->simdPerComputeUnit = 4;
+ properties->wavefrontsPerSimd =
+ pdevice->rad_info.family == CHIP_TONGA ||
+ pdevice->rad_info.family == CHIP_ICELAND ||
+ pdevice->rad_info.family == CHIP_POLARIS10 ||
+ pdevice->rad_info.family == CHIP_POLARIS11 ||
+ pdevice->rad_info.family == CHIP_POLARIS12 ||
+ pdevice->rad_info.family == CHIP_VEGAM ? 8 : 10;
+ properties->wavefrontSize = 64;
+
+ /* SGPR. */
+ properties->sgprsPerSimd =
+ radv_get_num_physical_sgprs(pdevice);
+ properties->minSgprAllocation =
+ pdevice->rad_info.chip_class >= VI ? 16 : 8;
+ properties->maxSgprAllocation =
+ pdevice->rad_info.family == CHIP_TONGA ||
+ pdevice->rad_info.family == CHIP_ICELAND ? 96 : 104;
+ properties->sgprAllocationGranularity =
+ pdevice->rad_info.chip_class >= VI ? 16 : 8;
+
+ /* VGPR. */
+ properties->vgprsPerSimd = RADV_NUM_PHYSICAL_VGPRS;
+ properties->minVgprAllocation = 4;
+ properties->maxVgprAllocation = 256;
+ properties->vgprAllocationGranularity = 4;
+ break;
+ }
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT: {
+ VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *properties =
+ (VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *)ext;
+ properties->maxVertexAttribDivisor = UINT32_MAX;
+ break;
+ }
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT: {
+ VkPhysicalDeviceDescriptorIndexingPropertiesEXT *properties =
+ (VkPhysicalDeviceDescriptorIndexingPropertiesEXT*)ext;
+ properties->maxUpdateAfterBindDescriptorsInAllPools = UINT32_MAX / 64;
+ properties->shaderUniformBufferArrayNonUniformIndexingNative = false;
+ properties->shaderSampledImageArrayNonUniformIndexingNative = false;
+ properties->shaderStorageBufferArrayNonUniformIndexingNative = false;
+ properties->shaderStorageImageArrayNonUniformIndexingNative = false;
+ properties->shaderInputAttachmentArrayNonUniformIndexingNative = false;
+ properties->robustBufferAccessUpdateAfterBind = false;
+ properties->quadDivergentImplicitLod = false;
+
+ size_t max_descriptor_set_size = ((1ull << 31) - 16 * MAX_DYNAMIC_BUFFERS) /
+ (32 /* uniform buffer, 32 due to potential space wasted on alignment */ +
+ 32 /* storage buffer, 32 due to potential space wasted on alignment */ +
+ 32 /* sampler, largest when combined with image */ +
+ 64 /* sampled image */ +
+ 64 /* storage image */);
+ properties->maxPerStageDescriptorUpdateAfterBindSamplers = max_descriptor_set_size;
+ properties->maxPerStageDescriptorUpdateAfterBindUniformBuffers = max_descriptor_set_size;
+ properties->maxPerStageDescriptorUpdateAfterBindStorageBuffers = max_descriptor_set_size;
+ properties->maxPerStageDescriptorUpdateAfterBindSampledImages = max_descriptor_set_size;
+ properties->maxPerStageDescriptorUpdateAfterBindStorageImages = max_descriptor_set_size;
+ properties->maxPerStageDescriptorUpdateAfterBindInputAttachments = max_descriptor_set_size;
+ properties->maxPerStageUpdateAfterBindResources = max_descriptor_set_size;
+ properties->maxDescriptorSetUpdateAfterBindSamplers = max_descriptor_set_size;
+ properties->maxDescriptorSetUpdateAfterBindUniformBuffers = max_descriptor_set_size;
+ properties->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic = MAX_DYNAMIC_UNIFORM_BUFFERS;
+ properties->maxDescriptorSetUpdateAfterBindStorageBuffers = max_descriptor_set_size;
+ properties->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic = MAX_DYNAMIC_STORAGE_BUFFERS;
+ properties->maxDescriptorSetUpdateAfterBindSampledImages = max_descriptor_set_size;
+ properties->maxDescriptorSetUpdateAfterBindStorageImages = max_descriptor_set_size;
+ properties->maxDescriptorSetUpdateAfterBindInputAttachments = max_descriptor_set_size;
+ break;
+ }
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES: {
+ VkPhysicalDeviceProtectedMemoryProperties *properties =
+ (VkPhysicalDeviceProtectedMemoryProperties *)ext;
+ properties->protectedNoFault = false;
+ break;
+ }