[Mesa-dev] [PATCH] mesa: fix texture updates for ATI_fragment_shader

Miklós Máté mtmkls at gmail.com
Sun Oct 15 17:10:33 UTC 2017


Hi,

I'd like to ask you to revert this change.

As Ian Romanick pointed out this makes ATI_fs behave like ARB_fp, 
however there is a major difference between the two: with ATI_fs there 
is no way of knowing the texture targets until the draw call. When an 
ATI_fs is created, st_init_atifs_prog() sets every texture target to 
TEXTURE_2D_BIT, and st_fixup_atifs() sets the correct one, but 
unfortunately _mesa_update_texture_state() is called between them. After 
this patch update_program_texture_state() validates the texture targets 
to match the bound texture units, and thus rejects sampling from cube 
maps. This results in broken rendering in Knights of the Old Republic.

MM

On 27/09/17 17:39, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> ---
>   src/mesa/main/texstate.c | 8 +++++---
>   1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/src/mesa/main/texstate.c b/src/mesa/main/texstate.c
> index 269e291..edd2253 100644
> --- a/src/mesa/main/texstate.c
> +++ b/src/mesa/main/texstate.c
> @@ -833,23 +833,25 @@ update_ff_texture_state(struct gl_context *ctx,
>   void
>   _mesa_update_texture_state(struct gl_context *ctx)
>   {
>      struct gl_program *prog[MESA_SHADER_STAGES];
>      int i;
>      int old_max_unit = ctx->Texture._MaxEnabledTexImageUnit;
>      BITSET_DECLARE(enabled_texture_units, MAX_COMBINED_TEXTURE_IMAGE_UNITS);
>   
>      memcpy(prog, ctx->_Shader->CurrentProgram, sizeof(prog));
>   
> -   if (prog[MESA_SHADER_FRAGMENT] == NULL &&
> -       _mesa_arb_fragment_program_enabled(ctx)) {
> -      prog[MESA_SHADER_FRAGMENT] = ctx->FragmentProgram.Current;
> +   if (prog[MESA_SHADER_FRAGMENT] == NULL) {
> +      if (_mesa_arb_fragment_program_enabled(ctx))
> +         prog[MESA_SHADER_FRAGMENT] = ctx->FragmentProgram.Current;
> +      else if (_mesa_ati_fragment_shader_enabled(ctx))
> +         prog[MESA_SHADER_FRAGMENT] = ctx->ATIFragmentShader.Current->Program;
>      }
>   
>      /* TODO: only set this if there are actual changes */
>      ctx->NewState |= _NEW_TEXTURE_OBJECT | _NEW_TEXTURE_STATE;
>   
>      ctx->Texture._GenFlags = 0x0;
>      ctx->Texture._TexMatEnabled = 0x0;
>      ctx->Texture._TexGenEnabled = 0x0;
>      ctx->Texture._MaxEnabledTexImageUnit = -1;
>      ctx->Texture._EnabledCoordUnits = 0x0;




More information about the mesa-dev mailing list