Merge branch 'llvm-cliptest-viewport'
[mesa.git] / src / mesa / drivers / fbdev / glfbdev.c
index e95a424698c4d41928d162d158864a93adb6a8a4..5195bca97fa5e5437f4aaa5ddc742200d19e9bdf 100644 (file)
 
 #ifdef USE_GLFBDEV_DRIVER
 
-#include "glheader.h"
-#include <linux/fb.h>
 #include "GL/glfbdev.h"
-#include "buffers.h"
-#include "context.h"
-#include "extensions.h"
-#include "fbobject.h"
-#include "framebuffer.h"
-#include "imports.h"
-#include "renderbuffer.h"
-#include "texformat.h"
-#include "teximage.h"
-#include "texstore.h"
+#include <linux/fb.h>
+#include "main/glheader.h"
+#include "main/buffers.h"
+#include "main/context.h"
+#include "main/extensions.h"
+#include "main/fbobject.h"
+#include "main/framebuffer.h"
+#include "main/imports.h"
+#include "main/renderbuffer.h"
+#include "main/texformat.h"
+#include "main/teximage.h"
+#include "main/texstore.h"
 #include "vbo/vbo.h"
 #include "swrast/swrast.h"
 #include "swrast_setup/swrast_setup.h"
 #define PF_B8G8R8A8   2
 #define PF_B5G6R5     3
 #define PF_B5G5R5     4
-#define PF_CI8        5
 
 
 /**
- * Derived from Mesa's GLvisual class.
+ * Derived from Mesa's struct gl_config class.
  */
 struct GLFBDevVisualRec {
-   GLvisual glvisual;              /* base class */
+   struct gl_config glvisual;              /* base class */
    struct fb_fix_screeninfo fix;
    struct fb_var_screeninfo var;
    int pixelFormat;
 };
 
 /**
- * Derived from Mesa's GLframebuffer class.
+ * Derived from Mesa's struct gl_framebuffer class.
  */
 struct GLFBDevBufferRec {
-   GLframebuffer glframebuffer;    /* base class */
+   struct gl_framebuffer glframebuffer;    /* base class */
    GLFBDevVisualPtr visual;
    struct fb_fix_screeninfo fix;
    struct fb_var_screeninfo var;
@@ -96,10 +95,10 @@ struct GLFBDevBufferRec {
 };
 
 /**
- * Derived from Mesa's GLcontext class.
+ * Derived from Mesa's struct gl_context class.
  */
 struct GLFBDevContextRec {
-   GLcontext glcontext;            /* base class */
+   struct gl_context glcontext;            /* base class */
    GLFBDevVisualPtr visual;
    GLFBDevBufferPtr drawBuffer;
    GLFBDevBufferPtr readBuffer;
@@ -123,7 +122,7 @@ struct GLFBDevRenderbufferRec {
 
 
 static const GLubyte *
-get_string(GLcontext *ctx, GLenum pname)
+get_string(struct gl_context *ctx, GLenum pname)
 {
    (void) ctx;
    switch (pname) {
@@ -136,7 +135,7 @@ get_string(GLcontext *ctx, GLenum pname)
 
 
 static void
-update_state( GLcontext *ctx, GLuint new_state )
+update_state( struct gl_context *ctx, GLuint new_state )
 {
    /* not much to do here - pass it on */
    _swrast_InvalidateState( ctx, new_state );
@@ -147,7 +146,7 @@ update_state( GLcontext *ctx, GLuint new_state )
 
 
 static void
-get_buffer_size( GLframebuffer *buffer, GLuint *width, GLuint *height )
+get_buffer_size( struct gl_framebuffer *buffer, GLuint *width, GLuint *height )
 {
    const GLFBDevBufferPtr fbdevbuffer = (GLFBDevBufferPtr) buffer;
    *width = fbdevbuffer->var.xres;
@@ -160,10 +159,10 @@ get_buffer_size( GLframebuffer *buffer, GLuint *width, GLuint *height )
  * framebuffer size has changed (and update corresponding state).
  */
 static void
-viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
+viewport(struct gl_context *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
 {
    GLuint newWidth, newHeight;
-   GLframebuffer *buffer;
+   struct gl_framebuffer *buffer;
 
    buffer = ctx->WinSysDrawBuffer;
    get_buffer_size( buffer, &newWidth, &newHeight );
@@ -217,6 +216,10 @@ viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
    DST[1] = VALUE[GCOMP];  \
    DST[2] = VALUE[RCOMP];  \
    DST[3] = VALUE[ACOMP]
+#define STORE_PIXEL_RGB(DST, X, Y, VALUE) \
+   DST[0] = VALUE[BCOMP];  \
+   DST[1] = VALUE[GCOMP];  \
+   DST[2] = VALUE[RCOMP];
 #define FETCH_PIXEL(DST, SRC) \
    DST[RCOMP] = SRC[2];  \
    DST[GCOMP] = SRC[1];  \
@@ -264,25 +267,6 @@ viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
 #include "swrast/s_spantemp.h"
 
 
-/* 8-bit color index */
-#define NAME(PREFIX) PREFIX##_CI8
-#define CI_MODE
-#define RB_TYPE GLubyte
-#define SPAN_VARS \
-   struct GLFBDevRenderbufferRec *frb = (struct GLFBDevRenderbufferRec *) rb;
-#define INIT_PIXEL_PTR(P, X, Y) \
-   GLubyte *P = frb->bottom - (Y) * frb->rowStride + (X)
-#define INC_PIXEL_PTR(P) P += 1
-#define STORE_PIXEL(DST, X, Y, VALUE) \
-   *DST = VALUE[0]
-#define FETCH_PIXEL(DST, SRC) \
-   DST = SRC[0]
-
-#include "swrast/s_spantemp.h"
-
-
-
-
 /**********************************************************************/
 /* Public API functions                                               */
 /**********************************************************************/
@@ -330,7 +314,7 @@ glFBDevGetProcAddress( const char *procName )
    };
    const struct name_address *entry;
    for (entry = functions; entry->name; entry++) {
-      if (_mesa_strcmp(entry->name, procName) == 0) {
+      if (strcmp(entry->name, procName) == 0) {
          return entry->func;
       }
    }
@@ -345,9 +329,9 @@ glFBDevCreateVisual( const struct fb_fix_screeninfo *fixInfo,
 {
    GLFBDevVisualPtr vis;
    const int *attrib;
-   GLboolean rgbFlag = GL_TRUE, dbFlag = GL_FALSE, stereoFlag = GL_FALSE;
+   GLboolean dbFlag = GL_FALSE, stereoFlag = GL_FALSE;
    GLint redBits = 0, greenBits = 0, blueBits = 0, alphaBits = 0;
-   GLint indexBits = 0, depthBits = 0, stencilBits = 0;
+   GLint depthBits = 0, stencilBits = 0;
    GLint accumRedBits = 0, accumGreenBits = 0;
    GLint accumBlueBits = 0, accumAlphaBits = 0;
    GLint numSamples = 0;
@@ -367,9 +351,6 @@ glFBDevCreateVisual( const struct fb_fix_screeninfo *fixInfo,
       case GLFBDEV_DOUBLE_BUFFER:
          dbFlag = GL_TRUE;
          break;
-      case GLFBDEV_COLOR_INDEX:
-         rgbFlag = GL_FALSE;
-         break;
       case GLFBDEV_DEPTH_SIZE:
          depthBits = attrib[1];
          attrib++;
@@ -390,74 +371,61 @@ glFBDevCreateVisual( const struct fb_fix_screeninfo *fixInfo,
          numSamples = attrib[1];
          attrib++;
          break;
+      case GLFBDEV_COLOR_INDEX:
+         /* Mesa no longer supports color-index rendering. */
       default:
          /* unexpected token */
-         _mesa_free(vis);
+         free(vis);
          return NULL;
       }
    }
 
-   if (rgbFlag) {
-      redBits   = varInfo->red.length;
-      greenBits = varInfo->green.length;
-      blueBits  = varInfo->blue.length;
-      alphaBits = varInfo->transp.length;
-
-      if (fixInfo->visual == FB_VISUAL_TRUECOLOR ||
-          fixInfo->visual == FB_VISUAL_DIRECTCOLOR) {
-         if (varInfo->bits_per_pixel == 24
-             && varInfo->red.offset == 16
-             && varInfo->green.offset == 8
-             && varInfo->blue.offset == 0) {
-            vis->pixelFormat = PF_B8G8R8;
-         }
-         else if (varInfo->bits_per_pixel == 32
-                  && varInfo->red.offset == 16
-                  && varInfo->green.offset == 8
-                  && varInfo->blue.offset == 0) {
-            vis->pixelFormat = PF_B8G8R8A8;
-         }
-         else if (varInfo->bits_per_pixel == 16
-                  && varInfo->red.offset == 11
-                  && varInfo->green.offset == 5
-                  && varInfo->blue.offset == 0) {
-            vis->pixelFormat = PF_B5G6R5;
-         }
-         else if (varInfo->bits_per_pixel == 16
-                  && varInfo->red.offset == 10
-                  && varInfo->green.offset == 5
-                  && varInfo->blue.offset == 0) {
-            vis->pixelFormat = PF_B5G5R5;
-         }
-         else {
-            _mesa_problem(NULL, "Unsupported fbdev RGB visual/bitdepth!\n");
-            _mesa_free(vis);
-            return NULL;
-         }
+   redBits   = varInfo->red.length;
+   greenBits = varInfo->green.length;
+   blueBits  = varInfo->blue.length;
+   alphaBits = varInfo->transp.length;
+
+   if (fixInfo->visual == FB_VISUAL_TRUECOLOR ||
+       fixInfo->visual == FB_VISUAL_DIRECTCOLOR) {
+      if (varInfo->bits_per_pixel == 24
+          && varInfo->red.offset == 16
+          && varInfo->green.offset == 8
+          && varInfo->blue.offset == 0) {
+         vis->pixelFormat = PF_B8G8R8;
       }
-   }
-   else {
-      indexBits = varInfo->bits_per_pixel;
-      if ((fixInfo->visual == FB_VISUAL_PSEUDOCOLOR ||
-           fixInfo->visual == FB_VISUAL_STATIC_PSEUDOCOLOR)
-          && varInfo->bits_per_pixel == 8) {
-         vis->pixelFormat = PF_CI8;
+      else if (varInfo->bits_per_pixel == 32
+               && varInfo->red.offset == 16
+               && varInfo->green.offset == 8
+               && varInfo->blue.offset == 0) {
+         vis->pixelFormat = PF_B8G8R8A8;
+      }
+      else if (varInfo->bits_per_pixel == 16
+               && varInfo->red.offset == 11
+               && varInfo->green.offset == 5
+               && varInfo->blue.offset == 0) {
+         vis->pixelFormat = PF_B5G6R5;
+      }
+      else if (varInfo->bits_per_pixel == 16
+               && varInfo->red.offset == 10
+               && varInfo->green.offset == 5
+               && varInfo->blue.offset == 0) {
+         vis->pixelFormat = PF_B5G5R5;
       }
       else {
-         _mesa_problem(NULL, "Unsupported fbdev CI visual/bitdepth!\n");
-         _mesa_free(vis);
+         _mesa_problem(NULL, "Unsupported fbdev RGB visual/bitdepth!\n");
+         free(vis);
          return NULL;
       }
    }
 
-   if (!_mesa_initialize_visual(&vis->glvisual, rgbFlag, dbFlag, stereoFlag,
+   if (!_mesa_initialize_visual(&vis->glvisual, dbFlag, stereoFlag,
                                 redBits, greenBits, blueBits, alphaBits,
-                                indexBits, depthBits, stencilBits,
+                                depthBits, stencilBits,
                                 accumRedBits, accumGreenBits,
                                 accumBlueBits, accumAlphaBits,
                                 numSamples)) {
       /* something was invalid */
-      _mesa_free(vis);
+      free(vis);
       return NULL;
    }
 
@@ -469,7 +437,7 @@ void
 glFBDevDestroyVisual( GLFBDevVisualPtr visual )
 {
    if (visual)
-      _mesa_free(visual);
+      free(visual);
 }
 
 
@@ -488,14 +456,14 @@ delete_renderbuffer(struct gl_renderbuffer *rb)
 {
    struct GLFBDevRenderbufferRec *frb = (struct GLFBDevRenderbufferRec *) rb;
    if (frb->mallocedBuffer) {
-      _mesa_free(frb->Base.Data);
+      free(frb->Base.Data);
    }
-   _mesa_free(frb);
+   free(frb);
 }
 
 
 static GLboolean
-renderbuffer_storage(GLcontext *ctx, struct gl_renderbuffer *rb,
+renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb,
                      GLenum internalFormat, GLuint width, GLuint height)
 {
    /* no-op: the renderbuffer storage is allocated just once when it's
@@ -554,23 +522,9 @@ new_glfbdev_renderbuffer(void *bufferStart, const GLFBDevVisualPtr visual)
          rb->Base.PutValues = put_values_B5G5R5;
          rb->Base.PutMonoValues = put_mono_values_B5G5R5;
       }
-      else if (pixelFormat == PF_CI8) {
-         rb->Base.GetRow = get_row_CI8;
-         rb->Base.GetValues = get_values_CI8;
-         rb->Base.PutRow = put_row_CI8;
-         rb->Base.PutMonoRow = put_mono_row_CI8;
-         rb->Base.PutValues = put_values_CI8;
-         rb->Base.PutMonoValues = put_mono_values_CI8;
-      }
 
-      if (pixelFormat == PF_CI8) {
-         rb->Base.InternalFormat = GL_COLOR_INDEX8_EXT;
-         rb->Base._BaseFormat = GL_COLOR_INDEX;
-      }
-      else {
-         rb->Base.InternalFormat = GL_RGBA;
-         rb->Base._BaseFormat = GL_RGBA;
-      }
+      rb->Base.InternalFormat = GL_RGBA;
+      rb->Base._BaseFormat = GL_RGBA;
       rb->Base.DataType = GL_UNSIGNED_BYTE;
       rb->Base.Data = bufferStart;
 
@@ -581,10 +535,12 @@ new_glfbdev_renderbuffer(void *bufferStart, const GLFBDevVisualPtr visual)
       rb->Base.Width = visual->var.xres;
       rb->Base.Height = visual->var.yres;
 
+      /*
       rb->Base.RedBits = visual->var.red.length;
       rb->Base.GreenBits = visual->var.green.length;
       rb->Base.BlueBits = visual->var.blue.length;
       rb->Base.AlphaBits = visual->var.transp.length;
+      */
 
       rb->Base.InternalFormat = pixelFormat;
    }
@@ -626,7 +582,7 @@ glFBDevCreateBuffer( const struct fb_fix_screeninfo *fixInfo,
       return NULL;
 
    /* basic framebuffer setup */
-   _mesa_initialize_framebuffer(&buf->glframebuffer, &visual->glvisual);
+   _mesa_initialize_window_framebuffer(&buf->glframebuffer, &visual->glvisual);
    /* add front renderbuffer */
    frontrb = new_glfbdev_renderbuffer(frontBuffer, visual);
    _mesa_add_renderbuffer(&buf->glframebuffer, BUFFER_FRONT_LEFT,
@@ -636,10 +592,10 @@ glFBDevCreateBuffer( const struct fb_fix_screeninfo *fixInfo,
       const int malloced = !backBuffer;
       if (malloced) {
          /* malloc a back buffer */
-         backBuffer = _mesa_malloc(size);
+         backBuffer = malloc(size);
          if (!backBuffer) {
             _mesa_free_framebuffer_data(&buf->glframebuffer);
-            _mesa_free(buf);
+            free(buf);
             return NULL;
          }
       }
@@ -685,7 +641,7 @@ glFBDevDestroyBuffer( GLFBDevBufferPtr buffer )
       }
       {
          struct gl_framebuffer *fb = &buffer->glframebuffer;
-         _mesa_unreference_framebuffer(&fb);
+         _mesa_reference_framebuffer(&fb, NULL);
       }
    }
 }
@@ -742,7 +698,7 @@ glFBDevSwapBuffers( GLFBDevBufferPtr buffer )
 
    ASSERT(frontrb->Base.Data);
    ASSERT(backrb->Base.Data);
-   _mesa_memcpy(frontrb->Base.Data, backrb->Base.Data, buffer->size);
+   memcpy(frontrb->Base.Data, backrb->Base.Data, buffer->size);
 }
 
 
@@ -750,7 +706,7 @@ GLFBDevContextPtr
 glFBDevCreateContext( const GLFBDevVisualPtr visual, GLFBDevContextPtr share )
 {
    GLFBDevContextPtr ctx;
-   GLcontext *glctx;
+   struct gl_context *glctx;
    struct dd_function_table functions;
 
    ASSERT(visual);
@@ -769,14 +725,14 @@ glFBDevCreateContext( const GLFBDevVisualPtr visual, GLFBDevContextPtr share )
    if (!_mesa_initialize_context(&ctx->glcontext, &visual->glvisual,
                                  share ? &share->glcontext : NULL,
                                  &functions, (void *) ctx)) {
-      _mesa_free(ctx);
+      free(ctx);
       return NULL;
    }
 
    ctx->visual = visual;
 
    /* Create module contexts */
-   glctx = (GLcontext *) &ctx->glcontext;
+   glctx = (struct gl_context *) &ctx->glcontext;
    _swrast_CreateContext( glctx );
    _vbo_CreateContext( glctx );
    _tnl_CreateContext( glctx );
@@ -790,6 +746,11 @@ glFBDevCreateContext( const GLFBDevVisualPtr visual, GLFBDevContextPtr share )
    }
 
    _mesa_enable_sw_extensions(glctx);
+   _mesa_enable_1_3_extensions(glctx);
+   _mesa_enable_1_4_extensions(glctx);
+   _mesa_enable_1_5_extensions(glctx);
+   _mesa_enable_2_0_extensions(glctx);
+   _mesa_enable_2_1_extensions(glctx);
 
    return ctx;
 }
@@ -801,7 +762,7 @@ glFBDevDestroyContext( GLFBDevContextPtr context )
    GLFBDevContextPtr fbdevctx = glFBDevGetCurrentContext();
 
    if (context) {
-      GLcontext *mesaCtx = &context->glcontext;
+      struct gl_context *mesaCtx = &context->glcontext;
 
       _swsetup_DestroyContext( mesaCtx );
       _swrast_DestroyContext( mesaCtx );
@@ -813,7 +774,7 @@ glFBDevDestroyContext( GLFBDevContextPtr context )
          _mesa_make_current(NULL, NULL, NULL);
       }
       _mesa_free_context_data(&context->glcontext);
-      _mesa_free(context);
+      free(context);
    }
 }