dri/swrast: port to dri_sw (context)
authorGeorge Sapountzis <gsapountzis@gmail.com>
Sun, 14 Mar 2010 09:36:45 +0000 (11:36 +0200)
committerGeorge Sapountzis <gsapountzis@gmail.com>
Sun, 14 Mar 2010 23:17:17 +0000 (01:17 +0200)
src/mesa/drivers/dri/common/dri_sw.c
src/mesa/drivers/dri/common/dri_sw.h
src/mesa/drivers/dri/swrast/swrast.c
src/mesa/drivers/dri/swrast/swrast_priv.h
src/mesa/drivers/dri/swrast/swrast_spantemp.h

index 4b87a7f32f2c1be86399325ed545b2b768d4aace..b7f9036f473c3679422a0f7af27ac8f930e65073 100644 (file)
@@ -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)
index b7257b14a22409e0a863f8858a4a77c99732a609..93e9624654876cdb486775b9480e6d9d57d27599 100644 (file)
@@ -54,7 +54,7 @@ struct __DRIscreenRec {
 
 struct __DRIcontextRec {
 
-    GLcontext Base;
+    void *driverPrivate;
 
     void *loaderPrivate;
 
index 8c858ab2da29835adfb91210b302fff6b722864f..8273439fef3e4318e9286a47136dbcd6a350b65b 100644 (file)
@@ -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;
 
index c83c64b4873b920fffc7c9ca787fe78c7c436d66..130598bbd81c12165767ea1bb7880143ef46c567 100644 (file)
 /**
  * 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)
 {
index 879a0c12e760f5102b15da2ea4f388477e9c8524..c73b785683ef1ddee5873b1782e5be82f4e856f4 100644 (file)
@@ -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;