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