[Mesa-dev] [PATCH] i965: Use memcpy instead of an assignment when storing uniforms
Ian Romanick
idr at freedesktop.org
Fri Aug 8 13:58:10 PDT 2014
On 08/08/2014 01:56 PM, Neil Roberts wrote:
> The i965 driver uses a float pointer to point to the value of a uniform and
> also as the destination within the batch buffer. However the same locations
> can also be used to store values for integer uniforms. Previously the value
> was being copied into the batch buffer with a regular assignment. This breaks
> if the compiler does this by loading and saving through an x87 register
> because the fst instruction tries to fix up invalid float values. That can
> corrupt some specific integer values. This patch changes it to use a memcpy
> instead so that it won't use a floating-point register.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=81150
There was a lot of chatter about this on IRC. Glad it was resolved!
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
If this code also exists on the 10.2 branch, this should be tagged
Cc: mesa-stable at lists.freedesktop.org
> ---
> src/mesa/drivers/dri/i965/gen6_vs_state.c | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/src/mesa/drivers/dri/i965/gen6_vs_state.c b/src/mesa/drivers/dri/i965/gen6_vs_state.c
> index 905e123..cdbc083 100644
> --- a/src/mesa/drivers/dri/i965/gen6_vs_state.c
> +++ b/src/mesa/drivers/dri/i965/gen6_vs_state.c
> @@ -81,7 +81,13 @@ gen6_upload_push_constants(struct brw_context *brw,
> * wouldn't be set for them.
> */
> for (i = 0; i < prog_data->nr_params; i++) {
> - param[i] = *prog_data->param[i];
> + /* A memcpy is used here instead of a regular assignment because
> + * otherwise the value may end up being copied through a
> + * floating-point register. This will break if the x87 registers are
> + * used and we are storing an integer value here because the fst
> + * instruction tries to fix up invalid values and that would corrupt
> + * an integer value */
> + memcpy(param + i, prog_data->param[i], sizeof param[i]);
> }
>
> if (0) {
>
More information about the mesa-dev
mailing list