gbm: Create hooks for dri2_loader_extension in dri backend
authorAnder Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
Wed, 25 Jan 2012 14:24:18 +0000 (16:24 +0200)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 29 Mar 2012 02:14:34 +0000 (22:14 -0400)
Pass a dri2_loader extension to the dri driver when gbm creates the dri
screen.  The implementation jumps through pointers in the gbm device
so that an EGL on GBM implementation can provide the real implementations.

src/gbm/backends/dri/gbm_dri.c
src/gbm/backends/dri/gbm_driint.h

index 5398e3dd400887cb90ee5ab1effc8420a5607ea0..4df6e8fcf06dc40cf395a8f93c25304bbbe7e331 100644 (file)
@@ -54,6 +54,49 @@ dri_lookup_egl_image(__DRIscreen *screen, void *image, void *data)
    return dri->lookup_image(screen, image, dri->lookup_user_data);
 }
 
+static __DRIbuffer *
+dri_get_buffers(__DRIdrawable * driDrawable,
+                int *width, int *height,
+                unsigned int *attachments, int count,
+                int *out_count, void *data)
+{
+   struct gbm_dri_surface *surf = data;
+   struct gbm_dri_device *dri = gbm_dri_device(surf->base.gbm);
+
+   if (dri->get_buffers == NULL)
+      return NULL;
+
+   return dri->get_buffers(driDrawable, width, height, attachments,
+                           count, out_count, surf->dri_private);
+}
+
+static void
+dri_flush_front_buffer(__DRIdrawable * driDrawable, void *data)
+{
+   struct gbm_dri_surface *surf = data;
+   struct gbm_dri_device *dri = gbm_dri_device(surf->base.gbm);
+
+   if (dri->flush_front_buffer != NULL)
+      dri->flush_front_buffer(driDrawable, surf->dri_private);
+}
+
+static __DRIbuffer *
+dri_get_buffers_with_format(__DRIdrawable * driDrawable,
+                            int *width, int *height,
+                            unsigned int *attachments, int count,
+                            int *out_count, void *data)
+{
+   struct gbm_dri_surface *surf = data;
+   struct gbm_dri_device *dri = gbm_dri_device(surf->base.gbm);
+
+   if (dri->get_buffers_with_format == NULL)
+      return NULL;
+
+   return
+      dri->get_buffers_with_format(driDrawable, width, height, attachments,
+                                   count, out_count, surf->dri_private);
+}
+
 static const __DRIuseInvalidateExtension use_invalidate = {
    { __DRI_USE_INVALIDATE, 1 }
 };
@@ -63,6 +106,13 @@ static const __DRIimageLookupExtension image_lookup_extension = {
    dri_lookup_egl_image
 };
 
+const __DRIdri2LoaderExtension dri2_loader_extension = {
+   { __DRI_DRI2_LOADER, 3 },
+   dri_get_buffers,
+   dri_flush_front_buffer,
+   dri_get_buffers_with_format,
+};
+
 struct dri_extension_match {
    const char *name;
    int version;
@@ -187,7 +237,8 @@ dri_screen_create(struct gbm_dri_device *dri)
 
    dri->extensions[0] = &image_lookup_extension.base;
    dri->extensions[1] = &use_invalidate.base;
-   dri->extensions[2] = NULL;
+   dri->extensions[2] = &dri2_loader_extension.base;
+   dri->extensions[3] = NULL;
 
    if (dri->dri2 == NULL)
       return -1;
index 514b5a620c1e9e379d110f1e67d51aa55a468f57..3b7db65ce9ffe0452136782e0acf8198ef006e87 100644 (file)
@@ -36,6 +36,8 @@
 #include <GL/gl.h> /* dri_interface needs GL types */
 #include "GL/internal/dri_interface.h"
 
+struct gbm_dri_surface;
+
 struct gbm_dri_device {
    struct gbm_drm_device base;
 
@@ -47,12 +49,23 @@ struct gbm_dri_device {
    __DRIdri2Extension   *dri2;
    __DRIimageExtension  *image;
    __DRI2flushExtension *flush;
+   __DRIdri2LoaderExtension *loader;
 
    const __DRIconfig   **driver_configs;
-   const __DRIextension *extensions[3];
+   const __DRIextension *extensions[4];
 
    __DRIimage *(*lookup_image)(__DRIscreen *screen, void *image, void *data);
    void *lookup_user_data;
+
+   __DRIbuffer *(*get_buffers)(__DRIdrawable * driDrawable,
+                               int *width, int *height,
+                               unsigned int *attachments, int count,
+                               int *out_count, void *data);
+   void (*flush_front_buffer)(__DRIdrawable * driDrawable, void *data);
+   __DRIbuffer *(*get_buffers_with_format)(__DRIdrawable * driDrawable,
+                            int *width, int *height,
+                            unsigned int *attachments, int count,
+                            int *out_count, void *data);
 };
 
 struct gbm_dri_bo {