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

Author: James Glanville <[email protected]>
Date:   Tue Apr 25 22:41:51 2023 +0100

pvr: Improve support for image clears

Depth/stencil surfaces are not PBE renderable, so a compatible format must
be used instead. The code to calculate this compatible format was not called
when configuring the PBE, and it was missing formats.

Also the code to calculate PBE swizzles was throwing an error in unhandled
cases, rather than using the pre-calculated defaults which was the correct
behaviour.

Fixes blits in dEQP-VK.draw.renderpass.depth_clamp.d32_sfloat

Signed-off-by: James Glanville <[email protected]>
Signed-off-by: Karmjit Mahil <[email protected]>
Reviewed-by: Frank Binns <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22748>

---

 src/imagination/vulkan/pvr_job_transfer.c | 46 +++++++++++++++++++------------
 1 file changed, 28 insertions(+), 18 deletions(-)

diff --git a/src/imagination/vulkan/pvr_job_transfer.c 
b/src/imagination/vulkan/pvr_job_transfer.c
index 1dab35936a1..87ee9ce861e 100644
--- a/src/imagination/vulkan/pvr_job_transfer.c
+++ b/src/imagination/vulkan/pvr_job_transfer.c
@@ -707,6 +707,32 @@ pvr_mem_layout_spec(const struct pvr_transfer_cmd_surface 
*surface,
    return VK_SUCCESS;
 }
 
+static uint32_t pvr_get_transfer_pbe_packmode(VkFormat format)
+{
+   uint32_t pbe_pack_mode = pvr_get_pbe_packmode(format);
+   const uint32_t red_width =
+      vk_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0U);
+
+   if (format == VK_FORMAT_A2B10G10R10_UINT_PACK32 ||
+       format == VK_FORMAT_A2R10G10B10_UINT_PACK32) {
+      pbe_pack_mode = PVRX(PBESTATE_PACKMODE_R10B10G10A2);
+   } else if (format == VK_FORMAT_B8G8R8A8_UNORM ||
+              format == VK_FORMAT_R8G8B8A8_UNORM) {
+      pbe_pack_mode = PVRX(PBESTATE_PACKMODE_U8U8U8U8);
+   } else if (format == VK_FORMAT_D16_UNORM) {
+      pbe_pack_mode = PVRX(PBESTATE_PACKMODE_U16);
+   } else if (format == VK_FORMAT_D32_SFLOAT) {
+      pbe_pack_mode = PVRX(PBESTATE_PACKMODE_F32);
+   } else if (format != VK_FORMAT_X8_D24_UNORM_PACK32 && red_width <= 8U &&
+              vk_format_is_normalized(format)) {
+      pbe_pack_mode = PVRX(PBESTATE_PACKMODE_F16F16F16F16);
+   } else if (vk_format_is_srgb(format)) {
+      pbe_pack_mode = PVRX(PBESTATE_PACKMODE_F16F16F16F16);
+   }
+
+   return pbe_pack_mode;
+}
+
 static VkResult
 pvr_pbe_setup_codegen_defaults(const struct pvr_device_info *dev_info,
                                const struct pvr_transfer_cmd *transfer_cmd,
@@ -740,7 +766,7 @@ pvr_pbe_setup_codegen_defaults(const struct pvr_device_info 
*dev_info,
                                     &surface_params->gamma);
 
    surface_params->is_normalized = vk_format_is_normalized(format);
-   surface_params->pbe_packmode = pvr_get_pbe_packmode(format);
+   surface_params->pbe_packmode = pvr_get_transfer_pbe_packmode(format);
    surface_params->nr_components = vk_format_get_nr_components(format);
 
    result = pvr_mem_layout_spec(dst,
@@ -1008,8 +1034,6 @@ static void pvr_pbe_setup_swizzle(const struct 
pvr_transfer_cmd *transfer_cmd,
          default:
             break;
          }
-      } else {
-         unreachable("Invalid case in pvr_pbe_setup_swizzle.");
       }
       break;
    }
@@ -2231,26 +2255,12 @@ static VkResult pvr_pack_clear_color(VkFormat format,
 {
    const uint32_t red_width =
       vk_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0U);
-   uint32_t pbe_pack_mode = pvr_get_pbe_packmode(format);
+   uint32_t pbe_pack_mode = pvr_get_transfer_pbe_packmode(format);
    const bool pbe_norm = vk_format_is_normalized(format);
 
    if (pbe_pack_mode == PVRX(PBESTATE_PACKMODE_INVALID))
       return vk_error(NULL, VK_ERROR_FORMAT_NOT_SUPPORTED);
 
-   if (format == VK_FORMAT_A2B10G10R10_UINT_PACK32 ||
-       format == VK_FORMAT_A2R10G10B10_UINT_PACK32) {
-      pbe_pack_mode = PVRX(PBESTATE_PACKMODE_R10B10G10A2);
-   } else if (format == VK_FORMAT_B8G8R8A8_UNORM ||
-              format == VK_FORMAT_R8G8B8A8_UNORM) {
-      pbe_pack_mode = PVRX(PBESTATE_PACKMODE_U8U8U8U8);
-   } else if (format != VK_FORMAT_D16_UNORM &&
-              format != VK_FORMAT_X8_D24_UNORM_PACK32 && red_width <= 8U &&
-              vk_format_is_normalized(format)) {
-      pbe_pack_mode = PVRX(PBESTATE_PACKMODE_F16F16F16F16);
-   } else if (vk_format_is_srgb(format)) {
-      pbe_pack_mode = PVRX(PBESTATE_PACKMODE_F16F16F16F16);
-   }
-
    /* Set packed color based on PBE pack mode and PBE norm. */
    switch (pbe_pack_mode) {
    case PVRX(PBESTATE_PACKMODE_U8U8U8U8):

Reply via email to