dri/drivers: update driNewRenderbuffer() to take a gl_format
[mesa.git] / src / mesa / drivers / dri / fb / fb_dri.c
index ff307009bd5c4af77ec989ff2ccfd1840cd33589..fd869b2fe7dace1737762ee0ad9c159287f15e90 100644 (file)
 #include "drirenderbuffer.h"
 
 #include "buffers.h"
-#include "extensions.h"
-#include "framebuffer.h"
-#include "renderbuffer.h"
-#include "array_cache/acache.h"
+#include "main/extensions.h"
+#include "main/framebuffer.h"
+#include "main/renderbuffer.h"
+#include "vbo/vbo.h"
 #include "swrast/swrast.h"
 #include "swrast_setup/swrast_setup.h"
 #include "tnl/tnl.h"
-#include "tnl/t_context.h"
+#include "tnl/tcontext.h"
 #include "tnl/t_pipeline.h"
 #include "drivers/common/driverfuncs.h"
 
+void fbSetSpanFunctions(driRenderbuffer *drb, const GLvisual *vis);
 
 typedef struct {
    GLcontext *glCtx;           /* Mesa context */
@@ -70,31 +71,8 @@ typedef struct {
    
 } fbContext, *fbContextPtr;
 
-typedef struct {
-   GLframebuffer *mesa_framebuffer;
-   void *currentBuffer;
-   void *frontBuffer;
-   void *backBuffer;
-   int currentPitch;
-} fbDrawable, *fbDrawablePtr;
-
-typedef struct {
-   unsigned long hFrameBuffer;
-   int fbOrigin;
-   int fbSize;
-   int fbStride;
-   int fbWidth;
-   int fbHeight;
-   int bpp;
-   int drmFD;
-   drmAddress fbMap;
-} fbDRI, *fbDRIPtr;
-
 #define FB_CONTEXT(ctx)                ((fbContextPtr)(ctx->DriverCtx))
 
-#ifdef USE_NEW_INTERFACE
-static PFNGLXCREATECONTEXTMODES create_context_modes = NULL;
-#endif /* USE_NEW_INTERFACE */
 
 static const GLubyte *
 get_string(GLcontext *ctx, GLenum pname)
@@ -115,7 +93,7 @@ update_state( GLcontext *ctx, GLuint new_state )
    /* not much to do here - pass it on */
    _swrast_InvalidateState( ctx, new_state );
    _swsetup_InvalidateState( ctx, new_state );
-   _ac_InvalidateState( ctx, new_state );
+   _vbo_InvalidateState( ctx, new_state );
    _tnl_InvalidateState( ctx, new_state );
 }
 
@@ -136,36 +114,21 @@ get_buffer_size( GLframebuffer *buffer, GLuint *width, GLuint *height )
 
 
 static void
-viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
+updateFramebufferSize(GLcontext *ctx)
 {
-   _mesa_ResizeBuffersMESA();
+   fbContextPtr fbmesa = FB_CONTEXT(ctx);
+   struct gl_framebuffer *fb = ctx->WinSysDrawBuffer;
+   if (fbmesa->dri.drawable->w != fb->Width ||
+       fbmesa->dri.drawable->h != fb->Height) {
+      driUpdateFramebufferSize(ctx, fbmesa->dri.drawable);
+   }
 }
 
-
-/* specifies the buffer for swrast span rendering/reading */
 static void
-set_buffer( GLcontext *ctx, GLframebuffer *buffer, GLuint bufferBit )
+viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
 {
-   fbContextPtr fbdevctx = FB_CONTEXT(ctx);
-   __DRIdrawablePrivate *dPriv = fbdevctx->dri.drawable;
-   fbDrawablePtr fbdrawable = (fbDrawablePtr)dPriv->driverPrivate;
-    
-   /* What a twisted mess of private structs
-    */
-   assert(buffer == fbdrawable->mesa_framebuffer);
-
-
-   switch (bufferBit) {
-   case BUFFER_BIT_FRONT_LEFT:
-      fbdrawable->currentBuffer = fbdrawable->frontBuffer;
-      break;
-   case BUFFER_BIT_BACK_LEFT:
-      fbdrawable->currentBuffer = fbdrawable->backBuffer;
-      break;
-   default:
-      /* This happens a lot if the client renders to the frontbuffer */
-      if (0) _mesa_problem(ctx, "bad bufferBit in set_buffer()");
-   }
+   /* XXX this should be called after we acquire the DRI lock, not here */
+   updateFramebufferSize(ctx);
 }
 
 
@@ -174,7 +137,6 @@ init_core_functions( struct dd_function_table *functions )
 {
    functions->GetString = get_string;
    functions->UpdateState = update_state;
-   functions->ResizeBuffers = _mesa_resize_framebuffer;
    functions->GetBufferSize = get_buffer_size;
    functions->Viewport = viewport;
 
@@ -190,11 +152,9 @@ init_core_functions( struct dd_function_table *functions )
 #define NAME(PREFIX) PREFIX##_B8G8R8
 #define FORMAT GL_RGBA8
 #define SPAN_VARS \
-   const fbContextPtr fbdevctx = FB_CONTEXT(ctx); \
-   __DRIdrawablePrivate *dPriv = fbdevctx->dri.drawable; \
-  const fbDrawablePtr fbdrawable = (fbDrawablePtr)dPriv->driverPrivate; 
+   driRenderbuffer *drb = (driRenderbuffer *) rb;
 #define INIT_PIXEL_PTR(P, X, Y) \
-   GLubyte *P = (GLubyte *)fbdrawable->currentBuffer + (Y) * fbdrawable->currentPitch + (X) * 3
+   GLubyte *P = (GLubyte *)drb->Base.Data + (drb->Base.Height - (Y)) * drb->pitch + (X) * 3;
 #define INC_PIXEL_PTR(P) P += 3
 #define STORE_PIXEL(DST, X, Y, VALUE) \
    DST[0] = VALUE[BCOMP]; \
@@ -213,11 +173,9 @@ init_core_functions( struct dd_function_table *functions )
 #define NAME(PREFIX) PREFIX##_B8G8R8A8
 #define FORMAT GL_RGBA8
 #define SPAN_VARS \
-   const fbContextPtr fbdevctx = FB_CONTEXT(ctx); \
-   __DRIdrawablePrivate *dPriv = fbdevctx->dri.drawable; \
-  const fbDrawablePtr fbdrawable = (fbDrawablePtr)dPriv->driverPrivate; 
+   driRenderbuffer *drb = (driRenderbuffer *) rb;
 #define INIT_PIXEL_PTR(P, X, Y) \
-   GLubyte *P = (GLubyte *)fbdrawable->currentBuffer + (Y) * fbdrawable->currentPitch + (X) * 4;
+   GLubyte *P = (GLubyte *)drb->Base.Data + (drb->Base.Height - (Y)) * drb->pitch + (X) * 4;
 #define INC_PIXEL_PTR(P) P += 4
 #define STORE_PIXEL(DST, X, Y, VALUE) \
    DST[0] = VALUE[BCOMP]; \
@@ -242,11 +200,9 @@ init_core_functions( struct dd_function_table *functions )
 #define NAME(PREFIX) PREFIX##_B5G6R5
 #define FORMAT GL_RGBA8
 #define SPAN_VARS \
-   const fbContextPtr fbdevctx = FB_CONTEXT(ctx); \
-   __DRIdrawablePrivate *dPriv = fbdevctx->dri.drawable; \
-  const fbDrawablePtr fbdrawable = (fbDrawablePtr)dPriv->driverPrivate; 
+   driRenderbuffer *drb = (driRenderbuffer *) rb;
 #define INIT_PIXEL_PTR(P, X, Y) \
-   GLushort *P = (GLushort *) ((char *)fbdrawable->currentBuffer + (Y) * fbdrawable->currentPitch + (X) * 2)
+   GLushort *P = (GLushort *)drb->Base.Data + (drb->Base.Height - (Y)) * drb->pitch + (X) * 2;
 #define INC_PIXEL_PTR(P) P += 1
 #define STORE_PIXEL(DST, X, Y, VALUE) \
    DST[0] = ( (((VALUE[RCOMP]) & 0xf8) << 8) | (((VALUE[GCOMP]) & 0xfc) << 3) | ((VALUE[BCOMP]) >> 3) )
@@ -263,11 +219,9 @@ init_core_functions( struct dd_function_table *functions )
 #define NAME(PREFIX) PREFIX##_B5G5R5
 #define FORMAT GL_RGBA8
 #define SPAN_VARS \
-   const fbContextPtr fbdevctx = FB_CONTEXT(ctx); \
-   __DRIdrawablePrivate *dPriv = fbdevctx->dri.drawable; \
-  const fbDrawablePtr fbdrawable = (fbDrawablePtr)dPriv->driverPrivate; 
+   driRenderbuffer *drb = (driRenderbuffer *) rb;
 #define INIT_PIXEL_PTR(P, X, Y) \
-   GLushort *P = (GLushort *) ((char *)fbdrawable->currentBuffer + (Y) * fbdrawable->currentPitch + (X) * 2)
+   GLushort *P = (GLushort *)drb->Base.Data + (drb->Base.Height - (Y)) * drb->pitch + (X) * 2;
 #define INC_PIXEL_PTR(P) P += 1
 #define STORE_PIXEL(DST, X, Y, VALUE) \
    DST[0] = ( (((VALUE[RCOMP]) & 0xf8) << 7) | (((VALUE[GCOMP]) & 0xf8) << 2) | ((VALUE[BCOMP]) >> 3) )
@@ -284,11 +238,9 @@ init_core_functions( struct dd_function_table *functions )
 #define NAME(PREFIX) PREFIX##_CI8
 #define FORMAT GL_COLOR_INDEX8_EXT
 #define SPAN_VARS \
-   const fbContextPtr fbdevctx = FB_CONTEXT(ctx); \
-   __DRIdrawablePrivate *dPriv = fbdevctx->dri.drawable; \
-  const fbDrawablePtr fbdrawable = (fbDrawablePtr)dPriv->driverPrivate; 
+   driRenderbuffer *drb = (driRenderbuffer *) rb;
 #define INIT_PIXEL_PTR(P, X, Y) \
-   GLubyte *P = (GLubyte *)fbdrawable->currentBuffer + (Y) * fbdrawable->currentPitch + (X)
+   GLubyte *P = (GLubyte *)drb->Base.Data + (drb->Base.Height - (Y)) * drb->pitch + (X);
 #define INC_PIXEL_PTR(P) P += 1
 #define STORE_PIXEL(DST, X, Y, VALUE) \
    *DST = VALUE[0]
@@ -299,7 +251,7 @@ init_core_functions( struct dd_function_table *functions )
 
 
 
-static void
+void
 fbSetSpanFunctions(driRenderbuffer *drb, const GLvisual *vis)
 {
    ASSERT(drb->Base.InternalFormat == GL_RGBA);
@@ -363,43 +315,16 @@ fbSetSpanFunctions(driRenderbuffer *drb, const GLvisual *vis)
 static GLboolean
 fbInitDriver( __DRIscreenPrivate *sPriv )
 {
-   fbDRIPtr dri_priv = (fbDRIPtr)sPriv->pDevPriv;
-   fbDRIPtr priv;
-   int drmFD;
-   
-   drmFD = drmOpen("radeon", NULL );
-   if (drmFD < 0) {
-      fprintf(stderr, "[drm] drmOpen failed\n");
-      return GL_FALSE;
-   }
-   
-   priv = _mesa_malloc(sizeof(*priv));
-   if (!priv)
-      return GL_FALSE;
-   
-   *priv = *dri_priv;
-
-   priv->drmFD = drmFD;
-   if (drmMap(drmFD, priv->hFrameBuffer, priv->fbSize, &priv->fbMap) < 0) {
-      fprintf(stderr, "[drm] drmMap framebuffer failed\n");
-      free(priv);
-      return GL_FALSE;
-   }
-   
-   sPriv->private = priv;
+   sPriv->private = NULL;
    return GL_TRUE;
 }
 
 static void
 fbDestroyScreen( __DRIscreenPrivate *sPriv )
 {
-   fbDRIPtr priv = (fbDRIPtr)sPriv->private;
-   
-   drmUnmap(priv->fbMap, priv->fbSize);
-   drmClose(priv->drmFD);
-   _mesa_free(priv);
 }
 
+
 /* Create the device specific context.
  */
 static GLboolean
@@ -440,21 +365,12 @@ fbCreateContext( const __GLcontextModes *glVisual,
 
    /* Create module contexts */
    _swrast_CreateContext( ctx );
-   _ac_CreateContext( ctx );
+   _vbo_CreateContext( ctx );
    _tnl_CreateContext( ctx );
    _swsetup_CreateContext( ctx );
    _swsetup_Wakeup( ctx );
 
 
-   /* swrast init -- need to verify these tests - I just plucked the
-    * numbers out of the air.  (KW)
-    */
-   {
-      struct swrast_device_driver *swdd;
-      swdd = _swrast_GetDeviceDriverReference( ctx );
-      swdd->SetBuffer = set_buffer;
-   }
-
    /* use default TCL pipeline */
    {
       TNLcontext *tnl = TNL_CONTEXT(ctx);
@@ -483,7 +399,7 @@ fbDestroyContext( __DRIcontextPrivate *driContextPriv )
    if ( fbmesa ) {
       _swsetup_DestroyContext( fbmesa->glCtx );
       _tnl_DestroyContext( fbmesa->glCtx );
-      _ac_DestroyContext( fbmesa->glCtx );
+      _vbo_DestroyContext( fbmesa->glCtx );
       _swrast_DestroyContext( fbmesa->glCtx );
 
       /* free the Mesa context */
@@ -504,8 +420,7 @@ fbCreateBuffer( __DRIscreenPrivate *driScrnPriv,
                const __GLcontextModes *mesaVis,
                GLboolean isPixmap )
 {
-   fbDRIPtr spriv = (fbDRIPtr)driScrnPriv->private;
-   fbDrawablePtr fbdrawable;
+   struct gl_framebuffer *mesa_framebuffer;
    
    if (isPixmap) {
       return GL_FALSE; /* not implemented */
@@ -516,67 +431,46 @@ fbCreateBuffer( __DRIscreenPrivate *driScrnPriv,
       const GLboolean swAccum = mesaVis->accumRedBits > 0;
       const GLboolean swStencil = mesaVis->stencilBits > 0;
       
-      fbdrawable = _mesa_calloc(sizeof(*fbdrawable));
-      if (!fbdrawable)
+      mesa_framebuffer = _mesa_create_framebuffer(mesaVis);
+      if (!mesa_framebuffer)
          return 0;
-      
-#if 0
-      fbdrawable->mesa_framebuffer = (void *)
-         _mesa_create_framebuffer( mesaVis,
-                                   swDepth,
-                                   swStencil,
-                                   swAccum,
-                                   swAlpha );
-
-      if (!fbdrawable->mesa_framebuffer) {
-         _mesa_free(fbdrawable);
-         return 0;
-      }
-#else
-      fbdrawable->mesa_framebuffer = _mesa_create_framebuffer(mesaVis);
-      if (!fbdrawable->mesa_framebuffer) {
-         _mesa_free(fbdrawable);
-         return 0;
-      }
 
       /* XXX double-check these parameters (bpp vs cpp, etc) */
       {
-         driRenderbuffer *drb = driNewRenderbuffer(GL_RGBA, spriv->bpp,
-                                                   spriv->fbOrigin,
-                                                   spriv->fbStride);
+         driRenderbuffer *drb = driNewRenderbuffer(MESA_FORMAT_ARGB8888,
+                                                   driScrnPriv->pFB,
+                                                   driScrnPriv->fbBPP / 8,
+                                                   driScrnPriv->fbOrigin,
+                                                   driScrnPriv->fbStride,
+                                                   driDrawPriv);
          fbSetSpanFunctions(drb, mesaVis);
-         _mesa_add_renderbuffer(fbdrawable->mesa_framebuffer,
+         _mesa_add_renderbuffer(mesa_framebuffer,
                                 BUFFER_FRONT_LEFT, &drb->Base);
       }
       if (mesaVis->doubleBufferMode) {
          /* XXX what are the correct origin/stride values? */
-         driRenderbuffer *drb = driNewRenderbuffer(GL_RGBA, spriv->bpp,
-                                                   spriv->fbOrigin,
-                                                   spriv->fbStride);
+         GLvoid *backBuf = _mesa_malloc(driScrnPriv->fbStride
+                                        * driScrnPriv->fbHeight);
+         driRenderbuffer *drb = driNewRenderbuffer(MESA_FORMAT_ARGB8888,
+                                                   backBuf,
+                                                   driScrnPriv->fbBPP /8,
+                                                   driScrnPriv->fbOrigin,
+                                                   driScrnPriv->fbStride,
+                                                   driDrawPriv);
          fbSetSpanFunctions(drb, mesaVis);
-         _mesa_add_renderbuffer(fbdrawable->mesa_framebuffer,
+         _mesa_add_renderbuffer(mesa_framebuffer,
                                 BUFFER_BACK_LEFT, &drb->Base);
       }
 
-      _mesa_add_soft_renderbuffers(fbdrawable->mesa_framebuffer,
+      _mesa_add_soft_renderbuffers(mesa_framebuffer,
                                    GL_FALSE, /* color */
                                    swDepth,
                                    swStencil,
                                    swAccum,
-                                   swAlpha,
+                                   swAlpha, /* or always zero? */
                                    GL_FALSE /* aux */);
-
-#endif
-
-      driDrawPriv->driverPrivate = fbdrawable;
-
-      fbdrawable->frontBuffer = fbdrawable->currentBuffer = spriv->fbMap;
-      fbdrawable->currentPitch = spriv->fbWidth;
       
-      /* Replace the framebuffer back buffer with a malloc'ed one --
-       * big speedup.
-       */
-      fbdrawable->backBuffer = _mesa_malloc(fbdrawable->currentPitch * driDrawPriv->h);
+      driDrawPriv->driverPrivate = mesa_framebuffer;
 
       return 1;
    }
@@ -586,12 +480,7 @@ fbCreateBuffer( __DRIscreenPrivate *driScrnPriv,
 static void
 fbDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
 {
-   fbDrawablePtr fbdrawable = (fbDrawablePtr)driDrawPriv->driverPrivate;
-   
-   _mesa_destroy_framebuffer(fbdrawable->mesa_framebuffer);
-   _mesa_free(fbdrawable->backBuffer);
-   _mesa_free(fbdrawable);
-   driDrawPriv->driverPrivate = NULL;
+   _mesa_reference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)), NULL);
 }
 
 
@@ -601,29 +490,32 @@ fbDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
 static void
 fbSwapBuffers( __DRIdrawablePrivate *dPriv )
 {
-   fbDrawablePtr fbdrawable = (fbDrawablePtr)dPriv->driverPrivate;
+   struct gl_framebuffer *mesa_framebuffer = (struct gl_framebuffer *)dPriv->driverPrivate;
+   struct gl_renderbuffer * front_renderbuffer = mesa_framebuffer->Attachment[BUFFER_FRONT_LEFT].Renderbuffer;
+   void *frontBuffer = front_renderbuffer->Data;
+   int currentPitch = ((driRenderbuffer *)front_renderbuffer)->pitch;
+   void *backBuffer = mesa_framebuffer->Attachment[BUFFER_BACK_LEFT].Renderbuffer->Data;
 
    if (dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) {
-      fbContextPtr fbmesa;
-      GLcontext *ctx;
-      fbmesa = (fbContextPtr) dPriv->driContextPriv->driverPrivate;
-      ctx = fbmesa->glCtx;
+      fbContextPtr fbmesa = (fbContextPtr) dPriv->driContextPriv->driverPrivate;
+      GLcontext *ctx = fbmesa->glCtx;
+      
       if (ctx->Visual.doubleBufferMode) {
         int i;
         int offset = 0;
-         char *tmp = _mesa_malloc(fbdrawable->currentPitch);
+         char *tmp = _mesa_malloc(currentPitch);
 
          _mesa_notifySwapBuffers( ctx );  /* flush pending rendering comands */
 
-         ASSERT(fbdrawable->frontBuffer);
-         ASSERT(fbdrawable->backBuffer);
+         ASSERT(frontBuffer);
+         ASSERT(backBuffer);
 
         for (i = 0; i < dPriv->h; i++) {
-            _mesa_memcpy(tmp, (char *) fbdrawable->backBuffer + offset,
-                         fbdrawable->currentPitch);
-            _mesa_memcpy((char *) fbdrawable->frontBuffer + offset, tmp,
-                          fbdrawable->currentPitch);
-            offset += fbdrawable->currentPitch;
+            _mesa_memcpy(tmp, (char *) backBuffer + offset,
+                         currentPitch);
+            _mesa_memcpy((char *) frontBuffer + offset, tmp,
+                          currentPitch);
+            offset += currentPitch;
         }
            
         _mesa_free(tmp);
@@ -646,13 +538,13 @@ fbMakeCurrent( __DRIcontextPrivate *driContextPriv,
 {
    if ( driContextPriv ) {
       fbContextPtr newFbCtx = 
-        (fbContextPtr) driContextPriv->driverPrivate;
+            (fbContextPtr) driContextPriv->driverPrivate;
 
       newFbCtx->dri.drawable = driDrawPriv;
 
-      _mesa_make_current( newFbCtx->glCtx,
-                          ((fbDrawablePtr)driDrawPriv->driverPrivate)->mesa_framebuffer,
-                          ((fbDrawablePtr)driReadPriv->driverPrivate)->mesa_framebuffer);
+      _mesa_make_current( newFbCtx->glCtx, 
+                           driDrawPriv->driverPrivate,
+                           driReadPriv->driverPrivate);
    } else {
       _mesa_make_current( NULL, NULL, NULL );
    }
@@ -692,8 +584,6 @@ __driValidateMode(const DRIDriverContext *ctx )
 static int
 __driInitFBDev( struct DRIDriverContextRec *ctx )
 {
-   fbDRIPtr pfbDRI;
-   
    /* Note that drmOpen will try to load the kernel module, if needed. */
    /* we need a fbdev drm driver - it will only track maps */
    ctx->drmFD = drmOpen("radeon", NULL );
@@ -715,7 +605,8 @@ __driInitFBDev( struct DRIDriverContextRec *ctx )
       return 0;
    }
    fprintf(stderr, "[drm] added %d byte SAREA at 0x%08lx\n",
-           ctx->shared.SAREASize, ctx->shared.hSAREA);
+           ctx->shared.SAREASize,
+           (unsigned long) ctx->shared.hSAREA);
 
    if (drmMap( ctx->drmFD,
        ctx->shared.hSAREA,
@@ -727,7 +618,8 @@ __driInitFBDev( struct DRIDriverContextRec *ctx )
    }
    memset(ctx->pSAREA, 0, ctx->shared.SAREASize);
    fprintf(stderr, "[drm] mapped SAREA 0x%08lx to %p, size %d\n",
-           ctx->shared.hSAREA, ctx->pSAREA, ctx->shared.SAREASize);
+           (unsigned long) ctx->shared.hSAREA, ctx->pSAREA,
+           ctx->shared.SAREASize);
    
    /* Need to AddMap the framebuffer and mmio regions here:
    */
@@ -747,20 +639,8 @@ __driInitFBDev( struct DRIDriverContextRec *ctx )
    }
 
    fprintf(stderr, "[drm] framebuffer handle = 0x%08lx\n",
-           ctx->shared.hFrameBuffer);
-
-   pfbDRI = (fbDRIPtr)malloc(sizeof(*pfbDRI));
-   pfbDRI->hFrameBuffer = ctx->shared.hFrameBuffer;
-   pfbDRI->fbOrigin = ctx->shared.fbOrigin;
-   pfbDRI->fbSize = ctx->shared.fbSize;
-   pfbDRI->fbStride = ctx->shared.fbStride;
-   pfbDRI->fbWidth = ctx->shared.virtualWidth;
-   pfbDRI->fbHeight = ctx->shared.virtualHeight;
-   pfbDRI->bpp = ctx->bpp;
-   
-   ctx->driverClientMsg = pfbDRI;
-   ctx->driverClientMsgSize = sizeof(*pfbDRI);
-   
+           (unsigned long) ctx->shared.hFrameBuffer);
+
    return 1;
 }
 
@@ -776,10 +656,10 @@ struct DRIDriverRec __driDriver = {
    __driHaltFBDev
 };
 
-#ifdef USE_NEW_INTERFACE
 static __GLcontextModes *
-fbFillInModes( unsigned pixel_bits, unsigned depth_bits,
-                 unsigned stencil_bits, GLboolean have_back_buffer )
+fbFillInModes( __DRIscreenPrivate *psp,
+              unsigned pixel_bits, unsigned depth_bits,
+              unsigned stencil_bits, GLboolean have_back_buffer )
 {
    __GLcontextModes * modes;
    __GLcontextModes * m;
@@ -798,8 +678,8 @@ fbFillInModes( unsigned pixel_bits, unsigned depth_bits,
       GLX_NONE, GLX_SWAP_UNDEFINED_OML /*, GLX_SWAP_COPY_OML */
    };
 
-   u_int8_t depth_bits_array[2];
-   u_int8_t stencil_bits_array[2];
+   uint8_t depth_bits_array[2];
+   uint8_t stencil_bits_array[2];
 
 
    depth_bits_array[0] = depth_bits;
@@ -822,11 +702,11 @@ fbFillInModes( unsigned pixel_bits, unsigned depth_bits,
       fb_type = GL_UNSIGNED_SHORT_5_6_5;
    }
    else {
-      fb_format = GL_BGR;
+      fb_format = GL_RGBA;
       fb_type = GL_UNSIGNED_INT_8_8_8_8_REV;
    }
 
-   modes = (*create_context_modes)( num_modes, sizeof( __GLcontextModes ) );
+   modes = (*psp->contextModes->createContextModes)( num_modes, sizeof( __GLcontextModes ) );
    m = modes;
    if ( ! driFillInModes( & m, fb_format, fb_type,
           depth_bits_array, stencil_bits_array, depth_buffer_factor,
@@ -897,20 +777,11 @@ void * __driCreateNewScreen( __DRInativeDisplay *dpy, int scrn, __DRIscreen *psc
                                          frame_buffer, pSAREA, fd,
                                          internal_api_version, &fbAPI);
           if ( psp != NULL ) {
-             create_context_modes = (PFNGLXCREATECONTEXTMODES)
-                   glXGetProcAddress( (const GLubyte *) "__glXCreateContextModes" );
-             if ( create_context_modes != NULL ) {
-#if 0                
-                fbDRIPtr dri_priv = (fbDRIPtr) psp->pDevPriv;
-                *driver_modes = fbFillInModes( dri_priv->bpp,
-                      (dri_priv->bpp == 16) ? 16 : 24,
-                      (dri_priv->bpp == 16) ? 0  : 8,
-                      (dri_priv->backOffset != dri_priv->depthOffset) );
-#endif
-                *driver_modes = fbFillInModes( 24, 24, 8, 0);
-             }
+            *driver_modes = fbFillInModes( psp, psp->fbBPP,
+                                           (psp->fbBPP == 16) ? 16 : 24,
+                                           (psp->fbBPP == 16) ? 0  : 8,
+                                           1);
           }
 
           return (void *) psp;
 }
-#endif /* USE_NEW_INTERFACE */