summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorRoland Scheidegger <[email protected]>2014-01-31 19:47:37 +0100
committerRoland Scheidegger <[email protected]>2014-01-31 19:51:06 +0100
commit1d53603f1fb49dd839e427f161a8912cf58d80c8 (patch)
treee8b7625c4685d939fce139d48210e70633c1018b /src/gallium
parent606544214e0e45d1d93de16b4ac4851d8d71eb87 (diff)
llvmpipe: fix denorm handling for r11g11b10_float format when blending
The code re-enabling denorms for small float formats did not recognize this format due to format handling hacks (mainly, the lp_type doesn't have the floating bit set). Reviewed-by: Jose Fonseca <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/llvmpipe/lp_state_fs.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c
index a24fecd17b4..2f9f907edd6 100644
--- a/src/gallium/drivers/llvmpipe/lp_state_fs.c
+++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c
@@ -1089,6 +1089,19 @@ scale_bits(struct gallivm_state *gallivm,
return result;
}
+/**
+ * If RT is a smallfloat (needing denorms) format
+ */
+static INLINE int
+have_smallfloat_format(struct lp_type dst_type,
+ enum pipe_format format)
+{
+ return ((dst_type.floating && dst_type.width != 32) ||
+ /* due to format handling hacks this format doesn't have floating set
+ * here (and actually has width set to 32 too) so special case this. */
+ (format == PIPE_FORMAT_R11G11B10_FLOAT));
+}
+
/**
* Convert from memory format to blending format
@@ -1593,7 +1606,7 @@ generate_unswizzled_blend(struct gallivm_state *gallivm,
* this, otherwise half-float format conversions won't work
* (again due to llvm bug #6393).
*/
- if (dst_type.floating && dst_type.width != 32) {
+ if (have_smallfloat_format(dst_type, out_format)) {
/* We need to make sure that denorms are ok for half float
conversions */
fpstate = lp_build_fpstate_get(gallivm);
@@ -2091,7 +2104,7 @@ generate_unswizzled_blend(struct gallivm_state *gallivm,
dst, dst_type, dst_count, dst_alignment);
}
- if (dst_type.floating && dst_type.width != 32) {
+ if (have_smallfloat_format(dst_type, out_format)) {
lp_build_fpstate_set(gallivm, fpstate);
}