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 <jason@jlekstrand.net>
Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Jason Ekstrand 2016-09-03 09:49:24 -07:00
parent c70be1ead5
commit fa4627149d

View file

@ -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;
}
}