v3dv: support compressed formats with TFU unit
authorIago Toral Quiroga <itoral@igalia.com>
Thu, 26 Nov 2020 11:34:52 +0000 (12:34 +0100)
committerIago Toral Quiroga <itoral@igalia.com>
Mon, 30 Nov 2020 12:19:27 +0000 (13:19 +0100)
Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7809>

src/broadcom/vulkan/v3dv_formats.c
src/broadcom/vulkan/v3dv_meta_copy.c

index 722698985b5c55558ceee7c62a053199770045cf..373306117c36d334a7822faeaa33a6b55f3bfca9 100644 (file)
@@ -359,6 +359,13 @@ v3dv_tfu_supports_tex_format(const struct v3d_device_info *devinfo,
    case TEXTURE_DATA_FORMAT_R32F:
    case TEXTURE_DATA_FORMAT_RG32F:
    case TEXTURE_DATA_FORMAT_RGBA32F:
+   case TEXTURE_DATA_FORMAT_RGB8_ETC2:
+   case TEXTURE_DATA_FORMAT_RGB8_PUNCHTHROUGH_ALPHA1:
+   case TEXTURE_DATA_FORMAT_RGBA8_ETC2_EAC:
+   case TEXTURE_DATA_FORMAT_R11_EAC:
+   case TEXTURE_DATA_FORMAT_SIGNED_R11_EAC:
+   case TEXTURE_DATA_FORMAT_RG11_EAC:
+   case TEXTURE_DATA_FORMAT_SIGNED_RG11_EAC:
       return true;
    default:
       return false;
index 474bb6f0a3a0c414b99e2ab992cefb12877bfa9c..b0069f0233d40633ac39f83467254754dc8f48b7 100644 (file)
@@ -2372,7 +2372,7 @@ copy_buffer_to_image_tfu(struct v3dv_cmd_buffer *cmd_buffer,
                          struct v3dv_buffer *buffer,
                          const VkBufferImageCopy *region)
 {
-   VkFormat vk_format = image->vk_format;
+   const VkFormat vk_format = image->vk_format;
    const struct v3dv_format *format = image->format;
 
    /* Format must be supported for texturing */
@@ -2410,6 +2410,11 @@ copy_buffer_to_image_tfu(struct v3dv_cmd_buffer *cmd_buffer,
    if (width != image->extent.width || height != image->extent.height)
       return false;
 
+   const uint32_t block_w = vk_format_get_blockwidth(image->vk_format);
+   const uint32_t block_h = vk_format_get_blockheight(image->vk_format);
+   width = DIV_ROUND_UP(width, block_w);
+   height = DIV_ROUND_UP(height, block_h);
+
    const struct v3d_resource_slice *slice = &image->slices[mip_level];
 
    uint32_t num_layers;
@@ -2431,7 +2436,7 @@ copy_buffer_to_image_tfu(struct v3dv_cmd_buffer *cmd_buffer,
       uint32_t layer = region->imageSubresource.baseArrayLayer + i;
 
       struct drm_v3d_submit_tfu tfu = {
-         .ios = (height << 16) | width,
+         .ios = ((height * block_h) << 16) | (width * block_w),
          .bo_handles = {
             dst_bo->handle,
             src_bo != dst_bo ? src_bo->handle : 0
@@ -5305,6 +5310,9 @@ v3dv_CmdBlitImage(VkCommandBuffer commandBuffer,
    assert(dst->samples == VK_SAMPLE_COUNT_1_BIT &&
           src->samples == VK_SAMPLE_COUNT_1_BIT);
 
+   /* We don't export VK_FORMAT_FEATURE_BLIT_DST_BIT on compressed formats */
+   assert(!vk_format_is_compressed(dst->vk_format));
+
    for (uint32_t i = 0; i < regionCount; i++) {
       if (blit_tfu(cmd_buffer, dst, src, &pRegions[i], filter))
          continue;