Module: Mesa
Branch: main
Commit: 205938cd39c49af3ee3d60ff54e152bf2d66c989
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=205938cd39c49af3ee3d60ff54e152bf2d66c989

Author: Iago Toral Quiroga <ito...@igalia.com>
Date:   Tue Dec 12 11:10:26 2023 +0100

v3dv: disallow image stores on VK_KHR_DISPLAY surfaces

Display surfaces must be linear and V3D can only do linear TMU access
for 1D images. This would also restrict sampling usages, however, we
can currently work around those in the driver at a performance penalty.

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/10268
Reviewed-by: Alejandro PiƱeiro <apinhe...@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26647>

---

 src/broadcom/vulkan/v3dv_wsi.c | 46 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)

diff --git a/src/broadcom/vulkan/v3dv_wsi.c b/src/broadcom/vulkan/v3dv_wsi.c
index 404a64d0e17..78af39448ce 100644
--- a/src/broadcom/vulkan/v3dv_wsi.c
+++ b/src/broadcom/vulkan/v3dv_wsi.c
@@ -27,6 +27,7 @@
 #include "vk_util.h"
 #include "wsi_common.h"
 #include "wsi_common_drm.h"
+#include "wsi_common_entrypoints.h"
 
 static VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL
 v3dv_wsi_proc_addr(VkPhysicalDevice physicalDevice, const char *pName)
@@ -43,6 +44,51 @@ v3dv_wsi_can_present_on_device(VkPhysicalDevice _pdevice, 
int fd)
    return wsi_common_drm_devices_equal(fd, pdevice->display_fd);
 }
 
+
+static void
+filter_surface_capabilities(VkSurfaceKHR _surface,
+                            VkSurfaceCapabilitiesKHR *caps)
+{
+   ICD_FROM_HANDLE(VkIcdSurfaceBase, surface, _surface);
+
+   /* Display images must be linear so they are restricted. This would
+    * affect sampling usages too, but we don't restrict those since we
+    * support on-the-fly conversion to UIF when sampling for simple 2D
+    * images at a performance penalty.
+    */
+   if (surface->platform == VK_ICD_WSI_PLATFORM_DISPLAY)
+      caps->supportedUsageFlags &= ~VK_IMAGE_USAGE_STORAGE_BIT;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL
+v3dv_GetPhysicalDeviceSurfaceCapabilitiesKHR(
+    VkPhysicalDevice                            physicalDevice,
+    VkSurfaceKHR                                surface,
+    VkSurfaceCapabilitiesKHR*                   pSurfaceCapabilities)
+{
+   VkResult result;
+   result = wsi_GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice,
+                                                        surface,
+                                                        pSurfaceCapabilities);
+   filter_surface_capabilities(surface, pSurfaceCapabilities);
+   return result;
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL
+v3dv_GetPhysicalDeviceSurfaceCapabilities2KHR(
+    VkPhysicalDevice                            physicalDevice,
+    const VkPhysicalDeviceSurfaceInfo2KHR*      pSurfaceInfo,
+    VkSurfaceCapabilities2KHR*                  pSurfaceCapabilities)
+{
+   VkResult result;
+   result = wsi_GetPhysicalDeviceSurfaceCapabilities2KHR(physicalDevice,
+                                                         pSurfaceInfo,
+                                                         pSurfaceCapabilities);
+   filter_surface_capabilities(pSurfaceInfo->surface,
+                               &pSurfaceCapabilities->surfaceCapabilities);
+   return result;
+}
+
 VkResult
 v3dv_wsi_init(struct v3dv_physical_device *physical_device)
 {

Reply via email to