[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