On 18.12.18 00:02, Bas Nieuwenhuizen wrote: > Exactly what title says, the new addrlib does not allow the above with > certain dimensions that the CTS seems to hit. Work around it by not > allowing the app to render to it via compat with other 128bpp formats > and do not render to it ourselves during copies. > > Fixes: 776b9113656 "amd/addrlib: update Mesa's copy of addrlib" > --- > src/amd/common/ac_surface.c | 12 ++++++++---- > src/amd/common/ac_surface.h | 1 + > src/amd/vulkan/radv_formats.c | 12 ++++++++++++ > src/amd/vulkan/radv_image.c | 6 ++++++ > src/amd/vulkan/radv_meta_copy.c | 24 ++++++++++++++++++------ > 5 files changed, 45 insertions(+), 10 deletions(-) > > diff --git a/src/amd/common/ac_surface.c b/src/amd/common/ac_surface.c > index d8d927ee1c5..80f5d642771 100644 > --- a/src/amd/common/ac_surface.c > +++ b/src/amd/common/ac_surface.c > @@ -709,7 +709,9 @@ static int gfx6_compute_surface(ADDR_HANDLE addrlib, > else > AddrSurfInfoIn.tileType = ADDR_NON_DISPLAYABLE; > > - AddrSurfInfoIn.flags.color = !(surf->flags & RADEON_SURF_Z_OR_SBUFFER); > + bool is_color_surface = !(surf->flags & RADEON_SURF_Z_OR_SBUFFER); > + AddrSurfInfoIn.flags.color = is_color_surface && > + !(surf->flags & > RADEON_SURF_NO_RENDER_TARGET); > AddrSurfInfoIn.flags.depth = (surf->flags & RADEON_SURF_ZBUFFER) != 0; > AddrSurfInfoIn.flags.cube = config->is_cube; > AddrSurfInfoIn.flags.display = get_display_flag(config, surf); > @@ -923,7 +925,7 @@ static int gfx6_compute_surface(ADDR_HANDLE addrlib, > } > > /* Compute FMASK. */ > - if (config->info.samples >= 2 && AddrSurfInfoIn.flags.color) { > + if (config->info.samples >= 2 && is_color_surface) { > ADDR_COMPUTE_FMASK_INFO_INPUT fin = {0}; > ADDR_COMPUTE_FMASK_INFO_OUTPUT fout = {0}; > ADDR_TILEINFO fmask_tile_info = {};
I'm not sure the gfx6 part is really applicable. At least we're not setting the texture bit here which makes me a bit uneasy. The gfx9 part is Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com> It makes some sense to have the extra flag there, it might result in better swizzling choices in some cases. Cheers, Nicolai > @@ -1412,11 +1414,13 @@ static int gfx9_compute_surface(ADDR_HANDLE addrlib, > AddrSurfInfoIn.bpp = surf->bpe * 8; > } > > - AddrSurfInfoIn.flags.color = !(surf->flags & RADEON_SURF_Z_OR_SBUFFER); > + bool is_color_surface = !(surf->flags & RADEON_SURF_Z_OR_SBUFFER); > + AddrSurfInfoIn.flags.color = is_color_surface && > + !(surf->flags & > RADEON_SURF_NO_RENDER_TARGET); > AddrSurfInfoIn.flags.depth = (surf->flags & RADEON_SURF_ZBUFFER) != 0; > AddrSurfInfoIn.flags.display = get_display_flag(config, surf); > /* flags.texture currently refers to TC-compatible HTILE */ > - AddrSurfInfoIn.flags.texture = AddrSurfInfoIn.flags.color || > + AddrSurfInfoIn.flags.texture = is_color_surface || > surf->flags & > RADEON_SURF_TC_COMPATIBLE_HTILE; > AddrSurfInfoIn.flags.opt4space = 1; > > diff --git a/src/amd/common/ac_surface.h b/src/amd/common/ac_surface.h > index 8ba964e64ec..7ae166c70a3 100644 > --- a/src/amd/common/ac_surface.h > +++ b/src/amd/common/ac_surface.h > @@ -68,6 +68,7 @@ enum radeon_micro_mode { > #define RADEON_SURF_IMPORTED (1 << 24) > #define RADEON_SURF_OPTIMIZE_FOR_SPACE (1 << 25) > #define RADEON_SURF_SHAREABLE (1 << 26) > +#define RADEON_SURF_NO_RENDER_TARGET (1 << 27) > > struct legacy_surf_level { > uint64_t offset; > diff --git a/src/amd/vulkan/radv_formats.c b/src/amd/vulkan/radv_formats.c > index 59bc46d2fc8..48727817d32 100644 > --- a/src/amd/vulkan/radv_formats.c > +++ b/src/amd/vulkan/radv_formats.c > @@ -1112,6 +1112,18 @@ static VkResult > radv_get_image_format_properties(struct radv_physical_device *ph > maxMipLevels = 1; > } > > + > + /* We can't create 3d compressed 128bpp images that can be rendered to > on GFX9 */ > + if (physical_device->rad_info.chip_class >= GFX9 && > + info->type == VK_IMAGE_TYPE_3D && > + vk_format_get_blocksizebits(info->format) == 128 && > + vk_format_is_compressed(info->format) && > + (info->flags & VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT) && > + ((info->flags & VK_IMAGE_CREATE_EXTENDED_USAGE_BIT) || > + (info->usage & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT))) { > + goto unsupported; > + } > + > if (info->usage & VK_IMAGE_USAGE_SAMPLED_BIT) { > if (!(format_feature_flags & > VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) { > goto unsupported; > diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c > index 2bd74e202fe..69bbcdcf645 100644 > --- a/src/amd/vulkan/radv_image.c > +++ b/src/amd/vulkan/radv_image.c > @@ -249,6 +249,12 @@ radv_init_surface(struct radv_device *device, > if (is_stencil) > surface->flags |= RADEON_SURF_SBUFFER; > > + if (device->physical_device->rad_info.chip_class >= GFX9 && > + pCreateInfo->imageType == VK_IMAGE_TYPE_3D && > + vk_format_get_blocksizebits(pCreateInfo->format) == 128 && > + vk_format_is_compressed(pCreateInfo->format)) > + surface->flags |= RADEON_SURF_NO_RENDER_TARGET; > + > surface->flags |= RADEON_SURF_OPTIMIZE_FOR_SPACE; > > if (!radv_use_dcc_for_image(device, image, create_info, pCreateInfo)) > diff --git a/src/amd/vulkan/radv_meta_copy.c b/src/amd/vulkan/radv_meta_copy.c > index ddfb5c54673..647a167ab4c 100644 > --- a/src/amd/vulkan/radv_meta_copy.c > +++ b/src/amd/vulkan/radv_meta_copy.c > @@ -107,6 +107,22 @@ blit_surf_for_image_level_layer(struct radv_image *image, > }; > } > > +static bool > +image_is_renderable(struct radv_device *device, struct radv_image *image) > +{ > + if (image->vk_format == VK_FORMAT_R32G32B32_UINT || > + image->vk_format == VK_FORMAT_R32G32B32_SINT || > + image->vk_format == VK_FORMAT_R32G32B32_SFLOAT) > + return false; > + > + if (device->physical_device->rad_info.chip_class >= GFX9 && > + image->type == VK_IMAGE_TYPE_3D && > + vk_format_get_blocksizebits(image->vk_format == 128) && > + vk_format_is_compressed(image->vk_format)) > + return false; > + return true; > +} > + > static void > meta_copy_buffer_to_image(struct radv_cmd_buffer *cmd_buffer, > struct radv_buffer* buffer, > @@ -196,9 +212,7 @@ meta_copy_buffer_to_image(struct radv_cmd_buffer > *cmd_buffer, > > /* Perform Blit */ > if (cs || > - (img_bsurf.image->vk_format == > VK_FORMAT_R32G32B32_UINT || > - img_bsurf.image->vk_format == > VK_FORMAT_R32G32B32_SINT || > - img_bsurf.image->vk_format == > VK_FORMAT_R32G32B32_SFLOAT)) { > + !image_is_renderable(cmd_buffer->device, > img_bsurf.image)) { > radv_meta_buffer_to_image_cs(cmd_buffer, > &buf_bsurf, &img_bsurf, 1, &rect); > } else { > radv_meta_blit2d(cmd_buffer, NULL, &buf_bsurf, > &img_bsurf, 1, &rect); > @@ -483,9 +497,7 @@ meta_copy_image(struct radv_cmd_buffer *cmd_buffer, > > /* Perform Blit */ > if (cs || > - (b_src.format == VK_FORMAT_R32G32B32_UINT || > - b_src.format == VK_FORMAT_R32G32B32_SINT || > - b_src.format == VK_FORMAT_R32G32B32_SFLOAT)) { > + !image_is_renderable(cmd_buffer->device, > b_dst.image)) { > radv_meta_image_to_image_cs(cmd_buffer, &b_src, > &b_dst, 1, &rect); > } else { > radv_meta_blit2d(cmd_buffer, &b_src, NULL, > &b_dst, 1, &rect); > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev