radv: Implement VK_EXT_discard_rectangles.
[mesa.git] / src / amd / vulkan / radv_device.c
index 788252c2c56a3d44d90eae270f220685996df655..baffa41d31694301e74b326b3685c13a86696ea3 100644 (file)
@@ -263,6 +263,12 @@ radv_physical_device_init(struct radv_physical_device *device,
         */
        device->has_clear_state = device->rad_info.chip_class >= CIK;
 
+       device->cpdma_prefetch_writes_memory = device->rad_info.chip_class <= VI;
+
+       /* Vega10/Raven need a special workaround for a hardware bug. */
+       device->has_scissor_bug = device->rad_info.family == CHIP_VEGA10 ||
+                                 device->rad_info.family == CHIP_RAVEN;
+
        radv_physical_device_init_mem_types(device);
 
        result = radv_init_wsi(device);
@@ -343,6 +349,8 @@ radv_get_debug_option_name(int id)
 static const struct debug_control radv_perftest_options[] = {
        {"nobatchchain", RADV_PERFTEST_NO_BATCHCHAIN},
        {"sisched", RADV_PERFTEST_SISCHED},
+       {"localbos", RADV_PERFTEST_LOCAL_BOS},
+       {"binning", RADV_PERFTEST_BINNING},
        {NULL, 0}
 };
 
@@ -786,6 +794,12 @@ void radv_GetPhysicalDeviceProperties2KHR(
                        properties->pointClippingBehavior = VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES_KHR;
                        break;
                }
+               case  VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT: {
+                       VkPhysicalDeviceDiscardRectanglePropertiesEXT *properties =
+                           (VkPhysicalDeviceDiscardRectanglePropertiesEXT*)ext;
+                       properties->maxDiscardRectangles = MAX_DISCARD_RECTANGLES;
+                       break;
+               }
                default:
                        break;
                }
@@ -1079,6 +1093,13 @@ VkResult radv_CreateDevice(
                }
        }
 
+       device->pbb_allowed = device->physical_device->rad_info.chip_class >= GFX9 &&
+                             (device->instance->perftest_flags & RADV_PERFTEST_BINNING);
+
+       /* Disabled and not implemented for now. */
+       device->dfsm_allowed = device->pbb_allowed && false;
+
+
 #if HAVE_LLVM < 0x0400
        device->llvm_supports_spill = false;
 #else
@@ -1594,7 +1615,9 @@ radv_get_preamble_cs(struct radv_queue *queue,
                                                                 size,
                                                                 4096,
                                                                 RADEON_DOMAIN_VRAM,
-                                                                RADEON_FLAG_CPU_ACCESS|RADEON_FLAG_NO_INTERPROCESS_SHARING);
+                                                                RADEON_FLAG_CPU_ACCESS |
+                                                                RADEON_FLAG_NO_INTERPROCESS_SHARING |
+                                                                RADEON_FLAG_READ_ONLY);
                if (!descriptor_bo)
                        goto fail;
        } else
@@ -3180,7 +3203,8 @@ radv_initialise_color_surface(struct radv_device *device,
                                max_uncompressed_block_size = V_028C78_MAX_BLOCK_SIZE_128B;
                }
 
-               if (iview->image->usage & (VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT)) {
+               if (iview->image->usage & (VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
+                                          VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)) {
                        independent_64b_blocks = 1;
                        max_compressed_block_size = V_028C78_MAX_BLOCK_SIZE_64B;
                } else
@@ -3808,8 +3832,8 @@ void radv_GetPhysicalDeviceExternalSemaphorePropertiesKHR(
 {
        RADV_FROM_HANDLE(radv_physical_device, pdevice, physicalDevice);
 
-       /* Require has_syncobj_wait for the syncobj signal ioctl introduced at virtually the same time */
-       if (pdevice->rad_info.has_syncobj_wait &&
+       /* Require has_syncobj_wait_for_submit for the syncobj signal ioctl introduced at virtually the same time */
+       if (pdevice->rad_info.has_syncobj_wait_for_submit &&
            (pExternalSemaphoreInfo->handleType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR || 
             pExternalSemaphoreInfo->handleType == VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT_KHR)) {
                pExternalSemaphoreProperties->exportFromImportedHandleTypes = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR | VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT_KHR;
@@ -3889,7 +3913,7 @@ void radv_GetPhysicalDeviceExternalFencePropertiesKHR(
 {
        RADV_FROM_HANDLE(radv_physical_device, pdevice, physicalDevice);
 
-       if (pdevice->rad_info.has_syncobj_wait &&
+       if (pdevice->rad_info.has_syncobj_wait_for_submit &&
            (pExternalFenceInfo->handleType == VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR || 
             pExternalFenceInfo->handleType == VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR)) {
                pExternalFenceProperties->exportFromImportedHandleTypes = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR | VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR;