[Mesa-stable] [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-stable
mailing list