mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-20 16:30:50 +02:00
st/mesa: handle SNORM formats in generic CopyPixels path
v2: check desc->is_mixed in util_format_is_snorm
This commit is contained in:
parent
adf8afa168
commit
f83e220d36
3 changed files with 29 additions and 0 deletions
|
|
@ -131,6 +131,26 @@ util_format_is_pure_uint(enum pipe_format format)
|
|||
return (desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED && desc->channel[i].pure_integer) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if all non-void channels are normalized signed.
|
||||
*/
|
||||
boolean
|
||||
util_format_is_snorm(enum pipe_format format)
|
||||
{
|
||||
const struct util_format_description *desc = util_format_description(format);
|
||||
int i;
|
||||
|
||||
if (desc->is_mixed)
|
||||
return FALSE;
|
||||
|
||||
i = util_format_get_first_non_void_channel(format);
|
||||
if (i == -1)
|
||||
return FALSE;
|
||||
|
||||
return desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED &&
|
||||
!desc->channel[i].pure_integer &&
|
||||
desc->channel[i].normalized;
|
||||
}
|
||||
|
||||
boolean
|
||||
util_format_is_luminance_alpha(enum pipe_format format)
|
||||
|
|
|
|||
|
|
@ -645,6 +645,9 @@ util_format_is_pure_sint(enum pipe_format format);
|
|||
boolean
|
||||
util_format_is_pure_uint(enum pipe_format format);
|
||||
|
||||
boolean
|
||||
util_format_is_snorm(enum pipe_format format);
|
||||
|
||||
/**
|
||||
* Check if the src format can be blitted to the destination format with
|
||||
* a simple memcpy. For example, blitting from RGBA to RGBx is OK, but not
|
||||
|
|
|
|||
|
|
@ -1546,6 +1546,7 @@ st_CopyPixels(struct gl_context *ctx, GLint srcx, GLint srcy,
|
|||
|
||||
if (!screen->is_format_supported(screen, srcFormat, st->internal_target, 0,
|
||||
srcBind)) {
|
||||
/* srcFormat is non-renderable. Find a compatible renderable format. */
|
||||
if (type == GL_DEPTH) {
|
||||
srcFormat = st_choose_format(st, GL_DEPTH_COMPONENT, GL_NONE,
|
||||
GL_NONE, st->internal_target, 0,
|
||||
|
|
@ -1569,6 +1570,11 @@ st_CopyPixels(struct gl_context *ctx, GLint srcx, GLint srcy,
|
|||
GL_NONE, st->internal_target, 0,
|
||||
srcBind, FALSE);
|
||||
}
|
||||
else if (util_format_is_snorm(srcFormat)) {
|
||||
srcFormat = st_choose_format(st, GL_RGBA16_SNORM, GL_NONE,
|
||||
GL_NONE, st->internal_target, 0,
|
||||
srcBind, FALSE);
|
||||
}
|
||||
else {
|
||||
srcFormat = st_choose_format(st, GL_RGBA, GL_NONE,
|
||||
GL_NONE, st->internal_target, 0,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue