ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

prog_statevars.c
Go to the documentation of this file.
00001 /*
00002  * Mesa 3-D graphics library
00003  * Version:  7.1
00004  *
00005  * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
00006  *
00007  * Permission is hereby granted, free of charge, to any person obtaining a
00008  * copy of this software and associated documentation files (the "Software"),
00009  * to deal in the Software without restriction, including without limitation
00010  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
00011  * and/or sell copies of the Software, and to permit persons to whom the
00012  * Software is furnished to do so, subject to the following conditions:
00013  *
00014  * The above copyright notice and this permission notice shall be included
00015  * in all copies or substantial portions of the Software.
00016  *
00017  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
00018  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00019  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
00020  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
00021  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
00022  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00023  */
00024 
00032 #include "main/glheader.h"
00033 #include "main/context.h"
00034 #include "main/hash.h"
00035 #include "main/imports.h"
00036 #include "main/macros.h"
00037 #include "main/mtypes.h"
00038 #include "prog_statevars.h"
00039 #include "prog_parameter.h"
00040 
00041 
00049 static void
00050 _mesa_fetch_state(GLcontext *ctx, const gl_state_index state[],
00051                   GLfloat *value)
00052 {
00053    switch (state[0]) {
00054    case STATE_MATERIAL:
00055       {
00056          /* state[1] is either 0=front or 1=back side */
00057          const GLuint face = (GLuint) state[1];
00058          const struct gl_material *mat = &ctx->Light.Material;
00059          ASSERT(face == 0 || face == 1);
00060          /* we rely on tokens numbered so that _BACK_ == _FRONT_+ 1 */
00061          ASSERT(MAT_ATTRIB_FRONT_AMBIENT + 1 == MAT_ATTRIB_BACK_AMBIENT);
00062          /* XXX we could get rid of this switch entirely with a little
00063           * work in arbprogparse.c's parse_state_single_item().
00064           */
00065          /* state[2] is the material attribute */
00066          switch (state[2]) {
00067          case STATE_AMBIENT:
00068             COPY_4V(value, mat->Attrib[MAT_ATTRIB_FRONT_AMBIENT + face]);
00069             return;
00070          case STATE_DIFFUSE:
00071             COPY_4V(value, mat->Attrib[MAT_ATTRIB_FRONT_DIFFUSE + face]);
00072             return;
00073          case STATE_SPECULAR:
00074             COPY_4V(value, mat->Attrib[MAT_ATTRIB_FRONT_SPECULAR + face]);
00075             return;
00076          case STATE_EMISSION:
00077             COPY_4V(value, mat->Attrib[MAT_ATTRIB_FRONT_EMISSION + face]);
00078             return;
00079          case STATE_SHININESS:
00080             value[0] = mat->Attrib[MAT_ATTRIB_FRONT_SHININESS + face][0];
00081             value[1] = 0.0F;
00082             value[2] = 0.0F;
00083             value[3] = 1.0F;
00084             return;
00085          default:
00086             _mesa_problem(ctx, "Invalid material state in fetch_state");
00087             return;
00088          }
00089       }
00090    case STATE_LIGHT:
00091       {
00092          /* state[1] is the light number */
00093          const GLuint ln = (GLuint) state[1];
00094          /* state[2] is the light attribute */
00095          switch (state[2]) {
00096          case STATE_AMBIENT:
00097             COPY_4V(value, ctx->Light.Light[ln].Ambient);
00098             return;
00099          case STATE_DIFFUSE:
00100             COPY_4V(value, ctx->Light.Light[ln].Diffuse);
00101             return;
00102          case STATE_SPECULAR:
00103             COPY_4V(value, ctx->Light.Light[ln].Specular);
00104             return;
00105          case STATE_POSITION:
00106             COPY_4V(value, ctx->Light.Light[ln].EyePosition);
00107             return;
00108          case STATE_ATTENUATION:
00109             value[0] = ctx->Light.Light[ln].ConstantAttenuation;
00110             value[1] = ctx->Light.Light[ln].LinearAttenuation;
00111             value[2] = ctx->Light.Light[ln].QuadraticAttenuation;
00112             value[3] = ctx->Light.Light[ln].SpotExponent;
00113             return;
00114          case STATE_SPOT_DIRECTION:
00115             COPY_3V(value, ctx->Light.Light[ln].EyeDirection);
00116             value[3] = ctx->Light.Light[ln]._CosCutoff;
00117             return;
00118          case STATE_SPOT_CUTOFF:
00119             value[0] = ctx->Light.Light[ln].SpotCutoff;
00120             return;
00121          case STATE_HALF_VECTOR:
00122             {
00123                static const GLfloat eye_z[] = {0, 0, 1};
00124                GLfloat p[3];
00125                /* Compute infinite half angle vector:
00126                 *   halfVector = normalize(normalize(lightPos) + (0, 0, 1))
00127         * light.EyePosition.w should be 0 for infinite lights.
00128                 */
00129                COPY_3V(p, ctx->Light.Light[ln].EyePosition);
00130                NORMALIZE_3FV(p);
00131            ADD_3V(value, p, eye_z);
00132            NORMALIZE_3FV(value);
00133            value[3] = 1.0;
00134             }
00135             return;
00136          default:
00137             _mesa_problem(ctx, "Invalid light state in fetch_state");
00138             return;
00139          }
00140       }
00141    case STATE_LIGHTMODEL_AMBIENT:
00142       COPY_4V(value, ctx->Light.Model.Ambient);
00143       return;
00144    case STATE_LIGHTMODEL_SCENECOLOR:
00145       if (state[1] == 0) {
00146          /* front */
00147          GLint i;
00148          for (i = 0; i < 3; i++) {
00149             value[i] = ctx->Light.Model.Ambient[i]
00150                * ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT][i]
00151                + ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_EMISSION][i];
00152          }
00153      value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3];
00154       }
00155       else {
00156          /* back */
00157          GLint i;
00158          for (i = 0; i < 3; i++) {
00159             value[i] = ctx->Light.Model.Ambient[i]
00160                * ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_AMBIENT][i]
00161                + ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_EMISSION][i];
00162          }
00163      value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3];
00164       }
00165       return;
00166    case STATE_LIGHTPROD:
00167       {
00168          const GLuint ln = (GLuint) state[1];
00169          const GLuint face = (GLuint) state[2];
00170          GLint i;
00171          ASSERT(face == 0 || face == 1);
00172          switch (state[3]) {
00173             case STATE_AMBIENT:
00174                for (i = 0; i < 3; i++) {
00175                   value[i] = ctx->Light.Light[ln].Ambient[i] *
00176                      ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT+face][i];
00177                }
00178                /* [3] = material alpha */
00179                value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT+face][3];
00180                return;
00181             case STATE_DIFFUSE:
00182                for (i = 0; i < 3; i++) {
00183                   value[i] = ctx->Light.Light[ln].Diffuse[i] *
00184                      ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE+face][i];
00185                }
00186                /* [3] = material alpha */
00187                value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE+face][3];
00188                return;
00189             case STATE_SPECULAR:
00190                for (i = 0; i < 3; i++) {
00191                   value[i] = ctx->Light.Light[ln].Specular[i] *
00192                      ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_SPECULAR+face][i];
00193                }
00194                /* [3] = material alpha */
00195                value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_SPECULAR+face][3];
00196                return;
00197             default:
00198                _mesa_problem(ctx, "Invalid lightprod state in fetch_state");
00199                return;
00200          }
00201       }
00202    case STATE_TEXGEN:
00203       {
00204          /* state[1] is the texture unit */
00205          const GLuint unit = (GLuint) state[1];
00206          /* state[2] is the texgen attribute */
00207          switch (state[2]) {
00208          case STATE_TEXGEN_EYE_S:
00209             COPY_4V(value, ctx->Texture.Unit[unit].EyePlaneS);
00210             return;
00211          case STATE_TEXGEN_EYE_T:
00212             COPY_4V(value, ctx->Texture.Unit[unit].EyePlaneT);
00213             return;
00214          case STATE_TEXGEN_EYE_R:
00215             COPY_4V(value, ctx->Texture.Unit[unit].EyePlaneR);
00216             return;
00217          case STATE_TEXGEN_EYE_Q:
00218             COPY_4V(value, ctx->Texture.Unit[unit].EyePlaneQ);
00219             return;
00220          case STATE_TEXGEN_OBJECT_S:
00221             COPY_4V(value, ctx->Texture.Unit[unit].ObjectPlaneS);
00222             return;
00223          case STATE_TEXGEN_OBJECT_T:
00224             COPY_4V(value, ctx->Texture.Unit[unit].ObjectPlaneT);
00225             return;
00226          case STATE_TEXGEN_OBJECT_R:
00227             COPY_4V(value, ctx->Texture.Unit[unit].ObjectPlaneR);
00228             return;
00229          case STATE_TEXGEN_OBJECT_Q:
00230             COPY_4V(value, ctx->Texture.Unit[unit].ObjectPlaneQ);
00231             return;
00232          default:
00233             _mesa_problem(ctx, "Invalid texgen state in fetch_state");
00234             return;
00235          }
00236       }
00237    case STATE_TEXENV_COLOR:
00238       {
00239          /* state[1] is the texture unit */
00240          const GLuint unit = (GLuint) state[1];
00241          COPY_4V(value, ctx->Texture.Unit[unit].EnvColor);
00242       }
00243       return;
00244    case STATE_FOG_COLOR:
00245       COPY_4V(value, ctx->Fog.Color);
00246       return;
00247    case STATE_FOG_PARAMS:
00248       value[0] = ctx->Fog.Density;
00249       value[1] = ctx->Fog.Start;
00250       value[2] = ctx->Fog.End;
00251       value[3] = (ctx->Fog.End == ctx->Fog.Start)
00252          ? 1.0f : (GLfloat)(1.0 / (ctx->Fog.End - ctx->Fog.Start));
00253       return;
00254    case STATE_CLIPPLANE:
00255       {
00256          const GLuint plane = (GLuint) state[1];
00257          COPY_4V(value, ctx->Transform.EyeUserPlane[plane]);
00258       }
00259       return;
00260    case STATE_POINT_SIZE:
00261       value[0] = ctx->Point.Size;
00262       value[1] = ctx->Point.MinSize;
00263       value[2] = ctx->Point.MaxSize;
00264       value[3] = ctx->Point.Threshold;
00265       return;
00266    case STATE_POINT_ATTENUATION:
00267       value[0] = ctx->Point.Params[0];
00268       value[1] = ctx->Point.Params[1];
00269       value[2] = ctx->Point.Params[2];
00270       value[3] = 1.0F;
00271       return;
00272    case STATE_MODELVIEW_MATRIX:
00273    case STATE_PROJECTION_MATRIX:
00274    case STATE_MVP_MATRIX:
00275    case STATE_TEXTURE_MATRIX:
00276    case STATE_PROGRAM_MATRIX:
00277    case STATE_COLOR_MATRIX:
00278       {
00279          /* state[0] = modelview, projection, texture, etc. */
00280          /* state[1] = which texture matrix or program matrix */
00281          /* state[2] = first row to fetch */
00282          /* state[3] = last row to fetch */
00283          /* state[4] = transpose, inverse or invtrans */
00284          const GLmatrix *matrix;
00285          const gl_state_index mat = state[0];
00286          const GLuint index = (GLuint) state[1];
00287          const GLuint firstRow = (GLuint) state[2];
00288          const GLuint lastRow = (GLuint) state[3];
00289          const gl_state_index modifier = state[4];
00290          const GLfloat *m;
00291          GLuint row, i;
00292          ASSERT(firstRow >= 0);
00293          ASSERT(firstRow < 4);
00294          ASSERT(lastRow >= 0);
00295          ASSERT(lastRow < 4);
00296          if (mat == STATE_MODELVIEW_MATRIX) {
00297             matrix = ctx->ModelviewMatrixStack.Top;
00298          }
00299          else if (mat == STATE_PROJECTION_MATRIX) {
00300             matrix = ctx->ProjectionMatrixStack.Top;
00301          }
00302          else if (mat == STATE_MVP_MATRIX) {
00303             matrix = &ctx->_ModelProjectMatrix;
00304          }
00305          else if (mat == STATE_TEXTURE_MATRIX) {
00306             matrix = ctx->TextureMatrixStack[index].Top;
00307          }
00308          else if (mat == STATE_PROGRAM_MATRIX) {
00309             matrix = ctx->ProgramMatrixStack[index].Top;
00310          }
00311          else if (mat == STATE_COLOR_MATRIX) {
00312             matrix = ctx->ColorMatrixStack.Top;
00313          }
00314          else {
00315             _mesa_problem(ctx, "Bad matrix name in _mesa_fetch_state()");
00316             return;
00317          }
00318          if (modifier == STATE_MATRIX_INVERSE ||
00319              modifier == STATE_MATRIX_INVTRANS) {
00320             /* Be sure inverse is up to date:
00321          */
00322             _math_matrix_alloc_inv( (GLmatrix *) matrix );
00323         _math_matrix_analyse( (GLmatrix*) matrix );
00324             m = matrix->inv;
00325          }
00326          else {
00327             m = matrix->m;
00328          }
00329          if (modifier == STATE_MATRIX_TRANSPOSE ||
00330              modifier == STATE_MATRIX_INVTRANS) {
00331             for (i = 0, row = firstRow; row <= lastRow; row++) {
00332                value[i++] = m[row * 4 + 0];
00333                value[i++] = m[row * 4 + 1];
00334                value[i++] = m[row * 4 + 2];
00335                value[i++] = m[row * 4 + 3];
00336             }
00337          }
00338          else {
00339             for (i = 0, row = firstRow; row <= lastRow; row++) {
00340                value[i++] = m[row + 0];
00341                value[i++] = m[row + 4];
00342                value[i++] = m[row + 8];
00343                value[i++] = m[row + 12];
00344             }
00345          }
00346       }
00347       return;
00348    case STATE_DEPTH_RANGE:
00349       value[0] = ctx->Viewport.Near;                     /* near       */
00350       value[1] = ctx->Viewport.Far;                      /* far        */
00351       value[2] = ctx->Viewport.Far - ctx->Viewport.Near; /* far - near */
00352       value[3] = 1.0;
00353       return;
00354    case STATE_FRAGMENT_PROGRAM:
00355       {
00356          /* state[1] = {STATE_ENV, STATE_LOCAL} */
00357          /* state[2] = parameter index          */
00358          const int idx = (int) state[2];
00359          switch (state[1]) {
00360             case STATE_ENV:
00361                COPY_4V(value, ctx->FragmentProgram.Parameters[idx]);
00362                break;
00363             case STATE_LOCAL:
00364                COPY_4V(value, ctx->FragmentProgram.Current->Base.LocalParams[idx]);
00365                break;
00366             default:
00367                _mesa_problem(ctx, "Bad state switch in _mesa_fetch_state()");
00368                return;
00369          }
00370       }
00371       return;
00372 
00373    case STATE_VERTEX_PROGRAM:
00374       {
00375          /* state[1] = {STATE_ENV, STATE_LOCAL} */
00376          /* state[2] = parameter index          */
00377          const int idx = (int) state[2];
00378          switch (state[1]) {
00379             case STATE_ENV:
00380                COPY_4V(value, ctx->VertexProgram.Parameters[idx]);
00381                break;
00382             case STATE_LOCAL:
00383                COPY_4V(value, ctx->VertexProgram.Current->Base.LocalParams[idx]);
00384                break;
00385             default:
00386                _mesa_problem(ctx, "Bad state switch in _mesa_fetch_state()");
00387                return;
00388          }
00389       }
00390       return;
00391 
00392    case STATE_NORMAL_SCALE:
00393       ASSIGN_4V(value, ctx->_ModelViewInvScale, 0, 0, 1);
00394       return;
00395 
00396    case STATE_INTERNAL:
00397       switch (state[1]) {
00398       case STATE_NORMAL_SCALE:
00399          ASSIGN_4V(value, 
00400                    ctx->_ModelViewInvScale, 
00401                    ctx->_ModelViewInvScale, 
00402                    ctx->_ModelViewInvScale, 
00403                    1);
00404          return;
00405       case STATE_TEXRECT_SCALE:
00406          {
00407             const int unit = (int) state[2];
00408             const struct gl_texture_object *texObj
00409                = ctx->Texture.Unit[unit]._Current;
00410             if (texObj) {
00411                struct gl_texture_image *texImage = texObj->Image[0][0];
00412                ASSIGN_4V(value, (GLfloat) (1.0 / texImage->Width),
00413                          (GLfloat)(1.0 / texImage->Height),
00414                          0.0f, 1.0f);
00415             }
00416          }
00417          return;
00418       case STATE_FOG_PARAMS_OPTIMIZED:
00419          /* for simpler per-vertex/pixel fog calcs. POW (for EXP/EXP2 fog)
00420           * might be more expensive than EX2 on some hw, plus it needs
00421           * another constant (e) anyway. Linear fog can now be done with a
00422           * single MAD.
00423           * linear: fogcoord * -1/(end-start) + end/(end-start)
00424           * exp: 2^-(density/ln(2) * fogcoord)
00425           * exp2: 2^-((density/(ln(2)^2) * fogcoord)^2)
00426           */
00427          value[0] = (ctx->Fog.End == ctx->Fog.Start)
00428             ? 1.0f : (GLfloat)(-1.0F / (ctx->Fog.End - ctx->Fog.Start));
00429          value[1] = ctx->Fog.End * -value[0];
00430          value[2] = (GLfloat)(ctx->Fog.Density * ONE_DIV_LN2);
00431          value[3] = (GLfloat)(ctx->Fog.Density * ONE_DIV_SQRT_LN2);
00432          return;
00433 
00434       case STATE_LIGHT_SPOT_DIR_NORMALIZED: {
00435          /* here, state[2] is the light number */
00436          /* pre-normalize spot dir */
00437          const GLuint ln = (GLuint) state[2];
00438          COPY_3V(value, ctx->Light.Light[ln]._NormDirection);
00439          value[3] = ctx->Light.Light[ln]._CosCutoff;
00440          return;
00441       }
00442 
00443       case STATE_LIGHT_POSITION: {
00444          const GLuint ln = (GLuint) state[2];
00445          COPY_4V(value, ctx->Light.Light[ln]._Position);
00446          return;
00447       }
00448 
00449       case STATE_LIGHT_POSITION_NORMALIZED: {
00450          const GLuint ln = (GLuint) state[2];
00451          COPY_4V(value, ctx->Light.Light[ln]._Position);
00452          NORMALIZE_3FV( value );
00453          return;
00454       }
00455 
00456       case STATE_LIGHT_HALF_VECTOR: {
00457          const GLuint ln = (GLuint) state[2];
00458          GLfloat p[3];
00459          /* Compute infinite half angle vector:
00460           *   halfVector = normalize(normalize(lightPos) + (0, 0, 1))
00461           * light.EyePosition.w should be 0 for infinite lights.
00462           */
00463          COPY_3V(p, ctx->Light.Light[ln]._Position);
00464          NORMALIZE_3FV(p);
00465          ADD_3V(value, p, ctx->_EyeZDir);
00466          NORMALIZE_3FV(value);
00467          value[3] = 1.0;
00468          return;
00469       }                       
00470 
00471 
00472       case STATE_PT_SCALE:
00473          value[0] = ctx->Pixel.RedScale;
00474          value[1] = ctx->Pixel.GreenScale;
00475          value[2] = ctx->Pixel.BlueScale;
00476          value[3] = ctx->Pixel.AlphaScale;
00477          break;
00478       case STATE_PT_BIAS:
00479          value[0] = ctx->Pixel.RedBias;
00480          value[1] = ctx->Pixel.GreenBias;
00481          value[2] = ctx->Pixel.BlueBias;
00482          value[3] = ctx->Pixel.AlphaBias;
00483          break;
00484       case STATE_PCM_SCALE:
00485          COPY_4V(value, ctx->Pixel.PostColorMatrixScale);
00486          break;
00487       case STATE_PCM_BIAS:
00488          COPY_4V(value, ctx->Pixel.PostColorMatrixBias);
00489          break;
00490       case STATE_SHADOW_AMBIENT:
00491          {
00492             const int unit = (int) state[2];
00493             const struct gl_texture_object *texObj
00494                = ctx->Texture.Unit[unit]._Current;
00495             if (texObj) {
00496                value[0] = texObj->ShadowAmbient;
00497                value[1] = texObj->ShadowAmbient;
00498                value[2] = texObj->ShadowAmbient;
00499                value[3] = texObj->ShadowAmbient;
00500             }
00501          }
00502          return;
00503 
00504       default:
00505          /* unknown state indexes are silently ignored
00506           *  should be handled by the driver.
00507           */
00508          return;
00509       }
00510       return;
00511 
00512    default:
00513       _mesa_problem(ctx, "Invalid state in _mesa_fetch_state");
00514       return;
00515    }
00516 }
00517 
00518 
00526 GLbitfield
00527 _mesa_program_state_flags(const gl_state_index state[STATE_LENGTH])
00528 {
00529    switch (state[0]) {
00530    case STATE_MATERIAL:
00531    case STATE_LIGHT:
00532    case STATE_LIGHTMODEL_AMBIENT:
00533    case STATE_LIGHTMODEL_SCENECOLOR:
00534    case STATE_LIGHTPROD:
00535       return _NEW_LIGHT;
00536 
00537    case STATE_TEXGEN:
00538    case STATE_TEXENV_COLOR:
00539       return _NEW_TEXTURE;
00540 
00541    case STATE_FOG_COLOR:
00542    case STATE_FOG_PARAMS:
00543       return _NEW_FOG;
00544 
00545    case STATE_CLIPPLANE:
00546       return _NEW_TRANSFORM;
00547 
00548    case STATE_POINT_SIZE:
00549    case STATE_POINT_ATTENUATION:
00550       return _NEW_POINT;
00551 
00552    case STATE_MODELVIEW_MATRIX:
00553       return _NEW_MODELVIEW;
00554    case STATE_PROJECTION_MATRIX:
00555       return _NEW_PROJECTION;
00556    case STATE_MVP_MATRIX:
00557       return _NEW_MODELVIEW | _NEW_PROJECTION;
00558    case STATE_TEXTURE_MATRIX:
00559       return _NEW_TEXTURE_MATRIX;
00560    case STATE_PROGRAM_MATRIX:
00561       return _NEW_TRACK_MATRIX;
00562    case STATE_COLOR_MATRIX:
00563       return _NEW_COLOR_MATRIX;
00564 
00565    case STATE_DEPTH_RANGE:
00566       return _NEW_VIEWPORT;
00567 
00568    case STATE_FRAGMENT_PROGRAM:
00569    case STATE_VERTEX_PROGRAM:
00570       return _NEW_PROGRAM;
00571 
00572    case STATE_NORMAL_SCALE:
00573       return _NEW_MODELVIEW;
00574 
00575    case STATE_INTERNAL:
00576       switch (state[1]) {
00577       case STATE_TEXRECT_SCALE:
00578       case STATE_SHADOW_AMBIENT:
00579      return _NEW_TEXTURE;
00580       case STATE_FOG_PARAMS_OPTIMIZED:
00581      return _NEW_FOG;
00582       default:
00583          /* unknown state indexes are silently ignored and
00584          *  no flag set, since it is handled by the driver.
00585          */
00586      return 0;
00587       }
00588 
00589    default:
00590       _mesa_problem(NULL, "unexpected state[0] in make_state_flags()");
00591       return 0;
00592    }
00593 }
00594 
00595 
00596 static void
00597 append(char *dst, const char *src)
00598 {
00599    while (*dst)
00600       dst++;
00601    while (*src)
00602      *dst++ = *src++;
00603    *dst = 0;
00604 }
00605 
00606 
00610 static void
00611 append_token(char *dst, gl_state_index k)
00612 {
00613    switch (k) {
00614    case STATE_MATERIAL:
00615       append(dst, "material");
00616       break;
00617    case STATE_LIGHT:
00618       append(dst, "light");
00619       break;
00620    case STATE_LIGHTMODEL_AMBIENT:
00621       append(dst, "lightmodel.ambient");
00622       break;
00623    case STATE_LIGHTMODEL_SCENECOLOR:
00624       break;
00625    case STATE_LIGHTPROD:
00626       append(dst, "lightprod");
00627       break;
00628    case STATE_TEXGEN:
00629       append(dst, "texgen");
00630       break;
00631    case STATE_FOG_COLOR:
00632       append(dst, "fog.color");
00633       break;
00634    case STATE_FOG_PARAMS:
00635       append(dst, "fog.params");
00636       break;
00637    case STATE_CLIPPLANE:
00638       append(dst, "clip");
00639       break;
00640    case STATE_POINT_SIZE:
00641       append(dst, "point.size");
00642       break;
00643    case STATE_POINT_ATTENUATION:
00644       append(dst, "point.attenuation");
00645       break;
00646    case STATE_MODELVIEW_MATRIX:
00647       append(dst, "matrix.modelview");
00648       break;
00649    case STATE_PROJECTION_MATRIX:
00650       append(dst, "matrix.projection");
00651       break;
00652    case STATE_MVP_MATRIX:
00653       append(dst, "matrix.mvp");
00654       break;
00655    case STATE_TEXTURE_MATRIX:
00656       append(dst, "matrix.texture");
00657       break;
00658    case STATE_PROGRAM_MATRIX:
00659       append(dst, "matrix.program");
00660       break;
00661    case STATE_COLOR_MATRIX:
00662       append(dst, "matrix.color");
00663       break;
00664    case STATE_MATRIX_INVERSE:
00665       append(dst, ".inverse");
00666       break;
00667    case STATE_MATRIX_TRANSPOSE:
00668       append(dst, ".transpose");
00669       break;
00670    case STATE_MATRIX_INVTRANS:
00671       append(dst, ".invtrans");
00672       break;
00673    case STATE_AMBIENT:
00674       append(dst, ".ambient");
00675       break;
00676    case STATE_DIFFUSE:
00677       append(dst, ".diffuse");
00678       break;
00679    case STATE_SPECULAR:
00680       append(dst, ".specular");
00681       break;
00682    case STATE_EMISSION:
00683       append(dst, ".emission");
00684       break;
00685    case STATE_SHININESS:
00686       append(dst, "lshininess");
00687       break;
00688    case STATE_HALF_VECTOR:
00689       append(dst, ".half");
00690       break;
00691    case STATE_POSITION:
00692       append(dst, ".position");
00693       break;
00694    case STATE_ATTENUATION:
00695       append(dst, ".attenuation");
00696       break;
00697    case STATE_SPOT_DIRECTION:
00698       append(dst, ".spot.direction");
00699       break;
00700    case STATE_SPOT_CUTOFF:
00701       append(dst, ".spot.cutoff");
00702       break;
00703    case STATE_TEXGEN_EYE_S:
00704       append(dst, "eye.s");
00705       break;
00706    case STATE_TEXGEN_EYE_T:
00707       append(dst, "eye.t");
00708       break;
00709    case STATE_TEXGEN_EYE_R:
00710       append(dst, "eye.r");
00711       break;
00712    case STATE_TEXGEN_EYE_Q:
00713       append(dst, "eye.q");
00714       break;
00715    case STATE_TEXGEN_OBJECT_S:
00716       append(dst, "object.s");
00717       break;
00718    case STATE_TEXGEN_OBJECT_T:
00719       append(dst, "object.t");
00720       break;
00721    case STATE_TEXGEN_OBJECT_R:
00722       append(dst, "object.r");
00723       break;
00724    case STATE_TEXGEN_OBJECT_Q:
00725       append(dst, "object.q");
00726       break;
00727    case STATE_TEXENV_COLOR:
00728       append(dst, "texenv");
00729       break;
00730    case STATE_DEPTH_RANGE:
00731       append(dst, "depth.range");
00732       break;
00733    case STATE_VERTEX_PROGRAM:
00734    case STATE_FRAGMENT_PROGRAM:
00735       break;
00736    case STATE_ENV:
00737       append(dst, "env");
00738       break;
00739    case STATE_LOCAL:
00740       append(dst, "local");
00741       break;
00742    /* BEGIN internal state vars */
00743    case STATE_INTERNAL:
00744       append(dst, "(internal)");
00745       break;
00746    case STATE_NORMAL_SCALE:
00747       append(dst, "normalScale");
00748       break;
00749    case STATE_TEXRECT_SCALE:
00750       append(dst, "texrectScale");
00751       break;
00752    case STATE_FOG_PARAMS_OPTIMIZED:
00753       append(dst, "fogParamsOptimized");
00754       break;
00755    case STATE_LIGHT_SPOT_DIR_NORMALIZED:
00756       append(dst, "lightSpotDirNormalized");
00757       break;
00758    case STATE_LIGHT_POSITION:
00759       append(dst, "lightPosition");
00760       break;
00761    case STATE_LIGHT_POSITION_NORMALIZED:
00762       append(dst, "light.position.normalized");
00763       break;
00764    case STATE_LIGHT_HALF_VECTOR:
00765       append(dst, "lightHalfVector");
00766       break;
00767    case STATE_PT_SCALE:
00768       append(dst, "PTscale");
00769       break;
00770    case STATE_PT_BIAS:
00771       append(dst, "PTbias");
00772       break;
00773    case STATE_PCM_SCALE:
00774       append(dst, "PCMscale");
00775       break;
00776    case STATE_PCM_BIAS:
00777       append(dst, "PCMbias");
00778       break;
00779    case STATE_SHADOW_AMBIENT:
00780       append(dst, "ShadowAmbient");
00781       break;
00782    default:
00783       /* probably STATE_INTERNAL_DRIVER+i (driver private state) */
00784       append(dst, "driverState");
00785    }
00786 }
00787 
00788 static void
00789 append_face(char *dst, GLint face)
00790 {
00791    if (face == 0)
00792       append(dst, "front.");
00793    else
00794       append(dst, "back.");
00795 }
00796 
00797 static void
00798 append_index(char *dst, GLint index)
00799 {
00800    char s[20];
00801    _mesa_sprintf(s, "[%d]", index);
00802    append(dst, s);
00803 }
00804 
00810 const char *
00811 _mesa_program_state_string(const gl_state_index state[STATE_LENGTH])
00812 {
00813    char str[1000] = "";
00814    char tmp[30];
00815 
00816    append(str, "state.");
00817    append_token(str, state[0]);
00818 
00819    switch (state[0]) {
00820    case STATE_MATERIAL:
00821       append_face(str, state[1]);
00822       append_token(str, state[2]);
00823       break;
00824    case STATE_LIGHT:
00825       append_index(str, state[1]); /* light number [i]. */
00826       append_token(str, state[2]); /* coefficients */
00827       break;
00828    case STATE_LIGHTMODEL_AMBIENT:
00829       append(str, "lightmodel.ambient");
00830       break;
00831    case STATE_LIGHTMODEL_SCENECOLOR:
00832       if (state[1] == 0) {
00833          append(str, "lightmodel.front.scenecolor");
00834       }
00835       else {
00836          append(str, "lightmodel.back.scenecolor");
00837       }
00838       break;
00839    case STATE_LIGHTPROD:
00840       append_index(str, state[1]); /* light number [i]. */
00841       append_face(str, state[2]);
00842       append_token(str, state[3]);
00843       break;
00844    case STATE_TEXGEN:
00845       append_index(str, state[1]); /* tex unit [i] */
00846       append_token(str, state[2]); /* plane coef */
00847       break;
00848    case STATE_TEXENV_COLOR:
00849       append_index(str, state[1]); /* tex unit [i] */
00850       append(str, "color");
00851       break;
00852    case STATE_CLIPPLANE:
00853       append_index(str, state[1]); /* plane [i] */
00854       append(str, ".plane");
00855       break;
00856    case STATE_MODELVIEW_MATRIX:
00857    case STATE_PROJECTION_MATRIX:
00858    case STATE_MVP_MATRIX:
00859    case STATE_TEXTURE_MATRIX:
00860    case STATE_PROGRAM_MATRIX:
00861    case STATE_COLOR_MATRIX:
00862       {
00863          /* state[0] = modelview, projection, texture, etc. */
00864          /* state[1] = which texture matrix or program matrix */
00865          /* state[2] = first row to fetch */
00866          /* state[3] = last row to fetch */
00867          /* state[4] = transpose, inverse or invtrans */
00868          const gl_state_index mat = state[0];
00869          const GLuint index = (GLuint) state[1];
00870          const GLuint firstRow = (GLuint) state[2];
00871          const GLuint lastRow = (GLuint) state[3];
00872          const gl_state_index modifier = state[4];
00873          if (index ||
00874              mat == STATE_TEXTURE_MATRIX ||
00875              mat == STATE_PROGRAM_MATRIX)
00876             append_index(str, index);
00877          if (modifier)
00878             append_token(str, modifier);
00879          if (firstRow == lastRow)
00880             _mesa_sprintf(tmp, ".row[%d]", firstRow);
00881          else
00882             _mesa_sprintf(tmp, ".row[%d..%d]", firstRow, lastRow);
00883          append(str, tmp);
00884       }
00885       break;
00886    case STATE_POINT_SIZE:
00887       break;
00888    case STATE_POINT_ATTENUATION:
00889       break;
00890    case STATE_FOG_PARAMS:
00891       break;
00892    case STATE_FOG_COLOR:
00893       break;
00894    case STATE_DEPTH_RANGE:
00895       break;
00896    case STATE_FRAGMENT_PROGRAM:
00897    case STATE_VERTEX_PROGRAM:
00898       /* state[1] = {STATE_ENV, STATE_LOCAL} */
00899       /* state[2] = parameter index          */
00900       append_token(str, state[1]);
00901       append_index(str, state[2]);
00902       break;
00903    case STATE_INTERNAL:
00904       append_token(str, state[1]);
00905       break;
00906    default:
00907       _mesa_problem(NULL, "Invalid state in _mesa_program_state_string");
00908       break;
00909    }
00910 
00911    return _mesa_strdup(str);
00912 }
00913 
00914 
00921 void
00922 _mesa_load_state_parameters(GLcontext *ctx,
00923                             struct gl_program_parameter_list *paramList)
00924 {
00925    GLuint i;
00926 
00927    if (!paramList)
00928       return;
00929 
00930    /*assert(ctx->Driver.NeedFlush == 0);*/
00931 
00932    for (i = 0; i < paramList->NumParameters; i++) {
00933       if (paramList->Parameters[i].Type == PROGRAM_STATE_VAR) {
00934          _mesa_fetch_state(ctx,
00935                (gl_state_index *) paramList->Parameters[i].StateIndexes,
00936                            paramList->ParameterValues[i]);
00937       }
00938    }
00939 }
00940 
00941 
00946 static void
00947 load_matrix(GLfloat registers[][4], GLuint pos, const GLfloat mat[16])
00948 {
00949    GLuint i;
00950    for (i = 0; i < 4; i++) {
00951       registers[pos + i][0] = mat[0 + i];
00952       registers[pos + i][1] = mat[4 + i];
00953       registers[pos + i][2] = mat[8 + i];
00954       registers[pos + i][3] = mat[12 + i];
00955    }
00956 }
00957 
00958 
00962 static void
00963 load_transpose_matrix(GLfloat registers[][4], GLuint pos,
00964                       const GLfloat mat[16])
00965 {
00966    MEMCPY(registers[pos], mat, 16 * sizeof(GLfloat));
00967 }
00968 
00969 
00975 void
00976 _mesa_load_tracked_matrices(GLcontext *ctx)
00977 {
00978    GLuint i;
00979 
00980    for (i = 0; i < MAX_NV_VERTEX_PROGRAM_PARAMS / 4; i++) {
00981       /* point 'mat' at source matrix */
00982       GLmatrix *mat;
00983       if (ctx->VertexProgram.TrackMatrix[i] == GL_MODELVIEW) {
00984          mat = ctx->ModelviewMatrixStack.Top;
00985       }
00986       else if (ctx->VertexProgram.TrackMatrix[i] == GL_PROJECTION) {
00987          mat = ctx->ProjectionMatrixStack.Top;
00988       }
00989       else if (ctx->VertexProgram.TrackMatrix[i] == GL_TEXTURE) {
00990          mat = ctx->TextureMatrixStack[ctx->Texture.CurrentUnit].Top;
00991       }
00992       else if (ctx->VertexProgram.TrackMatrix[i] == GL_COLOR) {
00993          mat = ctx->ColorMatrixStack.Top;
00994       }
00995       else if (ctx->VertexProgram.TrackMatrix[i]==GL_MODELVIEW_PROJECTION_NV) {
00996          /* XXX verify the combined matrix is up to date */
00997          mat = &ctx->_ModelProjectMatrix;
00998       }
00999       else if (ctx->VertexProgram.TrackMatrix[i] >= GL_MATRIX0_NV &&
01000                ctx->VertexProgram.TrackMatrix[i] <= GL_MATRIX7_NV) {
01001          GLuint n = ctx->VertexProgram.TrackMatrix[i] - GL_MATRIX0_NV;
01002          ASSERT(n < MAX_PROGRAM_MATRICES);
01003          mat = ctx->ProgramMatrixStack[n].Top;
01004       }
01005       else {
01006          /* no matrix is tracked, but we leave the register values as-is */
01007          assert(ctx->VertexProgram.TrackMatrix[i] == GL_NONE);
01008          continue;
01009       }
01010 
01011       /* load the matrix values into sequential registers */
01012       if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_IDENTITY_NV) {
01013          load_matrix(ctx->VertexProgram.Parameters, i*4, mat->m);
01014       }
01015       else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_INVERSE_NV) {
01016          _math_matrix_analyse(mat); /* update the inverse */
01017          ASSERT(!_math_matrix_is_dirty(mat));
01018          load_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv);
01019       }
01020       else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_TRANSPOSE_NV) {
01021          load_transpose_matrix(ctx->VertexProgram.Parameters, i*4, mat->m);
01022       }
01023       else {
01024          assert(ctx->VertexProgram.TrackMatrixTransform[i]
01025                 == GL_INVERSE_TRANSPOSE_NV);
01026          _math_matrix_analyse(mat); /* update the inverse */
01027          ASSERT(!_math_matrix_is_dirty(mat));
01028          load_transpose_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv);
01029       }
01030    }
01031 }

Generated on Fri May 25 2012 04:18:47 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.