summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/common/dri_sw.c2
-rw-r--r--src/mesa/drivers/dri/common/dri_sw.h2
-rw-r--r--src/mesa/drivers/dri/swrast/swrast.c41
-rw-r--r--src/mesa/drivers/dri/swrast/swrast_priv.h27
-rw-r--r--src/mesa/drivers/dri/swrast/swrast_spantemp.h8
5 files changed, 58 insertions, 22 deletions
diff --git a/src/mesa/drivers/dri/common/dri_sw.c b/src/mesa/drivers/dri/common/dri_sw.c
index 4b87a7f32f..b7f9036f47 100644
--- a/src/mesa/drivers/dri/common/dri_sw.c
+++ b/src/mesa/drivers/dri/common/dri_sw.c
@@ -99,7 +99,7 @@ driCreateNewContext(__DRIscreen *psp, const __DRIconfig *config,
__DRIcontext *shared, void *data)
{
__DRIcontext *pcp;
- void * const shareCtx = (shared != NULL) ? &shared->Base : NULL;
+ void * const shareCtx = (shared != NULL) ? shared->driverPrivate : NULL;
pcp = CALLOC_STRUCT(__DRIcontextRec);
if (!pcp)
diff --git a/src/mesa/drivers/dri/common/dri_sw.h b/src/mesa/drivers/dri/common/dri_sw.h
index b7257b14a2..93e9624654 100644
--- a/src/mesa/drivers/dri/common/dri_sw.h
+++ b/src/mesa/drivers/dri/common/dri_sw.h
@@ -54,7 +54,7 @@ struct __DRIscreenRec {
struct __DRIcontextRec {
- GLcontext Base;
+ void *driverPrivate;
void *loaderPrivate;
diff --git a/src/mesa/drivers/dri/swrast/swrast.c b/src/mesa/drivers/dri/swrast/swrast.c
index 8c858ab2da..8273439fef 100644
--- a/src/mesa/drivers/dri/swrast/swrast.c
+++ b/src/mesa/drivers/dri/swrast/swrast.c
@@ -474,25 +474,36 @@ static GLboolean
dri_create_context(const __GLcontextModes * visual,
__DRIcontext * cPriv, void *sharedContextPrivate)
{
- GLcontext *mesaCtx;
- GLcontext *sharedCtx;
+ struct dri_context *ctx = NULL;
+ struct dri_context *share = (struct dri_context *)sharedContextPrivate;
+ GLcontext *mesaCtx = NULL;
+ GLcontext *sharedCtx = NULL;
struct dd_function_table functions;
TRACE;
+ ctx = CALLOC_STRUCT(dri_context);
+ if (ctx == NULL)
+ goto context_fail;
+
+ cPriv->driverPrivate = ctx;
+ ctx->cPriv = cPriv;
+
/* build table of device driver functions */
_mesa_init_driver_functions(&functions);
swrast_init_driver_functions(&functions);
- sharedCtx = sharedContextPrivate;
+ if (share) {
+ sharedCtx = &share->Base;
+ }
+
+ mesaCtx = &ctx->Base;
/* basic context setup */
- if (!_mesa_initialize_context(&cPriv->Base, visual, sharedCtx, &functions, (void *) cPriv)) {
- return GL_FALSE;
+ if (!_mesa_initialize_context(mesaCtx, visual, sharedCtx, &functions, (void *) cPriv)) {
+ goto context_fail;
}
- mesaCtx = &cPriv->Base;
-
/* do bounds checking to prevent segfaults and server crashes! */
mesaCtx->Const.CheckArrayBounds = GL_TRUE;
@@ -521,16 +532,24 @@ dri_create_context(const __GLcontextModes * visual,
driInitExtensions( mesaCtx, NULL, GL_FALSE );
return GL_TRUE;
+
+context_fail:
+
+ FREE(ctx);
+
+ return GL_FALSE;
}
static void
dri_destroy_context(__DRIcontext * cPriv)
{
- GLcontext *mesaCtx;
TRACE;
if (cPriv) {
- mesaCtx = &cPriv->Base;
+ struct dri_context *ctx = dri_context(cPriv);
+ GLcontext *mesaCtx;
+
+ mesaCtx = &ctx->Base;
_mesa_meta_free(mesaCtx);
_swsetup_DestroyContext( mesaCtx );
@@ -552,10 +571,12 @@ dri_make_current(__DRIcontext * cPriv,
TRACE;
if (cPriv) {
+ struct dri_context *ctx = dri_context(cPriv);
+
if (!driDrawPriv || !driReadPriv)
return GL_FALSE;
- mesaCtx = &cPriv->Base;
+ mesaCtx = &ctx->Base;
mesaDraw = &driDrawPriv->Base;
mesaRead = &driReadPriv->Base;
diff --git a/src/mesa/drivers/dri/swrast/swrast_priv.h b/src/mesa/drivers/dri/swrast/swrast_priv.h
index c83c64b487..130598bbd8 100644
--- a/src/mesa/drivers/dri/swrast/swrast_priv.h
+++ b/src/mesa/drivers/dri/swrast/swrast_priv.h
@@ -59,6 +59,27 @@
/**
* Data types
*/
+struct dri_context
+{
+ /* mesa */
+ GLcontext Base;
+
+ /* dri */
+ __DRIcontext *cPriv;
+};
+
+static INLINE struct dri_context *
+dri_context(__DRIcontext * driContextPriv)
+{
+ return (struct dri_context *)driContextPriv->driverPrivate;
+}
+
+static INLINE struct dri_context *
+swrast_context(GLcontext *ctx)
+{
+ return (struct dri_context *) ctx;
+}
+
struct swrast_renderbuffer {
struct gl_renderbuffer Base;
@@ -68,12 +89,6 @@ struct swrast_renderbuffer {
GLuint bpp;
};
-static INLINE __DRIcontext *
-swrast_context(GLcontext *ctx)
-{
- return (__DRIcontext *) ctx;
-}
-
static INLINE __DRIdrawable *
swrast_drawable(GLframebuffer *fb)
{
diff --git a/src/mesa/drivers/dri/swrast/swrast_spantemp.h b/src/mesa/drivers/dri/swrast/swrast_spantemp.h
index 879a0c12e7..c73b785683 100644
--- a/src/mesa/drivers/dri/swrast/swrast_spantemp.h
+++ b/src/mesa/drivers/dri/swrast/swrast_spantemp.h
@@ -39,7 +39,7 @@
static INLINE void
PUT_PIXEL( GLcontext *glCtx, GLint x, GLint y, GLubyte *p )
{
- __DRIcontext *ctx = swrast_context(glCtx);
+ __DRIcontext *ctx = swrast_context(glCtx)->cPriv;
__DRIdrawable *draw = swrast_drawable(glCtx->DrawBuffer);
__DRIscreen *screen = ctx->driScreenPriv;
@@ -53,7 +53,7 @@ PUT_PIXEL( GLcontext *glCtx, GLint x, GLint y, GLubyte *p )
static INLINE void
GET_PIXEL( GLcontext *glCtx, GLint x, GLint y, GLubyte *p )
{
- __DRIcontext *ctx = swrast_context(glCtx);
+ __DRIcontext *ctx = swrast_context(glCtx)->cPriv;
__DRIdrawable *read = swrast_drawable(glCtx->ReadBuffer);
__DRIscreen *screen = ctx->driScreenPriv;
@@ -65,7 +65,7 @@ GET_PIXEL( GLcontext *glCtx, GLint x, GLint y, GLubyte *p )
static INLINE void
PUT_ROW( GLcontext *glCtx, GLint x, GLint y, GLuint n, char *row )
{
- __DRIcontext *ctx = swrast_context(glCtx);
+ __DRIcontext *ctx = swrast_context(glCtx)->cPriv;
__DRIdrawable *draw = swrast_drawable(glCtx->DrawBuffer);
__DRIscreen *screen = ctx->driScreenPriv;
@@ -78,7 +78,7 @@ PUT_ROW( GLcontext *glCtx, GLint x, GLint y, GLuint n, char *row )
static INLINE void
GET_ROW( GLcontext *glCtx, GLint x, GLint y, GLuint n, char *row )
{
- __DRIcontext *ctx = swrast_context(glCtx);
+ __DRIcontext *ctx = swrast_context(glCtx)->cPriv;
__DRIdrawable *read = swrast_drawable(glCtx->ReadBuffer);
__DRIscreen *screen = ctx->driScreenPriv;