summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2019-01-23 14:26:53 -0800
committerEric Anholt <[email protected]>2019-01-25 13:06:50 -0800
commit08f4a904b386f3535719dff4c224ea5cfccc92cd (patch)
treefe37c929c2488ac9857036c7ce49f2f11058c49f /src/gallium/auxiliary
parent104c7883e777b3d5caca98ed96afc3c7c409d340 (diff)
gallium: Make sure we return is_unorm/is_snorm for compressed formats.
The util helpers were looking for a non-void channels in a non-mixed format and returning its snorm/unorm state. However, compressed formats don't have non-void channels, so they always returned false. V3D wants to use util_format_is_[su]norm for its border color clamping workarounds, so fix the functions to return the right answer for these. This now means that we ignore .is_mixed. I could retain the is_mixed check, but it doesn't seem like a useful feature -- the only code I could find that might care is freedreno's blit, which has some notes about how things are wonky in this area anyway. Reviewed-by: <Roland Scheidegger [email protected]>
Diffstat (limited to 'src/gallium/auxiliary')
-rw-r--r--src/gallium/auxiliary/util/u_format.c28
-rw-r--r--src/gallium/auxiliary/util/u_format.h10
-rw-r--r--src/gallium/auxiliary/util/u_format_parse.py20
-rw-r--r--src/gallium/auxiliary/util/u_format_table.py2
4 files changed, 36 insertions, 24 deletions
diff --git a/src/gallium/auxiliary/util/u_format.c b/src/gallium/auxiliary/util/u_format.c
index 862061a8ec2..3a61d54f726 100644
--- a/src/gallium/auxiliary/util/u_format.c
+++ b/src/gallium/auxiliary/util/u_format.c
@@ -149,45 +149,25 @@ util_format_is_pure_uint(enum pipe_format format)
}
/**
- * Returns true if all non-void channels are normalized signed.
+ * Returns true if the format contains normalized signed channels.
*/
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;
+ return desc->is_snorm;
}
/**
- * Returns true if all non-void channels are normalized unsigned.
+ * Returns true if the format contains normalized unsigned channels.
*/
boolean
util_format_is_unorm(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_UNSIGNED &&
- !desc->channel[i].pure_integer &&
- desc->channel[i].normalized;
+ return desc->is_unorm;
}
boolean
diff --git a/src/gallium/auxiliary/util/u_format.h b/src/gallium/auxiliary/util/u_format.h
index 0c0c505e391..cb1138947aa 100644
--- a/src/gallium/auxiliary/util/u_format.h
+++ b/src/gallium/auxiliary/util/u_format.h
@@ -178,6 +178,16 @@ struct util_format_description
unsigned is_mixed:1;
/**
+ * Whether the format contains UNORM channels
+ */
+ unsigned is_unorm:1;
+
+ /**
+ * Whether the format contains SNORM channels
+ */
+ unsigned is_snorm:1;
+
+ /**
* Input channel description, in the order XYZW.
*
* Only valid for UTIL_FORMAT_LAYOUT_PLAIN formats.
diff --git a/src/gallium/auxiliary/util/u_format_parse.py b/src/gallium/auxiliary/util/u_format_parse.py
index 48cc012cd2a..e8a6c92d119 100644
--- a/src/gallium/auxiliary/util/u_format_parse.py
+++ b/src/gallium/auxiliary/util/u_format_parse.py
@@ -187,6 +187,26 @@ class Format:
return True
return False
+ def is_compressed(self):
+ for channel in self.le_channels:
+ if channel.type != VOID:
+ return False
+ return True
+
+ def is_unorm(self):
+ # Non-compressed formats all have unorm or srgb in their name.
+ for keyword in ['_UNORM', '_SRGB']:
+ if keyword in self.name:
+ return True
+
+ # All the compressed formats in GLES3.2 and GL4.6 ("Table 8.14: Generic
+ # and specific compressed internal formats.") that aren't snorm for
+ # border colors are unorm, other than BPTC_*_FLOAT.
+ return self.is_compressed() and not ('FLOAT' in self.name or self.is_snorm())
+
+ def is_snorm(self):
+ return '_SNORM' in self.name
+
def is_pot(self):
return is_pot(self.block_size())
diff --git a/src/gallium/auxiliary/util/u_format_table.py b/src/gallium/auxiliary/util/u_format_table.py
index 1a966c52bc7..97cd0474382 100644
--- a/src/gallium/auxiliary/util/u_format_table.py
+++ b/src/gallium/auxiliary/util/u_format_table.py
@@ -136,6 +136,8 @@ def write_format_table(formats):
print(" %s,\t/* is_array */" % (bool_map(format.is_array()),))
print(" %s,\t/* is_bitmask */" % (bool_map(format.is_bitmask()),))
print(" %s,\t/* is_mixed */" % (bool_map(format.is_mixed()),))
+ print(" %s,\t/* is_unorm */" % (bool_map(format.is_unorm()),))
+ print(" %s,\t/* is_snorm */" % (bool_map(format.is_snorm()),))
u_format_pack.print_channels(format, do_channel_array)
u_format_pack.print_channels(format, do_swizzle_array)
print(" %s," % (colorspace_map(format.colorspace),))