📄 program.c
字号:
switch (state[1]) { case STATE_ENV: COPY_4V(value, ctx->FragmentProgram.Parameters[idx]); break; case STATE_LOCAL: COPY_4V(value, ctx->FragmentProgram.Current->Base.LocalParams[idx]); break; default: _mesa_problem(ctx, "Bad state switch in _mesa_fetch_state()"); return; } } return; case STATE_VERTEX_PROGRAM: { /* state[1] = {STATE_ENV, STATE_LOCAL} */ /* state[2] = parameter index */ const int idx = (int) state[2]; switch (state[1]) { case STATE_ENV: COPY_4V(value, ctx->VertexProgram.Parameters[idx]); break; case STATE_LOCAL: COPY_4V(value, ctx->VertexProgram.Current->Base.LocalParams[idx]); break; default: _mesa_problem(ctx, "Bad state switch in _mesa_fetch_state()"); return; } } return; case STATE_INTERNAL: { switch (state[1]) { case STATE_NORMAL_SCALE: ASSIGN_4V(value, ctx->_ModelViewInvScale, 0, 0, 1); break; default: _mesa_problem(ctx, "Bad state switch in _mesa_fetch_state()"); return; } } return; default: _mesa_problem(ctx, "Invalid state in _mesa_fetch_state"); return; }}/* Return a bit mask of the Mesa state flags under which a parameter's * value might change. */static GLuint make_state_flags(const GLint state[]){ switch (state[0]) { case STATE_MATERIAL: case STATE_LIGHT: case STATE_LIGHTMODEL_AMBIENT: case STATE_LIGHTMODEL_SCENECOLOR: case STATE_LIGHTPROD: return _NEW_LIGHT; case STATE_TEXGEN: case STATE_TEXENV_COLOR: return _NEW_TEXTURE; case STATE_FOG_COLOR: case STATE_FOG_PARAMS: return _NEW_FOG; case STATE_CLIPPLANE: return _NEW_TRANSFORM; case STATE_POINT_SIZE: case STATE_POINT_ATTENUATION: return _NEW_POINT; case STATE_MATRIX: switch (state[1]) { case STATE_MODELVIEW: return _NEW_MODELVIEW; case STATE_PROJECTION: return _NEW_PROJECTION; case STATE_MVP: return _NEW_MODELVIEW | _NEW_PROJECTION; case STATE_TEXTURE: return _NEW_TEXTURE_MATRIX; case STATE_PROGRAM: return _NEW_TRACK_MATRIX; default: assert(0); return 0; } case STATE_DEPTH_RANGE: return _NEW_VIEWPORT; case STATE_FRAGMENT_PROGRAM: case STATE_VERTEX_PROGRAM: return _NEW_PROGRAM; case STATE_INTERNAL: switch (state[1]) { case STATE_NORMAL_SCALE: return _NEW_MODELVIEW; default: assert(0); return 0; } default: assert(0); return 0; }}static voidappend(char *dst, const char *src){ while (*dst) dst++; while (*src) *dst++ = *src++; *dst = 0;}static voidappend_token(char *dst, enum state_index k){ switch (k) { case STATE_MATERIAL: append(dst, "material."); break; case STATE_LIGHT: append(dst, "light"); break; case STATE_LIGHTMODEL_AMBIENT: append(dst, "lightmodel.ambient"); break; case STATE_LIGHTMODEL_SCENECOLOR: break; case STATE_LIGHTPROD: append(dst, "lightprod"); break; case STATE_TEXGEN: append(dst, "texgen"); break; case STATE_FOG_COLOR: append(dst, "fog.color"); break; case STATE_FOG_PARAMS: append(dst, "fog.params"); break; case STATE_CLIPPLANE: append(dst, "clip"); break; case STATE_POINT_SIZE: append(dst, "point.size"); break; case STATE_POINT_ATTENUATION: append(dst, "point.attenuation"); break; case STATE_MATRIX: append(dst, "matrix."); break; case STATE_MODELVIEW: append(dst, "modelview"); break; case STATE_PROJECTION: append(dst, "projection"); break; case STATE_MVP: append(dst, "mvp"); break; case STATE_TEXTURE: append(dst, "texture"); break; case STATE_PROGRAM: append(dst, "program"); break; case STATE_MATRIX_INVERSE: append(dst, ".inverse"); break; case STATE_MATRIX_TRANSPOSE: append(dst, ".transpose"); break; case STATE_MATRIX_INVTRANS: append(dst, ".invtrans"); break; case STATE_AMBIENT: append(dst, "ambient"); break; case STATE_DIFFUSE: append(dst, "diffuse"); break; case STATE_SPECULAR: append(dst, "specular"); break; case STATE_EMISSION: append(dst, "emission"); break; case STATE_SHININESS: append(dst, "shininess"); break; case STATE_HALF: append(dst, "half"); break; case STATE_POSITION: append(dst, ".position"); break; case STATE_ATTENUATION: append(dst, ".attenuation"); break; case STATE_SPOT_DIRECTION: append(dst, ".spot.direction"); break; case STATE_TEXGEN_EYE_S: append(dst, "eye.s"); break; case STATE_TEXGEN_EYE_T: append(dst, "eye.t"); break; case STATE_TEXGEN_EYE_R: append(dst, "eye.r"); break; case STATE_TEXGEN_EYE_Q: append(dst, "eye.q"); break; case STATE_TEXGEN_OBJECT_S: append(dst, "object.s"); break; case STATE_TEXGEN_OBJECT_T: append(dst, "object.t"); break; case STATE_TEXGEN_OBJECT_R: append(dst, "object.r"); break; case STATE_TEXGEN_OBJECT_Q: append(dst, "object.q"); break; case STATE_TEXENV_COLOR: append(dst, "texenv"); break; case STATE_DEPTH_RANGE: append(dst, "depth.range"); break; case STATE_VERTEX_PROGRAM: case STATE_FRAGMENT_PROGRAM: break; case STATE_ENV: append(dst, "env"); break; case STATE_LOCAL: append(dst, "local"); break; case STATE_INTERNAL: case STATE_NORMAL_SCALE: case STATE_POSITION_NORMALIZED: append(dst, "(internal)"); break; default: ; }}static voidappend_face(char *dst, GLint face){ if (face == 0) append(dst, "front."); else append(dst, "back.");}static voidappend_index(char *dst, GLint index){ char s[20]; _mesa_sprintf(s, "[%d].", index); append(dst, s);}/** * Make a string from the given state vector. * For example, return "state.matrix.texture[2].inverse". */static const char *make_state_string(const GLint state[6]){ char str[1000] = ""; char tmp[30]; append(str, "state."); append_token(str, (enum state_index) state[0]); switch (state[0]) { case STATE_MATERIAL: append_face(str, state[1]); append_token(str, (enum state_index) state[2]); break; case STATE_LIGHT: append(str, "light"); append_index(str, state[1]); /* light number [i]. */ append_token(str, (enum state_index) state[2]); /* coefficients */ break; case STATE_LIGHTMODEL_AMBIENT: append(str, "lightmodel.ambient"); break; case STATE_LIGHTMODEL_SCENECOLOR: if (state[1] == 0) { append(str, "lightmodel.front.scenecolor"); } else { append(str, "lightmodel.back.scenecolor"); } break; case STATE_LIGHTPROD: append_index(str, state[1]); /* light number [i]. */ append_face(str, state[2]); append_token(str, (enum state_index) state[3]); break; case STATE_TEXGEN: append_index(str, state[1]); /* tex unit [i] */ append_token(str, (enum state_index) state[2]); /* plane coef */ break; case STATE_TEXENV_COLOR: append_index(str, state[1]); /* tex unit [i] */ append(str, "color"); break; case STATE_FOG_COLOR: case STATE_FOG_PARAMS: break; case STATE_CLIPPLANE: append_index(str, state[1]); /* plane [i] */ append(str, "plane"); break; case STATE_POINT_SIZE: case STATE_POINT_ATTENUATION: break; case STATE_MATRIX: { /* state[1] = modelview, projection, texture, etc. */ /* state[2] = which texture matrix or program matrix */ /* state[3] = first column to fetch */ /* state[4] = last column to fetch */ /* state[5] = transpose, inverse or invtrans */ const enum state_index mat = (enum state_index) state[1]; const GLuint index = (GLuint) state[2]; const GLuint first = (GLuint) state[3]; const GLuint last = (GLuint) state[4]; const enum state_index modifier = (enum state_index) state[5]; append_token(str, mat); if (index) append_index(str, index); if (modifier) append_token(str, modifier); if (first == last) _mesa_sprintf(tmp, ".row[%d]", first); else _mesa_sprintf(tmp, ".row[%d..%d]", first, last); append(str, tmp); } break; case STATE_DEPTH_RANGE: break; case STATE_FRAGMENT_PROGRAM: case STATE_VERTEX_PROGRAM: /* state[1] = {STATE_ENV, STATE_LOCAL} */ /* state[2] = parameter index */ append_token(str, (enum state_index) state[1]); append_index(str, state[2]); break; case STATE_INTERNAL: break; default: _mesa_problem(NULL, "Invalid state in maka_state_string"); break; } return _mesa_strdup(str);}/** * Loop over all the parameters in a parameter list. If the parameter * is a GL state reference, look up the current value of that state * variable and put it into the parameter's Value[4] array. * This would be called at glBegin time when using a fragment program. */void_mesa_load_state_parameters(GLcontext *ctx, struct program_parameter_list *paramList){ GLuint i; if (!paramList) return; for (i = 0; i < paramList->NumParameters; i++) { if (paramList->Parameters[i].Type == PROGRAM_STATE_VAR) { _mesa_fetch_state(ctx, paramList->Parameters[i].StateIndexes, paramList->ParameterValues[i]); } }}/** * Initialize program instruction fields to defaults. */void_mesa_init_instruction(struct prog_instruction *inst){ _mesa_bzero(inst, sizeof(struct prog_instruction)); inst->SrcReg[0].File = PROGRAM_UNDEFINED; inst->SrcReg[0].Swizzle = SWIZZLE_NOOP; inst->SrcReg[1].File = PROGRAM_UNDEFINED;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -