1d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul/*
2d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul * Mesa 3-D graphics library
36d4d51d647c27288aa625560bc080231099c0b01Brian Paul * Version:  7.3
4d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul *
528876dd511ec2c9d5f5500499201df2588e8c7f1Brian Paul * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
6d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul *
7d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a
8d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul * copy of this software and associated documentation files (the "Software"),
9d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul * to deal in the Software without restriction, including without limitation
10d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul * and/or sell copies of the Software, and to permit persons to whom the
12d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul * Software is furnished to do so, subject to the following conditions:
13d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul *
14d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul * The above copyright notice and this permission notice shall be included
15d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul * in all copies or substantial portions of the Software.
16d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul *
17d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul */
24d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul
25d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul
266d460af6af77a0d5a5b568bcd6094b98e249ba93Brian Paul/**
276d460af6af77a0d5a5b568bcd6094b98e249ba93Brian Paul * \file state.c
286d460af6af77a0d5a5b568bcd6094b98e249ba93Brian Paul * State management.
296d460af6af77a0d5a5b568bcd6094b98e249ba93Brian Paul *
30f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg * This file manages recalculation of derived values in struct gl_context.
316d460af6af77a0d5a5b568bcd6094b98e249ba93Brian Paul */
326d460af6af77a0d5a5b568bcd6094b98e249ba93Brian Paul
33c9e5671691289006e9b1152d6ce20200a83010c2Brian Paul
34d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul#include "glheader.h"
35c9e5671691289006e9b1152d6ce20200a83010c2Brian Paul#include "mtypes.h"
360e019cbd1ca4ad8a11c9310d701ca4aab11b5951Brian Paul#include "arrayobj.h"
37d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul#include "context.h"
38c9e5671691289006e9b1152d6ce20200a83010c2Brian Paul#include "debug.h"
39c9e5671691289006e9b1152d6ce20200a83010c2Brian Paul#include "macros.h"
4032ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell#include "ffvertex_prog.h"
41e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#include "framebuffer.h"
42d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul#include "light.h"
43d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul#include "matrix.h"
44d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul#include "pixel.h"
45ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/program.h"
46ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_parameter.h"
47b527dd65c830a2b008816cf390d5be906e29bb23Ian Romanick#include "shaderobj.h"
48d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul#include "state.h"
49d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul#include "stencil.h"
50c9e5671691289006e9b1152d6ce20200a83010c2Brian Paul#include "texenvprogram.h"
51d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul#include "texobj.h"
52d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul#include "texstate.h"
537b8830d81d816c22d5930bec1f0f178cf0d138c6Brian Paul#include "varray.h"
54a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul
551e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell
56ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brianstatic void
57f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergupdate_separate_specular(struct gl_context *ctx)
58ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian{
59decc6e2a32ef49e673c081f30e19b8970155d887Brian Paul   if (_mesa_need_secondary_color(ctx))
60ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian      ctx->_TriangleCaps |= DD_SEPARATE_SPECULAR;
61ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian   else
62ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian      ctx->_TriangleCaps &= ~DD_SEPARATE_SPECULAR;
63ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian}
64ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian
65ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian
66a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul/**
67537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul * Update the following fields:
68537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul *   ctx->VertexProgram._Enabled
69537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul *   ctx->FragmentProgram._Enabled
70537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul *   ctx->ATIFragmentShader._Enabled
71537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul * This needs to be done before texture state validation.
72537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul */
736d460af6af77a0d5a5b568bcd6094b98e249ba93Brian Paulstatic void
74f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergupdate_program_enables(struct gl_context *ctx)
756d460af6af77a0d5a5b568bcd6094b98e249ba93Brian Paul{
763c95ff209f72bacd1b5807c97e1dee079e9206b3Brian Paul   /* These _Enabled flags indicate if the user-defined ARB/NV vertex/fragment
773c95ff209f72bacd1b5807c97e1dee079e9206b3Brian Paul    * program is enabled AND valid.  Similarly for ATI fragment shaders.
783c95ff209f72bacd1b5807c97e1dee079e9206b3Brian Paul    * GLSL shaders not relevant here.
793c95ff209f72bacd1b5807c97e1dee079e9206b3Brian Paul    */
806d460af6af77a0d5a5b568bcd6094b98e249ba93Brian Paul   ctx->VertexProgram._Enabled = ctx->VertexProgram.Enabled
81de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul      && ctx->VertexProgram.Current->Base.Instructions;
826d460af6af77a0d5a5b568bcd6094b98e249ba93Brian Paul   ctx->FragmentProgram._Enabled = ctx->FragmentProgram.Enabled
83de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul      && ctx->FragmentProgram.Current->Base.Instructions;
847f752fed993e5e9423abac200dd59141edbada56Dave Airlie   ctx->ATIFragmentShader._Enabled = ctx->ATIFragmentShader.Enabled
8528dfb0613b51c51d5f09010ea38d050a9ec817d7Roland Scheidegger      && ctx->ATIFragmentShader.Current->Instructions[0];
86537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul}
87537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul
88537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul
89537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul/**
9079dddedfd197d089ccb1c6d8b5b7d38583493ac5Brian Paul * Update the ctx->Vertex/Geometry/FragmentProgram._Current pointers to point
9179dddedfd197d089ccb1c6d8b5b7d38583493ac5Brian Paul * to the current/active programs.  Then call ctx->Driver.BindProgram() to
9279dddedfd197d089ccb1c6d8b5b7d38583493ac5Brian Paul * tell the driver which programs to use.
9379dddedfd197d089ccb1c6d8b5b7d38583493ac5Brian Paul *
9479dddedfd197d089ccb1c6d8b5b7d38583493ac5Brian Paul * Programs may come from 3 sources: GLSL shaders, ARB/NV_vertex/fragment
9579dddedfd197d089ccb1c6d8b5b7d38583493ac5Brian Paul * programs or programs derived from fixed-function state.
96537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul *
97537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul * This function needs to be called after texture state validation in case
98537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul * we're generating a fragment program from fixed-function texture state.
99de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul *
100de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul * \return bitfield which will indicate _NEW_PROGRAM state if a new vertex
101de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul * or fragment program is being used.
102537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul */
103de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paulstatic GLbitfield
104f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergupdate_program(struct gl_context *ctx)
105537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul{
10684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   const struct gl_shader_program *vsProg = ctx->Shader.CurrentVertexProgram;
10784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   const struct gl_shader_program *gsProg = ctx->Shader.CurrentGeometryProgram;
108459a44460e4d31d69d7ff04c1000917ca7870ff3Brian Paul   struct gl_shader_program *fsProg = ctx->Shader.CurrentFragmentProgram;
109537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul   const struct gl_vertex_program *prevVP = ctx->VertexProgram._Current;
110537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul   const struct gl_fragment_program *prevFP = ctx->FragmentProgram._Current;
111da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   const struct gl_geometry_program *prevGP = ctx->GeometryProgram._Current;
112de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul   GLbitfield new_state = 0x0;
11347b29f511a8e917c65536fde90397d54d2ad23d3Keith Whitwell
114a90046f1097ad95de2aa95ca65741dff5cddced9Brian   /*
115a90046f1097ad95de2aa95ca65741dff5cddced9Brian    * Set the ctx->VertexProgram._Current and ctx->FragmentProgram._Current
11635aebf46679a6450b912b592b83badcfb523b79cBrian Paul    * pointers to the programs that should be used for rendering.  If either
11735aebf46679a6450b912b592b83badcfb523b79cBrian Paul    * is NULL, use fixed-function code paths.
118a90046f1097ad95de2aa95ca65741dff5cddced9Brian    *
119a90046f1097ad95de2aa95ca65741dff5cddced9Brian    * These programs may come from several sources.  The priority is as
120a90046f1097ad95de2aa95ca65741dff5cddced9Brian    * follows:
121a90046f1097ad95de2aa95ca65741dff5cddced9Brian    *   1. OpenGL 2.0/ARB vertex/fragment shaders
122a90046f1097ad95de2aa95ca65741dff5cddced9Brian    *   2. ARB/NV vertex/fragment programs
123a90046f1097ad95de2aa95ca65741dff5cddced9Brian    *   3. Programs derived from fixed-function state.
12432ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell    *
12532ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell    * Note: it's possible for a vertex shader to get used with a fragment
12632ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell    * program (and vice versa) here, but in practice that shouldn't ever
12732ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell    * come up, or matter.
128a90046f1097ad95de2aa95ca65741dff5cddced9Brian    */
129a90046f1097ad95de2aa95ca65741dff5cddced9Brian
130de772c402215b956ab3aa0875330fc1bf7cdf95bIan Romanick   if (fsProg && fsProg->LinkStatus
131de772c402215b956ab3aa0875330fc1bf7cdf95bIan Romanick       && fsProg->_LinkedShaders[MESA_SHADER_FRAGMENT]) {
13279dddedfd197d089ccb1c6d8b5b7d38583493ac5Brian Paul      /* Use GLSL fragment shader */
133b527dd65c830a2b008816cf390d5be906e29bb23Ian Romanick      _mesa_reference_shader_program(ctx,
134b527dd65c830a2b008816cf390d5be906e29bb23Ian Romanick				     &ctx->Shader._CurrentFragmentProgram,
135b527dd65c830a2b008816cf390d5be906e29bb23Ian Romanick				     fsProg);
136df43fb661b2030d9b833a42dd47b8d7bf58d73aaBrian      _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current,
137e4f8d33aea7e0112dfbf3a38fdc36d11b2e7be10Brian Paul                               gl_fragment_program(fsProg->_LinkedShaders[MESA_SHADER_FRAGMENT]->Program));
13834db7a8c1e775aaefad7952133e087f1c1a569f6Ian Romanick      _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._TexEnvProgram,
13934db7a8c1e775aaefad7952133e087f1c1a569f6Ian Romanick			       NULL);
140a90046f1097ad95de2aa95ca65741dff5cddced9Brian   }
141e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane   else if (ctx->FragmentProgram._Enabled) {
14279dddedfd197d089ccb1c6d8b5b7d38583493ac5Brian Paul      /* Use user-defined fragment program */
143b527dd65c830a2b008816cf390d5be906e29bb23Ian Romanick      _mesa_reference_shader_program(ctx,
144b527dd65c830a2b008816cf390d5be906e29bb23Ian Romanick				     &ctx->Shader._CurrentFragmentProgram,
145b527dd65c830a2b008816cf390d5be906e29bb23Ian Romanick				     NULL);
146e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane      _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current,
147e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane                               ctx->FragmentProgram.Current);
14834db7a8c1e775aaefad7952133e087f1c1a569f6Ian Romanick      _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._TexEnvProgram,
14934db7a8c1e775aaefad7952133e087f1c1a569f6Ian Romanick			       NULL);
150e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane   }
151e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane   else if (ctx->FragmentProgram._MaintainTexEnvProgram) {
15279dddedfd197d089ccb1c6d8b5b7d38583493ac5Brian Paul      /* Use fragment program generated from fixed-function state */
1537ec2b0d0d6b6a0f760e55ffdee0bdb385a3e900aEric Anholt      struct gl_shader_program *f = _mesa_get_fixed_func_fragment_program(ctx);
1547ec2b0d0d6b6a0f760e55ffdee0bdb385a3e900aEric Anholt
155b527dd65c830a2b008816cf390d5be906e29bb23Ian Romanick      _mesa_reference_shader_program(ctx,
156b527dd65c830a2b008816cf390d5be906e29bb23Ian Romanick				     &ctx->Shader._CurrentFragmentProgram,
157b527dd65c830a2b008816cf390d5be906e29bb23Ian Romanick				     f);
158e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane      _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current,
159e4f8d33aea7e0112dfbf3a38fdc36d11b2e7be10Brian Paul			       gl_fragment_program(f->_LinkedShaders[MESA_SHADER_FRAGMENT]->Program));
16034db7a8c1e775aaefad7952133e087f1c1a569f6Ian Romanick      _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._TexEnvProgram,
161e4f8d33aea7e0112dfbf3a38fdc36d11b2e7be10Brian Paul			       gl_fragment_program(f->_LinkedShaders[MESA_SHADER_FRAGMENT]->Program));
162e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane   }
163a90046f1097ad95de2aa95ca65741dff5cddced9Brian   else {
16479dddedfd197d089ccb1c6d8b5b7d38583493ac5Brian Paul      /* No fragment program */
165e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane      _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current, NULL);
16634db7a8c1e775aaefad7952133e087f1c1a569f6Ian Romanick      _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._TexEnvProgram,
16734db7a8c1e775aaefad7952133e087f1c1a569f6Ian Romanick			       NULL);
168e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane   }
16932ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell
17039348bf79fb247eec895c93e52f23afe138be46aIan Romanick   if (gsProg && gsProg->LinkStatus
17139348bf79fb247eec895c93e52f23afe138be46aIan Romanick       && gsProg->_LinkedShaders[MESA_SHADER_GEOMETRY]) {
17279dddedfd197d089ccb1c6d8b5b7d38583493ac5Brian Paul      /* Use GLSL geometry shader */
173da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      _mesa_reference_geomprog(ctx, &ctx->GeometryProgram._Current,
174e4f8d33aea7e0112dfbf3a38fdc36d11b2e7be10Brian Paul			       gl_geometry_program(gsProg->_LinkedShaders[MESA_SHADER_GEOMETRY]->Program));
175da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   } else {
17679dddedfd197d089ccb1c6d8b5b7d38583493ac5Brian Paul      /* No geometry program */
177da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      _mesa_reference_geomprog(ctx, &ctx->GeometryProgram._Current, NULL);
178da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
179da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
180e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane   /* Examine vertex program after fragment program as
181e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane    * _mesa_get_fixed_func_vertex_program() needs to know active
182e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane    * fragprog inputs.
183e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane    */
184010cc547ca8c1fb2107106b0ad0de560780ce9aaIan Romanick   if (vsProg && vsProg->LinkStatus
185010cc547ca8c1fb2107106b0ad0de560780ce9aaIan Romanick       && vsProg->_LinkedShaders[MESA_SHADER_VERTEX]) {
18679dddedfd197d089ccb1c6d8b5b7d38583493ac5Brian Paul      /* Use GLSL vertex shader */
187e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane      _mesa_reference_vertprog(ctx, &ctx->VertexProgram._Current,
188e4f8d33aea7e0112dfbf3a38fdc36d11b2e7be10Brian Paul			       gl_vertex_program(vsProg->_LinkedShaders[MESA_SHADER_VERTEX]->Program));
189e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane   }
190e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane   else if (ctx->VertexProgram._Enabled) {
19179dddedfd197d089ccb1c6d8b5b7d38583493ac5Brian Paul      /* Use user-defined vertex program */
192e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane      _mesa_reference_vertprog(ctx, &ctx->VertexProgram._Current,
193e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane                               ctx->VertexProgram.Current);
194e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane   }
195e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane   else if (ctx->VertexProgram._MaintainTnlProgram) {
19679dddedfd197d089ccb1c6d8b5b7d38583493ac5Brian Paul      /* Use vertex program generated from fixed-function state */
197e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane      _mesa_reference_vertprog(ctx, &ctx->VertexProgram._Current,
198e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane                               _mesa_get_fixed_func_vertex_program(ctx));
199e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane      _mesa_reference_vertprog(ctx, &ctx->VertexProgram._TnlProgram,
200e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane                               ctx->VertexProgram._Current);
201e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane   }
202e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane   else {
203e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane      /* no vertex program */
204e4c9aeed8b59e15bce0906521cdd090f033586a9Alan Hourihane      _mesa_reference_vertprog(ctx, &ctx->VertexProgram._Current, NULL);
20547b29f511a8e917c65536fde90397d54d2ad23d3Keith Whitwell   }
2063e45db67294faaf0a06c42bdd6dbdb96f87c8801Brian
20732ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell   /* Let the driver know what's happening:
20832ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell    */
209de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul   if (ctx->FragmentProgram._Current != prevFP) {
210de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul      new_state |= _NEW_PROGRAM;
211de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul      if (ctx->Driver.BindProgram) {
212de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul         ctx->Driver.BindProgram(ctx, GL_FRAGMENT_PROGRAM_ARB,
213de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul                          (struct gl_program *) ctx->FragmentProgram._Current);
214de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul      }
21532ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell   }
216da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
217da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if (ctx->GeometryProgram._Current != prevGP) {
218da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      new_state |= _NEW_PROGRAM;
219da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      if (ctx->Driver.BindProgram) {
220da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         ctx->Driver.BindProgram(ctx, MESA_GEOMETRY_PROGRAM,
221da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                            (struct gl_program *) ctx->GeometryProgram._Current);
222da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
223da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
224da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
225de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul   if (ctx->VertexProgram._Current != prevVP) {
226de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul      new_state |= _NEW_PROGRAM;
227de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul      if (ctx->Driver.BindProgram) {
228de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul         ctx->Driver.BindProgram(ctx, GL_VERTEX_PROGRAM_ARB,
229de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul                            (struct gl_program *) ctx->VertexProgram._Current);
230de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul      }
23132ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell   }
232de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul
233de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul   return new_state;
2346d460af6af77a0d5a5b568bcd6094b98e249ba93Brian Paul}
2356d460af6af77a0d5a5b568bcd6094b98e249ba93Brian Paul
236a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul
23764e331eb529e66ef678804594c8a3266c97e645fBrian Paul/**
23864e331eb529e66ef678804594c8a3266c97e645fBrian Paul * Examine shader constants and return either _NEW_PROGRAM_CONSTANTS or 0.
23964e331eb529e66ef678804594c8a3266c97e645fBrian Paul */
24064e331eb529e66ef678804594c8a3266c97e645fBrian Paulstatic GLbitfield
241f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergupdate_program_constants(struct gl_context *ctx)
24264e331eb529e66ef678804594c8a3266c97e645fBrian Paul{
24364e331eb529e66ef678804594c8a3266c97e645fBrian Paul   GLbitfield new_state = 0x0;
24464e331eb529e66ef678804594c8a3266c97e645fBrian Paul
24564e331eb529e66ef678804594c8a3266c97e645fBrian Paul   if (ctx->FragmentProgram._Current) {
24664e331eb529e66ef678804594c8a3266c97e645fBrian Paul      const struct gl_program_parameter_list *params =
24764e331eb529e66ef678804594c8a3266c97e645fBrian Paul         ctx->FragmentProgram._Current->Base.Parameters;
24864e331eb529e66ef678804594c8a3266c97e645fBrian Paul      if (params && params->StateFlags & ctx->NewState) {
24964e331eb529e66ef678804594c8a3266c97e645fBrian Paul         new_state |= _NEW_PROGRAM_CONSTANTS;
25064e331eb529e66ef678804594c8a3266c97e645fBrian Paul      }
25164e331eb529e66ef678804594c8a3266c97e645fBrian Paul   }
25264e331eb529e66ef678804594c8a3266c97e645fBrian Paul
253da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if (ctx->GeometryProgram._Current) {
254da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      const struct gl_program_parameter_list *params =
255da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         ctx->GeometryProgram._Current->Base.Parameters;
256da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      /*FIXME: StateFlags is always 0 because we have unnamed constant
257da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin       *       not state changes */
258da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      if (params /*&& params->StateFlags & ctx->NewState*/) {
259da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         new_state |= _NEW_PROGRAM_CONSTANTS;
260da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
261da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
262da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
26364e331eb529e66ef678804594c8a3266c97e645fBrian Paul   if (ctx->VertexProgram._Current) {
26464e331eb529e66ef678804594c8a3266c97e645fBrian Paul      const struct gl_program_parameter_list *params =
26564e331eb529e66ef678804594c8a3266c97e645fBrian Paul         ctx->VertexProgram._Current->Base.Parameters;
26664e331eb529e66ef678804594c8a3266c97e645fBrian Paul      if (params && params->StateFlags & ctx->NewState) {
26764e331eb529e66ef678804594c8a3266c97e645fBrian Paul         new_state |= _NEW_PROGRAM_CONSTANTS;
26864e331eb529e66ef678804594c8a3266c97e645fBrian Paul      }
26964e331eb529e66ef678804594c8a3266c97e645fBrian Paul   }
27064e331eb529e66ef678804594c8a3266c97e645fBrian Paul
27164e331eb529e66ef678804594c8a3266c97e645fBrian Paul   return new_state;
27264e331eb529e66ef678804594c8a3266c97e645fBrian Paul}
27364e331eb529e66ef678804594c8a3266c97e645fBrian Paul
27464e331eb529e66ef678804594c8a3266c97e645fBrian Paul
27564e331eb529e66ef678804594c8a3266c97e645fBrian Paul
27664e331eb529e66ef678804594c8a3266c97e645fBrian Paul
277519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paulstatic void
278f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergupdate_viewport_matrix(struct gl_context *ctx)
279519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paul{
280519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paul   const GLfloat depthMax = ctx->DrawBuffer->_DepthMaxF;
281519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paul
282519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paul   ASSERT(depthMax > 0);
283519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paul
284519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paul   /* Compute scale and bias values. This is really driver-specific
285519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paul    * and should be maintained elsewhere if at all.
286519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paul    * NOTE: RasterPos uses this.
287519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paul    */
288519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paul   _math_matrix_viewport(&ctx->Viewport._WindowMap,
289519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paul                         ctx->Viewport.X, ctx->Viewport.Y,
290519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paul                         ctx->Viewport.Width, ctx->Viewport.Height,
291519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paul                         ctx->Viewport.Near, ctx->Viewport.Far,
292519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paul                         depthMax);
293519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paul}
294519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paul
295519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paul
296813e56db511e783fcf1ad7bcfd40645451802bd7Brian Paul/**
2975ef4e4ffb8053db87f52df3c9b2ddb71d9c7d6e5Roland Scheidegger * Update derived multisample state.
2985ef4e4ffb8053db87f52df3c9b2ddb71d9c7d6e5Roland Scheidegger */
2995ef4e4ffb8053db87f52df3c9b2ddb71d9c7d6e5Roland Scheideggerstatic void
300f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergupdate_multisample(struct gl_context *ctx)
3015ef4e4ffb8053db87f52df3c9b2ddb71d9c7d6e5Roland Scheidegger{
3025ef4e4ffb8053db87f52df3c9b2ddb71d9c7d6e5Roland Scheidegger   ctx->Multisample._Enabled = GL_FALSE;
3039d48a7832b78658d2422ae5a185276c41750010dBrian Paul   if (ctx->Multisample.Enabled &&
3049d48a7832b78658d2422ae5a185276c41750010dBrian Paul       ctx->DrawBuffer &&
3059d48a7832b78658d2422ae5a185276c41750010dBrian Paul       ctx->DrawBuffer->Visual.sampleBuffers)
3069d48a7832b78658d2422ae5a185276c41750010dBrian Paul      ctx->Multisample._Enabled = GL_TRUE;
3075ef4e4ffb8053db87f52df3c9b2ddb71d9c7d6e5Roland Scheidegger}
3085ef4e4ffb8053db87f52df3c9b2ddb71d9c7d6e5Roland Scheidegger
3095ef4e4ffb8053db87f52df3c9b2ddb71d9c7d6e5Roland Scheidegger
3105ef4e4ffb8053db87f52df3c9b2ddb71d9c7d6e5Roland Scheidegger/**
3119786688672db9e8916b6b64ec78417197db77e84Brian Paul * Update the ctx->Color._ClampFragmentColor field
3129786688672db9e8916b6b64ec78417197db77e84Brian Paul */
313e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšákstatic void
314e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšákupdate_clamp_fragment_color(struct gl_context *ctx)
315e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák{
3169786688672db9e8916b6b64ec78417197db77e84Brian Paul   if (ctx->Color.ClampFragmentColor == GL_FIXED_ONLY_ARB)
3179786688672db9e8916b6b64ec78417197db77e84Brian Paul      ctx->Color._ClampFragmentColor =
3189786688672db9e8916b6b64ec78417197db77e84Brian Paul         !ctx->DrawBuffer || !ctx->DrawBuffer->Visual.floatMode;
319e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   else
320e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák      ctx->Color._ClampFragmentColor = ctx->Color.ClampFragmentColor;
321e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák}
322e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák
3239786688672db9e8916b6b64ec78417197db77e84Brian Paul
3249786688672db9e8916b6b64ec78417197db77e84Brian Paul/**
3259786688672db9e8916b6b64ec78417197db77e84Brian Paul * Update the ctx->Color._ClampVertexColor field
3269786688672db9e8916b6b64ec78417197db77e84Brian Paul */
327e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšákstatic void
328e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšákupdate_clamp_vertex_color(struct gl_context *ctx)
329e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák{
3309786688672db9e8916b6b64ec78417197db77e84Brian Paul   if (ctx->Light.ClampVertexColor == GL_FIXED_ONLY_ARB)
3319786688672db9e8916b6b64ec78417197db77e84Brian Paul      ctx->Light._ClampVertexColor =
3329786688672db9e8916b6b64ec78417197db77e84Brian Paul         !ctx->DrawBuffer || !ctx->DrawBuffer->Visual.floatMode;
333e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   else
334e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák      ctx->Light._ClampVertexColor = ctx->Light.ClampVertexColor;
335e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák}
336e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák
3379786688672db9e8916b6b64ec78417197db77e84Brian Paul
3389786688672db9e8916b6b64ec78417197db77e84Brian Paul/**
3399786688672db9e8916b6b64ec78417197db77e84Brian Paul * Update the ctx->Color._ClampReadColor field
3409786688672db9e8916b6b64ec78417197db77e84Brian Paul */
341e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšákstatic void
342e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšákupdate_clamp_read_color(struct gl_context *ctx)
343e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák{
3449786688672db9e8916b6b64ec78417197db77e84Brian Paul   if (ctx->Color.ClampReadColor == GL_FIXED_ONLY_ARB)
3459786688672db9e8916b6b64ec78417197db77e84Brian Paul      ctx->Color._ClampReadColor =
3469786688672db9e8916b6b64ec78417197db77e84Brian Paul         !ctx->ReadBuffer || !ctx->ReadBuffer->Visual.floatMode;
347e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   else
348e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák      ctx->Color._ClampReadColor = ctx->Color.ClampReadColor;
349e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák}
350e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák
351b68e3422ed9a0f16c7015940ffd5ac0361f0ca42Eric Anholt/**
352b68e3422ed9a0f16c7015940ffd5ac0361f0ca42Eric Anholt * Update the ctx->VertexProgram._TwoSideEnabled flag.
353b68e3422ed9a0f16c7015940ffd5ac0361f0ca42Eric Anholt */
354b68e3422ed9a0f16c7015940ffd5ac0361f0ca42Eric Anholtstatic void
355b68e3422ed9a0f16c7015940ffd5ac0361f0ca42Eric Anholtupdate_twoside(struct gl_context *ctx)
356b68e3422ed9a0f16c7015940ffd5ac0361f0ca42Eric Anholt{
357b68e3422ed9a0f16c7015940ffd5ac0361f0ca42Eric Anholt   if (ctx->Shader.CurrentVertexProgram ||
358c0cd9471173cd2287d74f5a536577348c789da5dEric Anholt       ctx->VertexProgram._Enabled) {
359b68e3422ed9a0f16c7015940ffd5ac0361f0ca42Eric Anholt      ctx->VertexProgram._TwoSideEnabled = ctx->VertexProgram.TwoSideEnabled;
360b68e3422ed9a0f16c7015940ffd5ac0361f0ca42Eric Anholt   } else {
361b68e3422ed9a0f16c7015940ffd5ac0361f0ca42Eric Anholt      ctx->VertexProgram._TwoSideEnabled = (ctx->Light.Enabled &&
362b68e3422ed9a0f16c7015940ffd5ac0361f0ca42Eric Anholt					    ctx->Light.Model.TwoSide);
363b68e3422ed9a0f16c7015940ffd5ac0361f0ca42Eric Anholt   }
364b68e3422ed9a0f16c7015940ffd5ac0361f0ca42Eric Anholt}
365e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák
366519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paul
367ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian/*
368741bfef26c1f0d4f7c3d3a32479752cb6ee55ab6Brian Paul * Check polygon state and set DD_TRI_OFFSET
369ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian * in ctx->_TriangleCaps if needed.
370ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian */
371ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brianstatic void
372f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergupdate_polygon(struct gl_context *ctx)
373ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian{
374741bfef26c1f0d4f7c3d3a32479752cb6ee55ab6Brian Paul   ctx->_TriangleCaps &= ~DD_TRI_OFFSET;
375ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian
376ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian   if (   ctx->Polygon.OffsetPoint
377ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian       || ctx->Polygon.OffsetLine
378ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian       || ctx->Polygon.OffsetFill)
379ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian      ctx->_TriangleCaps |= DD_TRI_OFFSET;
380ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian}
381ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian
382a90046f1097ad95de2aa95ca65741dff5cddced9Brian
38367742383e87734130e35d08d7c63c75b9adcf655Brian Paul/**
3848dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian * Update the ctx->_TriangleCaps bitfield.
3858dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian * XXX that bitfield should really go away someday!
3868dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian * This function must be called after other update_*() functions since
3878dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian * there are dependencies on some other derived values.
3888dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian */
389ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian#if 0
3908dcfcad7a2598ba835930aac8f3fd6576e464c1cBrianstatic void
391f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergupdate_tricaps(struct gl_context *ctx, GLbitfield new_state)
3928dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian{
3938dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian   ctx->_TriangleCaps = 0;
3948dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian
3958dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian   /*
3968dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian    * Points
3978dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian    */
398b7f5b8af65603002f73b5f83b34d090536df6e00Brian   if (1/*new_state & _NEW_POINT*/) {
3998dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian      if (ctx->Point.SmoothFlag)
4008dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian         ctx->_TriangleCaps |= DD_POINT_SMOOTH;
4018dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian      if (ctx->Point._Attenuated)
4028dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian         ctx->_TriangleCaps |= DD_POINT_ATTEN;
4038dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian   }
4048dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian
4058dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian   /*
4068dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian    * Lines
4078dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian    */
408b7f5b8af65603002f73b5f83b34d090536df6e00Brian   if (1/*new_state & _NEW_LINE*/) {
4098dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian      if (ctx->Line.SmoothFlag)
4108dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian         ctx->_TriangleCaps |= DD_LINE_SMOOTH;
4118dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian      if (ctx->Line.StippleFlag)
4128dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian         ctx->_TriangleCaps |= DD_LINE_STIPPLE;
4138dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian   }
4148dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian
4158dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian   /*
4168dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian    * Polygons
4178dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian    */
418b7f5b8af65603002f73b5f83b34d090536df6e00Brian   if (1/*new_state & _NEW_POLYGON*/) {
4198dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian      if (ctx->Polygon.SmoothFlag)
4208dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian         ctx->_TriangleCaps |= DD_TRI_SMOOTH;
4218dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian      if (ctx->Polygon.StippleFlag)
4228dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian         ctx->_TriangleCaps |= DD_TRI_STIPPLE;
4238dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian      if (ctx->Polygon.FrontMode != GL_FILL
4248dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian          || ctx->Polygon.BackMode != GL_FILL)
4258dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian         ctx->_TriangleCaps |= DD_TRI_UNFILLED;
4268dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian      if (ctx->Polygon.OffsetPoint ||
4278dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian          ctx->Polygon.OffsetLine ||
4288dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian          ctx->Polygon.OffsetFill)
4298dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian         ctx->_TriangleCaps |= DD_TRI_OFFSET;
4308dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian   }
4318dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian
4328dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian   /*
4338dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian    * Lighting and shading
4348dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian    */
4358dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian   if (ctx->Light.Enabled && ctx->Light.Model.TwoSide)
4368dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian      ctx->_TriangleCaps |= DD_TRI_LIGHT_TWOSIDE;
437decc6e2a32ef49e673c081f30e19b8970155d887Brian Paul   if (_mesa_need_secondary_color(ctx))
4388dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian      ctx->_TriangleCaps |= DD_SEPARATE_SPECULAR;
4398dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian}
440ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian#endif
4418dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian
4428dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian
4438dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian/**
444a90046f1097ad95de2aa95ca65741dff5cddced9Brian * Compute derived GL state.
445f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg * If __struct gl_contextRec::NewState is non-zero then this function \b must
446a90046f1097ad95de2aa95ca65741dff5cddced9Brian * be called before rendering anything.
447cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell *
44867742383e87734130e35d08d7c63c75b9adcf655Brian Paul * Calls dd_function_table::UpdateState to perform any internal state
44967742383e87734130e35d08d7c63c75b9adcf655Brian Paul * management necessary.
4506dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell *
4516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa _mesa_update_modelview_project(), _mesa_update_texture(),
4528dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian * _mesa_update_buffer_bounds(),
45367742383e87734130e35d08d7c63c75b9adcf655Brian Paul * _mesa_update_lighting() and _mesa_update_tnl_spaces().
4541e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell */
45567742383e87734130e35d08d7c63c75b9adcf655Brian Paulvoid
456f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_update_state_locked( struct gl_context *ctx )
4571e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell{
458d469e5e5a03334f76cee4418dad97060661b1dc4Brian Paul   GLbitfield new_state = ctx->NewState;
45932ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell   GLbitfield prog_flags = _NEW_PROGRAM;
460de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul   GLbitfield new_prog_state = 0x0;
4611e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell
462fa1b533012030cd67148b5bf1e018fd5e30c96f8Keith Whitwell   if (new_state == _NEW_CURRENT_ATTRIB)
463fa1b533012030cd67148b5bf1e018fd5e30c96f8Keith Whitwell      goto out;
464fa1b533012030cd67148b5bf1e018fd5e30c96f8Keith Whitwell
4651e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell   if (MESA_VERBOSE & VERBOSE_STATE)
466306d3fcdbad523428501833405e47e9897896defKeith Whitwell      _mesa_print_state("_mesa_update_state", new_state);
4671e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell
468537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul   /* Determine which state flags effect vertex/fragment program state */
46946ae1abbac6837d051c10b2e8b57eab3d4958ff4Brian Paul   if (ctx->FragmentProgram._MaintainTexEnvProgram) {
470b6b9b17d27c570cc99ae339e595cf2f63ca5e8d7Brian Paul      prog_flags |= (_NEW_BUFFERS | _NEW_TEXTURE | _NEW_FOG |
471576c8c592a4be7047a00b0c8fe3851b09f10d8d4Marek Olšák		     _NEW_VARYING_VP_INPUTS | _NEW_LIGHT | _NEW_POINT |
472576c8c592a4be7047a00b0c8fe3851b09f10d8d4Marek Olšák		     _NEW_RENDERMODE | _NEW_PROGRAM | _NEW_FRAG_CLAMP |
473576c8c592a4be7047a00b0c8fe3851b09f10d8d4Marek Olšák		     _NEW_COLOR);
47446ae1abbac6837d051c10b2e8b57eab3d4958ff4Brian Paul   }
47546ae1abbac6837d051c10b2e8b57eab3d4958ff4Brian Paul   if (ctx->VertexProgram._MaintainTnlProgram) {
476576c8c592a4be7047a00b0c8fe3851b09f10d8d4Marek Olšák      prog_flags |= (_NEW_VARYING_VP_INPUTS | _NEW_TEXTURE |
477576c8c592a4be7047a00b0c8fe3851b09f10d8d4Marek Olšák                     _NEW_TEXTURE_MATRIX | _NEW_TRANSFORM | _NEW_POINT |
47846ae1abbac6837d051c10b2e8b57eab3d4958ff4Brian Paul                     _NEW_FOG | _NEW_LIGHT |
47946ae1abbac6837d051c10b2e8b57eab3d4958ff4Brian Paul                     _MESA_NEW_NEED_EYE_COORDS);
48046ae1abbac6837d051c10b2e8b57eab3d4958ff4Brian Paul   }
481537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul
482537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul   /*
483537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul    * Now update derived state info
484537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul    */
485537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul
48646ae1abbac6837d051c10b2e8b57eab3d4958ff4Brian Paul   if (new_state & prog_flags)
487537d3ed6f3112fdf16fd853ada0e0bcc8bd83227Brian Paul      update_program_enables( ctx );
48846ae1abbac6837d051c10b2e8b57eab3d4958ff4Brian Paul
4896dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   if (new_state & (_NEW_MODELVIEW|_NEW_PROJECTION))
4906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      _mesa_update_modelview_project( ctx, new_state );
4911e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell
4923abf746a7eae52220485cd031aecec2ca9e6103eKeith Whitwell   if (new_state & (_NEW_PROGRAM|_NEW_TEXTURE|_NEW_TEXTURE_MATRIX))
4936dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      _mesa_update_texture( ctx, new_state );
494d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul
495ba0fcc47d61be6caa2f4a5f4eb0c36eba9e2cb59Brian   if (new_state & _NEW_BUFFERS)
496e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_update_framebuffer(ctx);
497e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
49852f686c48080cec9a26aa23d16bc14bd3d302d70Brian Paul   if (new_state & (_NEW_SCISSOR | _NEW_BUFFERS | _NEW_VIEWPORT))
49967742383e87734130e35d08d7c63c75b9adcf655Brian Paul      _mesa_update_draw_buffer_bounds( ctx );
500d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul
501ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian   if (new_state & _NEW_POLYGON)
502ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian      update_polygon( ctx );
503ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian
5045e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   if (new_state & _NEW_LIGHT)
50508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_update_lighting( ctx );
506d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul
507b68e3422ed9a0f16c7015940ffd5ac0361f0ca42Eric Anholt   if (new_state & (_NEW_LIGHT | _NEW_PROGRAM))
508b68e3422ed9a0f16c7015940ffd5ac0361f0ca42Eric Anholt      update_twoside( ctx );
509b68e3422ed9a0f16c7015940ffd5ac0361f0ca42Eric Anholt
510e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   if (new_state & (_NEW_LIGHT | _NEW_BUFFERS))
511e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák      update_clamp_vertex_color(ctx);
512e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák
513f352a80aec10c3faf2d84e0b35d59b4edc0395efBrian Paul   if (new_state & (_NEW_STENCIL | _NEW_BUFFERS))
51442c34efd23d7ad05df9f3c71f7d52dd259e179d8Brian Paul      _mesa_update_stencil( ctx );
51542c34efd23d7ad05df9f3c71f7d52dd259e179d8Brian Paul
5167ecb61c30c4984a8513b306b640f9d274d8ecf61Brian Paul   if (new_state & _NEW_PIXEL)
5179c7b81697b2a381d7083e8e4c52f919f36ea9fa1Brian Paul      _mesa_update_pixel( ctx, new_state );
518d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul
5195edd7b8c46bbbaa59a421aa2c082374fc7dc101fBrian Paul   if (new_state & _MESA_NEW_SEPARATE_SPECULAR)
520ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian      update_separate_specular( ctx );
521ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian
522519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paul   if (new_state & (_NEW_BUFFERS | _NEW_VIEWPORT))
523519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paul      update_viewport_matrix(ctx);
524519a2e7cb7b8f026bd5fe711cdf12a20df1c46aeBrian Paul
525fb92fc25b00beda4df48865670c8769c7a669aacChristoph Bumiller   if (new_state & (_NEW_MULTISAMPLE | _NEW_BUFFERS))
5265ef4e4ffb8053db87f52df3c9b2ddb71d9c7d6e5Roland Scheidegger      update_multisample( ctx );
5275ef4e4ffb8053db87f52df3c9b2ddb71d9c7d6e5Roland Scheidegger
528e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   if (new_state & (_NEW_COLOR | _NEW_BUFFERS))
529e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák      update_clamp_read_color(ctx);
530e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák
531e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák   if(new_state & (_NEW_FRAG_CLAMP | _NEW_BUFFERS))
532e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák      update_clamp_fragment_color(ctx);
533e5c6a92a12b5cd7db205d72039f58d302b0be9d5Marek Olšák
534ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian#if 0
5358dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian   if (new_state & (_NEW_POINT | _NEW_LINE | _NEW_POLYGON | _NEW_LIGHT
5365edd7b8c46bbbaa59a421aa2c082374fc7dc101fBrian Paul                    | _NEW_STENCIL | _MESA_NEW_SEPARATE_SPECULAR))
5378dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian      update_tricaps( ctx, new_state );
538ed6d5ff6f8fdd34aaaa126119dbd8e1e321859d8Brian#endif
5398dcfcad7a2598ba835930aac8f3fd6576e464c1cBrian
5409c7b81697b2a381d7083e8e4c52f919f36ea9fa1Brian Paul   /* ctx->_NeedEyeCoords is now up to date.
5411e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell    *
542cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    * If the truth value of this variable has changed, update for the
543cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    * new lighting space and recompute the positions of lights and the
5441e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell    * normal transform.
5455e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen    *
5461e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell    * If the lighting space hasn't changed, may still need to recompute
54722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes    * light positions & normal transforms for other reasons.
5481e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell    */
5496dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell   if (new_state & _MESA_NEW_NEED_EYE_COORDS)
5506dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell      _mesa_update_tnl_spaces( ctx, new_state );
5511e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell
552de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul   if (new_state & prog_flags) {
553de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul      /* When we generate programs from fixed-function vertex/fragment state
554de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul       * this call may generate/bind a new program.  If so, we need to
555de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul       * propogate the _NEW_PROGRAM flag to the driver.
556de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul       */
557de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul      new_prog_state |= update_program( ctx );
558de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul   }
55932ef6e75839d6be283e034436e5dd34eabb67958Keith Whitwell
560bf3304a84b60a25bbc9de14d11af6e423939d7c3Marek Olšák   if (new_state & (_NEW_ARRAY | _NEW_PROGRAM | _NEW_BUFFER_OBJECT))
5617a1e941ebee43cb97a2c77fd2269999b202308a2Mathias Fröhlich      _mesa_update_array_object_max_element(ctx, ctx->Array.ArrayObj);
56264e331eb529e66ef678804594c8a3266c97e645fBrian Paul
56364e331eb529e66ef678804594c8a3266c97e645fBrian Paul out:
56464e331eb529e66ef678804594c8a3266c97e645fBrian Paul   new_prog_state |= update_program_constants(ctx);
56564e331eb529e66ef678804594c8a3266c97e645fBrian Paul
56623caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell   /*
567a999e809af97e32cc1198ca816dcacc735a0a4afBrian Paul    * Give the driver a chance to act upon the new_state flags.
568a999e809af97e32cc1198ca816dcacc735a0a4afBrian Paul    * The driver might plug in different span functions, for example.
569a999e809af97e32cc1198ca816dcacc735a0a4afBrian Paul    * Also, this is where the driver can invalidate the state of any
570a999e809af97e32cc1198ca816dcacc735a0a4afBrian Paul    * active modules (such as swrast_setup, swrast, tnl, etc).
571cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    *
572cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    * Set ctx->NewState to zero to avoid recursion if
573cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    * Driver.UpdateState() has to call FLUSH_VERTICES().  (fixed?)
57423caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell    */
575de1caa550700ae38ff791c30f6d482f3efddebd0Brian Paul   new_state = ctx->NewState | new_prog_state;
576d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul   ctx->NewState = 0;
577cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ctx->Driver.UpdateState(ctx, new_state);
578b0e048f0b955ef79e2de794172de053d27d7d8faBrian Paul   ctx->Array.ArrayObj->NewArrays = 0x0;
579d0a3ea051a3825441cdc97a82fa9a9c6e7e83087Brian Paul}
5800cb28418d06c30e431bdff515c1d36a812d5950dKeith Whitwell
5815ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell
5825ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell/* This is the usual entrypoint for state updates:
5835ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell */
5845ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwellvoid
585f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_update_state( struct gl_context *ctx )
5865ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell{
5875ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   _mesa_lock_context_textures(ctx);
5885ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   _mesa_update_state_locked(ctx);
5895ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell   _mesa_unlock_context_textures(ctx);
5905ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell}
5911680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell
5921680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell
5931680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell
5941680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell
5956d4d51d647c27288aa625560bc080231099c0b01Brian Paul/**
5966d4d51d647c27288aa625560bc080231099c0b01Brian Paul * Want to figure out which fragment program inputs are actually
5971680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell * constant/current values from ctx->Current.  These should be
5981680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell * referenced as a tracked state variable rather than a fragment
5991680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell * program input, to save the overhead of putting a constant value in
6001680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell * every submitted vertex, transferring it to hardware, interpolating
6011680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell * it across the triangle, etc...
6021680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell *
6031680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell * When there is a VP bound, just use vp->outputs.  But when we're
6041680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell * generating vp from fixed function state, basically want to
6051680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell * calculate:
6061680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell *
6071680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell * vp_out_2_fp_in( vp_in_2_vp_out( varying_inputs ) |
6081680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell *                 potential_vp_outputs )
6091680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell *
6101680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell * Where potential_vp_outputs is calculated by looking at enabled
6111680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell * texgen, etc.
6121680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell *
6131680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell * The generated fragment program should then only declare inputs that
6141680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell * may vary or otherwise differ from the ctx->Current values.
6151680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell * Otherwise, the fp should track them as state values instead.
6161680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell */
6171680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwellvoid
618f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_set_varying_vp_inputs( struct gl_context *ctx,
619dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich                             GLbitfield64 varying_inputs )
6201680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell{
6211680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell   if (ctx->varying_vp_inputs != varying_inputs) {
6221680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell      ctx->varying_vp_inputs = varying_inputs;
623fb4a34e60eb4c1bdc7b0fdcd98d1bf3038c354e8Marek Olšák
624fb4a34e60eb4c1bdc7b0fdcd98d1bf3038c354e8Marek Olšák      /* Only the fixed-func generated programs need to use the flag
625fb4a34e60eb4c1bdc7b0fdcd98d1bf3038c354e8Marek Olšák       * and the fixed-func fragment program uses it only if there is also
626fb4a34e60eb4c1bdc7b0fdcd98d1bf3038c354e8Marek Olšák       * a fixed-func vertex program, so this only depends on the latter.
627fb4a34e60eb4c1bdc7b0fdcd98d1bf3038c354e8Marek Olšák       *
628fb4a34e60eb4c1bdc7b0fdcd98d1bf3038c354e8Marek Olšák       * It's okay to check the VP pointer here, because this is called after
629fb4a34e60eb4c1bdc7b0fdcd98d1bf3038c354e8Marek Olšák       * _mesa_update_state in the vbo module. */
6308491e03b2befd7e9d16c5d17f95a83d91c5b16c9Kenneth Graunke      if (ctx->VertexProgram._TnlProgram ||
6318491e03b2befd7e9d16c5d17f95a83d91c5b16c9Kenneth Graunke          ctx->FragmentProgram._TexEnvProgram) {
632fb4a34e60eb4c1bdc7b0fdcd98d1bf3038c354e8Marek Olšák         ctx->NewState |= _NEW_VARYING_VP_INPUTS;
633fb4a34e60eb4c1bdc7b0fdcd98d1bf3038c354e8Marek Olšák      }
634298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      /*printf("%s %x\n", __FUNCTION__, varying_inputs);*/
6356d4d51d647c27288aa625560bc080231099c0b01Brian Paul   }
6366d4d51d647c27288aa625560bc080231099c0b01Brian Paul}
6376d4d51d647c27288aa625560bc080231099c0b01Brian Paul
6386d4d51d647c27288aa625560bc080231099c0b01Brian Paul
6396d4d51d647c27288aa625560bc080231099c0b01Brian Paul/**
6406d4d51d647c27288aa625560bc080231099c0b01Brian Paul * Used by drivers to tell core Mesa that the driver is going to
6416d4d51d647c27288aa625560bc080231099c0b01Brian Paul * install/ use its own vertex program.  In particular, this will
6426d4d51d647c27288aa625560bc080231099c0b01Brian Paul * prevent generated fragment programs from using state vars instead
6436d4d51d647c27288aa625560bc080231099c0b01Brian Paul * of ordinary varyings/inputs.
6446d4d51d647c27288aa625560bc080231099c0b01Brian Paul */
6456d4d51d647c27288aa625560bc080231099c0b01Brian Paulvoid
646f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_set_vp_override(struct gl_context *ctx, GLboolean flag)
6476d4d51d647c27288aa625560bc080231099c0b01Brian Paul{
6486d4d51d647c27288aa625560bc080231099c0b01Brian Paul   if (ctx->VertexProgram._Overriden != flag) {
6496d4d51d647c27288aa625560bc080231099c0b01Brian Paul      ctx->VertexProgram._Overriden = flag;
6506d4d51d647c27288aa625560bc080231099c0b01Brian Paul
6516d4d51d647c27288aa625560bc080231099c0b01Brian Paul      /* Set one of the bits which will trigger fragment program
6526d4d51d647c27288aa625560bc080231099c0b01Brian Paul       * regeneration:
6536d4d51d647c27288aa625560bc080231099c0b01Brian Paul       */
65428cfd37bb3c5dfa70715d91bd523e93dfedd3981Brian Paul      ctx->NewState |= _NEW_PROGRAM;
6551680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell   }
6561680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell}
657