radv/aco: do not advertise VK_KHR_shader_subgroup_extended_types
[mesa.git] / src / amd / vulkan / radv_device.c
index 2f44b279ac18f72327b053e8cb5f084cf656583d..09b19ed0007581935853eaf52bb48fd723331237 100644 (file)
@@ -411,10 +411,6 @@ radv_physical_device_init(struct radv_physical_device *device,
        device->use_ngg = device->rad_info.chip_class >= GFX10 &&
                          device->rad_info.family != CHIP_NAVI14 &&
                          !(device->instance->debug_flags & RADV_DEBUG_NO_NGG);
-       if (device->use_aco && device->use_ngg) {
-               fprintf(stderr, "WARNING: disabling NGG because ACO is used.\n");
-               device->use_ngg = false;
-       }
 
        device->use_ngg_streamout = false;
 
@@ -1001,11 +997,10 @@ void radv_GetPhysicalDeviceFeatures2(
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: {
                        VkPhysicalDevice16BitStorageFeatures *features =
                            (VkPhysicalDevice16BitStorageFeatures*)ext;
-                       bool enabled = pdevice->rad_info.chip_class >= GFX8 && !pdevice->use_aco;
-                       features->storageBuffer16BitAccess = enabled;
-                       features->uniformAndStorageBuffer16BitAccess = enabled;
-                       features->storagePushConstant16 = enabled;
-                       features->storageInputOutput16 = enabled && LLVM_VERSION_MAJOR >= 9;
+                       features->storageBuffer16BitAccess = !pdevice->use_aco;
+                       features->uniformAndStorageBuffer16BitAccess = !pdevice->use_aco;
+                       features->storagePushConstant16 = !pdevice->use_aco;
+                       features->storageInputOutput16 = pdevice->rad_info.has_double_rate_fp16 && !pdevice->use_aco && LLVM_VERSION_MAJOR >= 9;
                        break;
                }
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: {
@@ -1103,16 +1098,15 @@ void radv_GetPhysicalDeviceFeatures2(
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES: {
                        VkPhysicalDevice8BitStorageFeatures *features =
                            (VkPhysicalDevice8BitStorageFeatures *)ext;
-                       bool enabled = pdevice->rad_info.chip_class >= GFX8 && !pdevice->use_aco;
-                       features->storageBuffer8BitAccess = enabled;
-                       features->uniformAndStorageBuffer8BitAccess = enabled;
-                       features->storagePushConstant8 = enabled;
+                       features->storageBuffer8BitAccess = !pdevice->use_aco;
+                       features->uniformAndStorageBuffer8BitAccess = !pdevice->use_aco;
+                       features->storagePushConstant8 = !pdevice->use_aco;
                        break;
                }
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES: {
                        VkPhysicalDeviceShaderFloat16Int8Features *features =
                                (VkPhysicalDeviceShaderFloat16Int8Features*)ext;
-                       features->shaderFloat16 = pdevice->rad_info.chip_class >= GFX8 && !pdevice->use_aco;
+                       features->shaderFloat16 = pdevice->rad_info.has_double_rate_fp16 && !pdevice->use_aco;
                        features->shaderInt8 = !pdevice->use_aco;
                        break;
                }
@@ -1209,7 +1203,7 @@ void radv_GetPhysicalDeviceFeatures2(
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES: {
                        VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures *features =
                                (VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures *)ext;
-                       features->shaderSubgroupExtendedTypes = true;
+                       features->shaderSubgroupExtendedTypes = !pdevice->use_aco;
                        break;
                }
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES_KHR: {
@@ -1221,10 +1215,10 @@ void radv_GetPhysicalDeviceFeatures2(
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: {
                        VkPhysicalDeviceVulkan11Features *features =
                                (VkPhysicalDeviceVulkan11Features *)ext;
-                       features->storageBuffer16BitAccess = pdevice->rad_info.chip_class >= GFX8 && !pdevice->use_aco;
-                       features->uniformAndStorageBuffer16BitAccess = pdevice->rad_info.chip_class >= GFX8 && !pdevice->use_aco;
-                       features->storagePushConstant16 = pdevice->rad_info.chip_class >= GFX8 && !pdevice->use_aco;
-                       features->storageInputOutput16 = pdevice->rad_info.chip_class >= GFX8 && !pdevice->use_aco && LLVM_VERSION_MAJOR >= 9;
+                       features->storageBuffer16BitAccess = !pdevice->use_aco;
+                       features->uniformAndStorageBuffer16BitAccess = !pdevice->use_aco;
+                       features->storagePushConstant16 = !pdevice->use_aco;
+                       features->storageInputOutput16 = pdevice->rad_info.has_double_rate_fp16 && !pdevice->use_aco && LLVM_VERSION_MAJOR >= 9;
                        features->multiview = true;
                        features->multiviewGeometryShader = true;
                        features->multiviewTessellationShader = true;
@@ -1240,12 +1234,12 @@ void radv_GetPhysicalDeviceFeatures2(
                                (VkPhysicalDeviceVulkan12Features *)ext;
                        features->samplerMirrorClampToEdge = true;
                        features->drawIndirectCount = true;
-                       features->storageBuffer8BitAccess = pdevice->rad_info.chip_class >= GFX8 && !pdevice->use_aco;
-                       features->uniformAndStorageBuffer8BitAccess = pdevice->rad_info.chip_class >= GFX8 && !pdevice->use_aco;
-                       features->storagePushConstant8 = pdevice->rad_info.chip_class >= GFX8 && !pdevice->use_aco;
+                       features->storageBuffer8BitAccess = !pdevice->use_aco;
+                       features->uniformAndStorageBuffer8BitAccess = !pdevice->use_aco;
+                       features->storagePushConstant8 = !pdevice->use_aco;
                        features->shaderBufferInt64Atomics = LLVM_VERSION_MAJOR >= 9;
                        features->shaderSharedInt64Atomics = LLVM_VERSION_MAJOR >= 9;
-                       features->shaderFloat16 = pdevice->rad_info.chip_class >= GFX8 && !pdevice->use_aco;
+                       features->shaderFloat16 = pdevice->rad_info.has_double_rate_fp16 && !pdevice->use_aco;
                        features->shaderInt8 = !pdevice->use_aco;
                        features->descriptorIndexing = true;
                        features->shaderInputAttachmentArrayDynamicIndexing = true;
@@ -1272,7 +1266,7 @@ void radv_GetPhysicalDeviceFeatures2(
                        features->scalarBlockLayout = pdevice->rad_info.chip_class >= GFX7;
                        features->imagelessFramebuffer = true;
                        features->uniformBufferStandardLayout = true;
-                       features->shaderSubgroupExtendedTypes = true;
+                       features->shaderSubgroupExtendedTypes = !pdevice->use_aco;
                        features->separateDepthStencilLayouts = true;
                        features->hostQueryReset = true;
                        features->timelineSemaphore = pdevice->rad_info.has_syncobj_wait_for_submit;
@@ -1345,7 +1339,7 @@ void radv_GetPhysicalDeviceProperties(
                .maxMemoryAllocationCount                 = UINT32_MAX,
                .maxSamplerAllocationCount                = 64 * 1024,
                .bufferImageGranularity                   = 64, /* A cache line */
-               .sparseAddressSpaceSize                   = 0xffffffffu, /* buffer max size */
+               .sparseAddressSpaceSize                   = RADV_MAX_MEMORY_ALLOCATION_SIZE, /* buffer max size */
                .maxBoundDescriptorSets                   = MAX_SETS,
                .maxPerStageDescriptorSamplers            = max_descriptor_set_size,
                .maxPerStageDescriptorUniformBuffers      = max_descriptor_set_size,
@@ -1481,9 +1475,9 @@ radv_get_physical_device_properties_1_1(struct radv_physical_device *pdevice,
                                         VK_SUBGROUP_FEATURE_CLUSTERED_BIT |
                                         VK_SUBGROUP_FEATURE_QUAD_BIT;
 
-       if (pdevice->rad_info.chip_class == GFX8 ||
-           pdevice->rad_info.chip_class == GFX9 ||
-           (pdevice->rad_info.chip_class == GFX10 && pdevice->use_aco)) {
+       if (((pdevice->rad_info.chip_class == GFX6 ||
+             pdevice->rad_info.chip_class == GFX7) && !pdevice->use_aco) ||
+           pdevice->rad_info.chip_class >= GFX8) {
                p->subgroupSupportedOperations |= VK_SUBGROUP_FEATURE_SHUFFLE_BIT |
                                                  VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT;
        }
@@ -1518,8 +1512,13 @@ radv_get_physical_device_properties_1_2(struct radv_physical_device *pdevice,
        /* On AMD hardware, denormals and rounding modes for fp16/fp64 are
         * controlled by the same config register.
         */
-       p->denormBehaviorIndependence = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY_KHR;
-       p->roundingModeIndependence = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY_KHR;
+       if (pdevice->rad_info.has_double_rate_fp16) {
+               p->denormBehaviorIndependence = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY_KHR;
+               p->roundingModeIndependence = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY_KHR;
+       } else {
+               p->denormBehaviorIndependence = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL_KHR;
+               p->roundingModeIndependence = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL_KHR;
+       }
 
        /* Do not allow both preserving and flushing denorms because different
         * shaders in the same pipeline can have different settings and this
@@ -1536,10 +1535,10 @@ radv_get_physical_device_properties_1_2(struct radv_physical_device *pdevice,
        p->shaderSignedZeroInfNanPreserveFloat32 = true;
 
        p->shaderDenormFlushToZeroFloat16 = false;
-       p->shaderDenormPreserveFloat16 = pdevice->rad_info.chip_class >= GFX8;
-       p->shaderRoundingModeRTEFloat16 = pdevice->rad_info.chip_class >= GFX8;
+       p->shaderDenormPreserveFloat16 = pdevice->rad_info.has_double_rate_fp16;
+       p->shaderRoundingModeRTEFloat16 = pdevice->rad_info.has_double_rate_fp16;
        p->shaderRoundingModeRTZFloat16 = false;
-       p->shaderSignedZeroInfNanPreserveFloat16 = pdevice->rad_info.chip_class >= GFX8;
+       p->shaderSignedZeroInfNanPreserveFloat16 = pdevice->rad_info.has_double_rate_fp16;
 
        p->shaderDenormFlushToZeroFloat64 = false;
        p->shaderDenormPreserveFloat64 = pdevice->rad_info.chip_class >= GFX8;
@@ -6243,6 +6242,9 @@ VkResult radv_CreateBuffer(
        RADV_FROM_HANDLE(radv_device, device, _device);
        struct radv_buffer *buffer;
 
+       if (pCreateInfo->size > RADV_MAX_MEMORY_ALLOCATION_SIZE)
+               return VK_ERROR_OUT_OF_DEVICE_MEMORY;
+
        assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO);
 
        buffer = vk_alloc2(&device->alloc, pAllocator, sizeof(*buffer), 8,
@@ -7034,6 +7036,11 @@ radv_get_max_anisotropy(struct radv_device *device,
        return 0;
 }
 
+static inline int S_FIXED(float value, unsigned frac_bits)
+{
+       return value * (1 << frac_bits);
+}
+
 static void
 radv_init_sampler(struct radv_device *device,
                  struct radv_sampler *sampler,