mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-05 02:30:18 +01:00
v3dv: implement vkCmdResolveImage2KHR
The common Vulkan code will call this to implement vkCmdResolveImage. Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11443>
This commit is contained in:
parent
8e358a74d0
commit
aa61a653a5
2 changed files with 25 additions and 28 deletions
|
|
@ -1039,7 +1039,8 @@ cmd_buffer_subpass_handle_pending_resolves(struct v3dv_cmd_buffer *cmd_buffer)
|
|||
struct v3dv_image_view *src_iview = fb->attachments[src_attachment_idx];
|
||||
struct v3dv_image_view *dst_iview = fb->attachments[dst_attachment_idx];
|
||||
|
||||
VkImageResolve region = {
|
||||
VkImageResolve2KHR region = {
|
||||
.sType = VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
|
||||
.srcSubresource = {
|
||||
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
src_iview->base_level,
|
||||
|
|
@ -1057,16 +1058,16 @@ cmd_buffer_subpass_handle_pending_resolves(struct v3dv_cmd_buffer *cmd_buffer)
|
|||
.extent = src_iview->image->extent,
|
||||
};
|
||||
|
||||
VkImage src_image_handle =
|
||||
v3dv_image_to_handle((struct v3dv_image *) src_iview->image);
|
||||
VkImage dst_image_handle =
|
||||
v3dv_image_to_handle((struct v3dv_image *) dst_iview->image);
|
||||
v3dv_CmdResolveImage(cmd_buffer_handle,
|
||||
src_image_handle,
|
||||
VK_IMAGE_LAYOUT_GENERAL,
|
||||
dst_image_handle,
|
||||
VK_IMAGE_LAYOUT_GENERAL,
|
||||
1, ®ion);
|
||||
VkResolveImageInfo2KHR resolve_info = {
|
||||
.sType = VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
|
||||
.srcImage = v3dv_image_to_handle((struct v3dv_image *) src_iview->image),
|
||||
.srcImageLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||
.dstImage = v3dv_image_to_handle((struct v3dv_image *) dst_iview->image),
|
||||
.dstImageLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||
.regionCount = 1,
|
||||
.pRegions = ®ion,
|
||||
};
|
||||
v3dv_CmdResolveImage2KHR(cmd_buffer_handle, &resolve_info);
|
||||
}
|
||||
|
||||
cmd_buffer->state.framebuffer = restore_fb;
|
||||
|
|
|
|||
|
|
@ -5565,7 +5565,7 @@ emit_resolve_image_layer_per_tile_list(struct v3dv_job *job,
|
|||
struct v3dv_image *dst,
|
||||
struct v3dv_image *src,
|
||||
uint32_t layer_offset,
|
||||
const VkImageResolve *region)
|
||||
const VkImageResolve2KHR *region)
|
||||
{
|
||||
struct v3dv_cl *cl = &job->indirect;
|
||||
v3dv_cl_ensure_space(cl, 200, 1);
|
||||
|
|
@ -5623,7 +5623,7 @@ emit_resolve_image_layer(struct v3dv_job *job,
|
|||
struct v3dv_image *src,
|
||||
struct framebuffer_data *framebuffer,
|
||||
uint32_t layer,
|
||||
const VkImageResolve *region)
|
||||
const VkImageResolve2KHR *region)
|
||||
{
|
||||
emit_frame_setup(job, layer, NULL);
|
||||
emit_resolve_image_layer_per_tile_list(job, framebuffer,
|
||||
|
|
@ -5636,7 +5636,7 @@ emit_resolve_image_rcl(struct v3dv_job *job,
|
|||
struct v3dv_image *dst,
|
||||
struct v3dv_image *src,
|
||||
struct framebuffer_data *framebuffer,
|
||||
const VkImageResolve *region)
|
||||
const VkImageResolve2KHR *region)
|
||||
{
|
||||
struct v3dv_cl *rcl = emit_rcl_prologue(job, framebuffer, NULL);
|
||||
v3dv_return_if_oom(NULL, job);
|
||||
|
|
@ -5650,7 +5650,7 @@ static bool
|
|||
resolve_image_tlb(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
struct v3dv_image *dst,
|
||||
struct v3dv_image *src,
|
||||
const VkImageResolve *region)
|
||||
const VkImageResolve2KHR *region)
|
||||
{
|
||||
if (!can_use_tlb(src, ®ion->srcOffset, NULL) ||
|
||||
!can_use_tlb(dst, ®ion->dstOffset, NULL)) {
|
||||
|
|
@ -5701,7 +5701,7 @@ static bool
|
|||
resolve_image_blit(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
struct v3dv_image *dst,
|
||||
struct v3dv_image *src,
|
||||
const VkImageResolve *region)
|
||||
const VkImageResolve2KHR *region)
|
||||
{
|
||||
const VkImageBlit2KHR blit_region = {
|
||||
.sType = VK_STRUCTURE_TYPE_IMAGE_BLIT_2_KHR,
|
||||
|
|
@ -5730,17 +5730,13 @@ resolve_image_blit(struct v3dv_cmd_buffer *cmd_buffer,
|
|||
}
|
||||
|
||||
VKAPI_ATTR void VKAPI_CALL
|
||||
v3dv_CmdResolveImage(VkCommandBuffer commandBuffer,
|
||||
VkImage srcImage,
|
||||
VkImageLayout srcImageLayout,
|
||||
VkImage dstImage,
|
||||
VkImageLayout dstImageLayout,
|
||||
uint32_t regionCount,
|
||||
const VkImageResolve *pRegions)
|
||||
v3dv_CmdResolveImage2KHR(VkCommandBuffer commandBuffer,
|
||||
const VkResolveImageInfo2KHR *info)
|
||||
|
||||
{
|
||||
V3DV_FROM_HANDLE(v3dv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
V3DV_FROM_HANDLE(v3dv_image, src, srcImage);
|
||||
V3DV_FROM_HANDLE(v3dv_image, dst, dstImage);
|
||||
V3DV_FROM_HANDLE(v3dv_image, src, info->srcImage);
|
||||
V3DV_FROM_HANDLE(v3dv_image, dst, info->dstImage);
|
||||
|
||||
/* This command can only happen outside a render pass */
|
||||
assert(cmd_buffer->state.pass == NULL);
|
||||
|
|
@ -5749,10 +5745,10 @@ v3dv_CmdResolveImage(VkCommandBuffer commandBuffer,
|
|||
assert(src->samples == VK_SAMPLE_COUNT_4_BIT);
|
||||
assert(dst->samples == VK_SAMPLE_COUNT_1_BIT);
|
||||
|
||||
for (uint32_t i = 0; i < regionCount; i++) {
|
||||
if (resolve_image_tlb(cmd_buffer, dst, src, &pRegions[i]))
|
||||
for (uint32_t i = 0; i < info->regionCount; i++) {
|
||||
if (resolve_image_tlb(cmd_buffer, dst, src, &info->pRegions[i]))
|
||||
continue;
|
||||
if (resolve_image_blit(cmd_buffer, dst, src, &pRegions[i]))
|
||||
if (resolve_image_blit(cmd_buffer, dst, src, &info->pRegions[i]))
|
||||
continue;
|
||||
unreachable("Unsupported multismaple resolve operation");
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue