gbm: request correct version of the DRI2_FENCE extension
[mesa.git] / src / gbm / backends / dri / gbm_driint.h
index c5b5e17a4eefa587a08704ccf8cde774a4549c02..29a8ec25a1e067bedc637eaca14273cd84da3e4b 100644 (file)
 #ifndef _GBM_DRI_INTERNAL_H_
 #define _GBM_DRI_INTERNAL_H_
 
+#include <xf86drm.h>
+#include <string.h>
+#include <sys/mman.h>
 #include "gbmint.h"
+#include "c11/threads.h"
 
-#include "common.h"
 #include "common_drm.h"
 
 #include <GL/gl.h> /* dri_interface needs GL types */
 #include "GL/internal/dri_interface.h"
 
+struct gbm_dri_surface;
+struct gbm_dri_bo;
+
 struct gbm_dri_device {
    struct gbm_drm_device base;
 
    void *driver;
 
    __DRIscreen *screen;
-
-   __DRIcoreExtension   *core;
-   __DRIdri2Extension   *dri2;
-   __DRIimageExtension  *image;
+   __DRIcontext *context;
+   mtx_t mutex;
+
+   const __DRIcoreExtension   *core;
+   const __DRIdri2Extension   *dri2;
+   const __DRI2fenceExtension *fence;
+   const __DRIimageExtension  *image;
+   const __DRIswrastExtension *swrast;
+   const __DRI2flushExtension *flush;
+   const __DRIdri2LoaderExtension *loader;
+   const __DRI2interopExtension *interop;
 
    const __DRIconfig   **driver_configs;
-   const __DRIextension *extensions[3];
+   const __DRIextension **loader_extensions;
+   const __DRIextension **driver_extensions;
 
    __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);
+   int (*image_get_buffers)(__DRIdrawable *driDrawable,
+                            unsigned int format,
+                            uint32_t *stamp,
+                            void *loaderPrivate,
+                            uint32_t buffer_mask,
+                            struct __DRIimageList *buffers);
+   void (*swrast_put_image2)(__DRIdrawable *driDrawable,
+                             int            op,
+                             int            x,
+                             int            y,
+                             int            width,
+                             int            height,
+                             int            stride,
+                             char          *data,
+                             void          *loaderPrivate);
+   void (*swrast_get_image)(__DRIdrawable *driDrawable,
+                            int            x,
+                            int            y,
+                            int            width,
+                            int            height,
+                            char          *data,
+                            void          *loaderPrivate);
+
+   struct wl_drm *wl_drm;
 };
 
 struct gbm_dri_bo {
    struct gbm_drm_bo base;
 
    __DRIimage *image;
+
+   /* Used for cursors and the swrast front BO */
+   uint32_t handle, size;
+   void *map;
+};
+
+struct gbm_dri_surface {
+   struct gbm_surface base;
+
+   void *dri_private;
 };
 
 static inline struct gbm_dri_device *
@@ -72,7 +130,46 @@ gbm_dri_bo(struct gbm_bo *bo)
    return (struct gbm_dri_bo *) bo;
 }
 
-char *
-dri_fd_get_driver_name(int fd);
+static inline struct gbm_dri_surface *
+gbm_dri_surface(struct gbm_surface *surface)
+{
+   return (struct gbm_dri_surface *) surface;
+}
+
+static inline void *
+gbm_dri_bo_map_dumb(struct gbm_dri_bo *bo)
+{
+   struct drm_mode_map_dumb map_arg;
+   int ret;
+
+   if (bo->image != NULL)
+      return NULL;
+
+   if (bo->map != NULL)
+      return bo->map;
+
+   memset(&map_arg, 0, sizeof(map_arg));
+   map_arg.handle = bo->handle;
+
+   ret = drmIoctl(bo->base.base.gbm->fd, DRM_IOCTL_MODE_MAP_DUMB, &map_arg);
+   if (ret)
+      return NULL;
+
+   bo->map = mmap(0, bo->size, PROT_WRITE,
+                  MAP_SHARED, bo->base.base.gbm->fd, map_arg.offset);
+   if (bo->map == MAP_FAILED) {
+      bo->map = NULL;
+      return NULL;
+   }
+
+   return bo->map;
+}
+
+static inline void
+gbm_dri_bo_unmap_dumb(struct gbm_dri_bo *bo)
+{
+   munmap(bo->map, bo->size);
+   bo->map = NULL;
+}
 
 #endif