hk: support colour <--> z/s copies

dEQP-VK.api.ds_color_copy.* for maint8, but there's more to maint8

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34426>
This commit is contained in:
Alyssa Rosenzweig
2025-04-06 15:25:06 -04:00
committed by Marge Bot
parent f0e6746ffa
commit 0da52e1fd8
2 changed files with 33 additions and 43 deletions
+29 -43
View File
@@ -211,35 +211,23 @@ aspect_format(VkFormat fmt, VkImageAspectFlags aspect)
bool depth = (aspect & VK_IMAGE_ASPECT_DEPTH_BIT);
bool stencil = (aspect & VK_IMAGE_ASPECT_STENCIL_BIT);
enum pipe_format p_format = hk_format_to_pipe_format(fmt);
assert(!(depth && stencil));
if (util_format_is_depth_or_stencil(p_format)) {
assert(depth ^ stencil);
if (depth) {
switch (fmt) {
case VK_FORMAT_D32_SFLOAT:
case VK_FORMAT_D32_SFLOAT_S8_UINT:
return VK_FORMAT_D32_SFLOAT;
case VK_FORMAT_D16_UNORM:
case VK_FORMAT_D16_UNORM_S8_UINT:
return VK_FORMAT_D16_UNORM;
default:
unreachable("invalid depth");
}
} else {
switch (fmt) {
case VK_FORMAT_S8_UINT:
case VK_FORMAT_D32_SFLOAT_S8_UINT:
case VK_FORMAT_D16_UNORM_S8_UINT:
return VK_FORMAT_S8_UINT;
default:
unreachable("invalid stencil");
}
}
switch (fmt) {
case VK_FORMAT_D32_SFLOAT:
return VK_FORMAT_R32_SFLOAT;
case VK_FORMAT_D32_SFLOAT_S8_UINT:
return stencil ? VK_FORMAT_R8_UINT : VK_FORMAT_R32_SFLOAT;
case VK_FORMAT_D16_UNORM:
return VK_FORMAT_R16_UNORM;
case VK_FORMAT_S8_UINT:
return VK_FORMAT_R8_UINT;
case VK_FORMAT_D16_UNORM_S8_UINT:
return stencil ? VK_FORMAT_R8_UINT : VK_FORMAT_R16_UNORM;
default:
break;
}
assert(!depth && !stencil);
const struct vk_format_ycbcr_info *ycbcr_info =
vk_format_get_ycbcr_info(fmt);
@@ -265,11 +253,8 @@ aspect_format(VkFormat fmt, VkImageAspectFlags aspect)
* the unfortunate exception).
*/
static enum pipe_format
canonical_format_pipe(enum pipe_format fmt, bool canonicalize_zs)
canonical_format_pipe(enum pipe_format fmt)
{
if (!canonicalize_zs && util_format_is_depth_or_stencil(fmt))
return fmt;
assert(ail_is_valid_pixel_format(fmt));
if (util_format_is_compressed(fmt)) {
@@ -313,7 +298,7 @@ static VkFormat
canonical_format(VkFormat fmt)
{
return vk_format_from_pipe_format(
canonical_format_pipe(hk_format_to_pipe_format(fmt), false));
canonical_format_pipe(hk_format_to_pipe_format(fmt)));
}
enum copy_type {
@@ -401,7 +386,7 @@ load_store_formatted(nir_builder *b, nir_def *base, nir_def *index,
nir_def *value, enum pipe_format format)
{
if (util_format_is_depth_or_stencil(format))
format = canonical_format_pipe(format, true);
format = canonical_format_pipe(format);
if (is_format_native(format)) {
enum pipe_format isa = ail_pixel_format[format].renderable;
@@ -500,7 +485,7 @@ build_image_copy_shader(const struct vk_meta_image_copy_key *key)
/* The destination format is already canonical, convert to an ISA format */
enum pipe_format isa_format = PIPE_FORMAT_NONE;
if (key->block_based) {
enum pipe_format pipe = canonical_format_pipe(key->dst_format, true);
enum pipe_format pipe = canonical_format_pipe(key->dst_format);
isa_format = ail_pixel_format[pipe].renderable;
assert(isa_format != PIPE_FORMAT_NONE);
}
@@ -995,8 +980,7 @@ hk_meta_copy_buffer_to_image2(struct vk_command_buffer *cmd,
.nr_samples = image->samples,
.src_format = hk_format_to_pipe_format(canonical),
.dst_format = canonical_format_pipe(
hk_format_to_pipe_format(aspect_format(image->format, aspect)),
false),
hk_format_to_pipe_format(aspect_format(image->format, aspect))),
/* TODO: MSAA path */
.block_based =
@@ -1141,11 +1125,15 @@ hk_meta_copy_image2(struct vk_command_buffer *cmd, struct vk_meta_device *meta,
uint32_t blocksize_B =
util_format_get_blocksize(hk_format_to_pipe_format(canonical));
VkImageAspectFlagBits dst_aspect_mask =
bool use_dst_aspect_mask =
vk_format_get_ycbcr_info(dst_image->format) ||
vk_format_get_ycbcr_info(src_image->format)
? region->dstSubresource.aspectMask
: (1 << aspect);
vk_format_get_ycbcr_info(src_image->format) ||
(vk_format_is_depth_or_stencil(dst_image->format) &&
!vk_format_is_depth_or_stencil(src_image->format));
VkImageAspectFlagBits dst_aspect_mask =
use_dst_aspect_mask ? region->dstSubresource.aspectMask
: (1 << aspect);
struct vk_meta_image_copy_key key = {
.key_type = VK_META_OBJECT_KEY_COPY_IMAGE_TO_BUFFER,
@@ -1153,10 +1141,8 @@ hk_meta_copy_image2(struct vk_command_buffer *cmd, struct vk_meta_device *meta,
.block_size = blocksize_B,
.nr_samples = dst_image->samples,
.src_format = hk_format_to_pipe_format(canonical),
.dst_format =
canonical_format_pipe(hk_format_to_pipe_format(aspect_format(
dst_image->format, dst_aspect_mask)),
false),
.dst_format = canonical_format_pipe(hk_format_to_pipe_format(
aspect_format(dst_image->format, dst_aspect_mask))),
/* TODO: MSAA path */
.block_based = (dst_image->image_type != VK_IMAGE_TYPE_1D) &&
+4
View File
@@ -121,7 +121,11 @@ vk_swizzle_to_pipe(VkComponentSwizzle swizzle)
static enum pipe_format
get_stencil_format(enum pipe_format format)
{
/* Note: R8 is not a stencil format, but our copy code will internally cast
* between R8 and S8. It's simplest to handle here.
*/
switch (format) {
case PIPE_FORMAT_R8_UINT:
case PIPE_FORMAT_S8_UINT:
return PIPE_FORMAT_S8_UINT;
case PIPE_FORMAT_Z24_UNORM_S8_UINT: