[PATCH 9/9] glx/dri2: Enable GLX_ARB_create_context_robustness

Matt Turner mattst88 at gmail.com
Wed Jul 11 22:37:22 PDT 2012


On Wed, Jul 4, 2012 at 3:21 PM, Ian Romanick <idr at freedesktop.org> wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
>
> 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 <ian.d.romanick at intel.com>
> ---
>  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?


More information about the xorg-devel mailing list