dri: Change __DriverApiRec::CreateContext to take a struct for attribs
authorNeil Roberts <neil@linux.intel.com>
Wed, 1 Oct 2014 19:00:46 +0000 (20:00 +0100)
committerAdam Jackson <ajax@redhat.com>
Mon, 6 Nov 2017 21:09:02 +0000 (16:09 -0500)
Previously the CreateContext method of __DriverApiRec took a set of
arguments to describe the attribute values from the window system API's
CreateContextAttribs function. As more attributes get added this could
quickly get unworkable and every new attribute needs a modification for
every driver.

To fix that, pass the attribute values in a struct instead.  The struct
has a bitmask to specify which members are used. The first three members
(two for the GL version and one for the flags) are always set. If the
bit is not set in the attribute mask then it can be assumed the
attribute has the default value. Drivers will error if unknown bits in
the mask are set.

Reviewed-by: Adam Jackson <ajax@redhat.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
Signed-off-by: Neil Roberts <neil@linux.intel.com>
14 files changed:
src/gallium/state_trackers/dri/dri_context.c
src/gallium/state_trackers/dri/dri_context.h
src/mesa/drivers/dri/common/dri_util.c
src/mesa/drivers/dri/common/dri_util.h
src/mesa/drivers/dri/i915/intel_screen.c
src/mesa/drivers/dri/i965/brw_context.c
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/nouveau/nouveau_context.c
src/mesa/drivers/dri/nouveau/nouveau_context.h
src/mesa/drivers/dri/r200/r200_context.c
src/mesa/drivers/dri/r200/r200_context.h
src/mesa/drivers/dri/radeon/radeon_context.c
src/mesa/drivers/dri/radeon/radeon_context.h
src/mesa/drivers/dri/swrast/swrast.c

index 8776aacc093bee20ad8eab89a58d237bb611175a..d3a57322af39ea4c7f7b2e0a1042fa73a6677b57 100644 (file)
 
 GLboolean
 dri_create_context(gl_api api, const struct gl_config * visual,
-                  __DRIcontext * cPriv,
-                  unsigned major_version,
-                  unsigned minor_version,
-                  uint32_t flags,
-                   bool notify_reset,
-                   unsigned priority,
-                  unsigned *error,
-                  void *sharedContextPrivate)
+                   __DRIcontext * cPriv,
+                   const struct __DriverContextConfig *ctx_config,
+                   unsigned *error,
+                   void *sharedContextPrivate)
 {
    __DRIscreen *sPriv = cPriv->driScreenPriv;
    struct dri_screen *screen = dri_screen(sPriv);
@@ -61,18 +57,21 @@ dri_create_context(gl_api api, const struct gl_config * visual,
    unsigned allowed_flags = __DRI_CTX_FLAG_DEBUG |
                             __DRI_CTX_FLAG_FORWARD_COMPATIBLE |
                             __DRI_CTX_FLAG_NO_ERROR;
+   unsigned allowed_attribs = 0;
    const __DRIbackgroundCallableExtension *backgroundCallable =
       screen->sPriv->dri2.backgroundCallable;
 
-   if (screen->has_reset_status_query)
+   if (screen->has_reset_status_query) {
       allowed_flags |= __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS;
+      allowed_attribs |= __DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY;
+   }
 
-   if (flags & ~allowed_flags) {
+   if (ctx_config->flags & ~allowed_flags) {
       *error = __DRI_CTX_ERROR_UNKNOWN_FLAG;
       goto fail;
    }
 
-   if (!screen->has_reset_status_query && notify_reset) {
+   if (ctx_config->attribute_mask & ~allowed_attribs) {
       *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE;
       goto fail;
    }
@@ -89,10 +88,10 @@ dri_create_context(gl_api api, const struct gl_config * visual,
    case API_OPENGL_CORE:
       attribs.profile = api == API_OPENGL_COMPAT ? ST_PROFILE_DEFAULT
                                                  : ST_PROFILE_OPENGL_CORE;
-      attribs.major = major_version;
-      attribs.minor = minor_version;
+      attribs.major = ctx_config->major_version;
+      attribs.minor = ctx_config->minor_version;
 
-      if ((flags & __DRI_CTX_FLAG_FORWARD_COMPATIBLE) != 0)
+      if ((ctx_config->flags & __DRI_CTX_FLAG_FORWARD_COMPATIBLE) != 0)
         attribs.flags |= ST_CONTEXT_FLAG_FORWARD_COMPATIBLE;
       break;
    default:
@@ -100,16 +99,17 @@ dri_create_context(gl_api api, const struct gl_config * visual,
       goto fail;
    }
 
-   if ((flags & __DRI_CTX_FLAG_DEBUG) != 0)
+   if ((ctx_config->flags & __DRI_CTX_FLAG_DEBUG) != 0)
       attribs.flags |= ST_CONTEXT_FLAG_DEBUG;
 
-   if (flags & __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS)
+   if (ctx_config->flags & __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS)
       attribs.flags |= ST_CONTEXT_FLAG_ROBUST_ACCESS;
 
-   if (notify_reset)
-      attribs.flags |= ST_CONTEXT_FLAG_RESET_NOTIFICATION_ENABLED;
+   if (ctx_config->attribute_mask & __DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY)
+      if (ctx_config->reset_strategy != __DRI_CTX_RESET_NO_NOTIFICATION)
+         attribs.flags |= ST_CONTEXT_FLAG_RESET_NOTIFICATION_ENABLED;
 
-   if (flags & __DRI_CTX_FLAG_NO_ERROR)
+   if (ctx_config->flags & __DRI_CTX_FLAG_NO_ERROR)
       attribs.flags |= ST_CONTEXT_FLAG_NO_ERROR;
 
    if (sharedContextPrivate) {
index afa9c49ff3b804746007d5e207b97f511b81ac01..96e21e0695c7f339417bc8a18b7b0d8de5c5373b 100644 (file)
@@ -84,15 +84,11 @@ dri_get_current(__DRIscreen * driScreenPriv);
 
 boolean
 dri_create_context(gl_api api,
-                  const struct gl_config * visual,
-                  __DRIcontext * driContextPriv,
-                  unsigned major_version,
-                  unsigned minor_version,
-                  uint32_t flags,
-                  bool notify_reset,
-                   unsigned priority,
-                  unsigned *error,
-                  void *sharedContextPrivate);
+                   const struct gl_config * visual,
+                   __DRIcontext * driContextPriv,
+                   const struct __DriverContextConfig *ctx_config,
+                   unsigned *error,
+                   void *sharedContextPrivate);
 
 #endif
 
index 1cff0ddb2de6094afa9c977cabc5f9d12960d41b..dc5260ca5b9715748299f55fecd9edf621b02d74 100644 (file)
@@ -302,11 +302,13 @@ driCreateContextAttribs(__DRIscreen *screen, int api,
     const struct gl_config *modes = (config != NULL) ? &config->modes : NULL;
     void *shareCtx = (shared != NULL) ? shared->driverPrivate : NULL;
     gl_api mesa_api;
-    unsigned major_version = 1;
-    unsigned minor_version = 0;
-    uint32_t flags = 0;
-    bool notify_reset = false;
-    unsigned priority = __DRI_CTX_PRIORITY_MEDIUM;
+    struct __DriverContextConfig ctx_config;
+
+    ctx_config.major_version = 1;
+    ctx_config.minor_version = 0;
+    ctx_config.flags = 0;
+    ctx_config.attribute_mask = 0;
+    ctx_config.priority = __DRI_CTX_PRIORITY_MEDIUM;
 
     assert((num_attribs == 0) || (attribs != NULL));
 
@@ -337,20 +339,27 @@ driCreateContextAttribs(__DRIscreen *screen, int api,
     for (unsigned i = 0; i < num_attribs; i++) {
        switch (attribs[i * 2]) {
        case __DRI_CTX_ATTRIB_MAJOR_VERSION:
-           major_version = attribs[i * 2 + 1];
+            ctx_config.major_version = attribs[i * 2 + 1];
            break;
        case __DRI_CTX_ATTRIB_MINOR_VERSION:
-           minor_version = attribs[i * 2 + 1];
+           ctx_config.minor_version = attribs[i * 2 + 1];
            break;
        case __DRI_CTX_ATTRIB_FLAGS:
-           flags = attribs[i * 2 + 1];
+           ctx_config.flags = attribs[i * 2 + 1];
            break;
         case __DRI_CTX_ATTRIB_RESET_STRATEGY:
-            notify_reset = (attribs[i * 2 + 1]
-                            != __DRI_CTX_RESET_NO_NOTIFICATION);
+            if (attribs[i * 2 + 1] != __DRI_CTX_RESET_NO_NOTIFICATION) {
+                ctx_config.attribute_mask |=
+                    __DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY;
+                ctx_config.reset_strategy = attribs[i * 2 + 1];
+            } else {
+                ctx_config.attribute_mask &=
+                    ~__DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY;
+            }
             break;
        case __DRI_CTX_ATTRIB_PRIORITY:
-           priority = attribs[i * 2 + 1];
+            ctx_config.attribute_mask |= __DRIVER_CONTEXT_ATTRIB_PRIORITY;
+           ctx_config.priority = attribs[i * 2 + 1];
            break;
        default:
            /* We can't create a context that satisfies the requirements of an
@@ -366,12 +375,14 @@ driCreateContextAttribs(__DRIscreen *screen, int api,
      * compatibility profile.  This means that we treat a API_OPENGL_COMPAT 3.1 as
      * API_OPENGL_CORE and reject API_OPENGL_COMPAT 3.2+.
      */
-    if (mesa_api == API_OPENGL_COMPAT && major_version == 3 && minor_version == 1)
+    if (mesa_api == API_OPENGL_COMPAT &&
+        ctx_config.major_version == 3 && ctx_config.minor_version == 1)
        mesa_api = API_OPENGL_CORE;
 
     if (mesa_api == API_OPENGL_COMPAT
-        && ((major_version > 3)
-            || (major_version == 3 && minor_version >= 2))) {
+        && ((ctx_config.major_version > 3)
+            || (ctx_config.major_version == 3 &&
+                ctx_config.minor_version >= 2))) {
        *error = __DRI_CTX_ERROR_BAD_API;
        return NULL;
     }
@@ -406,9 +417,9 @@ driCreateContextAttribs(__DRIscreen *screen, int api,
      */
     if (mesa_api != API_OPENGL_COMPAT
         && mesa_api != API_OPENGL_CORE
-        && (flags & ~(__DRI_CTX_FLAG_DEBUG |
-                     __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS |
-                     __DRI_CTX_FLAG_NO_ERROR))) {
+        && (ctx_config.flags & ~(__DRI_CTX_FLAG_DEBUG |
+                                 __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS |
+                                 __DRI_CTX_FLAG_NO_ERROR))) {
        *error = __DRI_CTX_ERROR_BAD_FLAG;
        return NULL;
     }
@@ -424,7 +435,7 @@ driCreateContextAttribs(__DRIscreen *screen, int api,
      *
      * In Mesa, a debug context is the same as a regular context.
      */
-    if ((flags & __DRI_CTX_FLAG_FORWARD_COMPATIBLE) != 0) {
+    if ((ctx_config.flags & __DRI_CTX_FLAG_FORWARD_COMPATIBLE) != 0) {
        mesa_api = API_OPENGL_CORE;
     }
 
@@ -432,13 +443,15 @@ driCreateContextAttribs(__DRIscreen *screen, int api,
                                     | __DRI_CTX_FLAG_FORWARD_COMPATIBLE
                                     | __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS
                                     | __DRI_CTX_FLAG_NO_ERROR);
-    if (flags & ~allowed_flags) {
+    if (ctx_config.flags & ~allowed_flags) {
        *error = __DRI_CTX_ERROR_UNKNOWN_FLAG;
        return NULL;
     }
 
     if (!validate_context_version(screen, mesa_api,
-                                  major_version, minor_version, error))
+                                  ctx_config.major_version,
+                                  ctx_config.minor_version,
+                                  error))
        return NULL;
 
     context = calloc(1, sizeof *context);
@@ -454,9 +467,7 @@ driCreateContextAttribs(__DRIscreen *screen, int api,
     context->driReadablePriv = NULL;
 
     if (!screen->driver->CreateContext(mesa_api, modes, context,
-                                       major_version, minor_version,
-                                       flags, notify_reset, priority,
-                                       error, shareCtx)) {
+                                       &ctx_config, error, shareCtx)) {
         free(context);
         return NULL;
     }
index ecc2a4750739bff1917170a3a6083f0119ff615d..13d07dd51301398528bacf28cecad5b1a4d1dce9 100644 (file)
@@ -67,6 +67,37 @@ extern const __DRIswrastExtension driSWRastExtension;
 extern const __DRIdri2Extension driDRI2Extension;
 extern const __DRI2configQueryExtension dri2ConfigQueryExtension;
 extern const __DRIcopySubBufferExtension driCopySubBufferExtension;
+
+/**
+ * Description of the attributes used to create a config.
+ *
+ * This is passed as the context_config parameter to CreateContext. The idea
+ * with this struct is that it can be extended without having to modify all of
+ * the drivers. The first three members (major/minor_version and flags) are
+ * always valid, but the remaining members are only valid if the corresponding
+ * flag is set for the attribute. If the flag is not set then the default
+ * value should be assumed. That way the driver can quickly check if any
+ * attributes were set that it doesn't understand and report an error.
+ */
+struct __DriverContextConfig {
+    /* These members are always valid */
+    unsigned major_version;
+    unsigned minor_version;
+    uint32_t flags;
+
+    /* Flags describing which of the remaining members are valid */
+    uint32_t attribute_mask;
+
+    /* Only valid if __DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY is set */
+    int reset_strategy;
+
+    /* Only valid if __DRIVER_CONTEXT_PRIORITY is set */
+    unsigned priority;
+};
+
+#define __DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY  (1 << 0)
+#define __DRIVER_CONTEXT_ATTRIB_PRIORITY        (1 << 1)
+
 /**
  * Driver callback functions.
  *
@@ -85,11 +116,7 @@ struct __DriverAPIRec {
     GLboolean (*CreateContext)(gl_api api,
                                const struct gl_config *glVis,
                                __DRIcontext *driContextPriv,
-                               unsigned major_version,
-                               unsigned minor_version,
-                               uint32_t flags,
-                               bool notify_reset,
-                               unsigned priority,
+                               const struct __DriverContextConfig *ctx_config,
                                unsigned *error,
                                void *sharedContextPrivate);
 
index 1621a6246bae279526dc5703114592d1cf4ae096..5024a69bd4160dcfc403a51765b077d0fa901752 100644 (file)
@@ -958,11 +958,7 @@ static GLboolean
 intelCreateContext(gl_api api,
                    const struct gl_config * mesaVis,
                    __DRIcontext * driContextPriv,
-                   unsigned major_version,
-                   unsigned minor_version,
-                   uint32_t flags,
-                   bool notify_reset,
-                   unsigned priority,
+                   const struct __DriverContextConfig *ctx_config,
                    unsigned *error,
                    void *sharedContextPrivate)
 {
@@ -971,24 +967,28 @@ intelCreateContext(gl_api api,
    __DRIscreen *sPriv = driContextPriv->driScreenPriv;
    struct intel_screen *intelScreen = sPriv->driverPrivate;
 
-   if (flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) {
+   if (ctx_config->flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) {
       *error = __DRI_CTX_ERROR_UNKNOWN_FLAG;
       return false;
    }
 
-   if (notify_reset) {
+   if (ctx_config->attribute_mask) {
       *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE;
       return false;
    }
 
    if (IS_GEN3(intelScreen->deviceID)) {
       success = i915CreateContext(api, mesaVis, driContextPriv,
-                                  major_version, minor_version, flags,
+                                  ctx_config->major_version,
+                                  ctx_config->minor_version,
+                                  ctx_config->flags,
                                   error, sharedContextPrivate);
    } else {
       intelScreen->no_vbo = true;
       success = i830CreateContext(api, mesaVis, driContextPriv,
-                                  major_version, minor_version, flags,
+                                  ctx_config->major_version,
+                                  ctx_config->minor_version,
+                                  ctx_config->flags,
                                   error, sharedContextPrivate);
    }
 
index fae76312661912124eb2099a41987a228b780bd9..bb8b755cb5588f5f54e2a1cb8a941aec346c11b2 100644 (file)
@@ -826,11 +826,7 @@ GLboolean
 brwCreateContext(gl_api api,
                  const struct gl_config *mesaVis,
                  __DRIcontext *driContextPriv,
-                 unsigned major_version,
-                 unsigned minor_version,
-                 uint32_t flags,
-                 bool notify_reset,
-                 unsigned priority,
+                 const struct __DriverContextConfig *ctx_config,
                  unsigned *dri_ctx_error,
                  void *sharedContextPrivate)
 {
@@ -849,11 +845,20 @@ brwCreateContext(gl_api api,
    if (screen->has_context_reset_notification)
       allowed_flags |= __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS;
 
-   if (flags & ~allowed_flags) {
+   if (ctx_config->flags & ~allowed_flags) {
       *dri_ctx_error = __DRI_CTX_ERROR_UNKNOWN_FLAG;
       return false;
    }
 
+   if (ctx_config->attribute_mask & ~__DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY) {
+      *dri_ctx_error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE;
+      return false;
+   }
+
+   bool notify_reset =
+      ((ctx_config->attribute_mask & __DRIVER_CONTEXT_ATTRIB_RESET_STRATEGY) &&
+       ctx_config->reset_strategy != __DRI_CTX_RESET_NO_NOTIFICATION);
+
    struct brw_context *brw = rzalloc(NULL, struct brw_context);
    if (!brw) {
       fprintf(stderr, "%s: failed to alloc context\n", __func__);
@@ -902,7 +907,7 @@ brwCreateContext(gl_api api,
       return false;
    }
 
-   driContextSetFlags(ctx, flags);
+   driContextSetFlags(ctx, ctx_config->flags);
 
    /* Initialize the software rasterizer and helper modules.
     *
@@ -962,19 +967,21 @@ brwCreateContext(gl_api api,
       }
 
       int hw_priority = BRW_CONTEXT_MEDIUM_PRIORITY;
-      switch (priority) {
-      case __DRI_CTX_PRIORITY_LOW:
-         hw_priority = BRW_CONTEXT_LOW_PRIORITY;
-         break;
-      case __DRI_CTX_PRIORITY_HIGH:
-         hw_priority = BRW_CONTEXT_HIGH_PRIORITY;
-         break;
+      if (ctx_config->attribute_mask & __DRIVER_CONTEXT_ATTRIB_PRIORITY) {
+         switch (ctx_config->priority) {
+         case __DRI_CTX_PRIORITY_LOW:
+            hw_priority = BRW_CONTEXT_LOW_PRIORITY;
+            break;
+         case __DRI_CTX_PRIORITY_HIGH:
+            hw_priority = BRW_CONTEXT_HIGH_PRIORITY;
+            break;
+         }
       }
       if (hw_priority != I915_CONTEXT_DEFAULT_PRIORITY &&
           brw_hw_context_set_priority(brw->bufmgr, brw->hw_ctx, hw_priority)) {
          fprintf(stderr,
                 "Failed to set priority [%d:%d] for hardware context.\n",
-                 priority, hw_priority);
+                 ctx_config->priority, hw_priority);
          intelDestroyContext(driContextPriv);
          return false;
       }
@@ -1013,12 +1020,12 @@ brwCreateContext(gl_api api,
 
    brw_draw_init( brw );
 
-   if ((flags & __DRI_CTX_FLAG_DEBUG) != 0) {
+   if ((ctx_config->flags & __DRI_CTX_FLAG_DEBUG) != 0) {
       /* Turn on some extra GL_ARB_debug_output generation. */
       brw->perf_debug = true;
    }
 
-   if ((flags & __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS) != 0) {
+   if ((ctx_config->flags & __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS) != 0) {
       ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB;
       ctx->Const.RobustAccess = GL_TRUE;
    }
index 766b5bc0731104fc6952193a25d945c64af21152..8aa0c5ff64c264ab1761f9f2de3204eeccc6a92d 100644 (file)
@@ -1258,11 +1258,7 @@ void intel_resolve_for_dri2_flush(struct brw_context *brw,
 GLboolean brwCreateContext(gl_api api,
                            const struct gl_config *mesaVis,
                            __DRIcontext *driContextPriv,
-                           unsigned major_version,
-                           unsigned minor_version,
-                           uint32_t flags,
-                           bool notify_reset,
-                           unsigned priority,
+                           const struct __DriverContextConfig *ctx_config,
                            unsigned *error,
                            void *sharedContextPrivate);
 
index 39620e10214135abbad03c42d5c9ca3737cbe2eb..397e39603d2a0cada3731888b17543fdd7e0bce6 100644 (file)
 GLboolean
 nouveau_context_create(gl_api api,
                       const struct gl_config *visual, __DRIcontext *dri_ctx,
-                      unsigned major_version,
-                      unsigned minor_version,
-                      uint32_t flags,
-                      bool notify_reset,
-                       unsigned priority,
+                      const struct __DriverContextConfig *ctx_config,
                       unsigned *error,
                       void *share_ctx)
 {
@@ -64,12 +60,12 @@ nouveau_context_create(gl_api api,
        struct nouveau_context *nctx;
        struct gl_context *ctx;
 
-       if (flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) {
+       if (ctx_config->flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) {
                *error = __DRI_CTX_ERROR_UNKNOWN_FLAG;
                return false;
        }
 
-       if (notify_reset) {
+       if (ctx_config->attribute_mask) {
                *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE;
                return false;
        }
@@ -80,14 +76,15 @@ nouveau_context_create(gl_api api,
                return GL_FALSE;
        }
 
-       driContextSetFlags(ctx, flags);
+       driContextSetFlags(ctx, ctx_config->flags);
 
        nctx = to_nouveau_context(ctx);
        nctx->dri_context = dri_ctx;
        dri_ctx->driverPrivate = ctx;
 
        _mesa_compute_version(ctx);
-       if (ctx->Version < major_version * 10 + minor_version) {
+       if (ctx->Version < (ctx_config->major_version * 10 +
+                           ctx_config->minor_version)) {
           nouveau_context_destroy(dri_ctx);
           *error = __DRI_CTX_ERROR_BAD_VERSION;
           return GL_FALSE;
index 6ab865c7bdea627051eb18ad08678c5ebd27fbc3..dcb7bbb23a1510ec1b917473048f544b9b793665 100644 (file)
@@ -110,8 +110,7 @@ struct nouveau_context {
 GLboolean
 nouveau_context_create(gl_api api,
                       const struct gl_config *visual, __DRIcontext *dri_ctx,
-                      unsigned major_version, unsigned minor_version,
-                      uint32_t flags, bool notify_reset, unsigned priority,
+                      const struct __DriverContextConfig *ctx_config,
                       unsigned *error, void *share_ctx);
 
 GLboolean
index bd4f8b62cd2d90fdadb655b3d61634290ed457a3..edd433ae97e49d2a81cbf0c656f8a91c9c7b0b26 100644 (file)
@@ -174,11 +174,7 @@ static void r200_init_vtbl(radeonContextPtr radeon)
 GLboolean r200CreateContext( gl_api api,
                             const struct gl_config *glVisual,
                             __DRIcontext *driContextPriv,
-                            unsigned major_version,
-                            unsigned minor_version,
-                            uint32_t flags,
-                             bool notify_reset,
-                             unsigned priority,
+                            const struct __DriverContextConfig *ctx_config,
                             unsigned *error,
                             void *sharedContextPrivate)
 {
@@ -190,12 +186,12 @@ GLboolean r200CreateContext( gl_api api,
    int i;
    int tcl_mode;
 
-   if (flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) {
+   if (ctx_config->flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) {
       *error = __DRI_CTX_ERROR_UNKNOWN_FLAG;
       return false;
    }
 
-   if (notify_reset) {
+   if (ctx_config->attribute_mask) {
       *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE;
       return false;
    }
@@ -251,7 +247,7 @@ GLboolean r200CreateContext( gl_api api,
 
    ctx = &rmesa->radeon.glCtx;
 
-   driContextSetFlags(ctx, flags);
+   driContextSetFlags(ctx, ctx_config->flags);
 
    /* Initialize the software rasterizer and helper modules.
     */
index 200e0a24312d5ac840c1c28495a6397be59dd268..f9ba6835e804d1230a0c70b609e4dbc652430ec3 100644 (file)
@@ -628,11 +628,8 @@ extern void r200DestroyContext( __DRIcontext *driContextPriv );
 extern GLboolean r200CreateContext( gl_api api,
                                    const struct gl_config *glVisual,
                                    __DRIcontext *driContextPriv,
-                                   unsigned major_version,
-                                   unsigned minor_version,
-                                   uint32_t flags,
-                                    bool notify_reset,
-                                    unsigned priority,
+                                   const struct __DriverContextConfig *
+                                      ctx_config,
                                    unsigned *error,
                                    void *sharedContextPrivate);
 extern GLboolean r200MakeCurrent( __DRIcontext *driContextPriv,
index 866dc80c98f2cdafbd079ceeeedd50fbc5c7c7fe..04c76cdba1d53173008a1ccb8f502238c92c5b36 100644 (file)
@@ -140,11 +140,7 @@ GLboolean
 r100CreateContext( gl_api api,
                   const struct gl_config *glVisual,
                   __DRIcontext *driContextPriv,
-                  unsigned major_version,
-                  unsigned minor_version,
-                  uint32_t flags,
-                   bool notify_reset,
-                  unsigned priority,
+                  const struct __DriverContextConfig *ctx_config,
                   unsigned *error,
                   void *sharedContextPrivate)
 {
@@ -156,12 +152,12 @@ r100CreateContext( gl_api api,
    int i;
    int tcl_mode, fthrottle_mode;
 
-   if (flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) {
+   if (ctx_config->flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_NO_ERROR)) {
       *error = __DRI_CTX_ERROR_UNKNOWN_FLAG;
       return false;
    }
 
-   if (notify_reset) {
+   if (ctx_config->attribute_mask) {
       *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE;
       return false;
    }
@@ -214,7 +210,7 @@ r100CreateContext( gl_api api,
 
    ctx = &rmesa->radeon.glCtx;
 
-   driContextSetFlags(ctx, flags);
+   driContextSetFlags(ctx, ctx_config->flags);
 
    /* Initialize the software rasterizer and helper modules.
     */
index 4124f50db5e4ff71b899a6562f88cee4e46f4955..94917cf30b6ffb35824508695327dafd6e1f64eb 100644 (file)
@@ -452,11 +452,8 @@ R100_CONTEXT(struct gl_context *ctx)
 extern GLboolean r100CreateContext( gl_api api,
                                    const struct gl_config *glVisual,
                                    __DRIcontext *driContextPriv,
-                                   unsigned major_version,
-                                   unsigned minor_version,
-                                   uint32_t flags,
-                                    bool notify_reset,
-                                    unsigned priority,
+                                   const struct __DriverContextConfig *
+                                      ctx_config,
                                    unsigned *error,
                                    void *sharedContextPrivate);
 
index 6b71d806f09e4ae4bbed92c1fa54151e8ee4c008..f9bd1b9d5604262787750877cee2c14b275cfff1 100644 (file)
@@ -752,11 +752,7 @@ static GLboolean
 dri_create_context(gl_api api,
                   const struct gl_config * visual,
                   __DRIcontext * cPriv,
-                  unsigned major_version,
-                  unsigned minor_version,
-                  uint32_t flags,
-                  bool notify_reset,
-                  unsigned priority,
+                  const struct __DriverContextConfig *ctx_config,
                   unsigned *error,
                   void *sharedContextPrivate)
 {
@@ -770,7 +766,13 @@ dri_create_context(gl_api api,
 
     /* Flag filtering is handled in dri2CreateContextAttribs.
      */
-    (void) flags;
+    (void) ctx_config->flags;
+
+    /* The swrast driver doesn't understand any of the attributes */
+    if (ctx_config->attribute_mask != 0) {
+       *error = __DRI_CTX_ERROR_UNKNOWN_ATTRIBUTE;
+       return false;
+    }
 
     ctx = CALLOC_STRUCT(dri_context);
     if (ctx == NULL) {
@@ -797,7 +799,7 @@ dri_create_context(gl_api api,
        goto context_fail;
     }
 
-    driContextSetFlags(mesaCtx, flags);
+    driContextSetFlags(mesaCtx, ctx_config->flags);
 
     /* create module contexts */
     _swrast_CreateContext( mesaCtx );