i965/blorp: Make gen6 VS and GS disable helpers static
[mesa.git] / src / mesa / drivers / osmesa / osmesa.c
index 9b1e96cfc32c916a5a68434d1bd6f42ed5b00eb9..8462ab6627df77439b20358cd1d3bccdef12f724 100644 (file)
@@ -33,6 +33,7 @@
  */
 
 
+#include <stdio.h>
 #include "main/glheader.h"
 #include "GL/osmesa.h"
 #include "main/api_exec.h"
@@ -83,7 +84,7 @@ struct osmesa_context
 };
 
 
-static INLINE OSMesaContext
+static inline OSMesaContext
 OSMESA_CONTEXT(struct gl_context *ctx)
 {
    /* Just cast, since we're using structure containment */
@@ -207,7 +208,7 @@ osmesa_choose_line_function( struct gl_context *ctx )
 
    if (ctx->RenderMode != GL_RENDER ||
        ctx->Line.SmoothFlag ||
-       ctx->Texture._EnabledUnits ||
+       ctx->Texture._MaxEnabledTexImageUnit == -1 ||
        ctx->Light.ShadeModel != GL_FLAT ||
        ctx->Line.Width != 1.0F ||
        ctx->Line.StippleFlag ||
@@ -322,7 +323,7 @@ osmesa_choose_triangle_function( struct gl_context *ctx )
    if (ctx->RenderMode != GL_RENDER ||
        ctx->Polygon.SmoothFlag ||
        ctx->Polygon.StippleFlag ||
-       ctx->Texture._EnabledUnits) {
+       ctx->Texture._MaxEnabledTexImageUnit != -1) {
       return NULL;
    }
 
@@ -454,7 +455,7 @@ osmesa_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb,
             rb->Format = MESA_FORMAT_A8B8G8R8_UNORM;
       }
       else if (osmesa->DataType == GL_UNSIGNED_SHORT) {
-         rb->Format = MESA_FORMAT_RGBA_16;
+         rb->Format = MESA_FORMAT_RGBA_UNORM16;
       }
       else {
          rb->Format = MESA_FORMAT_RGBA_FLOAT32;
@@ -469,7 +470,7 @@ osmesa_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb,
       }
       else if (osmesa->DataType == GL_UNSIGNED_SHORT) {
          _mesa_warning(ctx, "Unsupported OSMesa format BGRA/GLushort");
-         rb->Format = MESA_FORMAT_RGBA_16; /* not exactly right */
+         rb->Format = MESA_FORMAT_RGBA_UNORM16; /* not exactly right */
       }
       else {
          _mesa_warning(ctx, "Unsupported OSMesa format BGRA/GLfloat");
@@ -485,7 +486,7 @@ osmesa_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb,
       }
       else if (osmesa->DataType == GL_UNSIGNED_SHORT) {
          _mesa_warning(ctx, "Unsupported OSMesa format ARGB/GLushort");
-         rb->Format = MESA_FORMAT_RGBA_16; /* not exactly right */
+         rb->Format = MESA_FORMAT_RGBA_UNORM16; /* not exactly right */
       }
       else {
          _mesa_warning(ctx, "Unsupported OSMesa format ARGB/GLfloat");
@@ -494,11 +495,11 @@ osmesa_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb,
    }
    else if (osmesa->format == OSMESA_RGB) {
       if (osmesa->DataType == GL_UNSIGNED_BYTE) {
-         rb->Format = MESA_FORMAT_RGB888;
+         rb->Format = MESA_FORMAT_BGR_UNORM8;
       }
       else if (osmesa->DataType == GL_UNSIGNED_SHORT) {
          _mesa_warning(ctx, "Unsupported OSMesa format RGB/GLushort");
-         rb->Format = MESA_FORMAT_RGBA_16; /* not exactly right */
+         rb->Format = MESA_FORMAT_RGBA_UNORM16; /* not exactly right */
       }
       else {
          _mesa_warning(ctx, "Unsupported OSMesa format RGB/GLfloat");
@@ -507,11 +508,11 @@ osmesa_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb,
    }
    else if (osmesa->format == OSMESA_BGR) {
       if (osmesa->DataType == GL_UNSIGNED_BYTE) {
-         rb->Format = MESA_FORMAT_BGR888;
+         rb->Format = MESA_FORMAT_RGB_UNORM8;
       }
       else if (osmesa->DataType == GL_UNSIGNED_SHORT) {
          _mesa_warning(ctx, "Unsupported OSMesa format BGR/GLushort");
-         rb->Format = MESA_FORMAT_RGBA_16; /* not exactly right */
+         rb->Format = MESA_FORMAT_RGBA_UNORM16; /* not exactly right */
       }
       else {
          _mesa_warning(ctx, "Unsupported OSMesa format BGR/GLfloat");
@@ -519,8 +520,8 @@ osmesa_renderbuffer_storage(struct gl_context *ctx, struct gl_renderbuffer *rb,
       }
    }
    else if (osmesa->format == OSMESA_RGB_565) {
-      ASSERT(osmesa->DataType == GL_UNSIGNED_BYTE);
-      rb->Format = MESA_FORMAT_RGB565;
+      assert(osmesa->DataType == GL_UNSIGNED_BYTE);
+      rb->Format = MESA_FORMAT_B5G6R5_UNORM;
    }
    else {
       _mesa_problem(ctx, "bad pixel format in osmesa renderbuffer_storage");
@@ -643,11 +644,101 @@ OSMesaCreateContext( GLenum format, OSMesaContext sharelist )
 GLAPI OSMesaContext GLAPIENTRY
 OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits,
                         GLint accumBits, OSMesaContext sharelist )
+{
+   int attribs[100], n = 0;
+
+   attribs[n++] = OSMESA_FORMAT;
+   attribs[n++] = format;
+   attribs[n++] = OSMESA_DEPTH_BITS;
+   attribs[n++] = depthBits;
+   attribs[n++] = OSMESA_STENCIL_BITS;
+   attribs[n++] = stencilBits;
+   attribs[n++] = OSMESA_ACCUM_BITS;
+   attribs[n++] = accumBits;
+   attribs[n++] = 0;
+
+   return OSMesaCreateContextAttribs(attribs, sharelist);
+}
+
+
+/**
+ * New in Mesa 11.2
+ *
+ * Create context with attribute list.
+ */
+GLAPI OSMesaContext GLAPIENTRY
+OSMesaCreateContextAttribs(const int *attribList, OSMesaContext sharelist)
 {
    OSMesaContext osmesa;
    struct dd_function_table functions;
    GLint rind, gind, bind, aind;
    GLint redBits = 0, greenBits = 0, blueBits = 0, alphaBits =0;
+   GLenum format = OSMESA_RGBA;
+   GLint depthBits = 0, stencilBits = 0, accumBits = 0;
+   int profile = OSMESA_COMPAT_PROFILE, version_major = 1, version_minor = 0;
+   gl_api api_profile = API_OPENGL_COMPAT;
+   int i;
+
+   for (i = 0; attribList[i]; i += 2) {
+      switch (attribList[i]) {
+      case OSMESA_FORMAT:
+         format = attribList[i+1];
+         switch (format) {
+         case OSMESA_COLOR_INDEX:
+         case OSMESA_RGBA:
+         case OSMESA_BGRA:
+         case OSMESA_ARGB:
+         case OSMESA_RGB:
+         case OSMESA_BGR:
+         case OSMESA_RGB_565:
+            /* legal */
+            break;
+         default:
+            return NULL;
+         }
+         break;
+      case OSMESA_DEPTH_BITS:
+         depthBits = attribList[i+1];
+         if (depthBits < 0)
+            return NULL;
+         break;
+      case OSMESA_STENCIL_BITS:
+         stencilBits = attribList[i+1];
+         if (stencilBits < 0)
+            return NULL;
+         break;
+      case OSMESA_ACCUM_BITS:
+         accumBits = attribList[i+1];
+         if (accumBits < 0)
+            return NULL;
+         break;
+      case OSMESA_PROFILE:
+         profile = attribList[i+1];
+         if (profile == OSMESA_COMPAT_PROFILE)
+            api_profile = API_OPENGL_COMPAT;
+         else if (profile == OSMESA_CORE_PROFILE)
+            api_profile = API_OPENGL_CORE;
+         else
+            return NULL;
+         break;
+      case OSMESA_CONTEXT_MAJOR_VERSION:
+         version_major = attribList[i+1];
+         if (version_major < 1)
+            return NULL;
+         break;
+      case OSMESA_CONTEXT_MINOR_VERSION:
+         version_minor = attribList[i+1];
+         if (version_minor < 0)
+            return NULL;
+         break;
+      case 0:
+         /* end of list */
+         break;
+      default:
+         fprintf(stderr, "Bad attribute in OSMesaCreateContextAttribs()\n");
+         return NULL;
+      }
+   }
 
    rind = gind = bind = aind = 0;
    if (format==OSMESA_RGBA) {
@@ -741,7 +832,7 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits,
       functions.UpdateState = osmesa_update_state;
 
       if (!_mesa_initialize_context(&osmesa->mesa,
-                                    API_OPENGL_COMPAT,
+                                    api_profile,
                                     osmesa->gl_visual,
                                     sharelist ? &sharelist->mesa
                                               : (struct gl_context *) NULL,
@@ -818,6 +909,13 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits,
 
          _mesa_compute_version(ctx);
 
+         if (ctx->Version < version_major * 10 + version_minor) {
+            _mesa_destroy_visual(osmesa->gl_visual);
+            _mesa_free_context_data(ctx);
+            free(osmesa);
+            return NULL;
+         }
+
          /* Exec table initialization requires the version to be computed */
          _mesa_initialize_dispatch_tables(ctx);
          _mesa_initialize_vbo_vtxfmt(ctx);
@@ -1120,10 +1218,11 @@ struct name_function
 static struct name_function functions[] = {
    { "OSMesaCreateContext", (OSMESAproc) OSMesaCreateContext },
    { "OSMesaCreateContextExt", (OSMESAproc) OSMesaCreateContextExt },
+   { "OSMesaCreateContextAttribs", (OSMESAproc) OSMesaCreateContextAttribs },
    { "OSMesaDestroyContext", (OSMESAproc) OSMesaDestroyContext },
    { "OSMesaMakeCurrent", (OSMESAproc) OSMesaMakeCurrent },
    { "OSMesaGetCurrentContext", (OSMESAproc) OSMesaGetCurrentContext },
-   { "OSMesaPixelsStore", (OSMESAproc) OSMesaPixelStore },
+   { "OSMesaPixelStore", (OSMESAproc) OSMesaPixelStore },
    { "OSMesaGetIntegerv", (OSMESAproc) OSMesaGetIntegerv },
    { "OSMesaGetDepthBuffer", (OSMESAproc) OSMesaGetDepthBuffer },
    { "OSMesaGetColorBuffer", (OSMESAproc) OSMesaGetColorBuffer },