[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