📄 state.c
字号:
SET_LinkProgramARB(exec, _mesa_LinkProgramARB); SET_UseProgramObjectARB(exec, _mesa_UseProgramObjectARB); SET_ValidateProgramARB(exec, _mesa_ValidateProgramARB); SET_Uniform1fARB(exec, _mesa_Uniform1fARB); SET_Uniform2fARB(exec, _mesa_Uniform2fARB); SET_Uniform3fARB(exec, _mesa_Uniform3fARB); SET_Uniform4fARB(exec, _mesa_Uniform4fARB); SET_Uniform1iARB(exec, _mesa_Uniform1iARB); SET_Uniform2iARB(exec, _mesa_Uniform2iARB); SET_Uniform3iARB(exec, _mesa_Uniform3iARB); SET_Uniform4iARB(exec, _mesa_Uniform4iARB); SET_Uniform1fvARB(exec, _mesa_Uniform1fvARB); SET_Uniform2fvARB(exec, _mesa_Uniform2fvARB); SET_Uniform3fvARB(exec, _mesa_Uniform3fvARB); SET_Uniform4fvARB(exec, _mesa_Uniform4fvARB); SET_Uniform1ivARB(exec, _mesa_Uniform1ivARB); SET_Uniform2ivARB(exec, _mesa_Uniform2ivARB); SET_Uniform3ivARB(exec, _mesa_Uniform3ivARB); SET_Uniform4ivARB(exec, _mesa_Uniform4ivARB); SET_UniformMatrix2fvARB(exec, _mesa_UniformMatrix2fvARB); SET_UniformMatrix3fvARB(exec, _mesa_UniformMatrix3fvARB); SET_UniformMatrix4fvARB(exec, _mesa_UniformMatrix4fvARB); SET_GetObjectParameterfvARB(exec, _mesa_GetObjectParameterfvARB); SET_GetObjectParameterivARB(exec, _mesa_GetObjectParameterivARB); SET_GetInfoLogARB(exec, _mesa_GetInfoLogARB); SET_GetAttachedObjectsARB(exec, _mesa_GetAttachedObjectsARB); SET_GetUniformLocationARB(exec, _mesa_GetUniformLocationARB); SET_GetActiveUniformARB(exec, _mesa_GetActiveUniformARB); SET_GetUniformfvARB(exec, _mesa_GetUniformfvARB); SET_GetUniformivARB(exec, _mesa_GetUniformivARB); SET_GetShaderSourceARB(exec, _mesa_GetShaderSourceARB);#endif /* FEATURE_ARB_shader_objects */#if FEATURE_ARB_vertex_shader SET_BindAttribLocationARB(exec, _mesa_BindAttribLocationARB); SET_GetActiveAttribARB(exec, _mesa_GetActiveAttribARB); SET_GetAttribLocationARB(exec, _mesa_GetAttribLocationARB);#endif /* FEATURE_ARB_vertex_shader */ /* GL_ATI_fragment_shader */#if FEATURE_ATI_fragment_shader SET_GenFragmentShadersATI(exec, _mesa_GenFragmentShadersATI); SET_BindFragmentShaderATI(exec, _mesa_BindFragmentShaderATI); SET_DeleteFragmentShaderATI(exec, _mesa_DeleteFragmentShaderATI); SET_BeginFragmentShaderATI(exec, _mesa_BeginFragmentShaderATI); SET_EndFragmentShaderATI(exec, _mesa_EndFragmentShaderATI); SET_PassTexCoordATI(exec, _mesa_PassTexCoordATI); SET_SampleMapATI(exec, _mesa_SampleMapATI); SET_ColorFragmentOp1ATI(exec, _mesa_ColorFragmentOp1ATI); SET_ColorFragmentOp2ATI(exec, _mesa_ColorFragmentOp2ATI); SET_ColorFragmentOp3ATI(exec, _mesa_ColorFragmentOp3ATI); SET_AlphaFragmentOp1ATI(exec, _mesa_AlphaFragmentOp1ATI); SET_AlphaFragmentOp2ATI(exec, _mesa_AlphaFragmentOp2ATI); SET_AlphaFragmentOp3ATI(exec, _mesa_AlphaFragmentOp3ATI); SET_SetFragmentShaderConstantATI(exec, _mesa_SetFragmentShaderConstantATI);#endif#if FEATURE_EXT_framebuffer_object SET_IsRenderbufferEXT(exec, _mesa_IsRenderbufferEXT); SET_BindRenderbufferEXT(exec, _mesa_BindRenderbufferEXT); SET_DeleteRenderbuffersEXT(exec, _mesa_DeleteRenderbuffersEXT); SET_GenRenderbuffersEXT(exec, _mesa_GenRenderbuffersEXT); SET_RenderbufferStorageEXT(exec, _mesa_RenderbufferStorageEXT); SET_GetRenderbufferParameterivEXT(exec, _mesa_GetRenderbufferParameterivEXT); SET_IsFramebufferEXT(exec, _mesa_IsFramebufferEXT); SET_BindFramebufferEXT(exec, _mesa_BindFramebufferEXT); SET_DeleteFramebuffersEXT(exec, _mesa_DeleteFramebuffersEXT); SET_GenFramebuffersEXT(exec, _mesa_GenFramebuffersEXT); SET_CheckFramebufferStatusEXT(exec, _mesa_CheckFramebufferStatusEXT); SET_FramebufferTexture1DEXT(exec, _mesa_FramebufferTexture1DEXT); SET_FramebufferTexture2DEXT(exec, _mesa_FramebufferTexture2DEXT); SET_FramebufferTexture3DEXT(exec, _mesa_FramebufferTexture3DEXT); SET_FramebufferRenderbufferEXT(exec, _mesa_FramebufferRenderbufferEXT); SET_GetFramebufferAttachmentParameterivEXT(exec, _mesa_GetFramebufferAttachmentParameterivEXT); SET_GenerateMipmapEXT(exec, _mesa_GenerateMipmapEXT);#endif /* GL_EXT_timer_query */ SET_GetQueryObjecti64vEXT(exec, _mesa_GetQueryObjecti64vEXT); SET_GetQueryObjectui64vEXT(exec, _mesa_GetQueryObjectui64vEXT);#if FEATURE_EXT_framebuffer_blit SET_BlitFramebufferEXT(exec, _mesa_BlitFramebufferEXT);#endif}/**********************************************************************//** \name State update logic *//*@{*/static voidupdate_separate_specular( GLcontext *ctx ){ if (NEED_SECONDARY_COLOR(ctx)) ctx->_TriangleCaps |= DD_SEPARATE_SPECULAR; else ctx->_TriangleCaps &= ~DD_SEPARATE_SPECULAR;}/** * Update state dependent on vertex arrays. */static voidupdate_arrays( GLcontext *ctx ){ GLuint i, min; /* find min of _MaxElement values for all enabled arrays */ /* 0 */ if (ctx->VertexProgram._Enabled && ctx->Array.VertexAttrib[VERT_ATTRIB_POS].Enabled) { min = ctx->Array.VertexAttrib[VERT_ATTRIB_POS]._MaxElement; } else if (ctx->Array.Vertex.Enabled) { min = ctx->Array.Vertex._MaxElement; } else { /* can't draw anything without vertex positions! */ min = 0; } /* 1 */ if (ctx->VertexProgram._Enabled && ctx->Array.VertexAttrib[VERT_ATTRIB_WEIGHT].Enabled) { min = MIN2(min, ctx->Array.VertexAttrib[VERT_ATTRIB_WEIGHT]._MaxElement); } /* no conventional vertex weight array */ /* 2 */ if (ctx->VertexProgram._Enabled && ctx->Array.VertexAttrib[VERT_ATTRIB_NORMAL].Enabled) { min = MIN2(min, ctx->Array.VertexAttrib[VERT_ATTRIB_NORMAL]._MaxElement); } else if (ctx->Array.Normal.Enabled) { min = MIN2(min, ctx->Array.Normal._MaxElement); } /* 3 */ if (ctx->VertexProgram._Enabled && ctx->Array.VertexAttrib[VERT_ATTRIB_COLOR0].Enabled) { min = MIN2(min, ctx->Array.VertexAttrib[VERT_ATTRIB_COLOR0]._MaxElement); } else if (ctx->Array.Color.Enabled) { min = MIN2(min, ctx->Array.Color._MaxElement); } /* 4 */ if (ctx->VertexProgram._Enabled && ctx->Array.VertexAttrib[VERT_ATTRIB_COLOR1].Enabled) { min = MIN2(min, ctx->Array.VertexAttrib[VERT_ATTRIB_COLOR1]._MaxElement); } else if (ctx->Array.SecondaryColor.Enabled) { min = MIN2(min, ctx->Array.SecondaryColor._MaxElement); } /* 5 */ if (ctx->VertexProgram._Enabled && ctx->Array.VertexAttrib[VERT_ATTRIB_FOG].Enabled) { min = MIN2(min, ctx->Array.VertexAttrib[VERT_ATTRIB_FOG]._MaxElement); } else if (ctx->Array.FogCoord.Enabled) { min = MIN2(min, ctx->Array.FogCoord._MaxElement); } /* 6 */ if (ctx->VertexProgram._Enabled && ctx->Array.VertexAttrib[VERT_ATTRIB_SIX].Enabled) { min = MIN2(min, ctx->Array.VertexAttrib[VERT_ATTRIB_SIX]._MaxElement); } /* 7 */ if (ctx->VertexProgram._Enabled && ctx->Array.VertexAttrib[VERT_ATTRIB_SEVEN].Enabled) { min = MIN2(min, ctx->Array.VertexAttrib[VERT_ATTRIB_SEVEN]._MaxElement); } /* 8..15 */ for (i = VERT_ATTRIB_TEX0; i < VERT_ATTRIB_MAX; i++) { if (ctx->VertexProgram._Enabled && ctx->Array.VertexAttrib[i].Enabled) { min = MIN2(min, ctx->Array.VertexAttrib[i]._MaxElement); } else if (i - VERT_ATTRIB_TEX0 < ctx->Const.MaxTextureCoordUnits && ctx->Array.TexCoord[i - VERT_ATTRIB_TEX0].Enabled) { min = MIN2(min, ctx->Array.TexCoord[i - VERT_ATTRIB_TEX0]._MaxElement); } } if (ctx->Array.Index.Enabled) { min = MIN2(min, ctx->Array.Index._MaxElement); } if (ctx->Array.EdgeFlag.Enabled) { min = MIN2(min, ctx->Array.EdgeFlag._MaxElement); } /* _MaxElement is one past the last legal array element */ ctx->Array._MaxElement = min;}/** * Update derived vertex/fragment program state. */static voidupdate_program(GLcontext *ctx){ /* For now, just set the _Enabled (really enabled) flags. * In the future we may have to check other state to be sure we really * have a runable program or shader. */ ctx->VertexProgram._Enabled = ctx->VertexProgram.Enabled && ctx->VertexProgram.Current->Base.Instructions; ctx->FragmentProgram._Enabled = ctx->FragmentProgram.Enabled && ctx->FragmentProgram.Current->Base.Instructions; ctx->ATIFragmentShader._Enabled = ctx->ATIFragmentShader.Enabled && ctx->ATIFragmentShader.Current->Instructions; ctx->FragmentProgram._Current = ctx->FragmentProgram.Current; ctx->FragmentProgram._Active = ctx->FragmentProgram._Enabled; if (ctx->_MaintainTexEnvProgram && !ctx->FragmentProgram._Enabled) { if (!ctx->_TexEnvProgram) ctx->_TexEnvProgram = (struct fragment_program *) ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB, 0); ctx->FragmentProgram._Current = ctx->_TexEnvProgram; if (ctx->_UseTexEnvProgram) ctx->FragmentProgram._Active = GL_TRUE; }}static voidupdate_viewport_matrix(GLcontext *ctx){ const GLfloat depthMax = ctx->DrawBuffer->_DepthMaxF; ASSERT(depthMax > 0); /* Compute scale and bias values. This is really driver-specific * and should be maintained elsewhere if at all. * NOTE: RasterPos uses this. */ _math_matrix_viewport(&ctx->Viewport._WindowMap, ctx->Viewport.X, ctx->Viewport.Y, ctx->Viewport.Width, ctx->Viewport.Height, ctx->Viewport.Near, ctx->Viewport.Far, depthMax);}/** * If __GLcontextRec::NewState is non-zero then this function \b must be called * before rendering any primitive. Basically, function pointers and * miscellaneous flags are updated to reflect the current state of the state * machine. * * Calls dd_function_table::UpdateState to perform any internal state * management necessary. * * \sa _mesa_update_modelview_project(), _mesa_update_texture(), * _mesa_update_buffer_bounds(), _mesa_update_polygon(), * _mesa_update_lighting() and _mesa_update_tnl_spaces(). */void_mesa_update_state( GLcontext *ctx ){ GLbitfield new_state = ctx->NewState; if (MESA_VERBOSE & VERBOSE_STATE) _mesa_print_state("_mesa_update_state", new_state); if (new_state & _NEW_PROGRAM) update_program( ctx ); if (new_state & (_NEW_MODELVIEW|_NEW_PROJECTION)) _mesa_update_modelview_project( ctx, new_state ); if (new_state & (_NEW_PROGRAM|_NEW_TEXTURE|_NEW_TEXTURE_MATRIX)) _mesa_update_texture( ctx, new_state ); if (new_state & (_NEW_BUFFERS | _NEW_COLOR | _NEW_PIXEL)) _mesa_update_framebuffer(ctx); if (new_state & (_NEW_SCISSOR | _NEW_BUFFERS | _NEW_VIEWPORT)) _mesa_update_draw_buffer_bounds( ctx ); if (new_state & _NEW_POINT) _mesa_update_point( ctx ); if (new_state & _NEW_POLYGON) _mesa_update_polygon( ctx ); if (new_state & _NEW_LIGHT) _mesa_update_lighting( ctx ); if (new_state & _NEW_STENCIL) _mesa_update_stencil( ctx ); if (new_state & _IMAGE_NEW_TRANSFER_STATE) _mesa_update_pixel( ctx, new_state ); if (new_state & _DD_NEW_SEPARATE_SPECULAR) update_separate_specular( ctx ); if (new_state & (_NEW_ARRAY | _NEW_PROGRAM)) update_arrays( ctx ); if (new_state & (_NEW_BUFFERS | _NEW_VIEWPORT)) update_viewport_matrix(ctx); if (ctx->_MaintainTexEnvProgram) { if (new_state & (_NEW_TEXTURE | _DD_NEW_SEPARATE_SPECULAR | _NEW_FOG)) _mesa_UpdateTexEnvProgram(ctx); } /* ctx->_NeedEyeCoords is now up to date. * * If the truth value of this variable has changed, update for the * new lighting space and recompute the positions of lights and the * normal transform. * * If the lighting space hasn't changed, may still need to recompute * light positions & normal transforms for other reasons. */ if (new_state & _MESA_NEW_NEED_EYE_COORDS) _mesa_update_tnl_spaces( ctx, new_state ); /* * Give the driver a chance to act upon the new_state flags. * The driver might plug in different span functions, for example. * Also, this is where the driver can invalidate the state of any * active modules (such as swrast_setup, swrast, tnl, etc). * * Set ctx->NewState to zero to avoid recursion if * Driver.UpdateState() has to call FLUSH_VERTICES(). (fixed?) */ new_state = ctx->NewState; ctx->NewState = 0; ctx->Driver.UpdateState(ctx, new_state); ctx->Array.NewState = 0;}/*@}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -