ac: declare an enum for the OOB select field on GFX10
[mesa.git] / src / amd / vulkan / radv_device.c
index 15cc163c1401f619604aa20c495352d7de4d3c06..d56125d328e49f490d26a44007fe84010d2f8671 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,8 +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->rad_info.chip_class >= GFX8 &&
-                                   (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 &&
@@ -626,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;
                }
@@ -1028,8 +1029,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: {
@@ -1048,7 +1049,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: {
@@ -1059,6 +1060,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;
@@ -1183,6 +1192,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;
                }
@@ -1190,25 +1205,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),
@@ -1264,11 +1286,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,
@@ -1386,17 +1408,18 @@ 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 |
-                                                       VK_SUBGROUP_FEATURE_BALLOT_BIT |
-                                                       VK_SUBGROUP_FEATURE_QUAD_BIT |
-                                                       VK_SUBGROUP_FEATURE_VOTE_BIT;
-                       if (pdevice->rad_info.chip_class >= GFX8) {
-                               properties->supportedOperations |=
+                                                       VK_SUBGROUP_FEATURE_VOTE_BIT |
                                                        VK_SUBGROUP_FEATURE_ARITHMETIC_BIT |
+                                                       VK_SUBGROUP_FEATURE_BALLOT_BIT |
                                                        VK_SUBGROUP_FEATURE_CLUSTERED_BIT |
+                                                       VK_SUBGROUP_FEATURE_QUAD_BIT;
+                       if (pdevice->rad_info.chip_class == GFX8 ||
+                           pdevice->rad_info.chip_class == GFX9) {
+                               properties->supportedOperations |=
                                                        VK_SUBGROUP_FEATURE_SHUFFLE_BIT |
                                                        VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT;
                        }
@@ -1406,11 +1429,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 +1507,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 +1537,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 +1608,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 +1628,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: {
@@ -2210,16 +2224,69 @@ static bool radv_close_all_fds(const int *keep_fds, int keep_fd_count)
        return true;
 }
 
+static bool secure_compile_open_fifo_fds(struct radv_secure_compile_state *sc,
+                                        int *fd_server, int *fd_client,
+                                        unsigned process, bool make_fifo)
+{
+       bool result = false;
+       char *fifo_server_path = NULL;
+       char *fifo_client_path = NULL;
+
+       if (asprintf(&fifo_server_path, "/tmp/radv_server_%s_%u", sc->uid, process) == -1)
+               goto open_fifo_exit;
+
+       if (asprintf(&fifo_client_path, "/tmp/radv_client_%s_%u", sc->uid, process) == -1)
+               goto open_fifo_exit;
+
+       if (make_fifo) {
+               int file1 = mkfifo(fifo_server_path, 0666);
+               if(file1 < 0)
+                       goto open_fifo_exit;
+
+               int file2 = mkfifo(fifo_client_path, 0666);
+               if(file2 < 0)
+                       goto open_fifo_exit;
+       }
+
+       *fd_server = open(fifo_server_path, O_RDWR);
+       if(*fd_server < 1)
+               goto open_fifo_exit;
+
+       *fd_client = open(fifo_client_path, O_RDWR);
+       if(*fd_client < 1) {
+               close(*fd_server);
+               goto open_fifo_exit;
+       }
+
+       result = true;
+
+open_fifo_exit:
+       free(fifo_server_path);
+       free(fifo_client_path);
+
+       return result;
+}
+
 static void run_secure_compile_device(struct radv_device *device, unsigned process,
-                                     int fd_secure_input, int fd_secure_output)
+                                     int fd_idle_device_output)
 {
+       int fd_secure_input;
+       int fd_secure_output;
+       bool fifo_result = secure_compile_open_fifo_fds(device->sc_state,
+                                                       &fd_secure_input,
+                                                       &fd_secure_output,
+                                                       process, false);
+
        enum radv_secure_compile_type sc_type;
 
        const int needed_fds[] = {
                fd_secure_input,
                fd_secure_output,
+               fd_idle_device_output,
        };
-       if (!radv_close_all_fds(needed_fds, ARRAY_SIZE(needed_fds)) || install_seccomp_filter() == -1) {
+
+       if (!fifo_result || !radv_close_all_fds(needed_fds, ARRAY_SIZE(needed_fds)) ||
+           install_seccomp_filter() == -1) {
                sc_type = RADV_SC_TYPE_INIT_FAILURE;
        } else {
                sc_type = RADV_SC_TYPE_INIT_SUCCESS;
@@ -2227,7 +2294,7 @@ static void run_secure_compile_device(struct radv_device *device, unsigned proce
                device->sc_state->secure_compile_processes[process].fd_secure_output = fd_secure_output;
        }
 
-       write(fd_secure_output, &sc_type, sizeof(sc_type));
+       write(fd_idle_device_output, &sc_type, sizeof(sc_type));
 
        if (sc_type == RADV_SC_TYPE_INIT_FAILURE)
                goto secure_compile_exit;
@@ -2375,6 +2442,89 @@ static void run_secure_compile_device(struct radv_device *device, unsigned proce
                }
        }
 
+secure_compile_exit:
+       close(fd_secure_input);
+       close(fd_secure_output);
+       close(fd_idle_device_output);
+       _exit(0);
+}
+
+static enum radv_secure_compile_type fork_secure_compile_device(struct radv_device *device, unsigned process)
+{
+       int fd_secure_input[2];
+       int fd_secure_output[2];
+
+       /* create pipe descriptors (used to communicate between processes) */
+       if (pipe(fd_secure_input) == -1 || pipe(fd_secure_output) == -1)
+               return RADV_SC_TYPE_INIT_FAILURE;
+
+
+       int sc_pid;
+       if ((sc_pid = fork()) == 0) {
+               device->sc_state->secure_compile_thread_counter = process;
+               run_secure_compile_device(device, process, fd_secure_output[1]);
+       } else {
+               if (sc_pid == -1)
+                       return RADV_SC_TYPE_INIT_FAILURE;
+
+               /* Read the init result returned from the secure process */
+               enum radv_secure_compile_type sc_type;
+               bool sc_read = radv_sc_read(fd_secure_output[0], &sc_type, sizeof(sc_type), true);
+
+               if (sc_type == RADV_SC_TYPE_INIT_FAILURE || !sc_read) {
+                       close(fd_secure_input[0]);
+                       close(fd_secure_input[1]);
+                       close(fd_secure_output[1]);
+                       close(fd_secure_output[0]);
+                       int status;
+                       waitpid(sc_pid, &status, 0);
+
+                       return RADV_SC_TYPE_INIT_FAILURE;
+               } else {
+                       assert(sc_type == RADV_SC_TYPE_INIT_SUCCESS);
+                       write(device->sc_state->secure_compile_processes[process].fd_secure_output, &sc_type, sizeof(sc_type));
+
+                       close(fd_secure_input[0]);
+                       close(fd_secure_input[1]);
+                       close(fd_secure_output[1]);
+                       close(fd_secure_output[0]);
+
+                       int status;
+                       waitpid(sc_pid, &status, 0);
+               }
+       }
+
+       return RADV_SC_TYPE_INIT_SUCCESS;
+}
+
+/* Run a bare bones fork of a device that was forked right after its creation.
+ * This device will have low overhead when it is forked again before each
+ * pipeline compilation. This device sits idle and its only job is to fork
+ * itself.
+ */
+static void run_secure_compile_idle_device(struct radv_device *device, unsigned process,
+                                           int fd_secure_input, int fd_secure_output)
+{
+       enum radv_secure_compile_type sc_type = RADV_SC_TYPE_INIT_SUCCESS;
+       device->sc_state->secure_compile_processes[process].fd_secure_input = fd_secure_input;
+       device->sc_state->secure_compile_processes[process].fd_secure_output = fd_secure_output;
+
+       write(fd_secure_output, &sc_type, sizeof(sc_type));
+
+       while (true) {
+               radv_sc_read(fd_secure_input, &sc_type, sizeof(sc_type), false);
+
+               if (sc_type == RADV_SC_TYPE_FORK_DEVICE) {
+                       sc_type = fork_secure_compile_device(device, process);
+
+                       if (sc_type == RADV_SC_TYPE_INIT_FAILURE)
+                               goto secure_compile_exit;
+
+               } else if (sc_type == RADV_SC_TYPE_DESTROY_DEVICE) {
+                       goto secure_compile_exit;
+               }
+       }
+
 secure_compile_exit:
        close(fd_secure_input);
        close(fd_secure_output);
@@ -2395,7 +2545,7 @@ static void destroy_secure_compile_device(struct radv_device *device, unsigned p
        waitpid(device->sc_state->secure_compile_processes[process].sc_pid, &status, 0);
 }
 
-static VkResult fork_secure_compile_device(struct radv_device *device)
+static VkResult fork_secure_compile_idle_device(struct radv_device *device)
 {
        device->sc_state = vk_zalloc(&device->alloc,
                                     sizeof(struct radv_secure_compile_state),
@@ -2403,6 +2553,15 @@ static VkResult fork_secure_compile_device(struct radv_device *device)
 
        mtx_init(&device->sc_state->secure_compile_mutex, mtx_plain);
 
+       pid_t upid = getpid();
+       time_t seconds = time(NULL);
+
+       char *uid;
+       if (asprintf(&uid, "%ld_%ld", (long) upid, (long) seconds) == -1)
+               return VK_ERROR_INITIALIZATION_FAILED;
+
+       device->sc_state->uid = uid;
+
        uint8_t sc_threads = device->instance->num_sc_threads;
        int fd_secure_input[MAX_SC_PROCS][2];
        int fd_secure_output[MAX_SC_PROCS][2];
@@ -2422,7 +2581,7 @@ static VkResult fork_secure_compile_device(struct radv_device *device)
        for (unsigned process = 0; process < sc_threads; process++) {
                if ((device->sc_state->secure_compile_processes[process].sc_pid = fork()) == 0) {
                        device->sc_state->secure_compile_thread_counter = process;
-                       run_secure_compile_device(device, process, fd_secure_input[process][0], fd_secure_output[process][1]);
+                       run_secure_compile_idle_device(device, process, fd_secure_input[process][0], fd_secure_output[process][1]);
                } else {
                        if (device->sc_state->secure_compile_processes[process].sc_pid == -1)
                                return VK_ERROR_INITIALIZATION_FAILED;
@@ -2431,7 +2590,18 @@ static VkResult fork_secure_compile_device(struct radv_device *device)
                        enum radv_secure_compile_type sc_type;
                        bool sc_read = radv_sc_read(fd_secure_output[process][0], &sc_type, sizeof(sc_type), true);
 
-                       if (sc_type == RADV_SC_TYPE_INIT_FAILURE || !sc_read) {
+                       bool fifo_result;
+                       if (sc_read && sc_type == RADV_SC_TYPE_INIT_SUCCESS) {
+                               fifo_result = secure_compile_open_fifo_fds(device->sc_state,
+                                                                          &device->sc_state->secure_compile_processes[process].fd_server,
+                                                                          &device->sc_state->secure_compile_processes[process].fd_client,
+                                                                          process, true);
+
+                               device->sc_state->secure_compile_processes[process].fd_secure_input = fd_secure_input[process][1];
+                               device->sc_state->secure_compile_processes[process].fd_secure_output = fd_secure_output[process][0];
+                       }
+
+                       if (sc_type == RADV_SC_TYPE_INIT_FAILURE || !sc_read || !fifo_result) {
                                close(fd_secure_input[process][0]);
                                close(fd_secure_input[process][1]);
                                close(fd_secure_output[process][1]);
@@ -2445,10 +2615,6 @@ static VkResult fork_secure_compile_device(struct radv_device *device)
                                }
 
                                return VK_ERROR_INITIALIZATION_FAILED;
-                       } else {
-                               assert(sc_type == RADV_SC_TYPE_INIT_SUCCESS);
-                               device->sc_state->secure_compile_processes[process].fd_secure_input = fd_secure_input[process][1];
-                               device->sc_state->secure_compile_processes[process].fd_secure_output = fd_secure_output[process][0];
                        }
                }
        }
@@ -2535,7 +2701,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;
@@ -2687,7 +2854,8 @@ VkResult radv_CreateDevice(
        /* Fork device for secure compile as required */
        device->instance->num_sc_threads = sc_threads;
        if (radv_device_use_secure_compile(device->instance)) {
-               result = fork_secure_compile_device(device);
+
+               result = fork_secure_compile_idle_device(device);
                if (result != VK_SUCCESS)
                        goto fail_meta;
        }
@@ -2751,15 +2919,16 @@ void radv_DestroyDevice(
 
        pthread_cond_destroy(&device->timeline_cond);
        radv_bo_list_finish(&device->bo_list);
-
        if (radv_device_use_secure_compile(device->instance)) {
                for (unsigned i = 0; i < device->instance->num_sc_threads; i++ ) {
                        destroy_secure_compile_device(device, i);
                }
        }
 
-       if (device->sc_state)
+       if (device->sc_state) {
+               free(device->sc_state->uid);
                vk_free(&device->alloc, device->sc_state->secure_compile_processes);
+       }
        vk_free(&device->alloc, device->sc_state);
        vk_free(&device->alloc, device);
 }
@@ -2864,7 +3033,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) |
@@ -2885,7 +3054,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) |
@@ -2911,7 +3080,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) |
@@ -2934,7 +3103,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) |
@@ -2960,7 +3129,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) |
@@ -2977,7 +3146,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) |
@@ -3138,9 +3307,28 @@ radv_emit_tess_factor_ring(struct radv_queue *queue, struct radeon_cmdbuf *cs,
        }
 }
 
+static void
+radv_emit_graphics_scratch(struct radv_queue *queue, struct radeon_cmdbuf *cs,
+                           uint32_t size_per_wave, uint32_t waves,
+                           struct radeon_winsys_bo *scratch_bo)
+{
+       if (queue->queue_family_index != RADV_QUEUE_GENERAL)
+               return;
+
+       if (!scratch_bo)
+               return;
+
+       radv_cs_add_buffer(queue->device->ws, cs, scratch_bo);
+
+       radeon_set_context_reg(cs, R_0286E8_SPI_TMPRING_SIZE,
+                              S_0286E8_WAVES(waves) |
+                              S_0286E8_WAVESIZE(round_up_u32(size_per_wave, 1024)));
+}
+
 static void
 radv_emit_compute_scratch(struct radv_queue *queue, struct radeon_cmdbuf *cs,
-                         struct radeon_winsys_bo *compute_scratch_bo)
+                          uint32_t size_per_wave, uint32_t waves,
+                          struct radeon_winsys_bo *compute_scratch_bo)
 {
        uint64_t scratch_va;
 
@@ -3155,6 +3343,10 @@ radv_emit_compute_scratch(struct radv_queue *queue, struct radeon_cmdbuf *cs,
        radeon_emit(cs, scratch_va);
        radeon_emit(cs, S_008F04_BASE_ADDRESS_HI(scratch_va >> 32) |
                        S_008F04_SWIZZLE_ENABLE(1));
+
+       radeon_set_sh_reg(cs, R_00B860_COMPUTE_TMPRING_SIZE,
+                        S_00B860_WAVES(waves) |
+                        S_00B860_WAVESIZE(round_up_u32(size_per_wave, 1024)));
 }
 
 static void
@@ -3235,8 +3427,10 @@ radv_init_compute_state(struct radeon_cmdbuf *cs, struct radv_queue *queue)
 
 static VkResult
 radv_get_preamble_cs(struct radv_queue *queue,
-                     uint32_t scratch_size,
-                     uint32_t compute_scratch_size,
+                    uint32_t scratch_size_per_wave,
+                    uint32_t scratch_waves,
+                    uint32_t compute_scratch_size_per_wave,
+                    uint32_t compute_scratch_waves,
                     uint32_t esgs_ring_size,
                     uint32_t gsvs_ring_size,
                     bool needs_tess_rings,
@@ -3280,8 +3474,22 @@ radv_get_preamble_cs(struct radv_queue *queue,
        tess_offchip_ring_size = max_offchip_buffers *
                queue->device->tess_offchip_block_dw_size * 4;
 
-       if (scratch_size <= queue->scratch_size &&
-           compute_scratch_size <= queue->compute_scratch_size &&
+       scratch_size_per_wave = MAX2(scratch_size_per_wave, queue->scratch_size_per_wave);
+       if (scratch_size_per_wave)
+               scratch_waves = MIN2(scratch_waves, UINT32_MAX / scratch_size_per_wave);
+       else
+               scratch_waves = 0;
+
+       compute_scratch_size_per_wave = MAX2(compute_scratch_size_per_wave, queue->compute_scratch_size_per_wave);
+       if (compute_scratch_size_per_wave)
+               compute_scratch_waves = MIN2(compute_scratch_waves, UINT32_MAX / compute_scratch_size_per_wave);
+       else
+               compute_scratch_waves = 0;
+
+       if (scratch_size_per_wave <= queue->scratch_size_per_wave &&
+           scratch_waves <= queue->scratch_waves &&
+           compute_scratch_size_per_wave <= queue->compute_scratch_size_per_wave &&
+           compute_scratch_waves <= queue->compute_scratch_waves &&
            esgs_ring_size <= queue->esgs_ring_size &&
            gsvs_ring_size <= queue->gsvs_ring_size &&
            !add_tess_rings && !add_gds && !add_sample_positions &&
@@ -3289,13 +3497,16 @@ radv_get_preamble_cs(struct radv_queue *queue,
                *initial_full_flush_preamble_cs = queue->initial_full_flush_preamble_cs;
                *initial_preamble_cs = queue->initial_preamble_cs;
                *continue_preamble_cs = queue->continue_preamble_cs;
-               if (!scratch_size && !compute_scratch_size && !esgs_ring_size && !gsvs_ring_size &&
-                   !needs_tess_rings && !needs_gds && !needs_sample_positions)
+               if (!scratch_size_per_wave && !compute_scratch_size_per_wave &&
+                   !esgs_ring_size && !gsvs_ring_size && !needs_tess_rings &&
+                   !needs_gds && !needs_sample_positions)
                        *continue_preamble_cs = NULL;
                return VK_SUCCESS;
        }
 
-       if (scratch_size > queue->scratch_size) {
+       uint32_t scratch_size = scratch_size_per_wave * scratch_waves;
+       uint32_t queue_scratch_size = queue->scratch_size_per_wave * queue->scratch_waves;
+       if (scratch_size > queue_scratch_size) {
                scratch_bo = queue->device->ws->buffer_create(queue->device->ws,
                                                              scratch_size,
                                                              4096,
@@ -3307,7 +3518,9 @@ radv_get_preamble_cs(struct radv_queue *queue,
        } else
                scratch_bo = queue->scratch_bo;
 
-       if (compute_scratch_size > queue->compute_scratch_size) {
+       uint32_t compute_scratch_size = compute_scratch_size_per_wave * compute_scratch_waves;
+       uint32_t compute_queue_scratch_size = queue->compute_scratch_size_per_wave * queue->compute_scratch_waves;
+       if (compute_scratch_size > compute_queue_scratch_size) {
                compute_scratch_bo = queue->device->ws->buffer_create(queue->device->ws,
                                                                      compute_scratch_size,
                                                                      4096,
@@ -3475,7 +3688,10 @@ radv_get_preamble_cs(struct radv_queue *queue,
                radv_emit_tess_factor_ring(queue, cs, hs_offchip_param,
                                           tess_factor_ring_size, tess_rings_bo);
                radv_emit_global_shader_pointers(queue, cs, descriptor_bo);
-               radv_emit_compute_scratch(queue, cs, compute_scratch_bo);
+               radv_emit_compute_scratch(queue, cs, compute_scratch_size_per_wave,
+                                         compute_scratch_waves, compute_scratch_bo);
+               radv_emit_graphics_scratch(queue, cs, scratch_size_per_wave,
+                                          scratch_waves, scratch_bo);
 
                if (gds_bo)
                        radv_cs_add_buffer(queue->device->ws, cs, gds_bo);
@@ -3528,15 +3744,17 @@ radv_get_preamble_cs(struct radv_queue *queue,
                if (queue->scratch_bo)
                        queue->device->ws->buffer_destroy(queue->scratch_bo);
                queue->scratch_bo = scratch_bo;
-               queue->scratch_size = scratch_size;
        }
+       queue->scratch_size_per_wave = scratch_size_per_wave;
+       queue->scratch_waves = scratch_waves;
 
        if (compute_scratch_bo != queue->compute_scratch_bo) {
                if (queue->compute_scratch_bo)
                        queue->device->ws->buffer_destroy(queue->compute_scratch_bo);
                queue->compute_scratch_bo = compute_scratch_bo;
-               queue->compute_scratch_size = compute_scratch_size;
        }
+       queue->compute_scratch_size_per_wave = compute_scratch_size_per_wave;
+       queue->compute_scratch_waves = compute_scratch_waves;
 
        if (esgs_ring_bo != queue->esgs_ring_bo) {
                if (queue->esgs_ring_bo)
@@ -3763,8 +3981,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);
                }
        }
@@ -3773,11 +3990,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);
                }
@@ -3832,8 +4047,8 @@ radv_get_preambles(struct radv_queue *queue,
                    struct radeon_cmdbuf **initial_preamble_cs,
                    struct radeon_cmdbuf **continue_preamble_cs)
 {
-       uint32_t scratch_size = 0;
-       uint32_t compute_scratch_size = 0;
+       uint32_t scratch_size_per_wave = 0, waves_wanted = 0;
+       uint32_t compute_scratch_size_per_wave = 0, compute_waves_wanted = 0;
        uint32_t esgs_ring_size = 0, gsvs_ring_size = 0;
        bool tess_rings_needed = false;
        bool gds_needed = false;
@@ -3843,9 +4058,12 @@ radv_get_preambles(struct radv_queue *queue,
                RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer,
                                 cmd_buffers[j]);
 
-               scratch_size = MAX2(scratch_size, cmd_buffer->scratch_size_needed);
-               compute_scratch_size = MAX2(compute_scratch_size,
-                                           cmd_buffer->compute_scratch_size_needed);
+               scratch_size_per_wave = MAX2(scratch_size_per_wave, cmd_buffer->scratch_size_per_wave_needed);
+               waves_wanted = MAX2(waves_wanted, cmd_buffer->scratch_waves_wanted);
+               compute_scratch_size_per_wave = MAX2(compute_scratch_size_per_wave,
+                                                    cmd_buffer->compute_scratch_size_per_wave_needed);
+               compute_waves_wanted = MAX2(compute_waves_wanted,
+                                           cmd_buffer->compute_scratch_waves_wanted);
                esgs_ring_size = MAX2(esgs_ring_size, cmd_buffer->esgs_ring_size_needed);
                gsvs_ring_size = MAX2(gsvs_ring_size, cmd_buffer->gsvs_ring_size_needed);
                tess_rings_needed |= cmd_buffer->tess_rings_needed;
@@ -3853,11 +4071,12 @@ radv_get_preambles(struct radv_queue *queue,
                sample_positions_needed |= cmd_buffer->sample_positions_needed;
        }
 
-       return radv_get_preamble_cs(queue, scratch_size, compute_scratch_size,
-                                     esgs_ring_size, gsvs_ring_size, tess_rings_needed,
-                                     gds_needed, sample_positions_needed,
-                                     initial_full_flush_preamble_cs,
-                                     initial_preamble_cs, continue_preamble_cs);
+       return radv_get_preamble_cs(queue, scratch_size_per_wave, waves_wanted,
+                                   compute_scratch_size_per_wave, compute_waves_wanted,
+                                   esgs_ring_size, gsvs_ring_size, tess_rings_needed,
+                                   gds_needed, sample_positions_needed,
+                                   initial_full_flush_preamble_cs,
+                                   initial_preamble_cs, continue_preamble_cs);
 }
 
 struct radv_deferred_queue_submission {
@@ -5367,8 +5586,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);
@@ -5727,15 +5944,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)
 {