radv/meta: remove radv_meta_blit2d_rect

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/38139>
This commit is contained in:
Samuel Pitoiset
2025-10-29 11:51:48 +01:00
committed by Marge Bot
parent 1319b2bef6
commit a1884dc737
5 changed files with 79 additions and 99 deletions

View File

@@ -177,25 +177,25 @@ struct radv_meta_blit2d_buffer {
enum radv_copy_flags copy_flags;
};
struct radv_meta_blit2d_rect {
uint32_t src_x, src_y;
uint32_t dst_x, dst_y;
uint32_t width, height;
};
void radv_gfx_copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *src,
struct radv_meta_blit2d_surf *dst, struct radv_meta_blit2d_rect *rect);
struct radv_meta_blit2d_surf *dst, const VkOffset3D *src_offset, const VkOffset3D *dst_offset,
const VkExtent3D *extent);
void radv_gfx_copy_memory_to_image(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_buffer *src,
struct radv_meta_blit2d_surf *dst, struct radv_meta_blit2d_rect *rect);
struct radv_meta_blit2d_surf *dst, const VkOffset3D *offset,
const VkExtent3D *extent);
void radv_meta_image_to_buffer(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *src,
struct radv_meta_blit2d_buffer *dst, struct radv_meta_blit2d_rect *rect);
struct radv_meta_blit2d_buffer *dst, const VkOffset3D *offset, const VkExtent3D *extent);
void radv_meta_buffer_to_image_cs(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_buffer *src,
struct radv_meta_blit2d_surf *dst, struct radv_meta_blit2d_rect *rect);
struct radv_meta_blit2d_surf *dst, const VkOffset3D *offset,
const VkExtent3D *extent);
void radv_meta_image_to_image_cs(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *src,
struct radv_meta_blit2d_surf *dst, struct radv_meta_blit2d_rect *rect);
struct radv_meta_blit2d_surf *dst, const VkOffset3D *src_offset,
const VkOffset3D *dst_offset, const VkExtent3D *extent);
void radv_meta_clear_image_cs(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *dst,
const VkClearColorValue *clear_color);
@@ -217,7 +217,9 @@ void radv_copy_vrs_htile(struct radv_cmd_buffer *cmd_buffer, struct radv_image_v
struct radv_image *dst_image, uint64_t htile_va, bool read_htile_value);
bool radv_can_use_fmask_copy(struct radv_cmd_buffer *cmd_buffer, const struct radv_image *src_image,
const struct radv_image *dst_image, const struct radv_meta_blit2d_rect *rect);
const struct radv_image *dst_image, const VkOffset3D *src_offset,
const VkOffset3D *dst_offset, const VkExtent3D *extent);
void radv_fmask_copy(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *src,
struct radv_meta_blit2d_surf *dst);

View File

@@ -60,7 +60,7 @@ create_iview(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *s
void
radv_gfx_copy_memory_to_image(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_buffer *src,
struct radv_meta_blit2d_surf *dst, struct radv_meta_blit2d_rect *rect)
struct radv_meta_blit2d_surf *dst, const VkOffset3D *offset, const VkExtent3D *extent)
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const enum blit2d_src_type src_type = BLIT2D_SRC_TYPE_BUFFER;
@@ -69,17 +69,17 @@ radv_gfx_copy_memory_to_image(struct radv_cmd_buffer *cmd_buffer, struct radv_me
VkResult result;
radv_CmdSetViewport(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1,
&(VkViewport){.x = rect->dst_x,
.y = rect->dst_y,
.width = rect->width,
.height = rect->height,
&(VkViewport){.x = offset->x,
.y = offset->y,
.width = extent->width,
.height = extent->height,
.minDepth = 0.0f,
.maxDepth = 1.0f});
radv_CmdSetScissor(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1,
&(VkRect2D){
.offset = (VkOffset2D){rect->dst_x, rect->dst_y},
.extent = (VkExtent2D){rect->width, rect->height},
.offset = (VkOffset2D){offset->x, offset->y},
.extent = (VkExtent2D){extent->width, extent->height},
});
u_foreach_bit (i, dst->aspect_mask) {
@@ -108,8 +108,8 @@ radv_gfx_copy_memory_to_image(struct radv_cmd_buffer *cmd_buffer, struct radv_me
.flags = VK_RENDERING_LOCAL_READ_CONCURRENT_ACCESS_CONTROL_BIT_KHR,
.renderArea =
{
.offset = {rect->dst_x, rect->dst_y},
.extent = {rect->width, rect->height},
.offset = {offset->x, offset->y},
.extent = {extent->width, extent->height},
},
.layerCount = 1,
};
@@ -153,10 +153,10 @@ radv_gfx_copy_memory_to_image(struct radv_cmd_buffer *cmd_buffer, struct radv_me
UNREACHABLE("Processing blit2d with multiple aspects.");
float vertex_push_constants[4] = {
rect->src_x,
rect->src_y,
rect->src_x + rect->width,
rect->src_y + rect->height,
0,
0,
extent->width,
extent->height,
};
const VkPushConstantsInfoKHR pc_info_vs = {
@@ -211,7 +211,8 @@ radv_gfx_copy_memory_to_image(struct radv_cmd_buffer *cmd_buffer, struct radv_me
void
radv_gfx_copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *src,
struct radv_meta_blit2d_surf *dst, struct radv_meta_blit2d_rect *rect)
struct radv_meta_blit2d_surf *dst, const VkOffset3D *src_offset, const VkOffset3D *dst_offset,
const VkExtent3D *extent)
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const bool use_3d = src->image->vk.image_type == VK_IMAGE_TYPE_3D;
@@ -223,18 +224,18 @@ radv_gfx_copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_
radv_CmdSetViewport(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1,
&(VkViewport){
.x = rect->dst_x,
.y = rect->dst_y,
.width = rect->width,
.height = rect->height,
.x = dst_offset->x,
.y = dst_offset->y,
.width = extent->width,
.height = extent->height,
.minDepth = 0.0f,
.maxDepth = 1.0f,
});
radv_CmdSetScissor(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1,
&(VkRect2D){
.offset = (VkOffset2D){rect->dst_x, rect->dst_y},
.extent = (VkExtent2D){rect->width, rect->height},
.offset = (VkOffset2D){dst_offset->x, dst_offset->y},
.extent = (VkExtent2D){extent->width, extent->height},
});
u_foreach_bit (i, dst->aspect_mask) {
@@ -280,8 +281,8 @@ radv_gfx_copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_
.flags = VK_RENDERING_LOCAL_READ_CONCURRENT_ACCESS_CONTROL_BIT_KHR,
.renderArea =
{
.offset = {rect->dst_x, rect->dst_y},
.extent = {rect->width, rect->height},
.offset = {dst_offset->x, dst_offset->y},
.extent = {extent->width, extent->height},
},
.layerCount = 1,
};
@@ -325,10 +326,10 @@ radv_gfx_copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_
UNREACHABLE("Processing blit2d with multiple aspects.");
float vertex_push_constants[4] = {
rect->src_x,
rect->src_y,
rect->src_x + rect->width,
rect->src_y + rect->height,
src_offset->x,
src_offset->y,
src_offset->x + extent->width,
src_offset->y + extent->height,
};
const VkPushConstantsInfoKHR pc_info_vs = {

View File

@@ -597,7 +597,7 @@ create_iview(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *s
*/
static void
fixup_gfx9_cs_copy(struct radv_cmd_buffer *cmd_buffer, const struct radv_meta_blit2d_buffer *buf_bsurf,
const struct radv_meta_blit2d_surf *img_bsurf, const struct radv_meta_blit2d_rect *rect,
const struct radv_meta_blit2d_surf *img_bsurf, const VkOffset3D *offset, const VkExtent3D *extent,
bool to_image)
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
@@ -628,9 +628,9 @@ fixup_gfx9_cs_copy(struct radv_cmd_buffer *cmd_buffer, const struct radv_meta_bl
VkExtent2D hw_mip_extent = {u_minify(hw_base_extent.width, mip_level), u_minify(hw_base_extent.height, mip_level)};
/* The actual extent we want to copy */
VkExtent2D mip_extent = {rect->width, rect->height};
VkExtent2D mip_extent = {extent->width, extent->height};
VkOffset2D mip_offset = {to_image ? rect->dst_x : rect->src_x, to_image ? rect->dst_y : rect->src_y};
VkOffset2D mip_offset = {offset->x, offset->y};
if (hw_mip_extent.width >= mip_offset.x + mip_extent.width &&
hw_mip_extent.height >= mip_offset.y + mip_extent.height)
@@ -691,7 +691,7 @@ get_image_stride_for_r32g32b32(struct radv_cmd_buffer *cmd_buffer, struct radv_m
void
radv_meta_image_to_buffer(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *src,
struct radv_meta_blit2d_buffer *dst, struct radv_meta_blit2d_rect *rect)
struct radv_meta_blit2d_buffer *dst, const VkOffset3D *offset, const VkExtent3D *extent)
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
struct radv_image_view src_view;
@@ -733,7 +733,7 @@ radv_meta_image_to_buffer(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_b
radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), VK_PIPELINE_BIND_POINT_COMPUTE, pipeline);
unsigned push_constants[4] = {rect->src_x, rect->src_y, src->layer, dst->pitch};
unsigned push_constants[4] = {offset->x, offset->y, src->layer, dst->pitch};
const VkPushConstantsInfoKHR pc_info = {
.sType = VK_STRUCTURE_TYPE_PUSH_CONSTANTS_INFO_KHR,
@@ -746,15 +746,16 @@ radv_meta_image_to_buffer(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_b
radv_CmdPushConstants2(radv_cmd_buffer_to_handle(cmd_buffer), &pc_info);
radv_unaligned_dispatch(cmd_buffer, rect->width, rect->height, 1);
fixup_gfx9_cs_copy(cmd_buffer, dst, src, rect, false);
radv_unaligned_dispatch(cmd_buffer, extent->width, extent->height, 1);
fixup_gfx9_cs_copy(cmd_buffer, dst, src, offset, extent, false);
radv_image_view_finish(&src_view);
}
static void
radv_meta_buffer_to_image_cs_r32g32b32(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_buffer *src,
struct radv_meta_blit2d_surf *dst, struct radv_meta_blit2d_rect *rect)
struct radv_meta_blit2d_surf *dst, const VkOffset3D *offset,
const VkExtent3D *extent)
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
VkPipelineLayout layout;
@@ -798,8 +799,8 @@ radv_meta_buffer_to_image_cs_r32g32b32(struct radv_cmd_buffer *cmd_buffer, struc
stride = get_image_stride_for_r32g32b32(cmd_buffer, dst);
unsigned push_constants[4] = {
rect->dst_x,
rect->dst_y,
offset->x,
offset->y,
stride,
src->pitch,
};
@@ -815,12 +816,12 @@ radv_meta_buffer_to_image_cs_r32g32b32(struct radv_cmd_buffer *cmd_buffer, struc
radv_CmdPushConstants2(radv_cmd_buffer_to_handle(cmd_buffer), &pc_info);
radv_unaligned_dispatch(cmd_buffer, rect->width, rect->height, 1);
radv_unaligned_dispatch(cmd_buffer, extent->width, extent->height, 1);
}
void
radv_meta_buffer_to_image_cs(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_buffer *src,
struct radv_meta_blit2d_surf *dst, struct radv_meta_blit2d_rect *rect)
struct radv_meta_blit2d_surf *dst, const VkOffset3D *offset, const VkExtent3D *extent)
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
struct radv_image_view dst_view;
@@ -829,7 +830,7 @@ radv_meta_buffer_to_image_cs(struct radv_cmd_buffer *cmd_buffer, struct radv_met
VkResult result;
if (vk_format_is_96bit(dst->image->vk.format)) {
radv_meta_buffer_to_image_cs_r32g32b32(cmd_buffer, src, dst, rect);
radv_meta_buffer_to_image_cs_r32g32b32(cmd_buffer, src, dst, offset, extent);
return;
}
@@ -867,8 +868,8 @@ radv_meta_buffer_to_image_cs(struct radv_cmd_buffer *cmd_buffer, struct radv_met
radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), VK_PIPELINE_BIND_POINT_COMPUTE, pipeline);
unsigned push_constants[4] = {
rect->dst_x,
rect->dst_y,
offset->x,
offset->y,
dst->layer,
src->pitch,
};
@@ -884,15 +885,16 @@ radv_meta_buffer_to_image_cs(struct radv_cmd_buffer *cmd_buffer, struct radv_met
radv_CmdPushConstants2(radv_cmd_buffer_to_handle(cmd_buffer), &pc_info);
radv_unaligned_dispatch(cmd_buffer, rect->width, rect->height, 1);
fixup_gfx9_cs_copy(cmd_buffer, src, dst, rect, true);
radv_unaligned_dispatch(cmd_buffer, extent->width, extent->height, 1);
fixup_gfx9_cs_copy(cmd_buffer, src, dst, offset, extent, true);
radv_image_view_finish(&dst_view);
}
static void
radv_meta_image_to_image_cs_r32g32b32(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *src,
struct radv_meta_blit2d_surf *dst, struct radv_meta_blit2d_rect *rect)
struct radv_meta_blit2d_surf *dst, const VkOffset3D *src_offset,
const VkOffset3D *dst_offset, const VkExtent3D *extent)
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
unsigned src_stride, dst_stride;
@@ -940,7 +942,7 @@ radv_meta_image_to_image_cs_r32g32b32(struct radv_cmd_buffer *cmd_buffer, struct
dst_stride = get_image_stride_for_r32g32b32(cmd_buffer, dst);
unsigned push_constants[6] = {
rect->src_x, rect->src_y, src_stride, rect->dst_x, rect->dst_y, dst_stride,
src_offset->x, src_offset->y, src_stride, dst_offset->x, dst_offset->y, dst_stride,
};
const VkPushConstantsInfoKHR pc_info = {
@@ -954,12 +956,13 @@ radv_meta_image_to_image_cs_r32g32b32(struct radv_cmd_buffer *cmd_buffer, struct
radv_CmdPushConstants2(radv_cmd_buffer_to_handle(cmd_buffer), &pc_info);
radv_unaligned_dispatch(cmd_buffer, rect->width, rect->height, 1);
radv_unaligned_dispatch(cmd_buffer, extent->width, extent->height, 1);
}
void
radv_meta_image_to_image_cs(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *src,
struct radv_meta_blit2d_surf *dst, struct radv_meta_blit2d_rect *rect)
struct radv_meta_blit2d_surf *dst, const VkOffset3D *src_offset,
const VkOffset3D *dst_offset, const VkExtent3D *extent)
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
struct radv_image_view src_view, dst_view;
@@ -969,7 +972,7 @@ radv_meta_image_to_image_cs(struct radv_cmd_buffer *cmd_buffer, struct radv_meta
VkResult result;
if (vk_format_is_96bit(src->format)) {
radv_meta_image_to_image_cs_r32g32b32(cmd_buffer, src, dst, rect);
radv_meta_image_to_image_cs_r32g32b32(cmd_buffer, src, dst, src_offset, dst_offset, extent);
return;
}
@@ -1042,7 +1045,7 @@ radv_meta_image_to_image_cs(struct radv_cmd_buffer *cmd_buffer, struct radv_meta
radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), VK_PIPELINE_BIND_POINT_COMPUTE, pipeline);
unsigned push_constants[6] = {
rect->src_x, rect->src_y, src->layer, rect->dst_x, rect->dst_y, dst->layer,
src_offset->x, src_offset->y, src->layer, dst_offset->x, dst_offset->y, dst->layer,
};
const VkPushConstantsInfoKHR pc_info = {
@@ -1056,7 +1059,7 @@ radv_meta_image_to_image_cs(struct radv_cmd_buffer *cmd_buffer, struct radv_meta
radv_CmdPushConstants2(radv_cmd_buffer_to_handle(cmd_buffer), &pc_info);
radv_unaligned_dispatch(cmd_buffer, rect->width, rect->height, 1);
radv_unaligned_dispatch(cmd_buffer, extent->width, extent->height, 1);
radv_image_view_finish(&src_view);
radv_image_view_finish(&dst_view);

View File

@@ -127,10 +127,6 @@ gfx_or_compute_copy_memory_to_image(struct radv_cmd_buffer *cmd_buffer, uint64_t
/* Start creating blit rect */
const VkExtent3D img_extent_el = vk_image_extent_to_elements(&image->vk, region->imageExtent);
struct radv_meta_blit2d_rect rect = {
.width = img_extent_el.width,
.height = img_extent_el.height,
};
/* Create blit surfaces */
struct radv_meta_blit2d_surf img_bsurf = blit_surf_for_image_level_layer(image, layout, &region->imageSubresource);
@@ -175,15 +171,11 @@ gfx_or_compute_copy_memory_to_image(struct radv_cmd_buffer *cmd_buffer, uint64_t
unsigned slice_3d = 0;
unsigned slice_array = 0;
while (slice_3d < num_slices_3d && slice_array < num_slices_array) {
rect.dst_x = img_offset_el.x;
rect.dst_y = img_offset_el.y;
/* Perform Blit */
if (use_compute) {
radv_meta_buffer_to_image_cs(cmd_buffer, &buf_bsurf, &img_bsurf, &rect);
radv_meta_buffer_to_image_cs(cmd_buffer, &buf_bsurf, &img_bsurf, &img_offset_el, &img_extent_el);
} else {
radv_gfx_copy_memory_to_image(cmd_buffer, &buf_bsurf, &img_bsurf, &rect);
radv_gfx_copy_memory_to_image(cmd_buffer, &buf_bsurf, &img_bsurf, &img_offset_el, &img_extent_el);
}
/* Once we've done the blit, all of the actual information about
@@ -291,10 +283,6 @@ compute_copy_image_to_memory(struct radv_cmd_buffer *cmd_buffer, uint64_t buffer
/* Start creating blit rect */
const VkExtent3D img_extent_el = vk_image_extent_to_elements(&image->vk, region->imageExtent);
struct radv_meta_blit2d_rect rect = {
.width = img_extent_el.width,
.height = img_extent_el.height,
};
/* Create blit surfaces */
struct radv_meta_blit2d_surf img_info = blit_surf_for_image_level_layer(image, layout, &region->imageSubresource);
@@ -338,12 +326,8 @@ compute_copy_image_to_memory(struct radv_cmd_buffer *cmd_buffer, uint64_t buffer
unsigned slice_3d = 0;
unsigned slice_array = 0;
while (slice_3d < num_slices_3d && slice_array < num_slices_array) {
rect.src_x = img_offset_el.x;
rect.src_y = img_offset_el.y;
/* Perform Blit */
radv_meta_image_to_buffer(cmd_buffer, &img_info, &buf_info, &rect);
radv_meta_image_to_buffer(cmd_buffer, &img_info, &buf_info, &img_offset_el, &img_extent_el);
buf_info.offset += buf_extent_el.width * buf_extent_el.height * img_info.bs;
img_info.layer++;
@@ -571,12 +555,6 @@ gfx_or_compute_copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image
*/
const VkExtent3D img_extent_el = vk_image_extent_to_elements(&src_image->vk, region->extent);
/* Start creating blit rect */
struct radv_meta_blit2d_rect rect = {
.width = img_extent_el.width,
.height = img_extent_el.height,
};
unsigned num_slices = vk_image_subresource_layer_count(&src_image->vk, &region->srcSubresource);
if (src_image->vk.image_type == VK_IMAGE_TYPE_3D) {
@@ -588,20 +566,15 @@ gfx_or_compute_copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image
b_dst.layer = dst_offset_el.z;
for (unsigned slice = 0; slice < num_slices; slice++) {
/* Finish creating blit rect */
rect.dst_x = dst_offset_el.x;
rect.dst_y = dst_offset_el.y;
rect.src_x = src_offset_el.x;
rect.src_y = src_offset_el.y;
/* Perform Blit */
if (use_compute) {
radv_meta_image_to_image_cs(cmd_buffer, &b_src, &b_dst, &rect);
radv_meta_image_to_image_cs(cmd_buffer, &b_src, &b_dst, &src_offset_el, &dst_offset_el, &img_extent_el);
} else {
if (radv_can_use_fmask_copy(cmd_buffer, b_src.image, b_dst.image, &rect)) {
if (radv_can_use_fmask_copy(cmd_buffer, b_src.image, b_dst.image, &src_offset_el, &dst_offset_el,
&img_extent_el)) {
radv_fmask_copy(cmd_buffer, &b_src, &b_dst);
} else {
radv_gfx_copy_image(cmd_buffer, &b_src, &b_dst, &rect);
radv_gfx_copy_image(cmd_buffer, &b_src, &b_dst, &src_offset_el, &dst_offset_el, &img_extent_el);
}
}

View File

@@ -118,7 +118,8 @@ radv_fixup_copy_dst_metadata(struct radv_cmd_buffer *cmd_buffer, const struct ra
bool
radv_can_use_fmask_copy(struct radv_cmd_buffer *cmd_buffer, const struct radv_image *src_image,
const struct radv_image *dst_image, const struct radv_meta_blit2d_rect *rect)
const struct radv_image *dst_image, const VkOffset3D *src_offset, const VkOffset3D *dst_offset,
const VkExtent3D *extent)
{
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device);
@@ -140,8 +141,8 @@ radv_can_use_fmask_copy(struct radv_cmd_buffer *cmd_buffer, const struct radv_im
return false;
/* The region must be a whole image copy. */
if (rect->src_x || rect->src_y || rect->dst_x || rect->dst_y || rect->width != src_image->vk.extent.width ||
rect->height != src_image->vk.extent.height)
if (src_offset->x || src_offset->y || dst_offset->x || dst_offset->y ||
extent->width != src_image->vk.extent.width || extent->height != src_image->vk.extent.height)
return false;
/* Source/destination images must have identical size. */