intel: Recognize new Ivybridge PCI IDs.
[mesa.git] / src / mesa / drivers / beos / GLView.cpp
index 80af9bd4168dbc965074b6046557323ebcb002f3..57c4614f32d008ca441d070583fc511d48c849d4 100644 (file)
@@ -29,6 +29,7 @@
 extern "C" {
 
 #include "glheader.h"
+#include "version.h"
 #include "buffers.h"
 #include "bufferobj.h"
 #include "context.h"
@@ -42,14 +43,13 @@ extern "C" {
 #include "texobj.h"
 #include "teximage.h"
 #include "texstore.h"
-#include "array_cache/acache.h"
+#include "vbo/vbo.h"
 #include "swrast/swrast.h"
 #include "swrast_setup/swrast_setup.h"
 #include "swrast/s_context.h"
 #include "swrast/s_depth.h"
 #include "swrast/s_lines.h"
 #include "swrast/s_triangle.h"
-#include "swrast/s_trispan.h"
 #include "tnl/tnl.h"
 #include "tnl/t_context.h"
 #include "tnl/t_pipeline.h"
@@ -59,7 +59,7 @@ extern "C" {
 }      // extern "C"
 
 #include <interface/Screen.h>
-#include "GLView.h"
+#include <GLView.h>
 
 // BeOS component ordering for B_RGBA32 bitmap format
 #if B_HOST_IS_LENDIAN
@@ -89,6 +89,8 @@ extern "C" {
 
 #define FLIP(coord) (LIBGGI_MODE(ggi_ctx->ggi_visual)->visible.y-(coord) - 1) 
 
+const char * color_space_name(color_space space);
+
 //
 // This object hangs off of the BGLView object.  We have to use
 // Be's BGLView class as-is to maintain binary compatibility (we
@@ -101,11 +103,15 @@ friend class BGLView;
 public:
        MesaDriver();
        ~MesaDriver();
-       void Init(BGLView * bglview, GLcontext * c, GLvisual * v, GLframebuffer * b);
+       
+       void            Init(BGLView * bglview, struct gl_context * c, struct gl_config * v, struct gl_framebuffer * b);
+
+       void            LockGL();
+       void            UnlockGL();
+       void            SwapBuffers() const;
+       status_t        CopyPixelsOut(BPoint source, BBitmap *dest);
+       status_t        CopyPixelsIn(BBitmap *source, BPoint dest);
 
-       void LockGL();
-       void UnlockGL();
-       void SwapBuffers() const;
        void CopySubBuffer(GLint x, GLint y, GLuint width, GLuint height) const;
        void Draw(BRect updateRect) const;
 
@@ -113,9 +119,9 @@ private:
        MesaDriver(const MesaDriver &rhs);  // copy constructor illegal
        MesaDriver &operator=(const MesaDriver &rhs);  // assignment oper. illegal
 
-       GLcontext *     m_glcontext;
-       GLvisual *              m_glvisual;
-       GLframebuffer * m_glframebuffer;
+       struct gl_context *     m_glcontext;
+       struct gl_config *              m_glvisual;
+       struct gl_framebuffer * m_glframebuffer;
 
        BGLView *               m_bglview;
        BBitmap *               m_bitmap;
@@ -126,118 +132,120 @@ private:
        GLuint                  m_width;
        GLuint                  m_height;
        
-   // Mesa Device Driver functions
-   static void                 UpdateState(GLcontext *ctx, GLuint new_state);
-   static void                 ClearIndex(GLcontext *ctx, GLuint index);
-   static void                 ClearColor(GLcontext *ctx, const GLfloat color[4]);
-   static void                 Clear(GLcontext *ctx, GLbitfield mask,
+   // Mesa Device Driver callback functions
+   static void                 UpdateState(struct gl_context *ctx, GLuint new_state);
+   static void                 ClearIndex(struct gl_context *ctx, GLuint index);
+   static void                 ClearColor(struct gl_context *ctx, const GLfloat color[4]);
+   static void                 Clear(struct gl_context *ctx, GLbitfield mask,
                                 GLboolean all, GLint x, GLint y,
                                 GLint width, GLint height);
-   static void                 ClearFront(GLcontext *ctx, GLboolean all, GLint x, GLint y,
+   static void                 ClearFront(struct gl_context *ctx, GLboolean all, GLint x, GLint y,
                           GLint width, GLint height);
-   static void                 ClearBack(GLcontext *ctx, GLboolean all, GLint x, GLint y,
+   static void                 ClearBack(struct gl_context *ctx, GLboolean all, GLint x, GLint y,
                          GLint width, GLint height);
-   static void                 Index(GLcontext *ctx, GLuint index);
-   static void                 Color(GLcontext *ctx, GLubyte r, GLubyte g,
+   static void                 Index(struct gl_context *ctx, GLuint index);
+   static void                 Color(struct gl_context *ctx, GLubyte r, GLubyte g,
                      GLubyte b, GLubyte a);
-   static void                 SetBuffer(GLcontext *ctx, GLframebuffer *colorBuffer,
+   static void                 SetBuffer(struct gl_context *ctx, struct gl_framebuffer *colorBuffer,
                              GLenum mode);
-   static void                 GetBufferSize(GLframebuffer * framebuffer, GLuint *width,
+   static void                 GetBufferSize(struct gl_framebuffer * framebuffer, GLuint *width,
                              GLuint *height);
-   static const GLubyte *      GetString(GLcontext *ctx, GLenum name);
+   static void         Error(struct gl_context *ctx);
+   static const GLubyte *      GetString(struct gl_context *ctx, GLenum name);
+   static void          Viewport(struct gl_context *ctx, GLint x, GLint y, GLsizei w, GLsizei h);
 
    // Front-buffer functions
-   static void                 WriteRGBASpanFront(const GLcontext *ctx, GLuint n,
+   static void                 WriteRGBASpanFront(const struct gl_context *ctx, GLuint n,
                                   GLint x, GLint y,
                                   CONST GLubyte rgba[][4],
                                   const GLubyte mask[]);
-   static void                 WriteRGBSpanFront(const GLcontext *ctx, GLuint n,
+   static void                 WriteRGBSpanFront(const struct gl_context *ctx, GLuint n,
                                  GLint x, GLint y,
                                  CONST GLubyte rgba[][3],
                                  const GLubyte mask[]);
-   static void                 WriteMonoRGBASpanFront(const GLcontext *ctx, GLuint n,
+   static void                 WriteMonoRGBASpanFront(const struct gl_context *ctx, GLuint n,
                                       GLint x, GLint y,
                                       const GLchan color[4],
                                       const GLubyte mask[]);
-   static void                 WriteRGBAPixelsFront(const GLcontext *ctx, GLuint n,
+   static void                 WriteRGBAPixelsFront(const struct gl_context *ctx, GLuint n,
                                     const GLint x[], const GLint y[],
                                     CONST GLubyte rgba[][4],
                                     const GLubyte mask[]);
-   static void                 WriteMonoRGBAPixelsFront(const GLcontext *ctx, GLuint n,
+   static void                 WriteMonoRGBAPixelsFront(const struct gl_context *ctx, GLuint n,
                                         const GLint x[], const GLint y[],
                                         const GLchan color[4],
                                         const GLubyte mask[]);
-   static void                 WriteCI32SpanFront(const GLcontext *ctx, GLuint n,
+   static void                 WriteCI32SpanFront(const struct gl_context *ctx, GLuint n,
                                   GLint x, GLint y,
                                   const GLuint index[], const GLubyte mask[]);
-   static void                 WriteCI8SpanFront(const GLcontext *ctx, GLuint n,
+   static void                 WriteCI8SpanFront(const struct gl_context *ctx, GLuint n,
                                  GLint x, GLint y,
                                  const GLubyte index[], const GLubyte mask[]);
-   static void                 WriteMonoCISpanFront(const GLcontext *ctx, GLuint n,
+   static void                 WriteMonoCISpanFront(const struct gl_context *ctx, GLuint n,
                                     GLint x, GLint y,
                                     GLuint colorIndex, const GLubyte mask[]);
-   static void                 WriteCI32PixelsFront(const GLcontext *ctx,
+   static void                 WriteCI32PixelsFront(const struct gl_context *ctx,
                                     GLuint n, const GLint x[], const GLint y[],
                                     const GLuint index[], const GLubyte mask[]);
-   static void                 WriteMonoCIPixelsFront(const GLcontext *ctx, GLuint n,
+   static void                 WriteMonoCIPixelsFront(const struct gl_context *ctx, GLuint n,
                                       const GLint x[], const GLint y[],
                                       GLuint colorIndex, const GLubyte mask[]);
-   static void                 ReadCI32SpanFront(const GLcontext *ctx,
+   static void                 ReadCI32SpanFront(const struct gl_context *ctx,
                                  GLuint n, GLint x, GLint y, GLuint index[]);
-   static void                 ReadRGBASpanFront(const GLcontext *ctx, GLuint n,
+   static void                 ReadRGBASpanFront(const struct gl_context *ctx, GLuint n,
                                  GLint x, GLint y,
                                  GLubyte rgba[][4]);
-   static void                 ReadCI32PixelsFront(const GLcontext *ctx,
+   static void                 ReadCI32PixelsFront(const struct gl_context *ctx,
                                    GLuint n, const GLint x[], const GLint y[],
                                    GLuint indx[], const GLubyte mask[]);
-   static void                 ReadRGBAPixelsFront(const GLcontext *ctx,
+   static void                 ReadRGBAPixelsFront(const struct gl_context *ctx,
                                    GLuint n, const GLint x[], const GLint y[],
                                    GLubyte rgba[][4], const GLubyte mask[]);
 
    // Back buffer functions
-   static void                 WriteRGBASpanBack(const GLcontext *ctx, GLuint n,
+   static void                 WriteRGBASpanBack(const struct gl_context *ctx, GLuint n,
                                   GLint x, GLint y,
                                   CONST GLubyte rgba[][4],
                                   const GLubyte mask[]);
-   static void                 WriteRGBSpanBack(const GLcontext *ctx, GLuint n,
+   static void                 WriteRGBSpanBack(const struct gl_context *ctx, GLuint n,
                                  GLint x, GLint y,
                                  CONST GLubyte rgba[][3],
                                  const GLubyte mask[]);
-   static void                 WriteMonoRGBASpanBack(const GLcontext *ctx, GLuint n,
+   static void                 WriteMonoRGBASpanBack(const struct gl_context *ctx, GLuint n,
                                      GLint x, GLint y,
                                      const GLchan color[4],
                                      const GLubyte mask[]);
-   static void                 WriteRGBAPixelsBack(const GLcontext *ctx, GLuint n,
+   static void                 WriteRGBAPixelsBack(const struct gl_context *ctx, GLuint n,
                                    const GLint x[], const GLint y[],
                                    CONST GLubyte rgba[][4],
                                    const GLubyte mask[]);
-   static void                 WriteMonoRGBAPixelsBack(const GLcontext *ctx, GLuint n,
+   static void                 WriteMonoRGBAPixelsBack(const struct gl_context *ctx, GLuint n,
                                        const GLint x[], const GLint y[],
                                        const GLchan color[4],
                                        const GLubyte mask[]);
-   static void                 WriteCI32SpanBack(const GLcontext *ctx, GLuint n,
+   static void                 WriteCI32SpanBack(const struct gl_context *ctx, GLuint n,
                                  GLint x, GLint y,
                                  const GLuint index[], const GLubyte mask[]);
-   static void                 WriteCI8SpanBack(const GLcontext *ctx, GLuint n, GLint x, GLint y,
+   static void                 WriteCI8SpanBack(const struct gl_context *ctx, GLuint n, GLint x, GLint y,
                                 const GLubyte index[], const GLubyte mask[]);
-   static void                 WriteMonoCISpanBack(const GLcontext *ctx, GLuint n,
+   static void                 WriteMonoCISpanBack(const struct gl_context *ctx, GLuint n,
                                    GLint x, GLint y, GLuint colorIndex,
                                    const GLubyte mask[]);
-   static void                 WriteCI32PixelsBack(const GLcontext *ctx,
+   static void                 WriteCI32PixelsBack(const struct gl_context *ctx,
                                    GLuint n, const GLint x[], const GLint y[],
                                    const GLuint index[], const GLubyte mask[]);
-   static void                 WriteMonoCIPixelsBack(const GLcontext *ctx,
+   static void                 WriteMonoCIPixelsBack(const struct gl_context *ctx,
                                      GLuint n, const GLint x[], const GLint y[],
                                      GLuint colorIndex, const GLubyte mask[]);
-   static void                 ReadCI32SpanBack(const GLcontext *ctx,
+   static void                 ReadCI32SpanBack(const struct gl_context *ctx,
                                 GLuint n, GLint x, GLint y, GLuint index[]);
-   static void                 ReadRGBASpanBack(const GLcontext *ctx, GLuint n,
+   static void                 ReadRGBASpanBack(const struct gl_context *ctx, GLuint n,
                                 GLint x, GLint y,
                                 GLubyte rgba[][4]);
-   static void                 ReadCI32PixelsBack(const GLcontext *ctx,
+   static void                 ReadCI32PixelsBack(const struct gl_context *ctx,
                                   GLuint n, const GLint x[], const GLint y[],
                                   GLuint indx[], const GLubyte mask[]);
-   static void                 ReadRGBAPixelsBack(const GLcontext *ctx,
+   static void                 ReadRGBAPixelsBack(const struct gl_context *ctx,
                                   GLuint n, const GLint x[], const GLint y[],
                                   GLubyte rgba[][4], const GLubyte mask[]);
 
@@ -258,7 +266,7 @@ private:
 BGLView::BGLView(BRect rect, char *name,
                  ulong resizingMode, ulong mode,
                  ulong options)
-   : BView(rect, name, resizingMode, mode | B_WILL_DRAW | B_FRAME_EVENTS) //  | B_FULL_UPDATE_ON_RESIZE)
+   : BView(rect, name, B_FOLLOW_ALL_SIDES, mode | B_WILL_DRAW | B_FRAME_EVENTS) //  | B_FULL_UPDATE_ON_RESIZE)
 {
        // We don't support single buffering (yet): double buffering forced.
        options |= BGL_DOUBLE;
@@ -288,11 +296,9 @@ BGLView::BGLView(BRect rect, char *name,
    MesaDriver * md = new MesaDriver();
 
    // examine option flags and create gl_context struct
-   GLvisual * visual = _mesa_create_visual( rgbFlag,
-                                            dblFlag,
+   struct gl_config * visual = _mesa_create_visual( dblFlag,
                                             stereoFlag,
                                             red, green, blue, alpha,
-                                            index,
                                             depth,
                                             stencil,
                                             accum, accum, accum, accum,
@@ -308,9 +314,12 @@ BGLView::BGLView(BRect rect, char *name,
        functions.Clear                 = md->Clear;
        functions.ClearIndex    = md->ClearIndex;
        functions.ClearColor    = md->ClearColor;
+       functions.Error                 = md->Error;
+        functions.Viewport      = md->Viewport;
 
        // create core context
-       GLcontext *ctx = _mesa_create_context(visual, NULL, &functions, md);
+       struct gl_context *ctx = _mesa_create_context(API_OPENGL, visual,
+                                                      NULL, &functions, md);
        if (! ctx) {
          _mesa_destroy_visual(visual);
          delete md;
@@ -323,7 +332,7 @@ BGLView::BGLView(BRect rect, char *name,
 
 
    // create core framebuffer
-   GLframebuffer * buffer = _mesa_create_framebuffer(visual,
+   struct gl_framebuffer * buffer = _mesa_create_framebuffer(visual,
                                               depth > 0 ? GL_TRUE : GL_FALSE,
                                               stencil > 0 ? GL_TRUE: GL_FALSE,
                                               accum > 0 ? GL_TRUE : GL_FALSE,
@@ -333,7 +342,7 @@ BGLView::BGLView(BRect rect, char *name,
    /* Initialize the software rasterizer and helper modules.
     */
    _swrast_CreateContext(ctx);
-   _ac_CreateContext(ctx);
+   _vbo_CreateContext(ctx);
    _tnl_CreateContext(ctx);
    _swsetup_CreateContext(ctx);
    _swsetup_Wakeup(ctx);
@@ -394,8 +403,6 @@ void BGLView::SwapBuffers(bool vSync)
 }
 
 
-
-
 #if 0
 void BGLView::CopySubBufferMESA(GLint x, GLint y, GLuint width, GLuint height)
 {
@@ -407,31 +414,36 @@ void BGLView::CopySubBufferMESA(GLint x, GLint y, GLuint width, GLuint height)
 
 BView *        BGLView::EmbeddedView()
 {
-   // TODO
        return NULL;
 }
 
 status_t BGLView::CopyPixelsOut(BPoint source, BBitmap *dest)
 {
-   // TODO
-       printf("BGLView::CopyPixelsOut() not implemented yet!\n");
-       return B_UNSUPPORTED;
-}
+       if (! dest || ! dest->Bounds().IsValid())
+               return B_BAD_VALUE;
 
+       MesaDriver * md = (MesaDriver *) m_gc;
+       assert(md);
+       return md->CopyPixelsOut(source, dest);
+}
 
 status_t BGLView::CopyPixelsIn(BBitmap *source, BPoint dest)
 {
-   // TODO
-       printf("BGLView::CopyPixelsIn() not implemented yet!\n");
-       return B_UNSUPPORTED;
+       if (! source || ! source->Bounds().IsValid())
+               return B_BAD_VALUE;
+
+       MesaDriver * md = (MesaDriver *) m_gc;
+       assert(md);
+       return md->CopyPixelsIn(source, dest);
 }
 
+
 void BGLView::ErrorCallback(unsigned long errorCode) // Mesa's GLenum is not ulong but uint!
 {
        char msg[32];
        sprintf(msg, "GL: Error code $%04lx.", errorCode);
        // debugger(msg);
-       printf("%s\n", msg);
+       fprintf(stderr, "%s\n", msg);
        return;
 }
 
@@ -496,13 +508,11 @@ void BGLView::SetResizingMode(uint32 mode)
 
 void BGLView::Show()
 {
-//   printf("BGLView Show\n");
    BView::Show();
 }
 
 void BGLView::Hide()
 {
-//   printf("BGLView Hide\n");
    BView::Hide();
 }
 
@@ -557,8 +567,7 @@ void BGLView::EnableDirectMode( bool enabled )
 }
 
 
-
-//---- private methods ----------
+//---- virtual reserved methods ----------
 
 void BGLView::_ReservedGLView1() {}
 void BGLView::_ReservedGLView2() {}
@@ -570,20 +579,21 @@ void BGLView::_ReservedGLView7() {}
 void BGLView::_ReservedGLView8() {}
 
 #if 0
+// Not implemented!!!
+
 BGLView::BGLView(const BGLView &v)
        : BView(v)
 {
    // XXX not sure how this should work
    printf("Warning BGLView::copy constructor not implemented\n");
 }
-#endif
-
 
 BGLView &BGLView::operator=(const BGLView &v)
 {
    printf("Warning BGLView::operator= not implemented\n");
        return *this;
 }
+#endif
 
 void BGLView::dither_front()
 {
@@ -653,11 +663,12 @@ MesaDriver::~MesaDriver()
    _mesa_destroy_visual(m_glvisual);
    _mesa_destroy_framebuffer(m_glframebuffer);
    _mesa_destroy_context(m_glcontext);
-
+   
+   delete m_bitmap;
 }
 
 
-void MesaDriver::Init(BGLView * bglview, GLcontext * ctx, GLvisual * visual, GLframebuffer * framebuffer)
+void MesaDriver::Init(BGLView * bglview, struct gl_context * ctx, struct gl_config * visual, struct gl_framebuffer * framebuffer)
 {
        m_bglview               = bglview;
        m_glcontext     = ctx;
@@ -669,6 +680,8 @@ void MesaDriver::Init(BGLView * bglview, GLcontext * ctx, GLvisual * visual, GLf
        TNLcontext * tnl = TNL_CONTEXT(ctx);
 
        assert(md->m_glcontext == ctx );
+       assert(tnl);
+       assert(swdd);
 
        // Use default TCL pipeline
        tnl->Driver.RunPipeline = _tnl_run_pipeline;
@@ -722,6 +735,78 @@ void MesaDriver::CopySubBuffer(GLint x, GLint y, GLuint width, GLuint height) co
    }
 }
 
+status_t MesaDriver::CopyPixelsOut(BPoint location, BBitmap *bitmap)
+{
+       color_space scs = m_bitmap->ColorSpace();
+       color_space dcs = bitmap->ColorSpace();
+
+       if (scs != dcs && (scs != B_RGBA32 || dcs != B_RGB32)) {
+               printf("CopyPixelsOut(): incompatible color space: %s != %s\n",
+                       color_space_name(scs),
+                       color_space_name(dcs));
+               return B_BAD_TYPE;
+       }
+       
+       // debugger("CopyPixelsOut()");
+       
+       BRect sr = m_bitmap->Bounds();
+       BRect dr = bitmap->Bounds();
+
+       sr = sr & dr.OffsetBySelf(location);
+       dr = sr.OffsetByCopy(-location.x, -location.y); 
+       
+       uint8 *ps = (uint8 *) m_bitmap->Bits();
+       uint8 *pd = (uint8 *) bitmap->Bits();
+       uint32 *s, *d;
+       uint32 y;
+       for (y = (uint32) sr.top; y <= (uint32) sr.bottom; y++) {
+               s = (uint32 *) (ps + y * m_bitmap->BytesPerRow());
+               s += (uint32) sr.left;
+               
+               d = (uint32 *) (pd + (y + (uint32) (dr.top - sr.top)) * bitmap->BytesPerRow());
+               d += (uint32) dr.left;
+               
+               memcpy(d, s, dr.IntegerWidth() * 4);
+       }
+       return B_OK;
+}
+
+status_t MesaDriver::CopyPixelsIn(BBitmap *bitmap, BPoint location)
+{
+       color_space scs = bitmap->ColorSpace();
+       color_space dcs = m_bitmap->ColorSpace();
+
+       if (scs != dcs && (dcs != B_RGBA32 || scs != B_RGB32)) {
+               printf("CopyPixelsIn(): incompatible color space: %s != %s\n",
+                       color_space_name(scs),
+                       color_space_name(dcs));
+               return B_BAD_TYPE;
+       }
+       
+       // debugger("CopyPixelsIn()");
+
+       BRect sr = bitmap->Bounds();
+       BRect dr = m_bitmap->Bounds();
+
+       sr = sr & dr.OffsetBySelf(location);
+       dr = sr.OffsetByCopy(-location.x, -location.y); 
+       
+       uint8 *ps = (uint8 *) bitmap->Bits();
+       uint8 *pd = (uint8 *) m_bitmap->Bits();
+       uint32 *s, *d;
+       uint32 y;
+       for (y = (uint32) sr.top; y <= (uint32) sr.bottom; y++) {
+               s = (uint32 *) (ps + y * bitmap->BytesPerRow());
+               s += (uint32) sr.left;
+               
+               d = (uint32 *) (pd + (y + (uint32) (dr.top - sr.top)) * m_bitmap->BytesPerRow());
+               d += (uint32) dr.left;
+               
+               memcpy(d, s, dr.IntegerWidth() * 4);
+       }
+       return B_OK;
+}
+
 
 void MesaDriver::Draw(BRect updateRect) const
 {
@@ -730,16 +815,23 @@ void MesaDriver::Draw(BRect updateRect) const
 }
 
 
-void MesaDriver::UpdateState( GLcontext *ctx, GLuint new_state )
+void MesaDriver::Error(struct gl_context *ctx)
+{
+       MesaDriver *md = (MesaDriver *) ctx->DriverCtx;
+       if (md && md->m_bglview)
+               md->m_bglview->ErrorCallback((unsigned long) ctx->ErrorValue);
+}
+
+void MesaDriver::UpdateState( struct gl_context *ctx, GLuint new_state )
 {
        struct swrast_device_driver *   swdd = _swrast_GetDeviceDriverReference( ctx );
 
        _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 );
 
-       if (ctx->Color.DrawBuffer == GL_FRONT) {
+       if (ctx->Color.DrawBuffer[0] == GL_FRONT) {
       /* read/write front buffer */
       swdd->WriteRGBASpan = MesaDriver::WriteRGBASpanFront;
       swdd->WriteRGBSpan = MesaDriver::WriteRGBSpanFront;
@@ -776,14 +868,14 @@ void MesaDriver::UpdateState( GLcontext *ctx, GLuint new_state )
 }
 
 
-void MesaDriver::ClearIndex(GLcontext *ctx, GLuint index)
+void MesaDriver::ClearIndex(struct gl_context *ctx, GLuint index)
 {
    MesaDriver *md = (MesaDriver *) ctx->DriverCtx;
    md->m_clear_index = index;
 }
 
 
-void MesaDriver::ClearColor(GLcontext *ctx, const GLfloat color[4])
+void MesaDriver::ClearColor(struct gl_context *ctx, const GLfloat color[4])
 {
    MesaDriver *md = (MesaDriver *) ctx->DriverCtx;
    CLAMPED_FLOAT_TO_CHAN(md->m_clear_color[BE_RCOMP], color[0]);
@@ -794,7 +886,7 @@ void MesaDriver::ClearColor(GLcontext *ctx, const GLfloat color[4])
 }
 
 
-void MesaDriver::Clear(GLcontext *ctx, GLbitfield mask,
+void MesaDriver::Clear(struct gl_context *ctx, GLbitfield mask,
                                GLboolean all, GLint x, GLint y,
                                GLint width, GLint height)
 {
@@ -811,7 +903,7 @@ void MesaDriver::Clear(GLcontext *ctx, GLbitfield mask,
 }
 
 
-void MesaDriver::ClearFront(GLcontext *ctx,
+void MesaDriver::ClearFront(struct gl_context *ctx,
                          GLboolean all, GLint x, GLint y,
                          GLint width, GLint height)
 {
@@ -855,7 +947,7 @@ void MesaDriver::ClearFront(GLcontext *ctx,
 }
 
 
-void MesaDriver::ClearBack(GLcontext *ctx,
+void MesaDriver::ClearBack(struct gl_context *ctx,
                         GLboolean all, GLint x, GLint y,
                         GLint width, GLint height)
 {
@@ -892,7 +984,7 @@ void MesaDriver::ClearBack(GLcontext *ctx,
 }
 
 
-void MesaDriver::SetBuffer(GLcontext *ctx, GLframebuffer *buffer,
+void MesaDriver::SetBuffer(struct gl_context *ctx, struct gl_framebuffer *buffer,
                             GLenum mode)
 {
    /* TODO */
@@ -901,7 +993,7 @@ void MesaDriver::SetBuffer(GLcontext *ctx, GLframebuffer *buffer,
        (void) mode;
 }
 
-void MesaDriver::GetBufferSize(GLframebuffer * framebuffer, GLuint *width,
+void MesaDriver::GetBufferSize(struct gl_framebuffer * framebuffer, GLuint *width,
                             GLuint *height)
 {
    GET_CURRENT_CONTEXT(ctx);
@@ -936,11 +1028,18 @@ void MesaDriver::GetBufferSize(GLframebuffer * framebuffer, GLuint *width,
 }
 
 
-const GLubyte *MesaDriver::GetString(GLcontext *ctx, GLenum name)
+void MesaDriver::Viewport(struct gl_context *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
+{
+   /* poll for window size change and realloc software Z/stencil/etc if needed */
+   _mesa_ResizeBuffersMESA();
+}
+
+
+const GLubyte *MesaDriver::GetString(struct gl_context *ctx, GLenum name)
 {
    switch (name) {
       case GL_RENDERER:
-         return (const GLubyte *) "Mesa BGLView (software)";
+         return (const GLubyte *) "Mesa " MESA_VERSION_STRING " powered BGLView (software)";
       default:
          // Let core library handle all other cases
          return NULL;
@@ -958,7 +1057,7 @@ inline void Plot(BGLView *bglview, int x, int y)
 }
 
 
-void MesaDriver::WriteRGBASpanFront(const GLcontext *ctx, GLuint n,
+void MesaDriver::WriteRGBASpanFront(const struct gl_context *ctx, GLuint n,
                                  GLint x, GLint y,
                                  CONST GLubyte rgba[][4],
                                  const GLubyte mask[])
@@ -983,7 +1082,7 @@ void MesaDriver::WriteRGBASpanFront(const GLcontext *ctx, GLuint n,
    }
 }
 
-void MesaDriver::WriteRGBSpanFront(const GLcontext *ctx, GLuint n,
+void MesaDriver::WriteRGBSpanFront(const struct gl_context *ctx, GLuint n,
                                 GLint x, GLint y,
                                 CONST GLubyte rgba[][3],
                                 const GLubyte mask[])
@@ -1008,7 +1107,7 @@ void MesaDriver::WriteRGBSpanFront(const GLcontext *ctx, GLuint n,
    }
 }
 
-void MesaDriver::WriteMonoRGBASpanFront(const GLcontext *ctx, GLuint n,
+void MesaDriver::WriteMonoRGBASpanFront(const struct gl_context *ctx, GLuint n,
                                      GLint x, GLint y,
                                      const GLchan color[4],
                                      const GLubyte mask[])
@@ -1032,7 +1131,7 @@ void MesaDriver::WriteMonoRGBASpanFront(const GLcontext *ctx, GLuint n,
    }
 }
 
-void MesaDriver::WriteRGBAPixelsFront(const GLcontext *ctx,
+void MesaDriver::WriteRGBAPixelsFront(const struct gl_context *ctx,
                                    GLuint n, const GLint x[], const GLint y[],
                                    CONST GLubyte rgba[][4],
                                    const GLubyte mask[] )
@@ -1057,7 +1156,7 @@ void MesaDriver::WriteRGBAPixelsFront(const GLcontext *ctx,
 }
 
 
-void MesaDriver::WriteMonoRGBAPixelsFront(const GLcontext *ctx, GLuint n,
+void MesaDriver::WriteMonoRGBAPixelsFront(const struct gl_context *ctx, GLuint n,
                                        const GLint x[], const GLint y[],
                                        const GLchan color[4],
                                        const GLubyte mask[])
@@ -1082,21 +1181,21 @@ void MesaDriver::WriteMonoRGBAPixelsFront(const GLcontext *ctx, GLuint n,
 }
 
 
-void MesaDriver::WriteCI32SpanFront( const GLcontext *ctx, GLuint n, GLint x, GLint y,
+void MesaDriver::WriteCI32SpanFront( const struct gl_context *ctx, GLuint n, GLint x, GLint y,
                              const GLuint index[], const GLubyte mask[] )
 {
        printf("WriteCI32SpanFront() not implemented yet!\n");
    // TODO
 }
 
-void MesaDriver::WriteCI8SpanFront( const GLcontext *ctx, GLuint n, GLint x, GLint y,
+void MesaDriver::WriteCI8SpanFront( const struct gl_context *ctx, GLuint n, GLint x, GLint y,
                             const GLubyte index[], const GLubyte mask[] )
 {
        printf("WriteCI8SpanFront() not implemented yet!\n");
    // TODO
 }
 
-void MesaDriver::WriteMonoCISpanFront( const GLcontext *ctx, GLuint n,
+void MesaDriver::WriteMonoCISpanFront( const struct gl_context *ctx, GLuint n,
                                     GLint x, GLint y,
                                     GLuint colorIndex, const GLubyte mask[] )
 {
@@ -1105,7 +1204,7 @@ void MesaDriver::WriteMonoCISpanFront( const GLcontext *ctx, GLuint n,
 }
 
 
-void MesaDriver::WriteCI32PixelsFront( const GLcontext *ctx, GLuint n,
+void MesaDriver::WriteCI32PixelsFront( const struct gl_context *ctx, GLuint n,
                                     const GLint x[], const GLint y[],
                                     const GLuint index[], const GLubyte mask[] )
 {
@@ -1113,7 +1212,7 @@ void MesaDriver::WriteCI32PixelsFront( const GLcontext *ctx, GLuint n,
    // TODO
 }
 
-void MesaDriver::WriteMonoCIPixelsFront( const GLcontext *ctx, GLuint n,
+void MesaDriver::WriteMonoCIPixelsFront( const struct gl_context *ctx, GLuint n,
                                       const GLint x[], const GLint y[],
                                       GLuint colorIndex, const GLubyte mask[] )
 {
@@ -1122,7 +1221,7 @@ void MesaDriver::WriteMonoCIPixelsFront( const GLcontext *ctx, GLuint n,
 }
 
 
-void MesaDriver::ReadCI32SpanFront( const GLcontext *ctx,
+void MesaDriver::ReadCI32SpanFront( const struct gl_context *ctx,
                                  GLuint n, GLint x, GLint y, GLuint index[] )
 {
        printf("ReadCI32SpanFront() not implemented yet!\n");
@@ -1130,7 +1229,7 @@ void MesaDriver::ReadCI32SpanFront( const GLcontext *ctx,
 }
 
 
-void MesaDriver::ReadRGBASpanFront( const GLcontext *ctx, GLuint n,
+void MesaDriver::ReadRGBASpanFront( const struct gl_context *ctx, GLuint n,
                                  GLint x, GLint y, GLubyte rgba[][4] )
 {
        printf("ReadRGBASpanFront() not implemented yet!\n");
@@ -1138,7 +1237,7 @@ void MesaDriver::ReadRGBASpanFront( const GLcontext *ctx, GLuint n,
 }
 
 
-void MesaDriver::ReadCI32PixelsFront( const GLcontext *ctx,
+void MesaDriver::ReadCI32PixelsFront( const struct gl_context *ctx,
                                    GLuint n, const GLint x[], const GLint y[],
                                    GLuint indx[], const GLubyte mask[] )
 {
@@ -1147,7 +1246,7 @@ void MesaDriver::ReadCI32PixelsFront( const GLcontext *ctx,
 }
 
 
-void MesaDriver::ReadRGBAPixelsFront( const GLcontext *ctx,
+void MesaDriver::ReadRGBAPixelsFront( const struct gl_context *ctx,
                                    GLuint n, const GLint x[], const GLint y[],
                                    GLubyte rgba[][4], const GLubyte mask[] )
 {
@@ -1158,7 +1257,7 @@ void MesaDriver::ReadRGBAPixelsFront( const GLcontext *ctx,
 
 
 
-void MesaDriver::WriteRGBASpanBack(const GLcontext *ctx, GLuint n,
+void MesaDriver::WriteRGBASpanBack(const struct gl_context *ctx, GLuint n,
                                  GLint x, GLint y,
                                  CONST GLubyte rgba[][4],
                                  const GLubyte mask[])
@@ -1188,7 +1287,7 @@ void MesaDriver::WriteRGBASpanBack(const GLcontext *ctx, GLuint n,
  }
 
 
-void MesaDriver::WriteRGBSpanBack(const GLcontext *ctx, GLuint n,
+void MesaDriver::WriteRGBSpanBack(const struct gl_context *ctx, GLuint n,
                                 GLint x, GLint y,
                                 CONST GLubyte rgb[][3],
                                 const GLubyte mask[])
@@ -1220,7 +1319,7 @@ void MesaDriver::WriteRGBSpanBack(const GLcontext *ctx, GLuint n,
 
 
 
-void MesaDriver::WriteMonoRGBASpanBack(const GLcontext *ctx, GLuint n,
+void MesaDriver::WriteMonoRGBASpanBack(const struct gl_context *ctx, GLuint n,
                                     GLint x, GLint y,
                                     const GLchan color[4], const GLubyte mask[])
 {
@@ -1248,7 +1347,7 @@ void MesaDriver::WriteMonoRGBASpanBack(const GLcontext *ctx, GLuint n,
 }
 
 
-void MesaDriver::WriteRGBAPixelsBack(const GLcontext *ctx,
+void MesaDriver::WriteRGBAPixelsBack(const struct gl_context *ctx,
                                    GLuint n, const GLint x[], const GLint y[],
                                    CONST GLubyte rgba[][4],
                                    const GLubyte mask[] )
@@ -1295,7 +1394,7 @@ void MesaDriver::WriteRGBAPixelsBack(const GLcontext *ctx,
 }
 
 
-void MesaDriver::WriteMonoRGBAPixelsBack(const GLcontext *ctx, GLuint n,
+void MesaDriver::WriteMonoRGBAPixelsBack(const struct gl_context *ctx, GLuint n,
                                       const GLint x[], const GLint y[],
                                       const GLchan color[4],
                                       const GLubyte mask[])
@@ -1338,7 +1437,7 @@ void MesaDriver::WriteMonoRGBAPixelsBack(const GLcontext *ctx, GLuint n,
 }
 
 
-void MesaDriver::WriteCI32SpanBack( const GLcontext *ctx, GLuint n,
+void MesaDriver::WriteCI32SpanBack( const struct gl_context *ctx, GLuint n,
                                  GLint x, GLint y,
                                  const GLuint index[], const GLubyte mask[] )
 {
@@ -1346,7 +1445,7 @@ void MesaDriver::WriteCI32SpanBack( const GLcontext *ctx, GLuint n,
    // TODO
 }
 
-void MesaDriver::WriteCI8SpanBack( const GLcontext *ctx, GLuint n,
+void MesaDriver::WriteCI8SpanBack( const struct gl_context *ctx, GLuint n,
                                 GLint x, GLint y,
                                 const GLubyte index[], const GLubyte mask[] )
 {
@@ -1354,7 +1453,7 @@ void MesaDriver::WriteCI8SpanBack( const GLcontext *ctx, GLuint n,
   // TODO
 }
 
-void MesaDriver::WriteMonoCISpanBack( const GLcontext *ctx, GLuint n,
+void MesaDriver::WriteMonoCISpanBack( const struct gl_context *ctx, GLuint n,
                                    GLint x, GLint y,
                                    GLuint colorIndex, const GLubyte mask[] )
 {
@@ -1363,7 +1462,7 @@ void MesaDriver::WriteMonoCISpanBack( const GLcontext *ctx, GLuint n,
 }
 
 
-void MesaDriver::WriteCI32PixelsBack( const GLcontext *ctx, GLuint n,
+void MesaDriver::WriteCI32PixelsBack( const struct gl_context *ctx, GLuint n,
                                    const GLint x[], const GLint y[],
                                    const GLuint index[], const GLubyte mask[] )
 {
@@ -1371,7 +1470,7 @@ void MesaDriver::WriteCI32PixelsBack( const GLcontext *ctx, GLuint n,
    // TODO
 }
 
-void MesaDriver::WriteMonoCIPixelsBack( const GLcontext *ctx, GLuint n,
+void MesaDriver::WriteMonoCIPixelsBack( const struct gl_context *ctx, GLuint n,
                                      const GLint x[], const GLint y[],
                                      GLuint colorIndex, const GLubyte mask[] )
 {
@@ -1380,7 +1479,7 @@ void MesaDriver::WriteMonoCIPixelsBack( const GLcontext *ctx, GLuint n,
 }
 
 
-void MesaDriver::ReadCI32SpanBack( const GLcontext *ctx,
+void MesaDriver::ReadCI32SpanBack( const struct gl_context *ctx,
                                 GLuint n, GLint x, GLint y, GLuint index[] )
 {
        printf("ReadCI32SpanBack() not implemented yet!\n");
@@ -1388,7 +1487,7 @@ void MesaDriver::ReadCI32SpanBack( const GLcontext *ctx,
 }
 
 
-void MesaDriver::ReadRGBASpanBack( const GLcontext *ctx, GLuint n,
+void MesaDriver::ReadRGBASpanBack( const struct gl_context *ctx, GLuint n,
                                 GLint x, GLint y, GLubyte rgba[][4] )
 {
    MesaDriver *md = (MesaDriver *) ctx->DriverCtx;
@@ -1408,7 +1507,7 @@ void MesaDriver::ReadRGBASpanBack( const GLcontext *ctx, GLuint n,
 }
 
 
-void MesaDriver::ReadCI32PixelsBack( const GLcontext *ctx,
+void MesaDriver::ReadCI32PixelsBack( const struct gl_context *ctx,
                                    GLuint n, const GLint x[], const GLint y[],
                                    GLuint indx[], const GLubyte mask[] )
 {
@@ -1417,7 +1516,7 @@ void MesaDriver::ReadCI32PixelsBack( const GLcontext *ctx,
 }
 
 
-void MesaDriver::ReadRGBAPixelsBack( const GLcontext *ctx,
+void MesaDriver::ReadRGBAPixelsBack( const struct gl_context *ctx,
                                   GLuint n, const GLint x[], const GLint y[],
                                   GLubyte rgba[][4], const GLubyte mask[] )
 {
@@ -1448,5 +1547,27 @@ void MesaDriver::ReadRGBAPixelsBack( const GLcontext *ctx,
    };
 }
 
+const char * color_space_name(color_space space)
+{
+#define C2N(a) case a: return #a
+
+       switch (space) {
+       C2N(B_RGB24);
+       C2N(B_RGB32);
+       C2N(B_RGBA32);
+       C2N(B_RGB32_BIG);
+       C2N(B_RGBA32_BIG);
+       C2N(B_GRAY8);
+       C2N(B_GRAY1);
+       C2N(B_RGB16);
+       C2N(B_RGB15);
+       C2N(B_RGBA15);
+       C2N(B_CMAP8);
+       default:
+               return "Unknown!";
+       };
+
+#undef C2N
+};