[Mesa-dev] [PATCH v2 7/7] mesa: don't enable legacy GL functions when using API_OPENGL_CORE

Brian Paul brianp at vmware.com
Fri Jul 27 08:06:21 PDT 2012


On 07/27/2012 12:43 AM, Jordan Justen wrote:
> Signed-off-by: Jordan Justen<jordan.l.justen at intel.com>
> ---
>   src/mesa/main/api_exec.c |  227 ++++++++++++++++++++++++++++------------------
>   src/mesa/main/api_exec.h |    3 +-
>   src/mesa/main/context.c  |    2 +-
>   src/mesa/main/vtxfmt.c   |  167 ++++++++++++++++++----------------
>   4 files changed, 232 insertions(+), 167 deletions(-)
>
> diff --git a/src/mesa/main/api_exec.c b/src/mesa/main/api_exec.c
> index 19e7f98..81be46d 100644
> --- a/src/mesa/main/api_exec.c
> +++ b/src/mesa/main/api_exec.c
> @@ -120,7 +120,7 @@
>    * \param exec dispatch table.
>    */
>   struct _glapi_table *
> -_mesa_create_exec_table(void)
> +_mesa_create_exec_table(struct gl_context *ctx)
>   {
>      struct _glapi_table *exec;
>
> @@ -133,7 +133,10 @@ _mesa_create_exec_table(void)
>   #endif
>
>      /* load the dispatch slots we understand */
> -   SET_AlphaFunc(exec, _mesa_AlphaFunc);
> +   if (ctx->API != API_OPENGL_CORE) {
> +      SET_AlphaFunc(exec, _mesa_AlphaFunc);
> +   }
> +
>      SET_BlendFunc(exec, _mesa_BlendFunc);
>      SET_Clear(exec, _mesa_Clear);
>      SET_ClearColor(exec, _mesa_ClearColor);
> @@ -149,42 +152,62 @@ _mesa_create_exec_table(void)
>      SET_Finish(exec, _mesa_Finish);
>      SET_Flush(exec, _mesa_Flush);
>      SET_FrontFace(exec, _mesa_FrontFace);
> -   SET_Frustum(exec, _mesa_Frustum);
> +   if (ctx->API != API_OPENGL_CORE) {
> +      SET_Frustum(exec, _mesa_Frustum);
> +   }

So, if you're not plugging functions into these dispatch pointers, the 
default is the "no op" function in the dispatcher module which print a 
warning message about calling an invalid function.

But the GL 3.2 spec says "Functions which have been removed will 
generate an INVALID_OPERATION error if called in the core profile or 
in a forward-compatible context."

So I think we actually need to plug in a "invalid operation" stub 
function instead.  Something like this:

void GLAPIENTRY
_mesa_invalid_function(void)
{
    GET_CURRENT_CONTEXT(ctx);
    _mesa_error(ctx, GL_INVALID_OPERATION,
                "Calling legacy function from core profile");
}

[...]

    if (ctx->API == API_OPENGL_CORE) {
       SET_Frustum(exec, _mesa_invalid_function);
    }
    else {
       SET_Frustum(exec, _mesa_Frustum);
    }


But it might be simplest to have a function that simply plugs the 
_mesa_invalid_function into all the relevant dispatch slots when a 
core profile context is created.  It would be called both for the 
"exec" the "dlist" dispatch tables.  Then we could leave the 
api_exec.c code mostly as-is.

-Brian


More information about the mesa-dev mailing list