iris: Convert RGBX to RGBA for rendering.
Fixes a bunch of RGB bugs.
This commit is contained in:
@@ -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.
|
||||
*
|
||||
|
@@ -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 *);
|
||||
|
||||
|
@@ -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) {
|
||||
|
Reference in New Issue
Block a user