radv: only use VkSamplerCreateInfo::compareOp if enabled
[mesa.git] / src / amd / vulkan / radv_device.c
index a7997cf9c209c3ba8dc3dfb6245eedf6c38aa83f..a7906919ecd9faf4857ce1afab9bf45a0a7fd4fb 100644 (file)
@@ -398,7 +398,7 @@ radv_physical_device_init(struct radv_physical_device *device,
        radv_handle_env_var_force_family(device);
 
        device->use_aco = instance->perftest_flags & RADV_PERFTEST_ACO;
-       if (device->rad_info.chip_class < GFX8 && device->use_aco) {
+       if (device->rad_info.chip_class < GFX7 && device->use_aco) {
                fprintf(stderr, "WARNING: disabling ACO on unsupported GPUs.\n");
                device->use_aco = false;
        }
@@ -439,7 +439,8 @@ radv_physical_device_init(struct radv_physical_device *device,
        device->dcc_msaa_allowed =
                (device->instance->perftest_flags & RADV_PERFTEST_DCC_MSAA);
 
-       device->use_shader_ballot = device->use_aco || (device->instance->perftest_flags & RADV_PERFTEST_SHADER_BALLOT);
+       device->use_shader_ballot = (device->use_aco && device->rad_info.chip_class >= GFX8) ||
+                                   (device->instance->perftest_flags & RADV_PERFTEST_SHADER_BALLOT);
 
        device->use_ngg = device->rad_info.chip_class >= GFX10 &&
                          device->rad_info.family != CHIP_NAVI14 &&
@@ -625,10 +626,11 @@ radv_handle_per_app_options(struct radv_instance *instance,
                if (LLVM_VERSION_MAJOR < 9)
                        instance->debug_flags |= RADV_DEBUG_NO_LOAD_STORE_OPT;
        } else if (!strcmp(name, "Wolfenstein: Youngblood")) {
-               if (!(instance->debug_flags & RADV_DEBUG_NO_SHADER_BALLOT)) {
+               if (!(instance->debug_flags & RADV_DEBUG_NO_SHADER_BALLOT) &&
+                   !(instance->perftest_flags & RADV_PERFTEST_ACO)) {
                        /* Force enable VK_AMD_shader_ballot because it looks
                         * safe and it gives a nice boost (+20% on Vega 56 at
-                        * this time).
+                        * this time). It also prevents corruption on LLVM.
                         */
                        instance->perftest_flags |= RADV_PERFTEST_SHADER_BALLOT;
                }
@@ -659,6 +661,10 @@ DRI_CONF_BEGIN
                DRI_CONF_VK_X11_OVERRIDE_MIN_IMAGE_COUNT(0)
                DRI_CONF_VK_X11_STRICT_IMAGE_COUNT("false")
        DRI_CONF_SECTION_END
+
+       DRI_CONF_SECTION_DEBUG
+               DRI_CONF_VK_WSI_FORCE_BGRA8_UNORM_FIRST("false")
+       DRI_CONF_SECTION_END
 DRI_CONF_END;
 
 static void  radv_init_dri_options(struct radv_instance *instance)
@@ -1027,8 +1033,8 @@ void radv_GetPhysicalDeviceFeatures2(
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: {
                        VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *features =
                                (VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *)ext;
-                       features->vertexAttributeInstanceRateDivisor = VK_TRUE;
-                       features->vertexAttributeInstanceRateZeroDivisor = VK_TRUE;
+                       features->vertexAttributeInstanceRateDivisor = true;
+                       features->vertexAttributeInstanceRateZeroDivisor = true;
                        break;
                }
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: {
@@ -1047,7 +1053,7 @@ void radv_GetPhysicalDeviceFeatures2(
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT: {
                        VkPhysicalDeviceMemoryPriorityFeaturesEXT *features =
                                (VkPhysicalDeviceMemoryPriorityFeaturesEXT *)ext;
-                       features->memoryPriority = VK_TRUE;
+                       features->memoryPriority = true;
                        break;
                }
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT: {
@@ -1058,6 +1064,14 @@ void radv_GetPhysicalDeviceFeatures2(
                        features->bufferDeviceAddressMultiDevice = false;
                        break;
                }
+               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR: {
+                       VkPhysicalDeviceBufferDeviceAddressFeaturesKHR *features =
+                               (VkPhysicalDeviceBufferDeviceAddressFeaturesKHR *)ext;
+                       features->bufferDeviceAddress = true;
+                       features->bufferDeviceAddressCaptureReplay = false;
+                       features->bufferDeviceAddressMultiDevice = false;
+                       break;
+               }
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT: {
                        VkPhysicalDeviceDepthClipEnableFeaturesEXT *features =
                                (VkPhysicalDeviceDepthClipEnableFeaturesEXT *)ext;
@@ -1182,6 +1196,12 @@ void radv_GetPhysicalDeviceFeatures2(
                        features->shaderSubgroupExtendedTypes = true;
                        break;
                }
+               case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES_KHR: {
+                       VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR *features =
+                               (VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR *)ext;
+                       features->separateDepthStencilLayouts = true;
+                       break;
+               }
                default:
                        break;
                }
@@ -1189,25 +1209,32 @@ void radv_GetPhysicalDeviceFeatures2(
        return radv_GetPhysicalDeviceFeatures(physicalDevice, &pFeatures->features);
 }
 
-void radv_GetPhysicalDeviceProperties(
-       VkPhysicalDevice                            physicalDevice,
-       VkPhysicalDeviceProperties*                 pProperties)
+static size_t
+radv_max_descriptor_set_size()
 {
-       RADV_FROM_HANDLE(radv_physical_device, pdevice, physicalDevice);
-       VkSampleCountFlags sample_counts = 0xf;
-
        /* make sure that the entire descriptor set is addressable with a signed
         * 32-bit int. So the sum of all limits scaled by descriptor size has to
         * be at most 2 GiB. the combined image & samples object count as one of
         * both. This limit is for the pipeline layout, not for the set layout, but
         * there is no set limit, so we just set a pipeline limit. I don't think
         * any app is going to hit this soon. */
-       size_t max_descriptor_set_size = ((1ull << 31) - 16 * MAX_DYNAMIC_BUFFERS) /
+       return ((1ull << 31) - 16 * MAX_DYNAMIC_BUFFERS
+                            - MAX_INLINE_UNIFORM_BLOCK_SIZE * MAX_INLINE_UNIFORM_BLOCK_COUNT) /
                  (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 */);
+}
+
+void radv_GetPhysicalDeviceProperties(
+       VkPhysicalDevice                            physicalDevice,
+       VkPhysicalDeviceProperties*                 pProperties)
+{
+       RADV_FROM_HANDLE(radv_physical_device, pdevice, physicalDevice);
+       VkSampleCountFlags sample_counts = 0xf;
+
+       size_t max_descriptor_set_size = radv_max_descriptor_set_size();
 
        VkPhysicalDeviceLimits limits = {
                .maxImageDimension1D                      = (1 << 14),
@@ -1263,11 +1290,11 @@ void radv_GetPhysicalDeviceProperties(
                .maxFragmentCombinedOutputResources       = 8,
                .maxComputeSharedMemorySize               = 32768,
                .maxComputeWorkGroupCount                 = { 65535, 65535, 65535 },
-               .maxComputeWorkGroupInvocations           = 2048,
+               .maxComputeWorkGroupInvocations           = 1024,
                .maxComputeWorkGroupSize = {
-                       2048,
-                       2048,
-                       2048
+                       1024,
+                       1024,
+                       1024
                },
                .subPixelPrecisionBits                    = 8,
                .subTexelPrecisionBits                    = 8,
@@ -1300,7 +1327,7 @@ void radv_GetPhysicalDeviceProperties(
                .framebufferNoAttachmentsSampleCounts     = sample_counts,
                .maxColorAttachments                      = MAX_RTS,
                .sampledImageColorSampleCounts            = sample_counts,
-               .sampledImageIntegerSampleCounts          = VK_SAMPLE_COUNT_1_BIT,
+               .sampledImageIntegerSampleCounts          = sample_counts,
                .sampledImageDepthSampleCounts            = sample_counts,
                .sampledImageStencilSampleCounts          = sample_counts,
                .storageImageSampleCounts                 = pdevice->rad_info.chip_class >= GFX8 ? sample_counts : VK_SAMPLE_COUNT_1_BIT,
@@ -1385,7 +1412,7 @@ void radv_GetPhysicalDeviceProperties2(
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES: {
                        VkPhysicalDeviceSubgroupProperties *properties =
                            (VkPhysicalDeviceSubgroupProperties*)ext;
-                       properties->subgroupSize = 64;
+                       properties->subgroupSize = RADV_SUBGROUP_SIZE;
                        properties->supportedStages = VK_SHADER_STAGE_ALL;
                        properties->supportedOperations =
                                                        VK_SUBGROUP_FEATURE_BASIC_BIT |
@@ -1406,11 +1433,8 @@ void radv_GetPhysicalDeviceProperties2(
                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;
+                       properties->maxPerSetDescriptors = RADV_MAX_PER_SET_DESCRIPTORS;
+                       properties->maxMemoryAllocationSize = RADV_MAX_MEMORY_ALLOCATION_SIZE;
                        break;
                }
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT: {
@@ -1487,13 +1511,7 @@ void radv_GetPhysicalDeviceProperties2(
                        properties->robustBufferAccessUpdateAfterBind = false;
                        properties->quadDivergentImplicitLod = false;
 
-                       size_t max_descriptor_set_size = ((1ull << 31) - 16 * MAX_DYNAMIC_BUFFERS -
-                               MAX_INLINE_UNIFORM_BLOCK_SIZE * MAX_INLINE_UNIFORM_BLOCK_COUNT) /
-                                 (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 */);
+                       size_t max_descriptor_set_size = radv_max_descriptor_set_size();
                        properties->maxPerStageDescriptorUpdateAfterBindSamplers = max_descriptor_set_size;
                        properties->maxPerStageDescriptorUpdateAfterBindUniformBuffers = max_descriptor_set_size;
                        properties->maxPerStageDescriptorUpdateAfterBindStorageBuffers = max_descriptor_set_size;
@@ -1523,12 +1541,12 @@ void radv_GetPhysicalDeviceProperties2(
                        properties->primitiveOverestimationSize = 0;
                        properties->maxExtraPrimitiveOverestimationSize = 0;
                        properties->extraPrimitiveOverestimationSizeGranularity = 0;
-                       properties->primitiveUnderestimation = VK_FALSE;
-                       properties->conservativePointAndLineRasterization = VK_FALSE;
-                       properties->degenerateTrianglesRasterized = VK_FALSE;
-                       properties->degenerateLinesRasterized = VK_FALSE;
-                       properties->fullyCoveredFragmentShaderInputVariable = VK_FALSE;
-                       properties->conservativeRasterizationPostDepthCoverage = VK_FALSE;
+                       properties->primitiveUnderestimation = false;
+                       properties->conservativePointAndLineRasterization = false;
+                       properties->degenerateTrianglesRasterized = false;
+                       properties->degenerateLinesRasterized = false;
+                       properties->fullyCoveredFragmentShaderInputVariable = false;
+                       properties->conservativeRasterizationPostDepthCoverage = false;
                        break;
                }
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT: {
@@ -1594,7 +1612,7 @@ void radv_GetPhysicalDeviceProperties2(
                        properties->sampleLocationCoordinateRange[0] = 0.0f;
                        properties->sampleLocationCoordinateRange[1] = 0.9375f;
                        properties->sampleLocationSubPixelBits = 4;
-                       properties->variableSampleLocations = VK_FALSE;
+                       properties->variableSampleLocations = false;
                        break;
                }
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR: {
@@ -1614,8 +1632,8 @@ void radv_GetPhysicalDeviceProperties2(
                                VK_RESOLVE_MODE_MIN_BIT_KHR |
                                VK_RESOLVE_MODE_MAX_BIT_KHR;
 
-                       properties->independentResolveNone = VK_TRUE;
-                       properties->independentResolve = VK_TRUE;
+                       properties->independentResolveNone = true;
+                       properties->independentResolve = true;
                        break;
                }
                case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT: {
@@ -2687,7 +2705,8 @@ VkResult radv_CreateDevice(
        device->use_global_bo_list =
                (device->instance->perftest_flags & RADV_PERFTEST_BO_LIST) ||
                device->enabled_extensions.EXT_descriptor_indexing ||
-               device->enabled_extensions.EXT_buffer_device_address;
+               device->enabled_extensions.EXT_buffer_device_address ||
+               device->enabled_extensions.KHR_buffer_device_address;
 
        device->robust_buffer_access = pCreateInfo->pEnabledFeatures &&
                                       pCreateInfo->pEnabledFeatures->robustBufferAccess;
@@ -3018,7 +3037,7 @@ fill_geom_tess_rings(struct radv_queue *queue,
 
                if (queue->device->physical_device->rad_info.chip_class >= GFX10) {
                        desc[3] |= S_008F0C_FORMAT(V_008F0C_IMG_FORMAT_32_FLOAT) |
-                                  S_008F0C_OOB_SELECT(2) |
+                                  S_008F0C_OOB_SELECT(V_008F0C_OOB_SELECT_DISABLED) |
                                   S_008F0C_RESOURCE_LEVEL(1);
                } else {
                        desc[3] |= S_008F0C_NUM_FORMAT(V_008F0C_BUF_NUM_FORMAT_FLOAT) |
@@ -3039,7 +3058,7 @@ fill_geom_tess_rings(struct radv_queue *queue,
 
                if (queue->device->physical_device->rad_info.chip_class >= GFX10) {
                        desc[7] |= S_008F0C_FORMAT(V_008F0C_IMG_FORMAT_32_FLOAT) |
-                                  S_008F0C_OOB_SELECT(2) |
+                                  S_008F0C_OOB_SELECT(V_008F0C_OOB_SELECT_DISABLED) |
                                   S_008F0C_RESOURCE_LEVEL(1);
                } else {
                        desc[7] |= S_008F0C_NUM_FORMAT(V_008F0C_BUF_NUM_FORMAT_FLOAT) |
@@ -3065,7 +3084,7 @@ fill_geom_tess_rings(struct radv_queue *queue,
 
                if (queue->device->physical_device->rad_info.chip_class >= GFX10) {
                        desc[3] |= S_008F0C_FORMAT(V_008F0C_IMG_FORMAT_32_FLOAT) |
-                                  S_008F0C_OOB_SELECT(2) |
+                                  S_008F0C_OOB_SELECT(V_008F0C_OOB_SELECT_DISABLED) |
                                   S_008F0C_RESOURCE_LEVEL(1);
                } else {
                        desc[3] |= S_008F0C_NUM_FORMAT(V_008F0C_BUF_NUM_FORMAT_FLOAT) |
@@ -3088,7 +3107,7 @@ fill_geom_tess_rings(struct radv_queue *queue,
 
                if (queue->device->physical_device->rad_info.chip_class >= GFX10) {
                        desc[7] |= S_008F0C_FORMAT(V_008F0C_IMG_FORMAT_32_FLOAT) |
-                                  S_008F0C_OOB_SELECT(2) |
+                                  S_008F0C_OOB_SELECT(V_008F0C_OOB_SELECT_DISABLED) |
                                   S_008F0C_RESOURCE_LEVEL(1);
                } else {
                        desc[7] |= S_008F0C_NUM_FORMAT(V_008F0C_BUF_NUM_FORMAT_FLOAT) |
@@ -3114,7 +3133,7 @@ fill_geom_tess_rings(struct radv_queue *queue,
 
                if (queue->device->physical_device->rad_info.chip_class >= GFX10) {
                        desc[3] |= S_008F0C_FORMAT(V_008F0C_IMG_FORMAT_32_FLOAT) |
-                                  S_008F0C_OOB_SELECT(3) |
+                                  S_008F0C_OOB_SELECT(V_008F0C_OOB_SELECT_RAW) |
                                   S_008F0C_RESOURCE_LEVEL(1);
                } else {
                        desc[3] |= S_008F0C_NUM_FORMAT(V_008F0C_BUF_NUM_FORMAT_FLOAT) |
@@ -3131,7 +3150,7 @@ fill_geom_tess_rings(struct radv_queue *queue,
 
                if (queue->device->physical_device->rad_info.chip_class >= GFX10) {
                        desc[7] |= S_008F0C_FORMAT(V_008F0C_IMG_FORMAT_32_FLOAT) |
-                                  S_008F0C_OOB_SELECT(3) |
+                                  S_008F0C_OOB_SELECT(V_008F0C_OOB_SELECT_RAW) |
                                   S_008F0C_RESOURCE_LEVEL(1);
                } else {
                        desc[7] |= S_008F0C_NUM_FORMAT(V_008F0C_BUF_NUM_FORMAT_FLOAT) |
@@ -3966,8 +3985,7 @@ radv_finalize_timelines(struct radv_device *device,
                        pthread_mutex_lock(&wait_sems[i]->timeline.mutex);
                        struct radv_timeline_point *point =
                                radv_timeline_find_point_at_least_locked(device, &wait_sems[i]->timeline, wait_values[i]);
-                       if (point)
-                               --point->wait_count;
+                       point->wait_count -= 2;
                        pthread_mutex_unlock(&wait_sems[i]->timeline.mutex);
                }
        }
@@ -3976,11 +3994,9 @@ radv_finalize_timelines(struct radv_device *device,
                        pthread_mutex_lock(&signal_sems[i]->timeline.mutex);
                        struct radv_timeline_point *point =
                                radv_timeline_find_point_at_least_locked(device, &signal_sems[i]->timeline, signal_values[i]);
-                       if (point) {
-                               signal_sems[i]->timeline.highest_submitted =
-                                       MAX2(signal_sems[i]->timeline.highest_submitted, point->value);
-                               point->wait_count--;
-                       }
+                       signal_sems[i]->timeline.highest_submitted =
+                               MAX2(signal_sems[i]->timeline.highest_submitted, point->value);
+                       point->wait_count -= 2;
                        radv_timeline_trigger_waiters_locked(&signal_sems[i]->timeline, processing_list);
                        pthread_mutex_unlock(&signal_sems[i]->timeline.mutex);
                }
@@ -5574,8 +5590,6 @@ radv_timeline_wait_locked(struct radv_device *device,
        if (!point)
                return VK_SUCCESS;
 
-       point->wait_count++;
-
        pthread_mutex_unlock(&timeline->mutex);
 
        bool success = device->ws->wait_syncobj(device->ws, &point->syncobj, 1, true, abs_timeout);
@@ -5934,15 +5948,27 @@ void radv_DestroyBuffer(
        vk_free2(&device->alloc, pAllocator, buffer);
 }
 
-VkDeviceAddress radv_GetBufferDeviceAddressEXT(
+VkDeviceAddress radv_GetBufferDeviceAddressKHR(
        VkDevice                                    device,
-       const VkBufferDeviceAddressInfoEXT*         pInfo)
+       const VkBufferDeviceAddressInfoKHR*         pInfo)
 {
        RADV_FROM_HANDLE(radv_buffer, buffer, pInfo->buffer);
        return radv_buffer_get_va(buffer->bo) + buffer->offset;
 }
 
 
+uint64_t radv_GetBufferOpaqueCaptureAddressKHR(VkDevice device,
+                                              const VkBufferDeviceAddressInfoKHR* pInfo)
+{
+       return 0;
+}
+
+uint64_t radv_GetDeviceMemoryOpaqueCaptureAddressKHR(VkDevice device,
+                                                    const VkDeviceMemoryOpaqueCaptureAddressInfoKHR* pInfo)
+{
+       return 0;
+}
+
 static inline unsigned
 si_tile_mode_index(const struct radv_image_plane *plane, unsigned level, bool stencil)
 {
@@ -6674,6 +6700,7 @@ radv_init_sampler(struct radv_device *device,
        bool compat_mode = device->physical_device->rad_info.chip_class == GFX8 ||
                           device->physical_device->rad_info.chip_class == GFX9;
        unsigned filter_mode = V_008F30_SQ_IMG_FILTER_MODE_BLEND;
+       unsigned depth_compare_func = V_008F30_SQ_TEX_DEPTH_COMPARE_NEVER;
 
        const struct VkSamplerReductionModeCreateInfoEXT *sampler_reduction =
                vk_find_struct_const(pCreateInfo->pNext,
@@ -6681,11 +6708,14 @@ radv_init_sampler(struct radv_device *device,
        if (sampler_reduction)
                filter_mode = radv_tex_filter_mode(sampler_reduction->reductionMode);
 
+       if (pCreateInfo->compareEnable)
+               depth_compare_func = radv_tex_compare(pCreateInfo->compareOp);
+
        sampler->state[0] = (S_008F30_CLAMP_X(radv_tex_wrap(pCreateInfo->addressModeU)) |
                             S_008F30_CLAMP_Y(radv_tex_wrap(pCreateInfo->addressModeV)) |
                             S_008F30_CLAMP_Z(radv_tex_wrap(pCreateInfo->addressModeW)) |
                             S_008F30_MAX_ANISO_RATIO(max_aniso_ratio) |
-                            S_008F30_DEPTH_COMPARE_FUNC(radv_tex_compare(pCreateInfo->compareOp)) |
+                            S_008F30_DEPTH_COMPARE_FUNC(depth_compare_func) |
                             S_008F30_FORCE_UNNORMALIZED(pCreateInfo->unnormalizedCoordinates ? 1 : 0) |
                             S_008F30_ANISO_THRESHOLD(max_aniso_ratio >> 1) |
                             S_008F30_ANISO_BIAS(max_aniso_ratio) |