/* This is the usual entrypoint for state updates: */ void _mesa_update_state( GLcontext *ctx ) { _mesa_lock_context_textures(ctx); _mesa_update_state_locked(ctx); _mesa_unlock_context_textures(ctx); }
static void intelRunPipeline(GLcontext * ctx) { struct intel_context *intel = intel_context(ctx); _mesa_lock_context_textures(ctx); if (ctx->NewState) _mesa_update_state_locked(ctx); if (intel->NewGLState) { if (intel->NewGLState & _NEW_TEXTURE) { intel->vtbl.update_texture_state(intel); } if (!intel->Fallback) { if (intel->NewGLState & _INTEL_NEW_RENDERSTATE) intelChooseRenderState(ctx); } intel->NewGLState = 0; } _tnl_run_pipeline(ctx); _mesa_unlock_context_textures(ctx); }
/** * Used by glXCopyContext to copy texture state from one context to another. */ void _mesa_copy_texture_state( const struct gl_context *src, struct gl_context *dst ) { GLuint u, tex; assert(src); assert(dst); dst->Texture.CurrentUnit = src->Texture.CurrentUnit; dst->Texture._GenFlags = src->Texture._GenFlags; dst->Texture._TexGenEnabled = src->Texture._TexGenEnabled; dst->Texture._TexMatEnabled = src->Texture._TexMatEnabled; /* per-unit state */ for (u = 0; u < src->Const.MaxCombinedTextureImageUnits; u++) { dst->Texture.Unit[u].LodBias = src->Texture.Unit[u].LodBias; /* * XXX strictly speaking, we should compare texture names/ids and * bind textures in the dest context according to id. For now, only * copy bindings if the contexts share the same pool of textures to * avoid refcounting bugs. */ if (dst->Shared == src->Shared) { /* copy texture object bindings, not contents of texture objects */ _mesa_lock_context_textures(dst); for (tex = 0; tex < NUM_TEXTURE_TARGETS; tex++) { _mesa_reference_texobj(&dst->Texture.Unit[u].CurrentTex[tex], src->Texture.Unit[u].CurrentTex[tex]); if (src->Texture.Unit[u].CurrentTex[tex]) { dst->Texture.NumCurrentTexUsed = MAX2(dst->Texture.NumCurrentTexUsed, u + 1); } } dst->Texture.Unit[u]._BoundTextures = src->Texture.Unit[u]._BoundTextures; _mesa_unlock_context_textures(dst); } } for (u = 0; u < src->Const.MaxTextureCoordUnits; u++) { dst->Texture.FixedFuncUnit[u].Enabled = src->Texture.FixedFuncUnit[u].Enabled; dst->Texture.FixedFuncUnit[u].EnvMode = src->Texture.FixedFuncUnit[u].EnvMode; COPY_4V(dst->Texture.FixedFuncUnit[u].EnvColor, src->Texture.FixedFuncUnit[u].EnvColor); dst->Texture.FixedFuncUnit[u].TexGenEnabled = src->Texture.FixedFuncUnit[u].TexGenEnabled; dst->Texture.FixedFuncUnit[u].GenS = src->Texture.FixedFuncUnit[u].GenS; dst->Texture.FixedFuncUnit[u].GenT = src->Texture.FixedFuncUnit[u].GenT; dst->Texture.FixedFuncUnit[u].GenR = src->Texture.FixedFuncUnit[u].GenR; dst->Texture.FixedFuncUnit[u].GenQ = src->Texture.FixedFuncUnit[u].GenQ; /* GL_EXT_texture_env_combine */ dst->Texture.FixedFuncUnit[u].Combine = src->Texture.FixedFuncUnit[u].Combine; } }
/** * Used by glXCopyContext to copy texture state from one context to another. */ void _mesa_copy_texture_state( const GLcontext *src, GLcontext *dst ) { GLuint u, tex; ASSERT(src); ASSERT(dst); dst->Texture.CurrentUnit = src->Texture.CurrentUnit; dst->Texture._GenFlags = src->Texture._GenFlags; dst->Texture._TexGenEnabled = src->Texture._TexGenEnabled; dst->Texture._TexMatEnabled = src->Texture._TexMatEnabled; dst->Texture.SharedPalette = src->Texture.SharedPalette; /* per-unit state */ for (u = 0; u < src->Const.MaxTextureImageUnits; u++) { dst->Texture.Unit[u].Enabled = src->Texture.Unit[u].Enabled; dst->Texture.Unit[u].EnvMode = src->Texture.Unit[u].EnvMode; COPY_4V(dst->Texture.Unit[u].EnvColor, src->Texture.Unit[u].EnvColor); dst->Texture.Unit[u].TexGenEnabled = src->Texture.Unit[u].TexGenEnabled; dst->Texture.Unit[u].GenS = src->Texture.Unit[u].GenS; dst->Texture.Unit[u].GenT = src->Texture.Unit[u].GenT; dst->Texture.Unit[u].GenR = src->Texture.Unit[u].GenR; dst->Texture.Unit[u].GenQ = src->Texture.Unit[u].GenQ; dst->Texture.Unit[u].LodBias = src->Texture.Unit[u].LodBias; /* GL_EXT_texture_env_combine */ dst->Texture.Unit[u].Combine = src->Texture.Unit[u].Combine; /* GL_ATI_envmap_bumpmap - need this? */ dst->Texture.Unit[u].BumpTarget = src->Texture.Unit[u].BumpTarget; COPY_4V(dst->Texture.Unit[u].RotMatrix, src->Texture.Unit[u].RotMatrix); /* * XXX strictly speaking, we should compare texture names/ids and * bind textures in the dest context according to id. For now, only * copy bindings if the contexts share the same pool of textures to * avoid refcounting bugs. */ if (dst->Shared == src->Shared) { /* copy texture object bindings, not contents of texture objects */ _mesa_lock_context_textures(dst); for (tex = 0; tex < NUM_TEXTURE_TARGETS; tex++) { _mesa_reference_texobj(&dst->Texture.Unit[u].CurrentTex[tex], src->Texture.Unit[u].CurrentTex[tex]); } _mesa_unlock_context_textures(dst); } } }
/** * Used by glXCopyContext to copy texture state from one context to another. */ void _mesa_copy_texture_state( const GLcontext *src, GLcontext *dst ) { GLuint u, tex; ASSERT(src); ASSERT(dst); dst->Texture.CurrentUnit = src->Texture.CurrentUnit; dst->Texture._GenFlags = src->Texture._GenFlags; dst->Texture._TexGenEnabled = src->Texture._TexGenEnabled; dst->Texture._TexMatEnabled = src->Texture._TexMatEnabled; dst->Texture.SharedPalette = src->Texture.SharedPalette; /* per-unit state */ for (u = 0; u < src->Const.MaxTextureImageUnits; u++) { dst->Texture.Unit[u].Enabled = src->Texture.Unit[u].Enabled; dst->Texture.Unit[u].EnvMode = src->Texture.Unit[u].EnvMode; COPY_4V(dst->Texture.Unit[u].EnvColor, src->Texture.Unit[u].EnvColor); dst->Texture.Unit[u].TexGenEnabled = src->Texture.Unit[u].TexGenEnabled; dst->Texture.Unit[u].GenS = src->Texture.Unit[u].GenS; dst->Texture.Unit[u].GenT = src->Texture.Unit[u].GenT; dst->Texture.Unit[u].GenR = src->Texture.Unit[u].GenR; dst->Texture.Unit[u].GenQ = src->Texture.Unit[u].GenQ; dst->Texture.Unit[u].LodBias = src->Texture.Unit[u].LodBias; /* GL_EXT_texture_env_combine */ dst->Texture.Unit[u].Combine = src->Texture.Unit[u].Combine; /* GL_ATI_envmap_bumpmap - need this? */ dst->Texture.Unit[u].BumpTarget = src->Texture.Unit[u].BumpTarget; COPY_4V(dst->Texture.Unit[u].RotMatrix, src->Texture.Unit[u].RotMatrix); /* copy texture object bindings, not contents of texture objects */ _mesa_lock_context_textures(dst); for (tex = 0; tex < NUM_TEXTURE_TARGETS; tex++) { _mesa_reference_texobj(&dst->Texture.Unit[u].CurrentTex[tex], src->Texture.Unit[u].CurrentTex[tex]); } _mesa_unlock_context_textures(dst); } }