aboutsummaryrefslogtreecommitdiffstats
path: root/src/intel/blorp
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2016-09-03 09:49:24 -0700
committerJason Ekstrand <[email protected]>2016-09-12 19:42:57 -0700
commitfa4627149dfe7cdb9f75d8e2f1bcaf1ad7006801 (patch)
tree33314baeab2bee8b08059d4ca0a493ad1b142b67 /src/intel/blorp
parentc70be1ead52b7a51819dc37220111bb0505610a7 (diff)
intel/blorp: Increase the presision of coordinate transform calculations
The result of this calculation goes into an fma() in the shader and we would like it to be as precise as possible. The division in particular was a source of imprecision whenever dst1 - dst0 was not a power of two. This prevents regressions in some of the new Vulkan CTS tests for blitting using a filtering of NEAREST. Signed-off-by: Jason Ekstrand <[email protected]> Reviewed-by: Topi Pohjolainen <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/intel/blorp')
-rw-r--r--src/intel/blorp/blorp_blit.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/src/intel/blorp/blorp_blit.c b/src/intel/blorp/blorp_blit.c
index 0898ed45faa..af463890579 100644
--- a/src/intel/blorp/blorp_blit.c
+++ b/src/intel/blorp/blorp_blit.c
@@ -1263,7 +1263,7 @@ brw_blorp_setup_coord_transform(struct brw_blorp_coord_transform *xform,
GLfloat dst0, GLfloat dst1,
bool mirror)
{
- float scale = (src1 - src0) / (dst1 - dst0);
+ double scale = (double)(src1 - src0) / (double)(dst1 - dst0);
if (!mirror) {
/* When not mirroring a coordinate (say, X), we need:
* src_x - src_x0 = (dst_x - dst_x0 + 0.5) * scale
@@ -1276,7 +1276,7 @@ brw_blorp_setup_coord_transform(struct brw_blorp_coord_transform *xform,
* so 0.5 provides the necessary correction.
*/
xform->multiplier = scale;
- xform->offset = src0 + (-dst0 + 0.5f) * scale;
+ xform->offset = src0 + (-(double)dst0 + 0.5) * scale;
} else {
/* When mirroring X we need:
* src_x - src_x0 = dst_x1 - dst_x - 0.5
@@ -1284,7 +1284,7 @@ brw_blorp_setup_coord_transform(struct brw_blorp_coord_transform *xform,
* src_x = src_x0 + (dst_x1 -dst_x - 0.5) * scale
*/
xform->multiplier = -scale;
- xform->offset = src0 + (dst1 - 0.5f) * scale;
+ xform->offset = src0 + ((double)dst1 - 0.5) * scale;
}
}