summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIago Toral Quiroga <itoral@igalia.com>2023-08-03 08:37:58 +0200
committerMarge Bot <emma+marge@anholt.net>2023-08-07 06:48:40 +0000
commit85c5b68823c2dd79e69946faf7afa3e3257e6970 (patch)
tree8dd98afc53d6242c98a4eac665ecaef45c0d448e
parent67be2b6e639890f640d2ac79773d13eee2054726 (diff)
v3dv: drop cpu path for buffer to image copies
We really want to avoid cpu jobs as much as possible. Also, the texel buffer path we have for this should be able to handle most cases. Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24466>
-rw-r--r--src/broadcom/vulkan/v3dv_meta_copy.c75
-rw-r--r--src/broadcom/vulkan/v3dv_private.h16
-rw-r--r--src/broadcom/vulkan/v3dv_queue.c56
3 files changed, 0 insertions, 147 deletions
diff --git a/src/broadcom/vulkan/v3dv_meta_copy.c b/src/broadcom/vulkan/v3dv_meta_copy.c
index c0ec888b8c7..b454486cd2e 100644
--- a/src/broadcom/vulkan/v3dv_meta_copy.c
+++ b/src/broadcom/vulkan/v3dv_meta_copy.c
@@ -3200,76 +3200,6 @@ copy_buffer_to_image_shader(struct v3dv_cmd_buffer *cmd_buffer,
}
}
-/**
- * Returns true if the implementation supports the requested operation (even if
- * it failed to process it, for example, due to an out-of-memory error).
- */
-static bool
-copy_buffer_to_image_cpu(struct v3dv_cmd_buffer *cmd_buffer,
- struct v3dv_image *image,
- struct v3dv_buffer *buffer,
- const VkBufferImageCopy2 *region)
-{
- /* FIXME */
- if (vk_format_is_depth_or_stencil(image->vk.format))
- return false;
-
- if (vk_format_is_compressed(image->vk.format))
- return false;
-
- if (image->vk.tiling == VK_IMAGE_TILING_LINEAR)
- return false;
-
- uint32_t buffer_width, buffer_height;
- if (region->bufferRowLength == 0)
- buffer_width = region->imageExtent.width;
- else
- buffer_width = region->bufferRowLength;
-
- if (region->bufferImageHeight == 0)
- buffer_height = region->imageExtent.height;
- else
- buffer_height = region->bufferImageHeight;
-
- uint8_t plane = v3dv_plane_from_aspect(region->imageSubresource.aspectMask);
- assert(plane < image->plane_count);
-
- uint32_t buffer_stride = buffer_width * image->planes[plane].cpp;
- uint32_t buffer_layer_stride = buffer_stride * buffer_height;
-
- uint32_t num_layers;
- if (image->vk.image_type != VK_IMAGE_TYPE_3D)
- num_layers = region->imageSubresource.layerCount;
- else
- num_layers = region->imageExtent.depth;
- assert(num_layers > 0);
-
- struct v3dv_job *job =
- v3dv_cmd_buffer_create_cpu_job(cmd_buffer->device,
- V3DV_JOB_TYPE_CPU_COPY_BUFFER_TO_IMAGE,
- cmd_buffer, -1);
- if (!job)
- return true;
-
- job->cpu.copy_buffer_to_image.image = image;
- job->cpu.copy_buffer_to_image.buffer = buffer;
- job->cpu.copy_buffer_to_image.buffer_stride = buffer_stride;
- job->cpu.copy_buffer_to_image.buffer_layer_stride = buffer_layer_stride;
- job->cpu.copy_buffer_to_image.buffer_offset = region->bufferOffset;
- job->cpu.copy_buffer_to_image.image_extent = region->imageExtent;
- job->cpu.copy_buffer_to_image.image_offset = region->imageOffset;
- job->cpu.copy_buffer_to_image.mip_level =
- region->imageSubresource.mipLevel;
- job->cpu.copy_buffer_to_image.base_layer =
- region->imageSubresource.baseArrayLayer;
- job->cpu.copy_buffer_to_image.layer_count = num_layers;
- job->cpu.copy_buffer_to_image.plane = plane;
-
- list_addtail(&job->list_link, &cmd_buffer->jobs);
-
- return true;
-}
-
VKAPI_ATTR void VKAPI_CALL
v3dv_CmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
const VkCopyBufferToImageInfo2 *info)
@@ -3330,11 +3260,6 @@ v3dv_CmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
* slow it might not be worth it and we should instead put more effort
* in handling more cases with the other paths.
*/
- if (copy_buffer_to_image_cpu(cmd_buffer, image, buffer, &info->pRegions[r])) {
- batch_size = 1;
- goto handled;
- }
-
if (copy_buffer_to_image_shader(cmd_buffer, image, buffer,
batch_size, &info->pRegions[r], false)) {
goto handled;
diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h
index c6707211529..c9e3513e6bb 100644
--- a/src/broadcom/vulkan/v3dv_private.h
+++ b/src/broadcom/vulkan/v3dv_private.h
@@ -1125,7 +1125,6 @@ enum v3dv_job_type {
V3DV_JOB_TYPE_CPU_RESET_QUERIES,
V3DV_JOB_TYPE_CPU_END_QUERY,
V3DV_JOB_TYPE_CPU_COPY_QUERY_RESULTS,
- V3DV_JOB_TYPE_CPU_COPY_BUFFER_TO_IMAGE,
V3DV_JOB_TYPE_CPU_CSD_INDIRECT,
V3DV_JOB_TYPE_CPU_TIMESTAMP_QUERY,
};
@@ -1164,20 +1163,6 @@ struct v3dv_submit_sync_info {
struct vk_sync_signal *signals;
};
-struct v3dv_copy_buffer_to_image_cpu_job_info {
- struct v3dv_image *image;
- struct v3dv_buffer *buffer;
- uint32_t buffer_offset;
- uint32_t buffer_stride;
- uint32_t buffer_layer_stride;
- VkOffset3D image_offset;
- VkExtent3D image_extent;
- uint32_t mip_level;
- uint32_t base_layer;
- uint32_t layer_count;
- uint8_t plane;
-};
-
struct v3dv_csd_indirect_cpu_job_info {
struct v3dv_buffer *buffer;
uint32_t offset;
@@ -1331,7 +1316,6 @@ struct v3dv_job {
struct v3dv_reset_query_cpu_job_info query_reset;
struct v3dv_end_query_info query_end;
struct v3dv_copy_query_results_cpu_job_info query_copy_results;
- struct v3dv_copy_buffer_to_image_cpu_job_info copy_buffer_to_image;
struct v3dv_csd_indirect_cpu_job_info csd_indirect;
struct v3dv_timestamp_query_cpu_job_info query_timestamp;
} cpu;
diff --git a/src/broadcom/vulkan/v3dv_queue.c b/src/broadcom/vulkan/v3dv_queue.c
index b4aae195180..bb7880a33c1 100644
--- a/src/broadcom/vulkan/v3dv_queue.c
+++ b/src/broadcom/vulkan/v3dv_queue.c
@@ -296,60 +296,6 @@ handle_copy_query_results_cpu_job(struct v3dv_job *job)
}
static VkResult
-handle_copy_buffer_to_image_cpu_job(struct v3dv_queue *queue,
- struct v3dv_job *job,
- struct v3dv_submit_sync_info *sync_info)
-{
- assert(job->type == V3DV_JOB_TYPE_CPU_COPY_BUFFER_TO_IMAGE);
- struct v3dv_copy_buffer_to_image_cpu_job_info *info =
- &job->cpu.copy_buffer_to_image;
-
- /* Wait for all GPU work to finish first, since we may be accessing
- * the BOs involved in the operation.
- */
- VkResult result = queue_wait_idle(queue, sync_info);
- if (result != VK_SUCCESS)
- return result;
-
- /* Map BOs */
- struct v3dv_bo *dst_bo = info->image->planes[info->plane].mem->bo;
- assert(!dst_bo->map || dst_bo->map_size == dst_bo->size);
- if (!dst_bo->map && !v3dv_bo_map(job->device, dst_bo, dst_bo->size))
- return vk_error(job->device, VK_ERROR_OUT_OF_HOST_MEMORY);
- void *dst_ptr = dst_bo->map;
-
- struct v3dv_bo *src_bo = info->buffer->mem->bo;
- assert(!src_bo->map || src_bo->map_size == src_bo->size);
- if (!src_bo->map && !v3dv_bo_map(job->device, src_bo, src_bo->size))
- return vk_error(job->device, VK_ERROR_OUT_OF_HOST_MEMORY);
- void *src_ptr = src_bo->map;
-
- const struct v3d_resource_slice *slice =
- &info->image->planes[info->plane].slices[info->mip_level];
-
- const struct pipe_box box = {
- info->image_offset.x, info->image_offset.y, info->base_layer,
- info->image_extent.width, info->image_extent.height, info->layer_count,
- };
-
- /* Copy each layer */
- for (uint32_t i = 0; i < info->layer_count; i++) {
- const uint32_t dst_offset =
- v3dv_layer_offset(info->image, info->mip_level,
- info->base_layer + i, info->plane);
- const uint32_t src_offset =
- info->buffer->mem_offset + info->buffer_offset +
- info->buffer_layer_stride * i;
- v3d_store_tiled_image(
- dst_ptr + dst_offset, slice->stride,
- src_ptr + src_offset, info->buffer_stride,
- slice->tiling, info->image->planes[info->plane].cpp, slice->padded_height, &box);
- }
-
- return VK_SUCCESS;
-}
-
-static VkResult
handle_timestamp_query_cpu_job(struct v3dv_queue *queue, struct v3dv_job *job,
struct v3dv_submit_sync_info *sync_info)
{
@@ -1014,8 +960,6 @@ queue_handle_job(struct v3dv_queue *queue,
return handle_end_query_cpu_job(job, counter_pass_idx);
case V3DV_JOB_TYPE_CPU_COPY_QUERY_RESULTS:
return handle_copy_query_results_cpu_job(job);
- case V3DV_JOB_TYPE_CPU_COPY_BUFFER_TO_IMAGE:
- return handle_copy_buffer_to_image_cpu_job(queue, job, sync_info);
case V3DV_JOB_TYPE_CPU_CSD_INDIRECT:
return handle_csd_indirect_cpu_job(queue, job, sync_info);
case V3DV_JOB_TYPE_CPU_TIMESTAMP_QUERY: