iris: Convert RGBX to RGBA for rendering.

Fixes a bunch of RGB bugs.
This commit is contained in:
Kenneth Graunke
2018-08-13 16:41:19 -07:00
parent 906becec70
commit ea19d359cc
3 changed files with 36 additions and 12 deletions

View File

@@ -398,6 +398,26 @@ iris_isl_format_for_pipe_format(enum pipe_format pf)
return table[pf];
}
enum isl_format
iris_isl_format_for_usage(const struct gen_device_info *devinfo,
enum pipe_format pformat,
isl_surf_usage_flags_t usage)
{
enum isl_format format = iris_isl_format_for_pipe_format(pformat);
/* Convert RGBX into RGBA for rendering or typed image access. */
if (isl_format_is_rgbx(format) &&
(((usage & ISL_SURF_USAGE_RENDER_TARGET_BIT) &&
!isl_format_supports_rendering(devinfo, format)) ||
((usage & ISL_SURF_USAGE_STORAGE_BIT) &&
!(isl_format_supports_typed_writes(devinfo, format) &&
isl_format_supports_typed_reads(devinfo, format))))) {
format = isl_format_rgbx_to_rgba(format);
}
return format;
}
/**
* The pscreen->is_format_supported() driver hook.
*

View File

@@ -87,6 +87,9 @@ iris_resource_bo(struct pipe_resource *p_res)
}
enum isl_format iris_isl_format_for_pipe_format(enum pipe_format pf);
enum isl_format iris_isl_format_for_usage(const struct gen_device_info *,
enum pipe_format,
isl_surf_usage_flags_t usage);
struct pipe_resource *iris_resource_get_separate_stencil(struct pipe_resource *);

View File

@@ -1328,24 +1328,25 @@ iris_create_surface(struct pipe_context *ctx,
psurf->u.tex.last_layer = tmpl->u.tex.last_layer;
psurf->u.tex.level = tmpl->u.tex.level;
enum isl_format isl_format = iris_isl_format_for_pipe_format(psurf->format);
unsigned usage = 0;
isl_surf_usage_flags_t usage = 0;
if (tmpl->writable)
usage = ISL_SURF_USAGE_STORAGE_BIT;
else if (util_format_is_depth_or_stencil(tmpl->format))
usage = ISL_SURF_USAGE_DEPTH_BIT;
else {
else
usage = ISL_SURF_USAGE_RENDER_TARGET_BIT;
if (!isl_format_supports_rendering(devinfo, isl_format)) {
/* Framebuffer validation will reject this invalid case, but it
* hasn't had the opportunity yet. In the meantime, we need to
* avoid hitting ISL asserts about unsupported formats below.
*/
free(surf);
return NULL;
}
enum isl_format isl_format =
iris_isl_format_for_usage(devinfo, psurf->format, usage);
if ((usage & ISL_SURF_USAGE_RENDER_TARGET_BIT) &&
!isl_format_supports_rendering(devinfo, isl_format)) {
/* Framebuffer validation will reject this invalid case, but it
* hasn't had the opportunity yet. In the meantime, we need to
* avoid hitting ISL asserts about unsupported formats below.
*/
free(surf);
return NULL;
}
surf->view = (struct isl_view) {