mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-19 02:20:27 +01:00
anv/image: Fix choice of isl_surf_usage for depthstencil images
Fixes assertion in vkCreateImage when VkFormat is combined depthstencil. Fixed many vulkancts tests that use combined depthstencil. For example, fixes dEQP-VK.pipeline.depth.format.d16_unorm_s8_uint.compare_ops.\ not_equal_less_or_equal_not_equal_greater.
This commit is contained in:
parent
a09b4c298c
commit
2f270f0d15
1 changed files with 20 additions and 14 deletions
|
|
@ -90,11 +90,11 @@ choose_isl_tiling_flags(const struct anv_image_create_info *anv_info)
|
|||
|
||||
/**
|
||||
* The \a format argument is required and overrides any format found in struct
|
||||
* anv_image_create_info.
|
||||
* anv_image_create_info. Exactly one bit must be set in \a aspect.
|
||||
*/
|
||||
static isl_surf_usage_flags_t
|
||||
choose_isl_surf_usage(const struct anv_image_create_info *info,
|
||||
const struct anv_format *format)
|
||||
VkImageAspectFlags aspect)
|
||||
{
|
||||
const VkImageCreateInfo *vk_info = info->vk_info;
|
||||
isl_surf_usage_flags_t isl_flags = 0;
|
||||
|
|
@ -115,12 +115,15 @@ choose_isl_surf_usage(const struct anv_image_create_info *info,
|
|||
isl_flags |= ISL_SURF_USAGE_CUBE_BIT;
|
||||
|
||||
if (vk_info->usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
|
||||
assert((format->depth_format != 0) ^ format->has_stencil);
|
||||
|
||||
if (format->depth_format) {
|
||||
switch (aspect) {
|
||||
default:
|
||||
unreachable("bad VkImageAspect");
|
||||
case VK_IMAGE_ASPECT_DEPTH_BIT:
|
||||
isl_flags |= ISL_SURF_USAGE_DEPTH_BIT;
|
||||
} else if (format->has_stencil) {
|
||||
break;
|
||||
case VK_IMAGE_ASPECT_STENCIL_BIT:
|
||||
isl_flags |= ISL_SURF_USAGE_STENCIL_BIT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -138,13 +141,13 @@ choose_isl_surf_usage(const struct anv_image_create_info *info,
|
|||
}
|
||||
|
||||
/**
|
||||
* The \a format argument is required and overrides any format in
|
||||
* struct anv_image_create_info.
|
||||
* The \a format argument is required and overrides any format in struct
|
||||
* anv_image_create_info. Exactly one bit must be set in \a aspect.
|
||||
*/
|
||||
static VkResult
|
||||
anv_image_make_surface(const struct anv_device *dev,
|
||||
const struct anv_image_create_info *anv_info,
|
||||
const struct anv_format *format,
|
||||
VkImageAspectFlags aspect,
|
||||
uint64_t *inout_image_size,
|
||||
uint32_t *inout_image_alignment,
|
||||
struct anv_surface *out_anv_surf)
|
||||
|
|
@ -159,7 +162,7 @@ anv_image_make_surface(const struct anv_device *dev,
|
|||
|
||||
isl_surf_init(&dev->isl_dev, &out_anv_surf->isl,
|
||||
.dim = vk_to_isl_surf_dim[vk_info->imageType],
|
||||
.format = format->surface_format,
|
||||
.format = anv_get_isl_format(vk_info->format, aspect),
|
||||
.width = vk_info->extent.width,
|
||||
.height = vk_info->extent.height,
|
||||
.depth = vk_info->extent.depth,
|
||||
|
|
@ -168,7 +171,7 @@ anv_image_make_surface(const struct anv_device *dev,
|
|||
.samples = vk_info->samples,
|
||||
.min_alignment = 0,
|
||||
.min_pitch = 0,
|
||||
.usage = choose_isl_surf_usage(anv_info, format),
|
||||
.usage = choose_isl_surf_usage(anv_info, aspect),
|
||||
.tiling_flags = choose_isl_tiling_flags(anv_info));
|
||||
|
||||
out_anv_surf->offset = align_u32(*inout_image_size,
|
||||
|
|
@ -249,14 +252,16 @@ anv_image_create(VkDevice _device,
|
|||
}
|
||||
|
||||
if (likely(anv_format_is_color(image->format))) {
|
||||
r = anv_image_make_surface(device, create_info, image->format,
|
||||
r = anv_image_make_surface(device, create_info,
|
||||
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
&image->size, &image->alignment,
|
||||
&image->color_surface);
|
||||
if (r != VK_SUCCESS)
|
||||
goto fail;
|
||||
} else {
|
||||
if (image->format->depth_format) {
|
||||
r = anv_image_make_surface(device, create_info, image->format,
|
||||
r = anv_image_make_surface(device, create_info,
|
||||
VK_IMAGE_ASPECT_DEPTH_BIT,
|
||||
&image->size, &image->alignment,
|
||||
&image->depth_surface);
|
||||
if (r != VK_SUCCESS)
|
||||
|
|
@ -264,7 +269,8 @@ anv_image_create(VkDevice _device,
|
|||
}
|
||||
|
||||
if (image->format->has_stencil) {
|
||||
r = anv_image_make_surface(device, create_info, anv_format_s8_uint,
|
||||
r = anv_image_make_surface(device, create_info,
|
||||
VK_IMAGE_ASPECT_STENCIL_BIT,
|
||||
&image->size, &image->alignment,
|
||||
&image->stencil_surface);
|
||||
if (r != VK_SUCCESS)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue