[Mesa-dev] [PATCH] i965: Fix repeated usage of rectangle texture coordinate scaling.

Ian Romanick idr at freedesktop.org
Wed May 28 11:25:03 PDT 2014


On 05/27/2014 06:16 PM, Kenneth Graunke wrote:
> Previously, we set up new entries in the params[] array on every access
> of a rectangle texture.  Unfortunately, we only reserve space for
> (2 * MaxTextureImageUnits) extra entries, so programs which accessed
> rectangle textures more times than that would write off the end of the
> array and likely crash.
> 
> We don't really have a decent mapping between the index returned by
> _mesa_add_state_reference and our index into the params array, so we
> have to manually search for it.
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=78691
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> Cc: mesa-stable at lists.freedesktop.org

Assuming no piglit regressions,

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

> ---
>  src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 27 ++++++++++++++++++++-------
>  1 file changed, 20 insertions(+), 7 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> index 171f063..be6b8ac 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> @@ -1486,15 +1486,28 @@ fs_visitor::rescale_texcoord(ir_texture *ir, fs_reg coordinate,
>  	 return coordinate;
>        }
>  
> -      scale_x = fs_reg(UNIFORM, uniforms);
> -      scale_y = fs_reg(UNIFORM, uniforms + 1);
> -
>        GLuint index = _mesa_add_state_reference(params,
>  					       (gl_state_index *)tokens);
> -      stage_prog_data->param[uniforms++] =
> -         &prog->Parameters->ParameterValues[index][0].f;
> -      stage_prog_data->param[uniforms++] =
> -         &prog->Parameters->ParameterValues[index][1].f;
> +      /* Try to find existing copies of the texrect scale uniforms. */
> +      for (unsigned i = 0; i < uniforms; i++) {
> +         if (stage_prog_data->param[i] ==
> +             &prog->Parameters->ParameterValues[index][0].f) {
> +            scale_x = fs_reg(UNIFORM, i);
> +            scale_y = fs_reg(UNIFORM, i + 1);
> +            break;
> +         }
> +      }
> +
> +      /* If we didn't already set them up, do so now. */
> +      if (scale_x.file == BAD_FILE) {
> +         scale_x = fs_reg(UNIFORM, uniforms);
> +         scale_y = fs_reg(UNIFORM, uniforms + 1);
> +
> +         stage_prog_data->param[uniforms++] =
> +            &prog->Parameters->ParameterValues[index][0].f;
> +         stage_prog_data->param[uniforms++] =
> +            &prog->Parameters->ParameterValues[index][1].f;
> +      }
>     }
>  
>     /* The 965 requires the EU to do the normalization of GL rectangle
> 



More information about the mesa-dev mailing list