Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenprog_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
1.7.6.1
|