From 71150b73c81a58dc06057ced561d10332aecc803 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Alejandro=20Pi=C3=B1eiro?= Date: Tue, 15 Mar 2016 12:53:07 +0100 Subject: [PATCH] i965: get the proper vertex surface type for doubles on gen8+ This commit adds support for PASSTHRU format when pushing double-precision attributes. Check glarray->Doubles in order to know if we should choose a format that does a conversion to float, or just passthru the 64-bit double. Reviewed-by: Kenneth Graunke --- src/mesa/drivers/dri/i965/brw_draw_upload.c | 30 ++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_draw_upload.c b/src/mesa/drivers/dri/i965/brw_draw_upload.c index 58e05166506..5af458368c8 100644 --- a/src/mesa/drivers/dri/i965/brw_draw_upload.c +++ b/src/mesa/drivers/dri/i965/brw_draw_upload.c @@ -37,7 +37,7 @@ #include "intel_batchbuffer.h" #include "intel_buffer_objects.h" -static const GLuint double_types[5] = { +static const GLuint double_types_float[5] = { 0, BRW_SURFACEFORMAT_R64_FLOAT, BRW_SURFACEFORMAT_R64G64_FLOAT, @@ -45,6 +45,14 @@ static const GLuint double_types[5] = { BRW_SURFACEFORMAT_R64G64B64A64_FLOAT }; +static const GLuint double_types_passthru[5] = { + 0, + BRW_SURFACEFORMAT_R64_PASSTHRU, + BRW_SURFACEFORMAT_R64G64_PASSTHRU, + BRW_SURFACEFORMAT_R64G64B64_PASSTHRU, + BRW_SURFACEFORMAT_R64G64B64A64_PASSTHRU +}; + static const GLuint float_types[5] = { 0, BRW_SURFACEFORMAT_R32_FLOAT, @@ -213,6 +221,22 @@ static const GLuint byte_types_scale[5] = { BRW_SURFACEFORMAT_R8G8B8A8_SSCALED }; +static GLuint +double_types(struct brw_context *brw, + int size, + GLboolean doubles) +{ + /* From the BDW PRM, Volume 2d, page 588 (VERTEX_ELEMENT_STATE): + * "When SourceElementFormat is set to one of the *64*_PASSTHRU formats, + * 64-bit components are stored in the URB without any conversion." + * Also included on BDW PRM, Volume 7, page 470, table "Source Element + * Formats Supported in VF Unit" + * Previous PRMs don't include those references. + */ + return (brw->gen >= 8 && doubles + ? double_types_passthru[size] + : double_types_float[size]); +} /** * Given vertex array type/size/format/normalized info, return @@ -245,7 +269,7 @@ brw_get_vertex_surface_type(struct brw_context *brw, return BRW_SURFACEFORMAT_R11G11B10_FLOAT; } else if (glarray->Normalized) { switch (glarray->Type) { - case GL_DOUBLE: return double_types[size]; + case GL_DOUBLE: return double_types(brw, size, glarray->Doubles); case GL_FLOAT: return float_types[size]; case GL_HALF_FLOAT: return half_float_types[size]; case GL_INT: return int_types_norm[size]; @@ -319,7 +343,7 @@ brw_get_vertex_surface_type(struct brw_context *brw, } assert(glarray->Format == GL_RGBA); /* sanity check */ switch (glarray->Type) { - case GL_DOUBLE: return double_types[size]; + case GL_DOUBLE: return double_types(brw, size, glarray->Doubles); case GL_FLOAT: return float_types[size]; case GL_HALF_FLOAT: return half_float_types[size]; case GL_INT: return int_types_scale[size]; -- 2.30.2