From a7a9a91d7b28e5b5faed509d00f0f951e3136b1b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Tue, 27 Apr 2010 11:04:51 -0400 Subject: [PATCH] dri: Add DRI entrypoints to create a context for a given API --- include/GL/internal/dri_interface.h | 14 ++++- src/mesa/drivers/dri/common/dri_util.c | 58 ++++++++++++++++++- src/mesa/drivers/dri/common/dri_util.h | 8 ++- src/mesa/drivers/dri/i810/i810context.c | 3 +- src/mesa/drivers/dri/i810/i810screen.h | 3 +- src/mesa/drivers/dri/intel/intel_screen.c | 3 +- src/mesa/drivers/dri/mach64/mach64_context.c | 3 +- src/mesa/drivers/dri/mach64/mach64_context.h | 3 +- src/mesa/drivers/dri/mga/mga_xmesa.c | 3 +- .../drivers/dri/nouveau/nouveau_context.c | 3 +- src/mesa/drivers/dri/r128/r128_context.c | 3 +- src/mesa/drivers/dri/r128/r128_context.h | 3 +- src/mesa/drivers/dri/r200/r200_context.c | 3 +- src/mesa/drivers/dri/r200/r200_context.h | 3 +- src/mesa/drivers/dri/r300/r300_context.c | 3 +- src/mesa/drivers/dri/r300/r300_context.h | 3 +- src/mesa/drivers/dri/r600/r600_context.c | 3 +- src/mesa/drivers/dri/r600/r600_context.h | 3 +- src/mesa/drivers/dri/radeon/radeon_context.c | 7 ++- src/mesa/drivers/dri/radeon/radeon_context.h | 3 +- src/mesa/drivers/dri/savage/savage_xmesa.c | 3 +- src/mesa/drivers/dri/sis/sis_context.c | 3 +- src/mesa/drivers/dri/sis/sis_context.h | 3 +- src/mesa/drivers/dri/tdfx/tdfx_context.c | 3 +- src/mesa/drivers/dri/tdfx/tdfx_context.h | 3 +- src/mesa/drivers/dri/unichrome/via_context.c | 3 +- src/mesa/drivers/dri/unichrome/via_screen.h | 3 +- 27 files changed, 124 insertions(+), 32 deletions(-) diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h index fa9b7c4bf21..4b9264166f9 100644 --- a/include/GL/internal/dri_interface.h +++ b/include/GL/internal/dri_interface.h @@ -736,7 +736,11 @@ struct __DRIdri2LoaderExtensionRec { * constructors for DRI2. */ #define __DRI_DRI2 "DRI_DRI2" -#define __DRI_DRI2_VERSION 1 +#define __DRI_DRI2_VERSION 2 + +#define __DRI_API_OPENGL 0 +#define __DRI_API_GLES 1 +#define __DRI_API_GLES2 2 struct __DRIdri2ExtensionRec { __DRIextension base; @@ -755,6 +759,14 @@ struct __DRIdri2ExtensionRec { __DRIcontext *shared, void *loaderPrivate); + /* Since version 2 */ + unsigned int (*getAPIMask)(__DRIscreen *screen); + + __DRIcontext *(*createNewContextForAPI)(__DRIscreen *screen, + int api, + const __DRIconfig *config, + __DRIcontext *shared, + void *data); }; diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c index f1bbd386128..e08005f90b9 100644 --- a/src/mesa/drivers/dri/common/dri_util.c +++ b/src/mesa/drivers/dri/common/dri_util.c @@ -564,7 +564,8 @@ driCreateNewContext(__DRIscreen *psp, const __DRIconfig *config, pcp->hHWContext = hwContext; - if ( !(*psp->DriverAPI.CreateContext)(&config->modes, pcp, shareCtx) ) { + if ( !(*psp->DriverAPI.CreateContext)(API_OPENGL, + &config->modes, pcp, shareCtx) ) { free(pcp); return NULL; } @@ -572,15 +573,62 @@ driCreateNewContext(__DRIscreen *psp, const __DRIconfig *config, return pcp; } +static unsigned int +dri2GetAPIMask(__DRIscreen *screen) +{ + return screen->api_mask; +} + +static __DRIcontext * +dri2CreateNewContextForAPI(__DRIscreen *screen, int api, + const __DRIconfig *config, + __DRIcontext *shared, void *data) +{ + __DRIcontext *context; + void *shareCtx = (shared != NULL) ? shared->driverPrivate : NULL; + gl_api mesa_api; + + if (!(screen->api_mask & (1 << api))) + return NULL; + + switch (api) { + case __DRI_API_OPENGL: + mesa_api = API_OPENGL; + break; + case __DRI_API_GLES: + mesa_api = API_OPENGLES; + break; + case __DRI_API_GLES2: + mesa_api = API_OPENGLES2; + break; + } + + context = malloc(sizeof *context); + if (!context) + return NULL; + + context->driScreenPriv = screen; + context->driDrawablePriv = NULL; + context->loaderPrivate = data; + + if (!(*screen->DriverAPI.CreateContext)(api, &config->modes, + context, shareCtx) ) { + free(context); + return NULL; + } + + return context; +} + static __DRIcontext * dri2CreateNewContext(__DRIscreen *screen, const __DRIconfig *config, __DRIcontext *shared, void *data) { - return driCreateNewContext(screen, config, 0, shared, 0, data); + return dri2CreateNewContextForAPI(screen, __DRI_API_OPENGL, + config, shared, data); } - static int driCopyContext(__DRIcontext *dest, __DRIcontext *src, unsigned long mask) { @@ -718,6 +766,7 @@ driCreateNewScreen(int scrn, psp->dri2.enabled = GL_FALSE; psp->DriverAPI = driDriverAPI; + psp->api_mask = (1 << __DRI_API_OPENGL); *driver_modes = driDriverAPI.InitScreen(psp); if (*driver_modes == NULL) { @@ -763,6 +812,7 @@ dri2CreateNewScreen(int scrn, int fd, psp->dri2.enabled = GL_TRUE; psp->DriverAPI = driDriverAPI; + psp->api_mask = (1 << __DRI_API_OPENGL); *driver_configs = driDriverAPI.InitScreen2(psp); if (*driver_configs == NULL) { free(psp); @@ -811,6 +861,8 @@ const __DRIdri2Extension driDRI2Extension = { dri2CreateNewScreen, dri2CreateNewDrawable, dri2CreateNewContext, + dri2GetAPIMask, + dri2CreateNewContextForAPI }; static int diff --git a/src/mesa/drivers/dri/common/dri_util.h b/src/mesa/drivers/dri/common/dri_util.h index 038a81604fc..4b7cd414b8f 100644 --- a/src/mesa/drivers/dri/common/dri_util.h +++ b/src/mesa/drivers/dri/common/dri_util.h @@ -52,6 +52,7 @@ #include #include #include "main/glheader.h" +#include "main/mtypes.h" #include "GL/internal/glcore.h" #include "GL/internal/dri_interface.h" @@ -146,8 +147,9 @@ struct __DriverAPIRec { /** * Context creation callback */ - GLboolean (*CreateContext)(const __GLcontextModes *glVis, - __DRIcontext *driContextPriv, + GLboolean (*CreateContext)(gl_api api, + const __GLcontextModes *glVis, + __DRIcontext *driContextPriv, void *sharedContextPrivate); /** @@ -527,6 +529,8 @@ struct __DRIscreenRec { /* The lock actually in use, old sarea or DRI2 */ drmLock *lock; + + unsigned int api_mask; }; extern void diff --git a/src/mesa/drivers/dri/i810/i810context.c b/src/mesa/drivers/dri/i810/i810context.c index 34e34606b4b..49f3ee88a61 100644 --- a/src/mesa/drivers/dri/i810/i810context.c +++ b/src/mesa/drivers/dri/i810/i810context.c @@ -166,7 +166,8 @@ static const struct dri_debug_control debug_control[] = }; GLboolean -i810CreateContext( const __GLcontextModes *mesaVis, +i810CreateContext( gl_api api, + const __GLcontextModes *mesaVis, __DRIcontext *driContextPriv, void *sharedContextPrivate ) { diff --git a/src/mesa/drivers/dri/i810/i810screen.h b/src/mesa/drivers/dri/i810/i810screen.h index 734e2fb002d..fe6db7e6e1c 100644 --- a/src/mesa/drivers/dri/i810/i810screen.h +++ b/src/mesa/drivers/dri/i810/i810screen.h @@ -78,7 +78,8 @@ typedef struct { extern GLboolean -i810CreateContext( const __GLcontextModes *mesaVis, +i810CreateContext( gl_api api, + const __GLcontextModes *mesaVis, __DRIcontext *driContextPriv, void *sharedContextPrivate ); diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c index 5e3f40836d0..b27e7a34a76 100644 --- a/src/mesa/drivers/dri/intel/intel_screen.c +++ b/src/mesa/drivers/dri/intel/intel_screen.c @@ -364,7 +364,8 @@ extern GLboolean brwCreateContext(const __GLcontextModes * mesaVis, void *sharedContextPrivate); static GLboolean -intelCreateContext(const __GLcontextModes * mesaVis, +intelCreateContext(gl_api api, + const __GLcontextModes * mesaVis, __DRIcontext * driContextPriv, void *sharedContextPrivate) { diff --git a/src/mesa/drivers/dri/mach64/mach64_context.c b/src/mesa/drivers/dri/mach64/mach64_context.c index 77e7e53ce04..72a44d96424 100644 --- a/src/mesa/drivers/dri/mach64/mach64_context.c +++ b/src/mesa/drivers/dri/mach64/mach64_context.c @@ -86,7 +86,8 @@ static const struct dri_extension card_extensions[] = /* Create the device specific context. */ -GLboolean mach64CreateContext( const __GLcontextModes *glVisual, +GLboolean mach64CreateContext( gl_api api, + const __GLcontextModes *glVisual, __DRIcontext *driContextPriv, void *sharedContextPrivate ) { diff --git a/src/mesa/drivers/dri/mach64/mach64_context.h b/src/mesa/drivers/dri/mach64/mach64_context.h index 18fc859d013..893fc8daee9 100644 --- a/src/mesa/drivers/dri/mach64/mach64_context.h +++ b/src/mesa/drivers/dri/mach64/mach64_context.h @@ -273,7 +273,8 @@ struct mach64_context { #define MACH64_CONTEXT(ctx) ((mach64ContextPtr)(ctx->DriverCtx)) -extern GLboolean mach64CreateContext( const __GLcontextModes *glVisual, +extern GLboolean mach64CreateContext( gl_api api, + const __GLcontextModes *glVisual, __DRIcontext *driContextPriv, void *sharedContextPrivate ); diff --git a/src/mesa/drivers/dri/mga/mga_xmesa.c b/src/mesa/drivers/dri/mga/mga_xmesa.c index 687412bca55..31007ccb1da 100644 --- a/src/mesa/drivers/dri/mga/mga_xmesa.c +++ b/src/mesa/drivers/dri/mga/mga_xmesa.c @@ -423,7 +423,8 @@ static const struct dri_debug_control debug_control[] = static GLboolean -mgaCreateContext( const __GLcontextModes *mesaVis, +mgaCreateContext( gl_api api, + const __GLcontextModes *mesaVis, __DRIcontext *driContextPriv, void *sharedContextPrivate ) { diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.c b/src/mesa/drivers/dri/nouveau/nouveau_context.c index 42bec659d73..f481161d468 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_context.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_context.c @@ -75,7 +75,8 @@ nouveau_channel_flush_notify(struct nouveau_channel *chan) } GLboolean -nouveau_context_create(const __GLcontextModes *visual, __DRIcontext *dri_ctx, +nouveau_context_create(gl_api api, + const __GLcontextModes *visual, __DRIcontext *dri_ctx, void *share_ctx) { __DRIscreen *dri_screen = dri_ctx->driScreenPriv; diff --git a/src/mesa/drivers/dri/r128/r128_context.c b/src/mesa/drivers/dri/r128/r128_context.c index 67e92405057..78607083830 100644 --- a/src/mesa/drivers/dri/r128/r128_context.c +++ b/src/mesa/drivers/dri/r128/r128_context.c @@ -99,7 +99,8 @@ static const struct dri_debug_control debug_control[] = /* Create the device specific context. */ -GLboolean r128CreateContext( const __GLcontextModes *glVisual, +GLboolean r128CreateContext( gl_api api, + const __GLcontextModes *glVisual, __DRIcontext *driContextPriv, void *sharedContextPrivate ) { diff --git a/src/mesa/drivers/dri/r128/r128_context.h b/src/mesa/drivers/dri/r128/r128_context.h index 65f845c1159..65ddb3bd23b 100644 --- a/src/mesa/drivers/dri/r128/r128_context.h +++ b/src/mesa/drivers/dri/r128/r128_context.h @@ -224,7 +224,8 @@ struct r128_context { (rmesa->r128Screen->chipset == R128_CARD_TYPE_R128_MOBILITY) -extern GLboolean r128CreateContext( const __GLcontextModes *glVisual, +extern GLboolean r128CreateContext( gl_api api, + const __GLcontextModes *glVisual, __DRIcontext *driContextPriv, void *sharedContextPrivate ); diff --git a/src/mesa/drivers/dri/r200/r200_context.c b/src/mesa/drivers/dri/r200/r200_context.c index 36a29350ccc..5896296021f 100644 --- a/src/mesa/drivers/dri/r200/r200_context.c +++ b/src/mesa/drivers/dri/r200/r200_context.c @@ -271,7 +271,8 @@ static void r200_init_vtbl(radeonContextPtr radeon) /* Create the device specific rendering context. */ -GLboolean r200CreateContext( const __GLcontextModes *glVisual, +GLboolean r200CreateContext( gl_api api, + const __GLcontextModes *glVisual, __DRIcontext *driContextPriv, void *sharedContextPrivate) { diff --git a/src/mesa/drivers/dri/r200/r200_context.h b/src/mesa/drivers/dri/r200/r200_context.h index a9dce310ae1..305958f5d76 100644 --- a/src/mesa/drivers/dri/r200/r200_context.h +++ b/src/mesa/drivers/dri/r200/r200_context.h @@ -637,7 +637,8 @@ struct r200_context { extern void r200DestroyContext( __DRIcontext *driContextPriv ); -extern GLboolean r200CreateContext( const __GLcontextModes *glVisual, +extern GLboolean r200CreateContext( gl_api api, + const __GLcontextModes *glVisual, __DRIcontext *driContextPriv, void *sharedContextPrivate); extern GLboolean r200MakeCurrent( __DRIcontext *driContextPriv, diff --git a/src/mesa/drivers/dri/r300/r300_context.c b/src/mesa/drivers/dri/r300/r300_context.c index 4dce454c3a7..6992ca59dbf 100644 --- a/src/mesa/drivers/dri/r300/r300_context.c +++ b/src/mesa/drivers/dri/r300/r300_context.c @@ -478,7 +478,8 @@ static void r300InitIoctlFuncs(struct dd_function_table *functions) /* Create the device specific rendering context. */ -GLboolean r300CreateContext(const __GLcontextModes * glVisual, +GLboolean r300CreateContext(gl_api api, + const __GLcontextModes * glVisual, __DRIcontext * driContextPriv, void *sharedContextPrivate) { diff --git a/src/mesa/drivers/dri/r300/r300_context.h b/src/mesa/drivers/dri/r300/r300_context.h index df7115e7dae..fbb609b9f61 100644 --- a/src/mesa/drivers/dri/r300/r300_context.h +++ b/src/mesa/drivers/dri/r300/r300_context.h @@ -543,7 +543,8 @@ struct r300_context { #define R300_CONTEXT(ctx) ((r300ContextPtr)(ctx->DriverCtx)) extern void r300DestroyContext(__DRIcontext * driContextPriv); -extern GLboolean r300CreateContext(const __GLcontextModes * glVisual, +extern GLboolean r300CreateContext(gl_api api, + const __GLcontextModes * glVisual, __DRIcontext * driContextPriv, void *sharedContextPrivate); diff --git a/src/mesa/drivers/dri/r600/r600_context.c b/src/mesa/drivers/dri/r600/r600_context.c index fddac2f9bdc..9f8923f09dc 100644 --- a/src/mesa/drivers/dri/r600/r600_context.c +++ b/src/mesa/drivers/dri/r600/r600_context.c @@ -353,7 +353,8 @@ static void r600InitGLExtensions(GLcontext *ctx) /* Create the device specific rendering context. */ -GLboolean r600CreateContext(const __GLcontextModes * glVisual, +GLboolean r600CreateContext(gl_api api, + const __GLcontextModes * glVisual, __DRIcontext * driContextPriv, void *sharedContextPrivate) { diff --git a/src/mesa/drivers/dri/r600/r600_context.h b/src/mesa/drivers/dri/r600/r600_context.h index 72c8c869b70..063dd7c49a1 100644 --- a/src/mesa/drivers/dri/r600/r600_context.h +++ b/src/mesa/drivers/dri/r600/r600_context.h @@ -155,7 +155,8 @@ struct r600_context { #define R700_CONTEXT(ctx) ((context_t *)(ctx->DriverCtx)) #define GL_CONTEXT(context) ((GLcontext *)(context->radeon.glCtx)) -extern GLboolean r600CreateContext(const __GLcontextModes * glVisual, +extern GLboolean r600CreateContext(gl_api api, + const __GLcontextModes * glVisual, __DRIcontext * driContextPriv, void *sharedContextPrivate); diff --git a/src/mesa/drivers/dri/radeon/radeon_context.c b/src/mesa/drivers/dri/radeon/radeon_context.c index 56aba16e9e0..ee65d7ff3d0 100644 --- a/src/mesa/drivers/dri/radeon/radeon_context.c +++ b/src/mesa/drivers/dri/radeon/radeon_context.c @@ -206,9 +206,10 @@ static void r100_init_vtbl(radeonContextPtr radeon) /* Create the device specific context. */ GLboolean -r100CreateContext( const __GLcontextModes *glVisual, - __DRIcontext *driContextPriv, - void *sharedContextPrivate) +r100CreateContext( gl_api api, + const __GLcontextModes *glVisual, + __DRIcontext *driContextPriv, + void *sharedContextPrivate) { __DRIscreen *sPriv = driContextPriv->driScreenPriv; radeonScreenPtr screen = (radeonScreenPtr)(sPriv->private); diff --git a/src/mesa/drivers/dri/radeon/radeon_context.h b/src/mesa/drivers/dri/radeon/radeon_context.h index d84760bf74f..c4bfbfdaeb3 100644 --- a/src/mesa/drivers/dri/radeon/radeon_context.h +++ b/src/mesa/drivers/dri/radeon/radeon_context.h @@ -450,7 +450,8 @@ struct r100_context { #define RADEON_OLD_PACKETS 1 -extern GLboolean r100CreateContext( const __GLcontextModes *glVisual, +extern GLboolean r100CreateContext( gl_api api, + const __GLcontextModes *glVisual, __DRIcontext *driContextPriv, void *sharedContextPrivate); diff --git a/src/mesa/drivers/dri/savage/savage_xmesa.c b/src/mesa/drivers/dri/savage/savage_xmesa.c index c3a53ea5e25..cbdc9c87eeb 100644 --- a/src/mesa/drivers/dri/savage/savage_xmesa.c +++ b/src/mesa/drivers/dri/savage/savage_xmesa.c @@ -288,7 +288,8 @@ savageDestroyScreen(__DRIscreen *sPriv) } static GLboolean -savageCreateContext( const __GLcontextModes *mesaVis, +savageCreateContext( gl_api api, + const __GLcontextModes *mesaVis, __DRIcontext *driContextPriv, void *sharedContextPrivate ) { diff --git a/src/mesa/drivers/dri/sis/sis_context.c b/src/mesa/drivers/dri/sis/sis_context.c index 400681a04ab..85f26a08b7f 100644 --- a/src/mesa/drivers/dri/sis/sis_context.c +++ b/src/mesa/drivers/dri/sis/sis_context.c @@ -158,7 +158,8 @@ void sisReAllocateBuffers(GLcontext *ctx, GLframebuffer *drawbuffer, } GLboolean -sisCreateContext( const __GLcontextModes *glVisual, +sisCreateContext( gl_api api, + const __GLcontextModes *glVisual, __DRIcontext *driContextPriv, void *sharedContextPrivate ) { diff --git a/src/mesa/drivers/dri/sis/sis_context.h b/src/mesa/drivers/dri/sis/sis_context.h index 4179ee081a7..132cee33ee3 100644 --- a/src/mesa/drivers/dri/sis/sis_context.h +++ b/src/mesa/drivers/dri/sis/sis_context.h @@ -438,7 +438,8 @@ enum _sis_verbose { VERBOSE_SIS_MEMORY = 0x2 }; -extern GLboolean sisCreateContext( const __GLcontextModes *glVisual, +extern GLboolean sisCreateContext( gl_api api, + const __GLcontextModes *glVisual, __DRIcontext *driContextPriv, void *sharedContextPrivate ); extern void sisDestroyContext( __DRIcontext * ); diff --git a/src/mesa/drivers/dri/tdfx/tdfx_context.c b/src/mesa/drivers/dri/tdfx/tdfx_context.c index edb1875f767..c30fcf3a6f7 100644 --- a/src/mesa/drivers/dri/tdfx/tdfx_context.c +++ b/src/mesa/drivers/dri/tdfx/tdfx_context.c @@ -164,7 +164,8 @@ static const struct dri_debug_control debug_control[] = { NULL, 0 } }; -GLboolean tdfxCreateContext( const __GLcontextModes *mesaVis, +GLboolean tdfxCreateContext( gl_api api, + const __GLcontextModes *mesaVis, __DRIcontext *driContextPriv, void *sharedContextPrivate ) { diff --git a/src/mesa/drivers/dri/tdfx/tdfx_context.h b/src/mesa/drivers/dri/tdfx/tdfx_context.h index 6e25cac3015..29b0876f9f9 100644 --- a/src/mesa/drivers/dri/tdfx/tdfx_context.h +++ b/src/mesa/drivers/dri/tdfx/tdfx_context.h @@ -937,7 +937,8 @@ struct tdfx_context { extern GLboolean -tdfxCreateContext( const __GLcontextModes *mesaVis, +tdfxCreateContext( gl_api api, + const __GLcontextModes *mesaVis, __DRIcontext *driContextPriv, void *sharedContextPrivate ); diff --git a/src/mesa/drivers/dri/unichrome/via_context.c b/src/mesa/drivers/dri/unichrome/via_context.c index 9da96bdd45a..4298c948551 100644 --- a/src/mesa/drivers/dri/unichrome/via_context.c +++ b/src/mesa/drivers/dri/unichrome/via_context.c @@ -456,7 +456,8 @@ FreeBuffer(struct via_context *vmesa) GLboolean -viaCreateContext(const __GLcontextModes *visual, +viaCreateContext(gl_api api, + const __GLcontextModes *visual, __DRIcontext *driContextPriv, void *sharedContextPrivate) { diff --git a/src/mesa/drivers/dri/unichrome/via_screen.h b/src/mesa/drivers/dri/unichrome/via_screen.h index aa662e01c04..51df0ce4eb4 100644 --- a/src/mesa/drivers/dri/unichrome/via_screen.h +++ b/src/mesa/drivers/dri/unichrome/via_screen.h @@ -76,7 +76,8 @@ typedef struct { extern GLboolean -viaCreateContext(const __GLcontextModes *mesaVis, +viaCreateContext(gl_api api, + const __GLcontextModes *mesaVis, __DRIcontext *driContextPriv, void *sharedContextPrivate); -- 2.30.2