GGI driver updates (Filip Spacek)
authorBrian Paul <brian.paul@tungstengraphics.com>
Mon, 10 Jun 2002 15:16:44 +0000 (15:16 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Mon, 10 Jun 2002 15:16:44 +0000 (15:16 +0000)
include/GL/ggimesa.h
progs/ggi/gears2.c
src/glut/ggi/ggiglut.c
src/mesa/drivers/ggi/default/linear.c
src/mesa/drivers/ggi/default/stubs.c
src/mesa/drivers/ggi/ggimesa.c
src/mesa/drivers/ggi/include/ggi/mesa/ggimesa.h
src/mesa/drivers/ggi/include/ggi/mesa/ggimesa_int.h

index f88ecffc5e2d2794b264b195bc448e8e373de3bd..1e8eb52b6a955c560b2ea19279ceae7289e7bdd4 100644 (file)
@@ -1,10 +1,11 @@
-/* $Id: ggimesa.h,v 1.3 2000/02/09 19:03:28 brianp Exp $ */
+/* $Id: ggimesa.h,v 1.4 2002/06/10 15:16:44 brianp Exp $ */
 
 /*
- * Mesa 3-D graphics library
- * Version:  3.3
+ * Mesa 3-D graphics library GGI bindings (GGIGL [giggle])
+ * Version:  4.0
  * Copyright (C) 1995-2000  Brian Paul
  * Copyright (C) 1998  Uwe Maurer
+ * Copyrigth (C) 2001 Filip Spacek
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
 #ifndef GGIMESA_H
 #define GGIMESA_H
 
-
-#define GGIMESA_MAJOR_VERSION 3
-#define GGIMESA_MINOR_VERSION 3
-
+#define GGIMESA_MAJOR_VERSION 4
+#define GGIMESA_MINOR_VERSION 0
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+#include <ggi/ggi.h>
 #include "GL/gl.h"
+  
+typedef struct ggi_mesa_context *ggi_mesa_context_t;
 
+/*
+ * Initialize Mesa GGI extension
+ */
+int ggiMesaInit(void);
+/*
+ * Clean up Mesa GGI exension
+ */
+int ggiMesaExit(void);
 
-typedef struct ggi_mesa_context *GGIMesaContext;
-
-#include <ggi/ggi.h>
-
-extern GGIMesaContext GGIMesaCreateContext(void);
+/*
+ * Attach Mesa GGI extension to the visual 'vis'
+ */
+int ggiMesaAttach(ggi_visual_t vis);
+/*
+ * Detach Mesa GGI extension from the visual 'vis'
+ */
+int ggiMesaDetach(ggi_visual_t vis);
 
-extern void GGIMesaDestroyContext(GGIMesaContext ctx);
+int ggiMesaExtendVisual(ggi_visual_t vis, GLboolean alpha_flag,
+                       GLboolean stereo_flag, GLint depth_size,
+                       GLint stencil_size, GLint accum_red_size,
+                       GLint accum_green_size, GLint accum_blue_size,
+                       GLint accum_alpha_size, GLint num_samples);
 
-extern void GGIMesaMakeCurrent(GGIMesaContext ctx);
+/*
+ * Create a new context capable of displaying on the visual vis.
+ */
+ggi_mesa_context_t ggiMesaCreateContext(ggi_visual_t vis);
+/*
+ * Destroy the context 'ctx'
+ */
+void ggiMesaDestroyContext(ggi_mesa_context_t ctx);
 
-extern GGIMesaContext GGIMesaGetCurrentContext(void);
+/*
+ * Make context 'ctx' the current context and bind it to visual 'vis'.
+ * Note that the context must have been created with respect to that visual.
+ */
+void ggiMesaMakeCurrent(ggi_mesa_context_t ctx, ggi_visual_t vis);
 
-extern void GGIMesaSwapBuffers(void);
+void ggiMesaSwapBuffers(void);
 
-extern int GGIMesaSetVisual(GGIMesaContext ctx, ggi_visual_t vis,
-                           GLboolean rgb_flag, GLboolean db_flag);
 
 #ifdef __cplusplus
 }
index 1d1e10db545d4d6ec5704484d494aa45359501e8..9468c03177781174b541ba6f284d259dc72af360 100644 (file)
@@ -19,6 +19,7 @@
 
 ggi_visual_t vis;
 char text[100];
+int db_flag,vis_x, vis_y, vir_x, vir_y, gt;
 
 /*
  * Draw a gear wheel.  You'll probably want to call this function when
@@ -157,6 +158,7 @@ static GLuint count = 1;
 
 static void draw( void )
 {
+   static int n = 0;
    glClearColor(0,0,0,0);
    glClearIndex(0);
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
@@ -197,12 +199,25 @@ static void draw( void )
    ggiPuts(vis,0,ggiGetInfo(vis)->mode->visible.y+16,text);
 #endif
 
-   GGIMesaSwapBuffers();
+    if(db_flag)
+   ggiMesaSwapBuffers();
                        
    count++;
    if (count==limit) {
       exit(1);
    }
+    ++n;
+    /*
+   if (!(n%10)){
+       ggi_color rgb = { 10000, 10000, 10000 };
+       ggiSetSimpleMode(vis,vis_x+(n/10),vis_y+(n/10),db_flag?2:1, gt); 
+       glViewport(0, 0,vis_x+(n/10),vis_y+(n/10));
+       ggiSetGCForeground(vis, ggiMapColor(vis, &rgb));
+       ggiDrawBox(vis, 20, 20, 100, 100);
+       if(db_flag)
+         ggiSetWriteFrame(vis, 1);
+    }
+    */
 }
 
 static void idle( void )
@@ -216,6 +231,10 @@ static void reshape( int width, int height )
 {
    GLfloat  h = (GLfloat) height / (GLfloat) width;
 
+    if(db_flag)
+       glDrawBuffer(GL_BACK);
+    else
+       glDrawBuffer(GL_FRONT);
    glViewport(0, 0, (GLint)width, (GLint)height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
@@ -231,8 +250,8 @@ static void reshape( int width, int height )
 static void init( void )
 {
    static GLfloat pos[4] = {5.0, 5.0, 10.0, 0.0 };
-   static GLfloat red[4] = {0.8, 0.1, 0.0, 1.0 };
-   static GLfloat green[4] = {0.0, 0.8, 0.2, 1.0 };
+   static GLfloat red[4] = {0.9, 0.9, 0.9, 1.0 };
+   static GLfloat green[4] = {0.0, 0.8, 0.9, 1.0 };
    static GLfloat blue[4] = {0.2, 0.2, 1.0, 1.0 };
 
    glLightfv( GL_LIGHT0, GL_POSITION, pos );
@@ -276,9 +295,9 @@ static void usage(char *s)
 
 int main( int argc, char *argv[] )
 {
-       GGIMesaContext ctx;
-       int vis_x,vis_y,vir_x,vir_y,bpp,db_flag,gt;
+       ggi_mesa_context_t ctx;
        ggi_mode mode;
+       int bpp;
 
        limit=0;
 
@@ -313,13 +332,12 @@ int main( int argc, char *argv[] )
                exit(1);
        }
  
-       ctx=GGIMesaCreateContext(); 
-       if (ctx==NULL)
+       if (ggiMesaInit() < 0)
        {
-               printf("GGIMesaCreateContext() failed\n");
+               printf("ggiMesaInit failed\n");
                exit(1);
        }
-
+       
        vis=ggiOpen(NULL);
        if (vis==NULL)
        {
@@ -327,29 +345,42 @@ int main( int argc, char *argv[] )
                exit(1);
        }
 
-       if (ggiSetGraphMode(vis,vis_x,vis_y,vir_x,vir_y,gt)<0) 
+       if (ggiSetSimpleMode(vis,vis_x,vis_y,db_flag ? 2 : 1,gt)<0) 
        {
                printf("%s: can't set graphmode (%i %i %i %i)  %i BPP\n",
                        argv[0],vis_x,vis_y,vir_x,vir_y,bpp);
                exit(1);
        }
 
-       if (GGIMesaSetVisual(ctx,vis,GL_TRUE,db_flag)<0)
+       if (ggiMesaAttach(vis) < 0)
+       {
+               printf("ggiMesaAttach failed\n");
+               exit(1);
+       }
+       if (ggiMesaExtendVisual(vis, GL_FALSE, GL_FALSE, 16,
+                               0, 0, 0, 0, 0, 1)  < 0)
        {
                printf ("GGIMesaSetVisual() failed\n");
                exit(1);
        }
 
-       GGIMesaMakeCurrent(ctx);
+       ctx = ggiMesaCreateContext(vis); 
+       if (ctx==NULL)
+       {
+               printf("GGIMesaCreateContext() failed\n");
+               exit(1);
+       }
+
+       ggiMesaMakeCurrent(ctx, vis);
        ggiGetMode(vis,&mode);
 
        reshape(mode.visible.x,mode.visible.y);
 
        init();
  
-       while (!ggiKbhit(vis)) idle();
+       while (!ggiKbhit(vis)) { /*sleep(1);*/ idle(); }
 
-       GGIMesaDestroyContext(ctx);
+       ggiMesaDestroyContext(ctx);
        ggiClose(vis);
 
        printf("%s\n",text);
index d66a9d706b8f60933a1b2e8d701145f96205e8c1..140f576002aebcf9dd9cac0532154cb4f5bcd4e9 100644 (file)
@@ -238,11 +238,6 @@ int glutCreateWindow(const char *title)
        
        gt = (rgb) ? __glut_gt_rgb : __glut_gt_index;
        
-       __glut_ctx = GGIMesaCreateContext();
-       
-       if (__glut_ctx == NULL) 
-         ggiPanic("Can't create mesa-context\n");
-
        __glut_vis = ggiOpen(NULL);
        if (__glut_vis == NULL) 
        {
@@ -261,20 +256,27 @@ int glutCreateWindow(const char *title)
          /* return GL_FALSE; */
        }
        
-       ggiGetMode(__glut_vis, &mode);
-
-       if (GGIMesaSetVisual(__glut_ctx, __glut_vis, rgb, frames > 1) < 0) 
+       if (ggiMesaExtendVisual(__glut_vis, GL_FALSE, GL_FALSE, 
+                               16, 0, 0, 0, 0, 0, 1) < 0) 
        {
                ggiPanic("GGIMesaSetVisual failed!\n");
        }
        
+       __glut_ctx = ggiMesaCreateContext(__glut_vis);
+       
+       if (__glut_ctx == NULL) 
+         ggiPanic("Can't create mesa-context\n");
+
+       ggiGetMode(__glut_vis, &mode);
+
+       
        __glut_width = mode.visible.x;
        __glut_height = mode.visible.y;
        
        mousex = mode.visible.x / 2;
        mousey = mode.visible.y / 2;
        
-       GGIMesaMakeCurrent(__glut_ctx);
+       ggiMesaMakeCurrent(__glut_ctx, __glut_vis);
        
        if (__glut_reshape) 
          __glut_reshape(__glut_width, __glut_height);
index e105cd0e592b67f2ca72dc52bdb3934a6134359c..4c74497e009892ff6cb263a425ca55b1fc85f393 100644 (file)
@@ -24,6 +24,8 @@
 
 #include <ggi/mesa/ggimesa.h>
 #include <ggi/mesa/ggimesa_int.h>
+#include <ggi/mesa/debug.h>
+#include "swrast/swrast.h"
 
 #define RMASK ((1<<R)-1)
 #define GMASK ((1<<G)-1)
 #define GS (8-G)
 #define BS (8-B)
 
+#define PACK(color) (((color[RCOMP]>>RS) << (G+B)) |  \
+                     ((color[GCOMP]>>GS) << B)     |  \
+                     ((color[BCOMP]>>BS)))
+
+#define FLIP(coord) (LIBGGI_MODE(ggi_ctx->ggi_visual)->visible.y-(coord) - 1)
+
 
 /**********************************************************************/
 /*****            Write spans of pixels                           *****/
 /**********************************************************************/
 
-void GGIwrite_ci32_span(const GLcontext *ctx,
-                         GLuint n, GLint x, GLint y,
-                         const GLuint ci[],
-                         const GLubyte mask[])
+void GGIwrite_ci32_span(const GLcontext *ctx, GLuint n, GLint x, GLint y,
+                       const GLuint ci[], const GLubyte mask[])
 {
-       FB_TYPE *fb=LFB(FB_TYPE,x,FLIP(y));
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+       FB_TYPE *fb;
+       fb = (FB_TYPE *)(LIBGGI_CURWRITE(ggi_ctx->ggi_visual) +
+                        FLIP(y)*LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual)) + x;
+
        if (mask)
        {
                while (n--) {
-                       if (*mask++) *fb=*ci;
+                       if (*mask++)
+                               *fb = *ci;
                        fb++;
                        ci++;
                }
@@ -58,17 +69,19 @@ void GGIwrite_ci32_span(const GLcontext *ctx,
        }
 }
 
-void GGIwrite_ci8_span(const GLcontext *ctx,
-                         GLuint n, GLint x, GLint y,
-                         const GLubyte ci[],
-                         const GLubyte mask[] )
+void GGIwrite_ci8_span(const GLcontext *ctx, GLuint n, GLint x, GLint y,
+                      const GLubyte ci[], const GLubyte mask[])
 {
-       FB_TYPE *fb=LFB(FB_TYPE,x,FLIP(y));
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+       FB_TYPE *fb;
+       fb = (FB_TYPE *)(LIBGGI_CURWRITE(ggi_ctx->ggi_visual) +
+                        FLIP(y)*LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual)) + x;
 
        if (mask)
        {
                while (n--) {
-                       if (*mask++) *fb=*ci;
+                       if (*mask++)
+                               *fb = *ci;
                        fb++;
                        ci++;
                }       
@@ -80,21 +93,19 @@ void GGIwrite_ci8_span(const GLcontext *ctx,
 }
 
 
-void GGIwrite_rgba_span(const GLcontext *ctx,
-                          GLuint n, GLint x, GLint y,
-                          const GLubyte rgba[][4],
-                          const GLubyte mask[])
+void GGIwrite_rgba_span(const GLcontext *ctx, GLuint n, GLint x, GLint y,
+                        const GLchan rgba[][4], const GLubyte mask[])
 {
-       FB_TYPE *fb=LFB(FB_TYPE,x,FLIP(y));
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+       FB_TYPE *fb;
+       fb = (FB_TYPE *)(LIBGGI_CURWRITE(ggi_ctx->ggi_visual) +
+                        FLIP(y)*LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual)) + x;
 
        if (mask)
        {
                while (n--) {
-                       if (*mask++) {
-                               *fb=    ((rgba[0][RCOMP]>>RS) << (G+B)) | 
-                                       ((rgba[0][GCOMP]>>GS) << B) |
-                                       ((rgba[0][BCOMP]>>BS));
-                       }
+                       if (*mask++)
+                               *fb = PACK(rgba[0]);
                        fb++;
                        rgba++;
                }
@@ -102,28 +113,25 @@ void GGIwrite_rgba_span(const GLcontext *ctx,
        else
        {
                while (n--) {
-                       *fb++=  ((rgba[0][RCOMP]>>RS) << (G+B)) | 
-                               ((rgba[0][GCOMP]>>GS) << B)|
-                               ((rgba[0][BCOMP]>>BS));
+                       *fb++ = PACK(rgba[0]);
                        rgba++;
                }
        }
 }
 
-void GGIwrite_rgb_span( const GLcontext *ctx,
-                          GLuint n, GLint x, GLint y,
-                          const GLubyte rgba[][3],
-                          const GLubyte mask[] )
+void GGIwrite_rgb_span(const GLcontext *ctx, GLuint n, GLint x, GLint y,
+                      const GLchan rgba[][3], const GLubyte mask[])
 {
-       FB_TYPE *fb=LFB(FB_TYPE,x,FLIP(y));
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+       FB_TYPE *fb;
+       fb = (FB_TYPE *)(LIBGGI_CURWRITE(ggi_ctx->ggi_visual) +
+                        FLIP(y)*LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual)) + x;
+
        if (mask)
        {
                while (n--) {
-                       if (*mask++) {
-                               *fb=    ((rgba[0][RCOMP]>>RS) << (G+B)) | 
-                                       ((rgba[0][GCOMP]>>GS) << B) |
-                                       ((rgba[0][BCOMP]>>BS));
-                       }
+                       if (*mask++)
+                               *fb = PACK(rgba[0]);
                        fb++;
                        rgba++;
                }
@@ -131,36 +139,62 @@ void GGIwrite_rgb_span( const GLcontext *ctx,
        else
        {
                while (n--) {
-                       *fb++=  ((rgba[0][RCOMP]>>RS) << (G+B)) | 
-                               ((rgba[0][GCOMP]>>GS) << B) |
-                               ((rgba[0][BCOMP]>>BS));
+                       *fb++ = PACK(rgba[0]);
                        rgba++;
                }
        }
 }
 
 
-void GGIwrite_mono_span( const GLcontext *ctx,
-                              GLuint n, GLint x, GLint y,
-                              const GLubyte mask[])
+void GGIwrite_mono_rgba_span(const GLcontext *ctx, GLuint n, GLint x, GLint y,
+                            const GLchan color[4], const GLubyte mask[])
 {
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
        FB_TYPE *fb;
-       FB_TYPE color;
+       fb = (FB_TYPE *)(LIBGGI_CURWRITE(ggi_ctx->ggi_visual) +
+                        FLIP(y)*LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual)) + x;
+
+       if (mask){
+               while (n--){
+                       if (*mask++)
+                               *fb = PACK(color);
+                       ++fb;
+               }
+       }
+       else {
+               while (n--) 
+                       *fb++ = PACK(color);
 
-       if (mask)
-       {
-               fb=LFB(FB_TYPE,x,FLIP(y));
-               color=(FB_TYPE) GGICTX->color;
+               /* Alternatively we could write a potentialy faster HLine
+               ggiSetGCForeground(ggi_ctx->ggi_visual, color);
+               ggiDrawHLine(ggi_ctx->ggi_visual,x,FLIP(y),n);
+               */
+       }
+}
 
-               while (n--) 
-               {
-                       if (*mask++) *fb=color; 
-                       fb++;
+void GGIwrite_mono_ci_span(const GLcontext *ctx, GLuint n, GLint x, GLint y,
+                          const GLuint ci, const GLubyte mask[])
+{
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+       FB_TYPE *fb;
+       fb = (FB_TYPE *)(LIBGGI_CURWRITE(ggi_ctx->ggi_visual) +
+                        FLIP(y)*LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual)) + x;
+
+       if (mask){
+               while (n--){
+                       if (*mask++)
+                               *fb = ci;
+                       ++fb;
                }
        }
-       else
-       {
-               ggiDrawHLine(VIS,x,FLIP(y),n);
+       else {
+               while (n--) 
+                       *fb++ = ci;
+
+               /* Alternatively we could write a potentialy faster HLine
+               ggiSetGCForeground(ggi_ctx->ggi_visual, ci);
+               ggiDrawHLine(ggi_ctx->ggi_visual, x, FLIP(y), n);
+               */
        }
 }
 
@@ -171,27 +205,33 @@ void GGIwrite_mono_span( const GLcontext *ctx,
 
 
 void GGIread_ci32_span(const GLcontext *ctx,
-                         GLuint n, GLint x, GLint y, GLuint ci[])
+                      GLuint n, GLint x, GLint y, GLuint ci[])
 {
-       FB_TYPE *fb=LFB(FB_TYPE,x,FLIP(y));
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+       FB_TYPE *fb;
+       fb = (FB_TYPE *)(LIBGGI_CURWRITE(ggi_ctx->ggi_visual) +
+                        FLIP(y)*LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual)) + x;
+
        while (n--)
-               *ci++=(GLuint)*fb++;
+               *ci++ = (GLuint)*fb++;
 }
 
 void GGIread_rgba_span(const GLcontext *ctx,
-                         GLuint n, GLint x, GLint y,
-                         GLubyte rgba[][4])
+                      GLuint n, GLint x, GLint y, GLchan rgba[][4])
 {
-       FB_TYPE *fb=LFB(FB_TYPE,x,FLIP(y));
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
        FB_TYPE color;
-
+       FB_TYPE *fb;
+       fb = (FB_TYPE *)(LIBGGI_CURWRITE(ggi_ctx->ggi_visual) +
+                        FLIP(y)*LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual)) + x;
+       
        while (n--)
        {
-               color=*fb++;
+               color = *fb++;
                rgba[0][RCOMP] = (GLubyte) (color>>(G+B))<<RS;  
                rgba[0][GCOMP] = (GLubyte) ((color>>B)& ((1<<G)-1))<<GS;  
                rgba[0][BCOMP] = (GLubyte) (color & ((1<<B)-1))<<BS;  
-               rgba[0][ACOMP] =0;
+               rgba[0][ACOMP] = 0;
                rgba++;
        }
 }
@@ -201,68 +241,97 @@ void GGIread_rgba_span(const GLcontext *ctx,
 /**********************************************************************/
 
 void GGIwrite_ci32_pixels(const GLcontext *ctx,
-                            GLuint n, const GLint x[], const GLint y[],
-                            const GLuint ci[], const GLubyte mask[] )
+                         GLuint n, const GLint x[], const GLint y[],
+                         const GLuint ci[], const GLubyte mask[])
 {
-       FB_TYPE *fb=LFB(FB_TYPE,0,0);
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+       int stride = LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual);
+       void *fb = LIBGGI_CURWRITE(ggi_ctx->ggi_visual);
 
        while (n--) {
-               if (*mask++) *(fb+ *x + FLIP(*y)*GGICTX->width)=*ci;
+               if (*mask++){
+                       FB_TYPE *dst = (FB_TYPE*)(fb + FLIP(*y)*stride) + *x;
+                       *dst = *ci;
+               }
                ci++;
                x++;
                y++;
        }
 }
 
-void GGIwrite_mono_pixels(const GLcontext *ctx,
-                                GLuint n,
-                                const GLint x[], const GLint y[],
-                                const GLubyte mask[] )
+void GGIwrite_mono_ci_pixels(const GLcontext *ctx,
+                            GLuint n, const GLint x[], const GLint y[],
+                            GLuint ci, const GLubyte mask[])
 {
-       FB_TYPE *fb=LFB(FB_TYPE,0,0);
-       FB_TYPE color=(FB_TYPE) GGICTX->color;
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+       int stride = LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual);
+       void *fb = LIBGGI_CURWRITE(ggi_ctx->ggi_visual);
 
        while (n--) {
-               if (*mask++) *(fb+ *x + FLIP(*y)*GGICTX->width)=color;
+               if (*mask++){
+                       FB_TYPE *dst = (FB_TYPE*)(fb + FLIP(*y)*stride) + *x;
+                       *dst = ci;
+               }
                x++;
                y++;
        }
 }
 
 void GGIwrite_rgba_pixels(const GLcontext *ctx,
-                            GLuint n, const GLint x[], const GLint y[],
-                            const GLubyte rgba[][4],
-                            const GLubyte mask[] )
+                         GLuint n, const GLint x[], const GLint y[],
+                         const GLchan rgba[][4], const GLubyte mask[])
 {
-       FB_TYPE *fb=LFB(FB_TYPE,0,0);
-       FB_TYPE color;
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+       int stride = LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual);
+       void *fb = LIBGGI_CURWRITE(ggi_ctx->ggi_visual);
 
        while (n--) {
-               if (*mask++) {
-                       color=  ((rgba[0][RCOMP]>>RS) << (G+B)) | 
-                               ((rgba[0][GCOMP]>>GS) << B) |
-                               ((rgba[0][BCOMP]>>BS));
-                        *(fb+ *x + FLIP(*y)*GGICTX->width)=color;
+               if (*mask++){
+                       FB_TYPE *dst = (FB_TYPE*)(fb + FLIP(*y)*stride) + *x;
+                       *dst = PACK(rgba[0]);
                }
-               x++;y++;
+               x++;
+               y++;
                rgba++;
        }
 }
 
+void GGIwrite_mono_rgba_pixels(const GLcontext *ctx,
+                              GLuint n, const GLint x[], const GLint y[],
+                              const GLchan rgba[4], const GLubyte mask[])
+{
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+       int stride = LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual);
+       void *fb = LIBGGI_CURWRITE(ggi_ctx->ggi_visual);
+
+       while (n--) {
+               if (*mask++){
+                       FB_TYPE *dst = (FB_TYPE*)(fb + FLIP(*y)*stride) + *x;
+                       *dst = PACK(rgba);
+               }
+               
+               x++;
+               y++;
+       }
+}
 
 /**********************************************************************/
 /*****                   Read arrays of pixels                    *****/
 /**********************************************************************/
 
 void GGIread_ci32_pixels(const GLcontext *ctx,
-                           GLuint n, const GLint x[], const GLint y[],
-                           GLuint ci[], const GLubyte mask[])
+                        GLuint n, const GLint x[], const GLint y[],
+                        GLuint ci[], const GLubyte mask[])
 {
-       FB_TYPE *fb=LFB(FB_TYPE,0,0);
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+       int stride = LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual);
+       void *fb = LIBGGI_CURWRITE(ggi_ctx->ggi_visual);
 
        while (n--) {
-               if (*mask++) 
-                       *ci=*(fb+ *x + FLIP(*y)*GGICTX->width);
+               if (*mask++){
+                       FB_TYPE *src = (FB_TYPE*)(fb + FLIP(*y)*stride) + *x;
+                       *ci = *src;
+               }
                ci++;
                x++;
                y++;
@@ -270,60 +339,70 @@ void GGIread_ci32_pixels(const GLcontext *ctx,
 }
 
 void GGIread_rgba_pixels(const GLcontext *ctx,
-                           GLuint n, const GLint x[], const GLint y[],
-                           GLubyte rgba[][4],
-                           const GLubyte mask[] )
+                        GLuint n, const GLint x[], const GLint y[],
+                        GLubyte rgba[][4], const GLubyte mask[])
 {
-       FB_TYPE *fb=LFB(FB_TYPE,0,0);
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+       int stride = LIBGGI_FB_W_STRIDE(ggi_ctx->ggi_visual);
+       void *fb = LIBGGI_CURWRITE(ggi_ctx->ggi_visual);
        FB_TYPE color;
 
        while (n--)
        {
                if (*mask++)
-               {
-                       color=*(fb+ *x + FLIP(*y)*GGICTX->width);
-                       rgba[0][RCOMP] =(GLubyte)(color>>(G+B))<<RS;  
-                       rgba[0][GCOMP] =(GLubyte)((color>>B)& ((1<<G)-1))<<GS;  
-                       rgba[0][BCOMP] =(GLubyte) (color & ((1<<B)-1))<<BS;  
-                       rgba[0][ACOMP] =0;
+               {       
+                       FB_TYPE *src = (FB_TYPE*)(fb + FLIP(*y)*stride) + *x;
+                       color = *src;
+
+                       rgba[0][RCOMP] = (GLubyte)(color>>(G+B))<<RS;  
+                       rgba[0][GCOMP] = (GLubyte)((color>>B)& ((1<<G)-1))<<GS;
+                       rgba[0][BCOMP] = (GLubyte) (color & ((1<<B)-1))<<BS;  
+                       rgba[0][ACOMP] = 0;
                }       
-               x++; y++;
+               x++;
+               y++;
                rgba++;
        }
 }
 
-int GGIsetup_driver(GGIMesaContext ggictx, struct ggi_mesa_info *info)
+void GGIset_read_buffer(GLcontext *ctx, GLframebuffer *buffer, GLenum mode)
 {
-       GLcontext *ctx = ggictx->gl_ctx;
-
-       ctx->Driver.WriteRGBASpan       = GGIwrite_rgba_span;
-       ctx->Driver.WriteRGBSpan        = GGIwrite_rgb_span;
-//     ctx->Driver.WriteMonoRGBASpan   = GGIwrite_mono_span;
-       ctx->Driver.WriteRGBAPixels     = GGIwrite_rgba_pixels;
-//     ctx->Driver.WriteMonoRGBAPixels = GGIwrite_mono_pixels;
-
-       ctx->Driver.WriteCI32Span       = GGIwrite_ci32_span;
-       ctx->Driver.WriteCI8Span       = GGIwrite_ci8_span;
-//     ctx->Driver.WriteMonoCISpan   = GGIwrite_mono_span;
-       ctx->Driver.WriteCI32Pixels     = GGIwrite_ci32_pixels;
-//     ctx->Driver.WriteMonoCIPixels = GGIwrite_mono_pixels;
-
-       ctx->Driver.ReadCI32Span = GGIread_ci32_span;
-       ctx->Driver.ReadRGBASpan = GGIread_rgba_span;
-       ctx->Driver.ReadCI32Pixels = GGIread_ci32_pixels;
-       ctx->Driver.ReadRGBAPixels = GGIread_rgba_pixels;
+}
 
-       info->red_bits = R;
-       info->green_bits =G;
-       info->blue_bits = B;
+int GGIsetup_driver(ggi_mesa_context_t ggi_ctx)
+{
+       struct swrast_device_driver *swdd =
+               _swrast_GetDeviceDriverReference(ggi_ctx->gl_ctx);
+
+       GGIMESADPRINT_LIBS("linear_%d: GGIsetup_driver\n", sizeof(FB_TYPE)*8);
+       
+       swdd->WriteRGBASpan     = GGIwrite_rgba_span;
+       swdd->WriteRGBSpan      = GGIwrite_rgb_span;
+       swdd->WriteMonoRGBASpan = GGIwrite_mono_rgba_span;
+       swdd->WriteRGBAPixels   = GGIwrite_rgba_pixels;
+       swdd->WriteMonoRGBAPixels = GGIwrite_mono_rgba_pixels;
+
+       swdd->WriteCI32Span       = GGIwrite_ci32_span;
+       swdd->WriteCI8Span       = GGIwrite_ci8_span;
+       swdd->WriteMonoCISpan   = GGIwrite_mono_ci_span;
+       swdd->WriteCI32Pixels     = GGIwrite_ci32_pixels;
+       swdd->WriteMonoCIPixels = GGIwrite_mono_ci_pixels;
+
+       swdd->ReadCI32Span = GGIread_ci32_span;
+       swdd->ReadRGBASpan = GGIread_rgba_span;
+       swdd->ReadCI32Pixels = GGIread_ci32_pixels;
+       swdd->ReadRGBAPixels = GGIread_rgba_pixels;
+
+       swdd->SetReadBuffer = GGIset_read_buffer;       
 
        return 0;
 }
 
 static int GGIopen(ggi_visual_t vis,struct ggi_dlhandle *dlh,
-                       const char *args,void *argptr, uint32 *dlret)
-{      
-       LIBGGI_MESAEXT(vis)->setup_driver=GGIsetup_driver;
+                  const char *args,void *argptr, uint32 *dlret)
+{
+       GGIMESADPRINT_CORE("linear_%d: GGIOpen\n", sizeof(FB_TYPE)*8);
+       LIBGGI_MESAEXT(vis)->setup_driver = GGIsetup_driver;
 
        *dlret = GGI_DL_OPDRAW;
        return 0;
@@ -332,15 +411,15 @@ static int GGIopen(ggi_visual_t vis,struct ggi_dlhandle *dlh,
 int DLOPENFUNC(int func, void **funcptr)
 {
        switch (func) {
-               case GGIFUNC_open:
-                       *funcptr = GGIopen;
-                       return 0;
-               case GGIFUNC_exit:
-               case GGIFUNC_close:
-                       *funcptr = NULL;
-                       return 0;
-               default:
-                       *funcptr = NULL;
+       case GGIFUNC_open:
+               *funcptr = GGIopen;
+               return 0;
+       case GGIFUNC_exit:
+       case GGIFUNC_close:
+               *funcptr = NULL;
+               return 0;
+       default:
+               *funcptr = NULL;
        }
        return GGI_ENOTFOUND;
 }
index 07999276fbf513bc51e1436f1698471bb3a45340..27eb363627d490464074d23dbd78381f8e03a1cd 100644 (file)
 
 #include <ggi/internal/ggi-dl.h>
 #include <ggi/mesa/ggimesa_int.h>
+#include <ggi/mesa/debug.h>
 
 #include "mmath.h"
 #include "swrast/swrast.h"
-#include "swrast_setup/swrast_setup.h"
-#include "swrast/s_context.h"
-#include "swrast/s_depth.h"
-#include "swrast/s_triangle.h"
+//#include "swrast_setup/swrast_setup.h"
+//#include "swrast/s_context.h"
+//#include "swrast/s_depth.h"
+//#include "swrast/s_triangle.h"
+
+#define FLIP(coord) (LIBGGI_MODE(ggi_ctx->ggi_visual)->visible.y-(coord)-1)
 
 /**********************************************************************/
 /*****            Write spans of pixels                           *****/
@@ -43,18 +46,21 @@ void GGIwrite_ci32_span(const GLcontext *ctx,
                          const GLuint ci[],
                          const GLubyte mask[] )
 {
-       y=FLIP(y);
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+       y = FLIP(y);
        if (mask)
        {
                while (n--) {
-                       if (*mask++) ggiPutPixel(VIS,x,y,*ci);
+                       if (*mask++)
+                               ggiPutPixel(ggi_ctx->ggi_visual, x, y, *ci);
                        x++;
                        ci++;
                }
        }
        else
        {
-               while (n--) ggiPutPixel(VIS,x++,y,*ci++);
+               while (n--)
+                       ggiPutPixel(ggi_ctx->ggi_visual, x++, y, *ci++);
        }
 }
 
@@ -63,36 +69,69 @@ void GGIwrite_ci8_span(const GLcontext *ctx,
                          const GLubyte ci[],
                          const GLubyte mask[] )
 {
-       y=FLIP(y);
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+       y = FLIP(y);
        if (mask)
        {
                while (n--) {
-                       if (*mask++) ggiPutPixel(VIS,x,y,*ci);
+                       if (*mask++)
+                               ggiPutPixel(ggi_ctx->ggi_visual, x, y, *ci);
                        x++;
                        ci++;
                }
        }
        else
        {
-               while (n--) ggiPutPixel(VIS,x++,y,*ci++);
+               while (n--)
+                       ggiPutPixel(ggi_ctx->ggi_visual, x++, y, *ci++);
        }
 }
 
-void GGIwrite_mono_span( const GLcontext *ctx,
-                         GLuint n, GLint x, GLint y,
-                         const GLubyte mask[] )
+void GGIwrite_mono_ci_span(const GLcontext *ctx, GLuint n, GLint x, GLint y,
+                          const GLuint ci, const GLubyte mask[])
 {
-       y=FLIP(y);
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+       y = FLIP(y);
        if (mask)
        {
                while (n--) {
-                       if (*mask++) ggiDrawPixel(VIS,x,y);
+                       if (*mask++)
+                               ggiPutPixel(ggi_ctx->ggi_visual, x, y, ci);
                        x++;
                }
        }
        else
        {
-               ggiDrawHLine(VIS,x,y,n);
+               while (n--)
+                       ggiPutPixel(ggi_ctx->ggi_visual, x++, y, ci);
+       }
+}
+
+void GGIwrite_mono_rgba_span(const GLcontext *ctx, GLuint n, GLint x, GLint y,
+                            const GLchan rgba[4], const GLubyte mask[])
+{
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+       ggi_color rgb;
+       ggi_pixel col;  
+
+       y = FLIP(y);
+
+       rgb.r = (uint16)(rgba[RCOMP]) << SHIFT;
+       rgb.g = (uint16)(rgba[GCOMP]) << SHIFT;
+       rgb.b = (uint16)(rgba[BCOMP]) << SHIFT;
+       col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);
+
+       if (mask)
+       {
+               while (n--) {
+                       if (*mask++)
+                               ggiPutPixel(ggi_ctx->ggi_visual, x, y, col);
+                       x++;
+               }
+       }
+       else
+       {
+               ggiDrawHLine(ggi_ctx->ggi_visual, x, y, n);
        }
 }
 
@@ -101,20 +140,21 @@ void GGIwrite_rgba_span( const GLcontext *ctx,
                           const GLubyte rgba[][4],
                           const GLubyte mask[])
 {
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
        ggi_color rgb;
        ggi_pixel col;  
-       y=FLIP(y);
+       y = FLIP(y);
 
        if (mask)
        {
                while (n--) {
                        if (*mask++) 
                        {
-                               rgb.r=(uint16)(rgba[0][RCOMP]) << SHIFT;
-                               rgb.g=(uint16)(rgba[0][GCOMP]) << SHIFT;
-                               rgb.b=(uint16)(rgba[0][BCOMP]) << SHIFT;
-                               col=ggiMapColor(VIS,&rgb);
-                               ggiPutPixel(VIS,x,y,col);
+                               rgb.r = (uint16)(rgba[0][RCOMP]) << SHIFT;
+                               rgb.g = (uint16)(rgba[0][GCOMP]) << SHIFT;
+                               rgb.b = (uint16)(rgba[0][BCOMP]) << SHIFT;
+                               col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);
+                               ggiPutPixel(ggi_ctx->ggi_visual, x, y, col);
                        }
                        x++;
                        rgba++;
@@ -124,34 +164,36 @@ void GGIwrite_rgba_span( const GLcontext *ctx,
        {
                while (n--)
                {
-                       rgb.r=(uint16)(rgba[0][RCOMP]) << SHIFT;
-                       rgb.g=(uint16)(rgba[0][GCOMP]) << SHIFT;
-                       rgb.b=(uint16)(rgba[0][BCOMP]) << SHIFT;
-                       col=ggiMapColor(VIS,&rgb);
-                       ggiPutPixel(VIS,x++,y,col);
+                       rgb.r = (uint16)(rgba[0][RCOMP]) << SHIFT;
+                       rgb.g = (uint16)(rgba[0][GCOMP]) << SHIFT;
+                       rgb.b = (uint16)(rgba[0][BCOMP]) << SHIFT;
+                       col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);
+                       ggiPutPixel(ggi_ctx->ggi_visual, x++, y, col);
                        rgba++;
                }
        }
 }
+
 void GGIwrite_rgb_span( const GLcontext *ctx,
                           GLuint n, GLint x, GLint y,
                           const GLubyte rgba[][3],
                           const GLubyte mask[] )
 {
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
        ggi_color rgb;
        ggi_pixel col;  
-       y=FLIP(y);
+       y = FLIP(y);
 
        if (mask)
        {
                while (n--) {
                        if (*mask++) 
                        {
-                               rgb.r=(uint16)(rgba[0][RCOMP]) << SHIFT;
-                               rgb.g=(uint16)(rgba[0][GCOMP]) << SHIFT;
-                               rgb.b=(uint16)(rgba[0][BCOMP]) << SHIFT;
-                               col=ggiMapColor(VIS,&rgb);
-                               ggiPutPixel(VIS,x,y,col);
+                               rgb.r = (uint16)(rgba[0][RCOMP]) << SHIFT;
+                               rgb.g = (uint16)(rgba[0][GCOMP]) << SHIFT;
+                               rgb.b = (uint16)(rgba[0][BCOMP]) << SHIFT;
+                               col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);
+                               ggiPutPixel(ggi_ctx->ggi_visual, x, y, col);
                        }
                        x++;
                        rgba++;
@@ -161,11 +203,11 @@ void GGIwrite_rgb_span( const GLcontext *ctx,
        {
                while (n--)
                {
-                       rgb.r=(uint16)(rgba[0][RCOMP]) << SHIFT;
-                       rgb.g=(uint16)(rgba[0][GCOMP]) << SHIFT;
-                       rgb.b=(uint16)(rgba[0][BCOMP]) << SHIFT;
-                       col=ggiMapColor(VIS,&rgb);
-                       ggiPutPixel(VIS,x++,y,col);
+                       rgb.r = (uint16)(rgba[0][RCOMP]) << SHIFT;
+                       rgb.g = (uint16)(rgba[0][GCOMP]) << SHIFT;
+                       rgb.b = (uint16)(rgba[0][BCOMP]) << SHIFT;
+                       col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);
+                       ggiPutPixel(ggi_ctx->ggi_visual, x++, y, col);
                        rgba++;
                }
        }
@@ -181,24 +223,26 @@ void GGIwrite_rgb_span( const GLcontext *ctx,
 void GGIread_ci32_span( const GLcontext *ctx,
                          GLuint n, GLint x, GLint y, GLuint ci[])
 {
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
        y = FLIP(y);
        while (n--)
-               ggiGetPixel(VIS, x++, y,ci++);
+               ggiGetPixel(ggi_ctx->ggi_visual, x++, y, ci++);
 }
 
 void GGIread_rgba_span( const GLcontext *ctx,
                          GLuint n, GLint x, GLint y,
                          GLubyte rgba[][4])
 {
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
        ggi_color rgb;
        ggi_pixel col;
 
-       y=FLIP(y);
+       y = FLIP(y);
 
        while (n--)
        {
-               ggiGetPixel(VIS,x++,y,&col);
-               ggiUnmapPixel(VIS,col,&rgb);
+               ggiGetPixel(ggi_ctx->ggi_visual, x++, y, &col);
+               ggiUnmapPixel(ggi_ctx->ggi_visual, col, &rgb);
                rgba[0][RCOMP] = (GLubyte) (rgb.r >> SHIFT);
                rgba[0][GCOMP] = (GLubyte) (rgb.g >> SHIFT);
                rgba[0][BCOMP] = (GLubyte) (rgb.b >> SHIFT);
@@ -215,21 +259,24 @@ void GGIwrite_ci32_pixels( const GLcontext *ctx,
                             GLuint n, const GLint x[], const GLint y[],
                             const GLuint ci[], const GLubyte mask[] )
 {
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
        while (n--) {
-               if (*mask++) ggiPutPixel(VIS,*x, FLIP(*y),*ci);
+               if (*mask++)
+                       ggiPutPixel(ggi_ctx->ggi_visual, *x, FLIP(*y), *ci);
                ci++;
                x++;
                y++;
        }
 }
 
-void GGIwrite_mono_pixels( const GLcontext *ctx,
-                                GLuint n,
-                                const GLint x[], const GLint y[],
-                                const GLubyte mask[] )
+void GGIwrite_mono_ci_pixels(const GLcontext *ctx,
+                            GLuint n, const GLint x[], const GLint y[],
+                            GLuint ci, const GLubyte mask[])
 {
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
        while (n--) {
-               if (*mask++) ggiDrawPixel(VIS,*x,FLIP(*y));
+               if (*mask++)
+                       ggiPutPixel(ggi_ctx->ggi_visual, *x, FLIP(*y), ci);
                x++;
                y++;
        }
@@ -240,21 +287,43 @@ void GGIwrite_rgba_pixels( const GLcontext *ctx,
                             const GLubyte rgba[][4],
                             const GLubyte mask[] )
 {
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
        ggi_pixel col;
        ggi_color rgb;
        while (n--) {
                if (*mask++) {
-                       rgb.r=(uint16)(rgba[0][RCOMP]) << SHIFT;
-                       rgb.g=(uint16)(rgba[0][GCOMP]) << SHIFT;
-                       rgb.b=(uint16)(rgba[0][BCOMP]) << SHIFT;
-                       col=ggiMapColor(VIS,&rgb);
-                       ggiPutPixel(VIS,*x,FLIP(*y),col);
+                       rgb.r = (uint16)(rgba[0][RCOMP]) << SHIFT;
+                       rgb.g = (uint16)(rgba[0][GCOMP]) << SHIFT;
+                       rgb.b = (uint16)(rgba[0][BCOMP]) << SHIFT;
+                       col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);
+                       ggiPutPixel(ggi_ctx->ggi_visual, *x, FLIP(*y), col);
                }
-               x++;y++;
+               x++;
+               y++;
                rgba++;
        }
 }
 
+void GGIwrite_mono_rgba_pixels(const GLcontext *ctx,
+                              GLuint n, const GLint x[], const GLint y[],
+                              const GLchan rgba[4], const GLubyte mask[])
+{
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+       ggi_color rgb;
+       ggi_pixel col;  
+
+       rgb.r = (uint16)(rgba[RCOMP]) << SHIFT;
+       rgb.g = (uint16)(rgba[GCOMP]) << SHIFT;
+       rgb.b = (uint16)(rgba[BCOMP]) << SHIFT;
+       col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);
+       
+       while (n--) {
+               if (*mask++)
+                       ggiPutPixel(ggi_ctx->ggi_visual, *x, FLIP(*y), col);
+               x++;
+               y++;
+       }
+}
 
 /**********************************************************************/
 /*****                   Read arrays of pixels                    *****/
@@ -264,9 +333,10 @@ void GGIread_ci32_pixels( const GLcontext *ctx,
                            GLuint n, const GLint x[], const GLint y[],
                            GLuint ci[], const GLubyte mask[])
 {
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
        while (n--) {
                if (*mask++) 
-                       ggiGetPixel(VIS, *x, FLIP(*y) ,ci);
+                       ggiGetPixel(ggi_ctx->ggi_visual, *x, FLIP(*y), ci);
                ci++;
                x++;
                y++;
@@ -278,6 +348,7 @@ void GGIread_rgba_pixels( const GLcontext *ctx,
                            GLubyte rgba[][4],
                            const GLubyte mask[] )
 {
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
        ggi_color rgb;
        ggi_pixel col;
 
@@ -285,47 +356,59 @@ void GGIread_rgba_pixels( const GLcontext *ctx,
        {
                if (*mask++)
                {
-                       ggiGetPixel(VIS,*x,FLIP(*y),&col);
-                       ggiUnmapPixel(VIS,col,&rgb);
-                       rgba[0][RCOMP]= rgb.r >> SHIFT; 
-                       rgba[0][GCOMP]= rgb.g >> SHIFT;
-                       rgba[0][BCOMP]= rgb.b >> SHIFT;
-                       rgba[0][ACOMP]=0;
+                       ggiGetPixel(ggi_ctx->ggi_visual, *x, FLIP(*y), &col);
+                       ggiUnmapPixel(ggi_ctx->ggi_visual, col, &rgb);
+                       rgba[0][RCOMP] = rgb.r >> SHIFT; 
+                       rgba[0][GCOMP] = rgb.g >> SHIFT;
+                       rgba[0][BCOMP] = rgb.b >> SHIFT;
+                       rgba[0][ACOMP] = 0;
                }       
-               x++; y++;
+               x++;
+               y++;
                rgba++;
        }
 }
 
-
-static swrast_tri_func ggimesa_stubs_get_triangle_func(GLcontext *ctx);
-
-int GGIsetup_driver(GGIMesaContext ggictx, struct ggi_mesa_info *info)
+int GGIextend_visual(ggi_visual_t vis)
 {
-       GLcontext *ctx = ggictx->gl_ctx;
+       return 0;
+}
 
-       ctx->Driver.WriteRGBASpan       = GGIwrite_rgba_span;
-       ctx->Driver.WriteRGBSpan        = GGIwrite_rgb_span;
-       ctx->Driver.WriteRGBAPixels     = GGIwrite_rgba_pixels;
+//static swrast_tri_func ggimesa_stubs_get_triangle_func(GLcontext *ctx);
 
-       ctx->Driver.WriteCI32Span       = GGIwrite_ci32_span;
-       ctx->Driver.WriteCI8Span        = GGIwrite_ci8_span;
-       ctx->Driver.WriteCI32Pixels     = GGIwrite_ci32_pixels;
+int GGIsetup_driver(ggi_mesa_context_t ggi_ctx)
+{
+       struct swrast_device_driver *swdd =
+               _swrast_GetDeviceDriverReference(ggi_ctx->gl_ctx);
 
-       ctx->Driver.ReadCI32Span        = GGIread_ci32_span;
-       ctx->Driver.ReadRGBASpan        = GGIread_rgba_span;
-       ctx->Driver.ReadCI32Pixels      = GGIread_ci32_pixels;
-       ctx->Driver.ReadRGBAPixels      = GGIread_rgba_pixels;
+       GGIMESADPRINT_CORE("stubs: setup_driver\n");
+       
+       swdd->WriteRGBASpan     = GGIwrite_rgba_span;
+       swdd->WriteRGBSpan      = GGIwrite_rgb_span;
+       swdd->WriteMonoRGBASpan = GGIwrite_mono_rgba_span;
+       swdd->WriteRGBAPixels   = GGIwrite_rgba_pixels;
+       swdd->WriteMonoRGBAPixels = GGIwrite_mono_rgba_pixels;
+
+       swdd->WriteCI32Span     = GGIwrite_ci32_span;
+       swdd->WriteCI8Span      = GGIwrite_ci8_span;
+       swdd->WriteMonoCISpan   = GGIwrite_mono_ci_span;
+       swdd->WriteCI32Pixels   = GGIwrite_ci32_pixels;
+       swdd->WriteMonoCIPixels = GGIwrite_mono_ci_pixels;
+
+       swdd->ReadCI32Span      = GGIread_ci32_span;
+       swdd->ReadRGBASpan      = GGIread_rgba_span;
+       swdd->ReadCI32Pixels    = GGIread_ci32_pixels;
+       swdd->ReadRGBAPixels    = GGIread_rgba_pixels;
        
        return 0;
 }
 
-void GGIupdate_state(GLcontext *ctx)
+void GGIupdate_state(ggi_mesa_context_t *ctx)
 {
-       ctx->Driver.TriangleFunc = _swsetup_Triangle;
+       //ctx->Driver.TriangleFunc = _swsetup_Triangle;
 }
 
-
+/*
 void GGItriangle_flat(GLcontext *ctx, const SWvertex *v0, const SWvertex *v1, const SWvertex *v2)
 {
 //#define INTERP_Z 1
@@ -402,10 +485,10 @@ static swrast_tri_func ggimesa_stubs_get_triangle_func(GLcontext *ctx)
 
        return GGItriangle_flat;        
 }
-
+*/
 static int GGIopen(ggi_visual_t vis, struct ggi_dlhandle *dlh,
                        const char *args, void *argptr, uint32 *dlret)
-{ 
+{
                LIBGGI_MESAEXT(vis)->update_state = GGIupdate_state;
        LIBGGI_MESAEXT(vis)->setup_driver = GGIsetup_driver;
 
@@ -416,15 +499,15 @@ static int GGIopen(ggi_visual_t vis, struct ggi_dlhandle *dlh,
 int MesaGGIdl_stubs(int func, void **funcptr)
 {
        switch (func) {
-               case GGIFUNC_open:
-                       *funcptr = GGIopen;
-                       return 0;
-               case GGIFUNC_exit:
-               case GGIFUNC_close:
-                       *funcptr = NULL;
-                       return 0;
-               default:
-                       *funcptr = NULL;
+       case GGIFUNC_open:
+               *funcptr = GGIopen;
+               return 0;
+       case GGIFUNC_exit:
+       case GGIFUNC_close:
+               *funcptr = NULL;
+               return 0;
+       default:
+               *funcptr = NULL;
        }
        return GGI_ENOTFOUND;
 }
index 2674fee3b157e45805374ee70b33e7df16be25ef..a4621bb28893dd3c5e8eede63835b7136d75fa9c 100644 (file)
@@ -1,6 +1,7 @@
 /* GGI-Driver for MESA
  * 
  * Copyright (C) 1997-1998  Uwe Maurer  -  uwe_maurer@t-online.de 
+ *                    2002  Filip Spacek
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
 #include "swrast/swrast.h"
 #include "swrast_setup/swrast_setup.h"
 #include "tnl/tnl.h"
-
-#undef VIS
-#undef FLIP
-#define VIS (GGIMesa->ggi_vis)
-#define FLIP(y) (GGIMesa->flip_y-(y))
-
-GGIMesaContext GGIMesa = NULL;    /* the current context */
+#include "tnl/t_context.h"
+#include "tnl/t_pipeline.h"
+#include "array_cache/acache.h"
+#include "texformat.h"
+#include "texstore.h"
 
 ggi_extid ggiMesaID = -1;
 static int _ggimesaLibIsUp = 0;
 static void *_ggimesaConfigHandle;
 
-/* FIXME: These should really be defined in the make system using -Dxxx */
-#define GGIMESACONFFILE "/usr/local/etc/ggi/ggimesa.conf"
-#define GGIMESATAGLEN 0
-static char ggimesaconfstub[512] = GGIMESACONFFILE;
-static char *ggimesaconffile = ggimesaconfstub + GGIMESATAGLEN;
+static char ggimesaconffile[] = GGIMESACONFFILE;
 
 int _ggimesaDebugSync = 0;
 uint32 _ggimesaDebugState = 0;
@@ -57,48 +52,52 @@ uint32 _ggimesaDebugState = 0;
 static void gl_ggiUpdateState(GLcontext *ctx, GLuint new_state);
 static int changed(ggi_visual_t vis, int whatchanged);
 
-static void gl_ggiGetSize(GLcontext *ctx, GLuint *width, GLuint *height)
+
+static int _ggi_error(void)
 {
-       GGIMESADPRINT_CORE("gl_ggiGetSize() called\n");
+       GGIMESADPRINT_CORE("_ggi_error() called\n");
        
-       *width = GGIMesa->width; 
-       *height = GGIMesa->height;      
+       return -1;
 }
 
-static void gl_ggiSetIndex(GLcontext *ctx, GLuint ci)
+static void gl_ggiGetSize(GLframebuffer *fb, GLuint *width, GLuint *height)
 {
-       GGIMESADPRINT_CORE("gl_ggiSetIndex() called\n");
+       /* FIXME: this is a hack to work around the new interface */
+       GLcontext *ctx;
+       ggi_mesa_context_t ggi_ctx;
+       ctx = _mesa_get_current_context();
+       ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+       
+       GGIMESADPRINT_CORE("gl_ggiGetSize() called\n");
        
-       ggiSetGCForeground(VIS, ci);
-       GGICTX->color = (ggi_pixel)ci;
+       *width = LIBGGI_MODE(ggi_ctx->ggi_visual)->visible.x; 
+       *height = LIBGGI_MODE(ggi_ctx->ggi_visual)->visible.y;
+       printf("returning %d, %d\n", *width, *height);
 }
 
-static void gl_ggiSetClearIndex(GLcontext *ctx, GLuint ci)
+static void gl_ggiSetIndex(GLcontext *ctx, GLuint ci)
 {
-       GGIMESADPRINT_CORE("gl_ggiSetClearIndex() called\n");
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+       
+       GGIMESADPRINT_CORE("gl_ggiSetIndex() called\n");
        
-       ggiSetGCForeground(VIS, ci);
-       GGICTX->clearcolor = (ggi_pixel)ci;
+       ggiSetGCForeground(ggi_ctx->ggi_visual, ci);
+       ggi_ctx->color = (ggi_pixel)ci;
 }
 
-static void gl_ggiSetColor(GLcontext *ctx, GLubyte red, GLubyte green,
-                          GLubyte blue, GLubyte alpha)
-{
-       ggi_color rgb;
-       ggi_pixel col;
+static void gl_ggiSetClearIndex(GLcontext *ctx, GLuint ci)
+{      
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
        
-       GGIMESADPRINT_CORE("gl_ggiSetColor() called\n");
+       GGIMESADPRINT_CORE("gl_ggiSetClearIndex() called\n");
        
-       rgb.r = (uint16)red << SHIFT;
-       rgb.g = (uint16)green << SHIFT;
-       rgb.b = (uint16)blue << SHIFT;
-       col = ggiMapColor(VIS, &rgb);
-       ggiSetGCForeground(VIS, col);
-       GGICTX->color = col;
+       ggiSetGCForeground(ggi_ctx->ggi_visual, ci);
+       ggi_ctx->clearcolor = (ggi_pixel)ci;
 }
 
 static void gl_ggiSetClearColor(GLcontext *ctx, const GLchan color[4])
 {
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
        ggi_color rgb;
        ggi_pixel col;
        
@@ -107,48 +106,60 @@ static void gl_ggiSetClearColor(GLcontext *ctx, const GLchan color[4])
        rgb.r = (uint16)color[0] << SHIFT;
        rgb.g = (uint16)color[1] << SHIFT;
        rgb.b = (uint16)color[2] << SHIFT;
-       col = ggiMapColor(VIS, &rgb);
-       ggiSetGCForeground(VIS, col);
-       GGICTX->clearcolor = col;
+       col = ggiMapColor(ggi_ctx->ggi_visual, &rgb);
+       ggiSetGCForeground(ggi_ctx->ggi_visual, col);
+       ggi_ctx->clearcolor = col;
 }
 
-static GLbitfield gl_ggiClear(GLcontext *ctx,GLbitfield mask, GLboolean all,
-                             GLint x, GLint y, GLint width, GLint height)
+static void gl_ggiClear(GLcontext *ctx, GLbitfield mask, GLboolean all,
+                       GLint x, GLint y, GLint width, GLint height)
 {
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+       
        GGIMESADPRINT_CORE("gl_ggiClear() called\n");
 
-       if (mask & GL_COLOR_BUFFER_BIT
+       if (mask & (DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT)
        {
-               ggiSetGCForeground(VIS, GGICTX->clearcolor);
+               ggiSetGCForeground(ggi_ctx->ggi_visual, ggi_ctx->clearcolor);
 
                if (all)
                {
-                       ggiDrawBox(VIS, 0, GGIMesa->origin.y,
-                                  GGIMesa->width, GGIMesa->height);
+                       int w, h;
+                       w = LIBGGI_MODE(ggi_ctx->ggi_visual)->visible.x;
+                       h = LIBGGI_MODE(ggi_ctx->ggi_visual)->visible.y;
+                       ggiDrawBox(ggi_ctx->ggi_visual, 0, 0, w, h);
                }
                else
                {
-                       ggiDrawBox(VIS, x, FLIP(y), width, height);
+                       ggiDrawBox(ggi_ctx->ggi_visual, x, y, //FLIP(y),
+                                  width, height);
                }
+               ggiSetGCForeground(ggi_ctx->ggi_visual, ggi_ctx->color);
 
-               ggiSetGCForeground(VIS, GGICTX->color);
+               mask &= ~(DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT);
        }
-       return mask & (~GL_COLOR_BUFFER_BIT);
+       _swrast_Clear(ctx, mask, all, x, y, width, height);
+       
 }
 
 /* Set the buffer used for drawing */
 static GLboolean gl_ggiSetDrawBuffer(GLcontext *ctx, GLenum mode)
 {
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+
+       printf("set draw %d\n", mode);
        GGIMESADPRINT_CORE("gl_ggiSetDrawBuffer() called\n");
        
        if (mode == GL_FRONT_LEFT) 
        {
-               GGICTX->active_buffer = 1;
+               ggiSetWriteFrame(ggi_ctx->ggi_visual,
+                                ggiGetDisplayFrame(ggi_ctx->ggi_visual));
                return GL_TRUE;
        }
        else if (mode == GL_BACK_LEFT) 
        {
-               GGICTX->active_buffer = 0;
+               ggiSetWriteFrame(ggi_ctx->ggi_visual,
+                                ggiGetDisplayFrame(ggi_ctx->ggi_visual)?0 : 1);
                return GL_TRUE;
        }
        else 
@@ -160,18 +171,27 @@ static GLboolean gl_ggiSetDrawBuffer(GLcontext *ctx, GLenum mode)
 
 /* Set the buffer used for reading */
 /* XXX support for separate read/draw buffers hasn't been tested */
-static void gl_ggiSetReadBuffer(GLcontext *ctx, GLframebuffer *buffer, GLenum mode)
+static GLboolean gl_ggiSetReadBuffer(GLcontext *ctx, GLframebuffer *buffer, GLenum mode)
 {
-       GGIMESADPRINT_CORE("gl_ggiSetReadBuffer() called\n");
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
        
+       printf("set read %d\n", mode);
+       GGIMESADPRINT_CORE("gl_ggiSetReadBuffer() called\n");
+
        if (mode == GL_FRONT_LEFT) 
        {
-               GGICTX->active_buffer = 1;
+               ggiSetReadFrame(ggi_ctx->ggi_visual,
+                               ggiGetDisplayFrame(ggi_ctx->ggi_visual));
+               return GL_TRUE;
        }
        else if (mode == GL_BACK_LEFT) 
        {
-               GGICTX->active_buffer = 0;
+               ggiSetReadFrame(ggi_ctx->ggi_visual,
+                               ggiGetDisplayFrame(ggi_ctx->ggi_visual)?0 : 1);
+               return GL_TRUE;
        }
+       else
+               return GL_FALSE;
 }
 
 
@@ -187,9 +207,11 @@ static const GLubyte * gl_ggiGetString(GLcontext *ctx, GLenum name)
 
 static void gl_ggiFlush(GLcontext *ctx)
 {
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+
        GGIMESADPRINT_CORE("gl_ggiFlush() called\n");
        
-       ggiFlush(VIS);
+       ggiFlush(ggi_ctx->ggi_visual);
 }
 
 static void gl_ggiIndexMask(GLcontext *ctx, GLuint mask)
@@ -197,7 +219,8 @@ static void gl_ggiIndexMask(GLcontext *ctx, GLuint mask)
        GGIMESADPRINT_CORE("gl_ggiIndexMask() called\n");
 }
 
-static void gl_ggiColorMask(GLcontext *ctx, GLboolean rmask, GLboolean gmask, GLboolean bmask, GLboolean amask)
+static void gl_ggiColorMask(GLcontext *ctx, GLboolean rmask, GLboolean gmask,
+                           GLboolean bmask, GLboolean amask)
 {
        GGIMESADPRINT_CORE("gl_ggiColorMask() called\n");
 }
@@ -209,75 +232,95 @@ static void gl_ggiEnable(GLcontext *ctx, GLenum pname, GLboolean state)
 
 static void gl_ggiSetupPointers(GLcontext *ctx)
 {
+       TNLcontext *tnl;
+  
        GGIMESADPRINT_CORE("gl_ggiSetupPointers() called\n");
-       
-       /* Initialize all the pointers in the DD struct.  Do this whenever */
-       /* a new context is made current or we change buffers via set_buffer! */
 
+       /* General information */
        ctx->Driver.GetString = gl_ggiGetString;
-       ctx->Driver.UpdateState = gl_ggiUpdateState;
-
+       ctx->Driver.GetBufferSize = gl_ggiGetSize;
+       ctx->Driver.Finish = gl_ggiFlush;
+       ctx->Driver.Flush = gl_ggiFlush;
+       
+       /* Software rasterizer pixel paths */
+       ctx->Driver.Accum = _swrast_Accum;
+       ctx->Driver.Bitmap = _swrast_Bitmap;
+       ctx->Driver.Clear = gl_ggiClear;
+       ctx->Driver.ResizeBuffers = _swrast_alloc_buffers;
+       ctx->Driver.CopyPixels = _swrast_CopyPixels;
+       ctx->Driver.DrawPixels = _swrast_DrawPixels;
+       ctx->Driver.ReadPixels = _swrast_ReadPixels;
+
+       /* Software texturing */
+       ctx->Driver.ChooseTextureFormat = _mesa_choose_tex_format;
+       ctx->Driver.TexImage1D = _mesa_store_teximage1d;
+       ctx->Driver.TexImage2D = _mesa_store_teximage2d;
+       ctx->Driver.TexImage3D = _mesa_store_teximage3d;
+       ctx->Driver.TexSubImage1D = _mesa_store_texsubimage1d;
+       ctx->Driver.TexSubImage2D = _mesa_store_texsubimage2d;
+       ctx->Driver.TexSubImage3D = _mesa_store_texsubimage3d;
+       ctx->Driver.TestProxyTexImage = _mesa_test_proxy_teximage;
+
+       ctx->Driver.CopyTexImage1D = _swrast_copy_teximage1d;
+       ctx->Driver.CopyTexImage2D = _swrast_copy_teximage2d;
+       ctx->Driver.CopyTexSubImage1D = _swrast_copy_texsubimage1d;
+       ctx->Driver.CopyTexSubImage2D = _swrast_copy_texsubimage2d;
+       ctx->Driver.CopyTexSubImage3D = _swrast_copy_texsubimage3d;
+
+       ctx->Driver.BaseCompressedTexFormat = _mesa_base_compressed_texformat;
+       ctx->Driver.CompressedTextureSize = _mesa_compressed_texture_size;
+       ctx->Driver.GetCompressedTexImage = _mesa_get_compressed_teximage;
+
+       /* Imaging extensions */
+       ctx->Driver.CopyColorTable = _swrast_CopyColorTable;
+       ctx->Driver.CopyColorSubTable = _swrast_CopyColorSubTable;
+       ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D;
+       ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D;
+       
+       /* State change callbacks */
+       ctx->Driver.SetDrawBuffer = gl_ggiSetDrawBuffer;
        ctx->Driver.ClearIndex = gl_ggiSetClearIndex; 
        ctx->Driver.ClearColor = gl_ggiSetClearColor;
-//     ctx->Driver.Clear = gl_ggiClear;
        ctx->Driver.IndexMask = gl_ggiIndexMask;
        ctx->Driver.ColorMask = gl_ggiColorMask;
        ctx->Driver.Enable = gl_ggiEnable;
        
-       ctx->Driver.SetDrawBuffer = gl_ggiSetDrawBuffer;
-       ctx->Driver.SetReadBuffer = gl_ggiSetReadBuffer;
-       
-       ctx->Driver.GetBufferSize = gl_ggiGetSize;
-       
-       ctx->Driver.Finish = gl_ggiFlush;
-       ctx->Driver.Flush = gl_ggiFlush;
+       ctx->Driver.UpdateState = gl_ggiUpdateState;
 
-       ctx->Driver.RenderStart = 0;
-       ctx->Driver.RenderFinish = _swrast_flush;
-       
-       ctx->Driver.PointsFunc = _swsetup_Points;
-       ctx->Driver.LineFunc = _swsetup_Line;
-       ctx->Driver.TriangleFunc = _swsetup_Triangle;
-       ctx->Driver.QuadFunc = _swsetup_Quad;
+       /* Initialize TNL driver interface */
+       tnl = TNL_CONTEXT(ctx);
+       tnl->Driver.RunPipeline = _tnl_run_pipeline;
        
+       /* Install setup for tnl */
+       _swsetup_Wakeup(ctx);
 }
 
-static int gl_ggiInitInfo(GGIMesaContext ctx, struct ggi_mesa_info *info)
+static void get_mode_info(ggi_visual_t vis, int *r, int *g, int *b,
+                         GLboolean *rgb, GLboolean *db, int *ci)
 {
-       ggi_mode mode;
-
-       GGIMESADPRINT_CORE("gl_ggiInitInfo() called\n");
-       
-       ggiGetMode(ctx->ggi_vis, &mode);
+       int i;
        
-       info->depth_bits = DEFAULT_SOFTWARE_DEPTH_BITS;
-       info->stencil_bits = STENCIL_BITS;
-       info->accum_bits = ACCUM_BITS;
-
-       if (info->rgb_flag)
-       {               
-               info->rgb_flag = GL_TRUE;
-               info->alpha_flag = GL_FALSE;
-               info->index_bits = 0;
-
-               info->red_bits = 8;
-               info->green_bits = 8;
-               info->blue_bits = 8;
-
-               info->alpha_bits = 0;
+       *r = 0;
+       *g = 0;
+       *b = 0;
+
+       for(i = 0; i < sizeof(ggi_pixel)*8; ++i){
+               int mask = 1 << i;
+               if(LIBGGI_PIXFMT(vis)->red_mask & mask)
+                       ++(*r);
+               if(LIBGGI_PIXFMT(vis)->green_mask & mask)
+                       ++(*g);
+               if(LIBGGI_PIXFMT(vis)->blue_mask & mask)
+                       ++(*b);
        }
-       else
-       {
-               info->alpha_flag = GL_FALSE;
 
-               info->index_bits = GT_SIZE(mode.graphtype);
-               info->red_bits = info->green_bits = 
-                 info->blue_bits = info->alpha_bits = 0;
-       }
-       
-       return 0;
-}
+       *rgb = GT_SCHEME(LIBGGI_MODE(vis)->graphtype) == GT_TRUECOLOR;
+       *db = LIBGGI_MODE(vis)->frames > 1;
+       *ci = GT_SIZE(LIBGGI_MODE(vis)->graphtype);
 
+       printf("rgb (%d, %d, %d) db %d, rgb %d ci %d\n",*r,*g,*b,*db,*rgb,*ci);
+}
+       
 int ggiMesaInit()
 {
        int err;
@@ -300,17 +343,19 @@ int ggiMesaInit()
        
        _ggimesaLibIsUp++;
        if (_ggimesaLibIsUp > 1)
-         return 0; /* Initialize only at first call */
+               return 0; /* Initialize only at first call */
        
        err = ggLoadConfig(ggimesaconffile, &_ggimesaConfigHandle);
        if (err != GGI_OK)
        {
-               GGIMESADPRINT_CORE("GGIMesa: Couldn't open %s\n", ggimesaconffile);
+               GGIMESADPRINT_CORE("GGIMesa: Couldn't open %s\n",
+                                  ggimesaconffile);
                _ggimesaLibIsUp--;
                return err;
        }
        
-       ggiMesaID = ggiExtensionRegister("GGIMesa", sizeof(struct mesa_ext), changed);
+       ggiMesaID = ggiExtensionRegister("GGIMesa",
+                                        sizeof(struct ggi_mesa_ext), changed);
        
        if (ggiMesaID < 0)
        {
@@ -323,254 +368,224 @@ int ggiMesaInit()
        return 0;
 }
 
-
-GGIMesaContext GGIMesaCreateContext(void)
+int ggiMesaExit(void)
 {
-       GGIMesaContext ctx;
-       char *str;
-
-       GGIMESADPRINT_CORE("ggiMesaCreateContext() called\n");
+       int rc;
+       
+       GGIMESADPRINT_CORE("ggiMesaExit() called\n");
        
-       if (ggiMesaInit() < 0)          /* register extensions*/
+       if (!_ggimesaLibIsUp)
+               return -1;
+       
+       if (_ggimesaLibIsUp > 1)
        {
-               return NULL;
+               /* Exit only at last call */
+               _ggimesaLibIsUp--;
+               return 0;
        }
-
-       ctx = (GGIMesaContext)calloc(1, sizeof(struct ggi_mesa_context));
-       if (!ctx) 
-         return NULL;
-       
-       ctx->gl_vis = (GLvisual *)calloc(1, sizeof(GLvisual));
-       if (!ctx->gl_vis) 
-         return NULL;
-
-       ctx->viewport_init = GL_FALSE;  
-//     ctx->gl_vis->DBflag = GL_FALSE;
-
-       ctx->gl_ctx = _mesa_create_context(ctx->gl_vis, NULL, (void *)ctx, GL_TRUE);
-       if (!ctx->gl_ctx) 
-         return NULL;
        
-        _mesa_enable_sw_extensions(ctx->gl_ctx);
+       rc = ggiExtensionUnregister(ggiMesaID);
+       ggFreeConfig(_ggimesaConfigHandle);
        
-       _swrast_CreateContext(ctx->gl_ctx);
-       _swsetup_CreateContext(ctx->gl_ctx);
-       _tnl_CreateContext(ctx->gl_ctx);
+       _ggimesaLibIsUp = 0;
        
-       return ctx;
+       return rc;
 }
 
-void GGIMesaDestroyContext(GGIMesaContext ctx)
+int ggiMesaAttach(ggi_visual_t vis)
 {
-       GGIMESADPRINT_CORE("ggiMesaDestroyContext() called\n");
+       int rc;
+       
+       GGIMESADPRINT_CORE("ggiMesaAttach() called\n");
        
-       if (ctx) 
+       rc = ggiExtensionAttach(vis, ggiMesaID);
+       if (rc == 0)
        {
-               _mesa_destroy_visual(ctx->gl_vis);
-               _mesa_destroy_context(ctx->gl_ctx);
-               _mesa_destroy_framebuffer(ctx->gl_buffer);
-               if (ctx == GGIMesa) 
-                 GGIMesa = NULL;
-               if (ctx->ggi_vis) 
-                 ggiExtensionDetach(ctx->ggi_vis, ggiMesaID);
-               ggiExtensionUnregister(ggiMesaID);
-               free(ctx);
+               int r, g, b, ci;
+               GLboolean rgb, db;
+               GLvisual *gl_visual;
+               GLframebuffer *gl_fb;
+               
+               /* We are creating the primary instance */
+               memset(LIBGGI_MESAEXT(vis), 0, sizeof(struct ggi_mesa_ext));
+               LIBGGI_MESAEXT(vis)->update_state = (void *)_ggi_error;
+               LIBGGI_MESAEXT(vis)->setup_driver = (void *)_ggi_error;
+
+               /* Initialize default mesa visual */
+               get_mode_info(vis, &r, &g, &b, &rgb, &db, &ci);
+               gl_visual = &(LIBGGI_MESAEXT(vis)->mesa_visual.gl_visual);
+               _mesa_initialize_visual(gl_visual,
+                                       rgb, db, 0 /* No stereo */,
+                                       r, g, b, 0 /* No alpha */, ci,
+                                       0 /* No depth */, 0 /* No stencil */,
+                                       0, 0, 0, 0 /* No accum */, 0);
+               
+               /* Now fake an "API change" so the right libs get loaded */
+               changed(vis, GGI_CHG_APILIST);
        }
+       
+       return rc;
 }
 
-int GGIMesaSetVisual(GGIMesaContext ctx, ggi_visual_t vis,
-                    GLboolean rgb_flag, GLboolean db_flag)
+int ggiMesaDetach(ggi_visual_t vis)
+{
+       GGIMESADPRINT_CORE("ggiMesaDetach() called\n");
+       
+       return ggiExtensionDetach(vis, ggiMesaID);
+}
+int ggiMesaExtendVisual(ggi_visual_t vis, GLboolean alpha_flag,
+                       GLboolean stereo_flag, GLint depth_size,
+                       GLint stencil_size, GLint accum_red_size,
+                       GLint accum_green_size, GLint accum_blue_size,
+                       GLint accum_alpha_size, GLint num_samples)
 {
-       struct ggi_mesa_info info;
+        GLvisual *gl_vis = &(LIBGGI_MESAEXT(vis)->mesa_visual.gl_visual);
+       int r, g, b, ci;
+       GLboolean db, rgb;
+
+       get_mode_info(vis, &r, &g, &b, &rgb, &db, &ci);
+       
+       /* Initialize the visual with the provided information */       
+       _mesa_initialize_visual(&(LIBGGI_MESAEXT(vis)->mesa_visual.gl_visual),
+                               rgb, db, stereo_flag,
+                               r, g, b, 0 /* FIXME */, ci,
+                               depth_size, stencil_size,
+                               accum_red_size, accum_green_size,
+                               accum_blue_size, accum_alpha_size, 0);
+
+       /* Now fake an "API change" so the right libs get loaded. After all,
+          extending the visual by all these new buffers could be considered
+          a "mode change" which requires an "API change".
+        */
+       changed(vis, GGI_CHG_APILIST);
+       
+       return 0;
+}
+
+
+ggi_mesa_context_t ggiMesaCreateContext(ggi_visual_t vis)
+{
+       ggi_mesa_context_t ctx;
        int err;
-       uint16 r,g,b;
        ggi_color pal[256];
        int i;
-       void *func;
-       ggi_mode mode;
-       int num_buf;
 
-       GGIMESADPRINT_CORE("ggiMesaSetVisual() called\n");
+       GGIMESADPRINT_CORE("ggiMesaCreateContext() called\n");
        
-       if (!ctx) return -1;
-       if (!vis) return -1;
+       ctx = (ggi_mesa_context_t)malloc(sizeof(struct ggi_mesa_context));
+       if (!ctx) 
+               return NULL;
        
-       if (ctx->ggi_vis)
-         ggiExtensionDetach(ctx->ggi_vis, ggiMesaID);
-
-       ctx->ggi_vis=vis;
+       ctx->ggi_visual = vis;
+       ctx->color = 0;
 
-       err = ggiExtensionAttach(vis, ggiMesaID);
-       if (err < 0) 
-         return -1;
-       if (err == 0) 
-         changed(vis, GGI_CHG_APILIST);
+       ctx->gl_ctx =
+         _mesa_create_context(&(LIBGGI_MESAEXT(vis)->mesa_visual.gl_visual),
+                              NULL, (void *)ctx, GL_TRUE);
+       if (!ctx->gl_ctx)
+               goto free_context;
+       
+        _mesa_enable_sw_extensions(ctx->gl_ctx);
+       
+       _swrast_CreateContext(ctx->gl_ctx);
+       _ac_CreateContext(ctx->gl_ctx);
+       _tnl_CreateContext(ctx->gl_ctx);
+       _swsetup_CreateContext(ctx->gl_ctx);
        
-       if (ctx->gl_vis)
-         _mesa_destroy_visual(ctx->gl_vis);
-
-       if (ctx->gl_buffer)
-         _mesa_destroy_framebuffer(ctx->gl_buffer);
-
-       info.rgb_flag = rgb_flag;
-       info.db_flag = db_flag;
-
-       err = gl_ggiInitInfo(ctx, &info);
-       if (err) 
-         return -1;
-
        gl_ggiSetupPointers(ctx->gl_ctx);
 
-       func = (void *)LIBGGI_MESAEXT(ctx->ggi_vis)->setup_driver;
-
-       if (!func)
-       {
+       /* Make sure that an appropriate sublib has been loaded */
+       if (!LIBGGI_MESAEXT(ctx->ggi_visual)->setup_driver){
                GGIMESADPRINT_CORE("setup_driver==NULL!\n");
                GGIMESADPRINT_CORE("Please check your config files!\n");
-               return -1;
+               goto free_context;
        }
 
-       err = LIBGGI_MESAEXT(ctx->ggi_vis)->setup_driver(ctx, &info);
-       if (err) 
-         return -1;
-
-       ctx->gl_vis = _mesa_create_visual(info.rgb_flag,
-                                          info.db_flag,
-                                          GL_FALSE, /*stereo*/
-                                          info.red_bits, info.green_bits,
-                                          info.blue_bits, info.alpha_bits,
-                                          info.index_bits,
-                                          info.depth_bits, 
-                                          info.stencil_bits,
-                                          info.accum_bits,
-                                          info.accum_bits,
-                                          info.accum_bits,
-                                          info.accum_bits,
-                                          1);
-       if (!ctx->gl_vis) 
-       {
-               GGIMESADPRINT_CORE("Can't create gl_visual!\n");
-               return -1;
-       }
-
-       ctx->gl_buffer = _mesa_create_framebuffer(ctx->gl_vis,
-//                                            ctx->gl_vis->DepthBits > 0,
-//                                            ctx->gl_vis->StencilBits > 0,
-//                                            ctx->gl_vis->AccumRedBits > 0,
-//                                            ctx->gl_vis->AlphaBits > 0);
-                                              info.depth_bits > 0,
-                                              info.stencil_bits > 0,
-                                              info.accum_bits > 0,
-                                              info.alpha_bits > 0);
-                                              
-
-       if (!ctx->gl_buffer) 
-       {
-               GGIMESADPRINT_CORE("Can't create gl_buffer!\n");
-               return -1;
+       /* Set up the sublib driver */
+       err = LIBGGI_MESAEXT(ctx->ggi_visual)->setup_driver(ctx);
+       if (err){
+               GGIMESADPRINT_CORE("setup_driver failed (err = %d)", err);
+               goto free_gl_context;
        }
-       
-       ggiGetMode(ctx->ggi_vis, &mode);
-       ctx->width = mode.visible.x;
-       ctx->height = mode.visible.y;
-       ctx->stride = mode.virt.x;
-       ctx->origin.x = 0;
-       ctx->origin.y = 0;
-       ctx->flip_y = ctx->origin.y + ctx->height - 1; 
 
-       ctx->color = 0;
-
-       ctx->lfb[0] = ctx->lfb[1] = NULL;
-       num_buf = ggiDBGetNumBuffers(ctx->ggi_vis);
-       
-       for (i = 0; i < num_buf; i++)
-       {
-               if (ggiDBGetBuffer(ctx->ggi_vis,i)->layout == blPixelLinearBuffer)
-               {
-                       ctx->stride = ggiDBGetBuffer(ctx->ggi_vis, i)->buffer.plb.stride /
-                       (ggiDBGetBuffer(ctx->ggi_vis, i)->buffer.plb.pixelformat->size / 8);
-                       ctx->lfb[0] = ggiDBGetBuffer(ctx->ggi_vis, i)->write;
-               }
-       }
-       
-       if (ctx->lfb[0] == NULL)
-       {
-               GGIMESADPRINT_CORE("No linear frame buffer!\n");
-               return -1;
-       }
+       _mesa_read_config_file(ctx->gl_ctx);
+               
+       return ctx;
        
-       /* FIXME: Use separate buffers */
-       ctx->lfb[1] = malloc(ctx->stride * ctx->height);
-       ctx->bufsize = (ctx->stride * ctx->height);
+free_gl_context:
+       _mesa_destroy_context(ctx->gl_ctx);
+free_context:
+       free(ctx);
        
-       ctx->gl_ctx->Visual = *ctx->gl_vis;
-       ctx->gl_ctx->Pixel.ReadBuffer = 
-       ctx->gl_ctx->Color.DrawBuffer = (db_flag) ? GL_BACK : GL_FRONT;
-
-       if (GGIMesa == ctx)
-         _mesa_make_current(ctx->gl_ctx, ctx->gl_buffer);
+       return NULL;
+}
 
-       if (rgb_flag && mode.graphtype==GT_8BIT)
-       {
-               for (i = r = 0; r < 8; r++)
-                 for (g = 0; g < 8; g++)
-                   for (b = 0; b < 4; b++, i++)
-               {
-                       pal[i].r = r << (GGI_COLOR_PRECISION - 3);      
-                       pal[i].g = g << (GGI_COLOR_PRECISION - 3);      
-                       pal[i].b = b << (GGI_COLOR_PRECISION - 2);      
-               }
-               ggiSetPalette(ctx->ggi_vis, 0, 256, pal);       
-       }
+void ggiMesaDestroyContext(ggi_mesa_context_t ctx)
+{
+       GGIMESADPRINT_CORE("ggiMesaDestroyContext() called\n");
+       
+       if(!ctx)
+               return;
 
-       return 0;
+       _mesa_destroy_context(ctx->gl_ctx);
+       free(ctx);
 }
 
-void GGIMesaMakeCurrent(GGIMesaContext ctx)
+void ggiMesaMakeCurrent(ggi_mesa_context_t ctx, ggi_visual_t vis)
 {
        GGIMESADPRINT_CORE("ggiMesaMakeCurrent(ctx = %p) called\n", ctx);
+
+       /* FIXME: clean up where are ggi_vis */
+       if (ctx->ggi_visual != vis) {
+               GGIMESADPRINT_CORE("Cannot migrate GL contexts\n");
+               return;
+       }
        
-       if (!ctx->ggi_vis) 
-         return;
-       
-       GGIMesa = ctx;
-       _mesa_make_current(ctx->gl_ctx, ctx->gl_buffer);
+       _mesa_make_current(ctx->gl_ctx, &LIBGGI_MESAEXT(vis)->mesa_buffer);
        
-       if (!ctx->viewport_init)
+       if (ctx->gl_ctx->Viewport.Width == 0)
        {
-               _mesa_set_viewport(ctx->gl_ctx, 0, 0, ctx->width, ctx->height);
-               ctx->viewport_init = GL_TRUE;
+               _mesa_Viewport(0, 0,
+                              LIBGGI_MODE(vis)->visible.x,
+                              LIBGGI_MODE(vis)->visible.y);
+               ctx->gl_ctx->Scissor.Width = LIBGGI_MODE(vis)->visible.x;
+               ctx->gl_ctx->Scissor.Height = LIBGGI_MODE(vis)->visible.y;
        }
 }
 
 
-GGIMesaContext GGIMesaGetCurrentContext(void)
-{
-       GGIMESADPRINT_CORE("ggiMesaGetCurrentContext() called\n");
-       
-       return GGIMesa;
-}
-
 /*
  * Swap front/back buffers for current context if double buffered.
  */
-void GGIMesaSwapBuffers(void)
+void ggiMesaSwapBuffers(void)
 {
-       GGIMESADPRINT_CORE("ggiMesaSwapBuffers() called\n");    
+       GLcontext *ctx;
+       ggi_mesa_context_t ggi_ctx;
+       ctx = _mesa_get_current_context();
+       ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
        
-       _mesa_swapbuffers( GGIMesa->gl_ctx );
-       gl_ggiFlush(GGIMesa->gl_ctx);
+       GGIMESADPRINT_CORE("ggiMesaSwapBuffers() called\n");    
        
-//     if (GGIMesa->gl_vis->DBflag)
-//     {
-               memcpy(GGIMesa->lfb[0], GGIMesa->lfb[1], GGIMesa->bufsize);
-//     }
+       _mesa_swapbuffers(ctx);
+       gl_ggiFlush(ctx);
+
+       ggiSetDisplayFrame(ggi_ctx->ggi_visual,
+                          !ggiGetDisplayFrame(ggi_ctx->ggi_visual));
+       ggiSetWriteFrame(ggi_ctx->ggi_visual,
+                        !ggiGetWriteFrame(ggi_ctx->ggi_visual));
+       ggiSetReadFrame(ggi_ctx->ggi_visual,
+                        !ggiGetReadFrame(ggi_ctx->ggi_visual));
+
+       GGIMESADPRINT_CORE("swap disp: %d, write %d\n",
+                          ggiGetDisplayFrame(ggi_ctx->ggi_visual),
+                          ggiGetWriteFrame(ggi_ctx->ggi_visual));
 }
 
 static void gl_ggiUpdateState(GLcontext *ctx, GLuint new_state)
 {
-       void *func;
-
+       ggi_mesa_context_t ggi_ctx = (ggi_mesa_context_t)ctx->DriverCtx;
+       
        GGIMESADPRINT_CORE("gl_ggiUpdateState() called\n");
                
        /* Propogate statechange information to swrast and swrast_setup
@@ -580,104 +595,68 @@ static void gl_ggiUpdateState(GLcontext *ctx, GLuint new_state)
        _swsetup_InvalidateState(ctx, new_state);
        _tnl_InvalidateState(ctx, new_state);
        
-       func = (void *)CTX_OPMESA(ctx)->update_state;
-
-       if (!func) {
+       if (!LIBGGI_MESAEXT(ggi_ctx->ggi_visual)->update_state) {
                GGIMESADPRINT_CORE("update_state == NULL!\n");
                GGIMESADPRINT_CORE("Please check your config files!\n");
                ggiPanic("");
        }
 
-       CTX_OPMESA(ctx)->update_state(ctx);
+       LIBGGI_MESAEXT(ggi_ctx->ggi_visual)->update_state(ggi_ctx);
 }
 
 static int changed(ggi_visual_t vis, int whatchanged)
 {
+       GLcontext *ctx;
+       ctx = _mesa_get_current_context();
+
        GGIMESADPRINT_CORE("changed() called\n");
                
        switch (whatchanged)
        {
-               case GGI_CHG_APILIST:
+       case GGI_CHG_APILIST:
+       {
+               char api[256];
+               char args[256];
+               int i;
+               const char *fname;
+               ggi_dlhandle *lib;
+               GLvisual *gl_vis=&(LIBGGI_MESAEXT(vis)->mesa_visual.gl_visual);
+               GLframebuffer *gl_fb = &(LIBGGI_MESAEXT(vis)->mesa_buffer);
+               
+               /* Initialize the framebuffer to provide all necessary
+                  buffers in software. The target libraries that are loaded
+                  next are free to modify this according to their
+                  capabilities. 
+                */
+                /* FIXME: if the target changes capabilities we'll leak 
+                   swrast's memory !!! Need to deallocate first */
+               _mesa_initialize_framebuffer(gl_fb, gl_vis,
+                                        gl_vis->depthBits > 0,
+                                        gl_vis->stencilBits > 0,
+                                        gl_vis->accumRedBits > 0,
+                                        gl_vis->alphaBits > 0);
+
+               for (i = 0; ggiGetAPI(vis, i, api, args) == 0; i++)
                {
-                       char api[256];
-                       char args[256];
-                       int i;
-                       const char *fname;
-                       ggi_dlhandle *lib;
-                       
-                       for (i = 0; ggiGetAPI(vis, i, api, args) == 0; i++)
+                       strcat(api, "-mesa");
+                       fname = ggMatchConfig(_ggimesaConfigHandle, api, NULL);
+                       if (fname == NULL)
                        {
-                               strcat(api, "-mesa");
-                               fname = ggMatchConfig(_ggimesaConfigHandle, api, NULL);
-                               if (fname == NULL)
-                               {
-                                       /* No special implementation for this sublib */
-                                       continue;
-                               }
-                               lib = ggiExtensionLoadDL(vis, fname, args, NULL, GGI_SYMNAME_PREFIX);
+                               /* No special implementation for this sublib */
+                               continue;
                        }
-               } 
-               break;
-       }
-       return 0;
-}
-
-
-int ggiMesaExit(void)
-{
-       int rc;
-       
-       GGIMESADPRINT_CORE("ggiMesaExit() called\n");
-       
-       if (!_ggimesaLibIsUp)
-         return -1;
-       
-       if (_ggimesaLibIsUp > 1)
-       {
-               /* Exit only at last call */
-               _ggimesaLibIsUp--;
-               return 0;
-       }
-       
-       rc = ggiExtensionUnregister(ggiMesaID);
-       ggFreeConfig(_ggimesaConfigHandle);
-       
-       _ggimesaLibIsUp = 0;
-       
-       return rc;
-}
-
-static int _ggi_error(void)
-{
-       GGIMESADPRINT_CORE("_ggi_error() called\n");
-       
-       return -1;
-}
+                       lib = ggiExtensionLoadDL(vis, fname, args, NULL,
+                                                GGI_SYMNAME_PREFIX);
+               }
 
-int ggiMesaAttach(ggi_visual_t vis)
-{
-       int rc;
-       
-       GGIMESADPRINT_CORE("ggiMesaAttach() called\n");
-       
-       rc = ggiExtensionAttach(vis, ggiMesaID);
-       if (rc == 0)
-       {
-               /* We are creating the primary instance */
-               memset(LIBGGI_MESAEXT(vis), 0, sizeof(mesaext));
-               LIBGGI_MESAEXT(vis)->update_state = (void *)_ggi_error;
-               LIBGGI_MESAEXT(vis)->setup_driver = (void *)_ggi_error;
+               /* The targets have cleared everything they can do from 
+                  the framebuffer structure so we provide the rest in sw
+                */
+               _swrast_alloc_buffers(gl_fb);
                
-               /* Now fake an "API change" so the right libs get loaded */
-               changed(vis, GGI_CHG_APILIST);
+               break;
+       } 
        }
-       
-       return rc;
+       return 0;
 }
 
-int ggiMesaDetach(ggi_visual_t vis)
-{
-       GGIMESADPRINT_CORE("ggiMesaDetach() called\n");
-       
-       return ggiExtensionDetach(vis, ggiMesaID);
-}
index a1e67fcbbff0385a3a3e9b79b003122f734911dc..5596e765d427e9454118de9dade2a86d72e6fec8 100644 (file)
 #include <ggi/ggi.h>
 #include "GL/ggimesa.h"
 
-struct ggi_mesa_info;
+/*
+ * GGIMesa visual configuration.
+ * 
+ * This structure "derives" from Mesa's GLvisual and extends it by
+ * GGI's visual. Combination of these two structures is enough to fully
+ * describe the mode the application is currently running in.  GGI
+ * visual provides information about color configuration and buffering
+ * method, GLvisual fills the rest.
+ */
+struct ggi_mesa_visual {
+       GLvisual gl_visual;
+       ggi_visual_t ggi_visual;
+};
 
+/*
+ * GGIMesa context.
+ *
+ * GGIMesa context expands the Mesa's context (it doesn't actualy derive
+ * from it, but this ability isn't needed, and it is best if GL context
+ * creation is left up to Mesa). It also contains a reference to the GGI
+ * visual it is attached to, which is very useful for all Mesa callbacks.
+ */
 struct ggi_mesa_context
 {
        GLcontext *gl_ctx;
-       GLvisual *gl_vis;
-       GLframebuffer *gl_buffer;
+       ggi_visual_t ggi_visual;
        
-       ggi_visual_t ggi_vis;
-       ggi_coord origin;
-       int flip_y;
-       int width, height, stride;      /* Stride is in pixels */
        ggi_pixel color;                /* Current color or index*/
        ggi_pixel clearcolor;
-       void *lfb[2];                   /* Linear frame buffers */
-       int active_buffer;
-       int bufsize;
-       int viewport_init;
-};
-
-struct ggi_mesa_info
-{
-       GLboolean rgb_flag;
-       GLboolean db_flag;
-       GLboolean alpha_flag;
-       GLint index_bits;
-       GLint red_bits, green_bits, blue_bits, alpha_bits;
-       GLint depth_bits, stencil_bits, accum_bits;
+       
+       void *private;
 };
 
-extern GGIMesaContext GGIMesa; /* The current context */
-
 #define SHIFT (GGI_COLOR_PRECISION - 8)
 
-#define GGICTX ((GGIMesaContext)ctx->DriverCtx)
-#define VIS (GGICTX->ggi_vis)
-#define FLIP(y) (GGICTX->flip_y-(y))
-
-#define LFB(type,x,y) ((type *)GGICTX->lfb[0] + (x) + (y) * GGICTX->stride)
-
-#define CTX_OPMESA(ctx) \
-((struct mesa_ext *)LIBGGI_EXT(((GGIMesaContext)ctx->DriverCtx)->ggi_vis, \
-       ggiMesaID))
-
-       
 #endif
 
index ae4a3c5825a884ef3518c93cf718930a0f436b2c..da8b10f2ff90854785e19f0f4120fbcc71c2a138 100644 (file)
@@ -11,14 +11,35 @@ extern ggi_extid ggiMesaID;
 ggifunc_setmode GGIMesa_setmode;
 ggifunc_getapi GGIMesa_getapi;
 
-typedef struct mesa_ext
+typedef struct ggi_mesa_ext
 {
-       void (*update_state)(GLcontext *ctx);
-       int (*setup_driver)(GGIMesaContext ctx, struct ggi_mesa_info *info);
+       /*
+        * How mesa extends this visual; i.e., size of the depth buffer etc.
+        *
+        * By default (upon attaching) this structure is initialized to what
+        * libggi is guaranteed to handle without any help: single buffered
+        * visual without any ancilary buffers.
+        */
+       struct ggi_mesa_visual mesa_visual;
+
+       /*
+        * Mesa framebuffer is a collection of all ancilary buffers required.
+        *
+        * This structure contains the ancilary buffers provided in in
+        * software. On each mode change it is loaded with the list of
+        * required buffers and the target is expected to clear the ones
+        * it can provide in hw. The remaining ones are then provided in sw.
+        *
+        */
+       GLframebuffer mesa_buffer;
+
+       void (*update_state)(ggi_mesa_context_t ctx);
+       int (*setup_driver)(ggi_mesa_context_t ctx);
+       
        void *private;
-} mesaext;
+} ggi_mesa_ext_t;
 
-#define LIBGGI_MESAEXT(vis) ((mesaext *)LIBGGI_EXT(vis,ggiMesaID))
+#define LIBGGI_MESAEXT(vis) ((ggi_mesa_ext_t *)LIBGGI_EXT(vis,ggiMesaID))
 #define GGIMESA_PRIVATE(vis) ((LIBGGI_MESAEXT(vis)->private))
 
 #endif /* _GGI_MISC_INT_H */