From cf8a1caa231b748d3ba7c776ab076ad3de99e963 Mon Sep 17 00:00:00 2001
From: George Sapountzis <gsapountzis@gmail.com>
Date: Sun, 14 Mar 2010 11:36:45 +0200
Subject: dri/swrast: port to dri_sw (context)

---
 src/mesa/drivers/dri/common/dri_sw.c          |  2 +-
 src/mesa/drivers/dri/common/dri_sw.h          |  2 +-
 src/mesa/drivers/dri/swrast/swrast.c          | 41 ++++++++++++++++++++-------
 src/mesa/drivers/dri/swrast/swrast_priv.h     | 27 ++++++++++++++----
 src/mesa/drivers/dri/swrast/swrast_spantemp.h |  8 +++---
 5 files changed, 58 insertions(+), 22 deletions(-)

(limited to 'src/mesa')

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;
-- 
cgit v1.2.3