On 07/11/2012 10:37 PM, Matt Turner wrote:
On Wed, Jul 4, 2012 at 3:21 PM, Ian Romanick <[email protected]> wrote:
From: Ian Romanick <[email protected]>

If the driver supports __DRI2_ROBUSTNESS, then enable
GLX_ARB_create_cotnext_robustness as well.  If robustness values are
passed to glXCreateContextAttribsARB and the driver doesn't support
__DRI2_ROBUSTNESS, existing drivers will already generate the correct
error values (so that the correct GLX errors are generated).

Signed-off-by: Ian Romanick <[email protected]>
---
  glx/glxdri2.c |   61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
  1 files changed, 58 insertions(+), 3 deletions(-)

diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index 8210a2b..1e99179 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -59,6 +59,16 @@ typedef struct __GLXDRIscreen __GLXDRIscreen;
  typedef struct __GLXDRIcontext __GLXDRIcontext;
  typedef struct __GLXDRIdrawable __GLXDRIdrawable;

+
+#ifdef __DRI2_ROBUSTNESS
+#define ALL_DRI_CTX_FLAGS (__DRI_CTX_FLAG_DEBUG                         \
+                           | __DRI_CTX_FLAG_FORWARD_COMPATIBLE          \
+                           | __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS)
+#else
+#define ALL_DRI_CTX_FLAGS (__DRI_CTX_FLAG_DEBUG                         \
+                           | __DRI_CTX_FLAG_FORWARD_COMPATIBLE)
+#endif
+
  struct __GLXDRIscreen {
      __GLXscreen base;
      __DRIscreen *driScreen;
@@ -381,7 +391,7 @@ __glXDRIscreenDestroy(__GLXscreen * baseScreen)
  static Bool
  dri2_convert_glx_attribs(unsigned num_attribs, const uint32_t *attribs,
                           unsigned *major_ver, unsigned *minor_ver,
-                         uint32_t *flags, int *api, unsigned *error)
+                         uint32_t *flags, int *api, int *reset, unsigned 
*error)
  {
      unsigned i;

@@ -395,6 +405,11 @@ dri2_convert_glx_attribs(unsigned num_attribs, const 
uint32_t *attribs,

      *major_ver = 1;
      *minor_ver = 0;
+#ifdef __DRI2_ROBUSTNESS
+    *reset = __DRI_CTX_RESET_NO_NOTIFICATION;
+#else
+    (void) reset;
+#endif

      for (i = 0; i < num_attribs; i++) {
          switch (attribs[i * 2]) {
@@ -425,6 +440,26 @@ dri2_convert_glx_attribs(unsigned num_attribs, const 
uint32_t *attribs,
                  return False;
              }
              break;
+#ifdef __DRI2_ROBUSTNESS
+        case GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB:
+            if (screen->dri2->base.version >= 4) {
+                *error = BadValue;
+                return False;
+            }
+
+            switch (attribs[i * 2 + 1]) {
+            case GLX_NO_RESET_NOTIFICATION_ARB:
+                *reset = __DRI_CTX_RESET_NO_NOTIFICATION;
+                break;
+            case GLX_LOSE_CONTEXT_ON_RESET_ARB:
+                *reset = __DRI_CTX_RESET_LOSE_CONTEXT;
+                break;
+            default:
+                *error = BadValue;
+                return False;
+            }
+            break;
+#endif
          default:
              /* If an unknown attribute is received, fail.
               */
@@ -435,7 +470,7 @@ dri2_convert_glx_attribs(unsigned num_attribs, const 
uint32_t *attribs,

      /* Unknown flag value.
       */
-    if (*flags & ~(__DRI_CTX_FLAG_DEBUG | __DRI_CTX_FLAG_FORWARD_COMPATIBLE)) {
+    if ((*flags & ~ALL_DRI_CTX_FLAGS) != 0) {
          *error = BadValue;
          return False;
      }
@@ -473,12 +508,14 @@ create_driver_context(__GLXDRIcontext * context,
          unsigned major_ver;
          unsigned minor_ver;
          uint32_t flags;
+        int reset;
          int api;

          if (num_attribs != 0) {
              if (!dri2_convert_glx_attribs(num_attribs, attribs,
                                            &major_ver, &minor_ver,
-                                          &flags, &api, (unsigned *) error))
+                                          &flags, &api, &reset,
+                                          (unsigned *) error))
                  return NULL;

              ctx_attribs[num_ctx_attribs++] = __DRI_CTX_ATTRIB_MAJOR_VERSION;
@@ -494,6 +531,14 @@ create_driver_context(__GLXDRIcontext * context,
                   */
                  ctx_attribs[num_ctx_attribs++] = flags;
              }
+
+#ifdef __DRI2_ROBUSTNESS
+            if (reset != __DRI_CTX_NO_RESET_NOTIFICATION) {
+                ctx_attribs[num_ctx_attribs++] =
+                    __DRI_CTX_ATTRIB_RESET_NOTIFICATION;

Where is __DRI_CTX_ATTRIB_RESET_NOTIFICATION defined?

The only place I can find it defined is in the robustness branch of
your Mesa tree:
http://cgit.freedesktop.org/~idr/mesa/commit/?h=robustness&id=60435317099e463da60a351a212bd217f06904f5

Should that be upstream?

No, it should have been __DRI_CTX_ATTRIB_RESET_STRATEGY. :( I making changes across multiple repos across multiple sets of review comments. I'll change the name in Mesa back to __DRI_CTX_ATTRIB_RESET_NOTIFICATION.
_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to