egl: Handle dri configs with floating point pixel data
[mesa.git] / src / gbm / backends / dri / gbm_driint.h
index cb4e477abf4733867843e8c1b18a869737620727..a8bfa39e5222f37702d7da56790237a505d892bc 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 "common.h"
-#include "common_drm.h"
+#include "c11/threads.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_visual {
+   uint32_t gbm_format;
+   int dri_image_format;
+   struct {
+      int red;
+      int green;
+      int blue;
+      int alpha;
+   } rgba_shifts;
+   struct {
+      unsigned int red;
+      unsigned int green;
+      unsigned int blue;
+      unsigned int alpha;
+   } rgba_sizes;
+   bool is_float;
+};
 
 struct gbm_dri_device {
-   struct gbm_drm_device base;
+   struct gbm_device base;
 
    void *driver;
+   char *driver_name; /* Name of the DRI module, without the _dri suffix */
 
    __DRIscreen *screen;
+   __DRIcontext *context;
+   mtx_t mutex;
 
-   __DRIcoreExtension   *core;
-   __DRIdri2Extension   *dri2;
-   __DRIimageExtension  *image;
-   __DRI2flushExtension *flush;
-   __DRIdri2LoaderExtension *loader;
+   const __DRIcoreExtension   *core;
+   const __DRIdri2Extension   *dri2;
+   const __DRI2fenceExtension *fence;
+   const __DRIimageExtension  *image;
+   const __DRIswrastExtension *swrast;
+   const __DRI2flushExtension *flush;
 
    const __DRIconfig   **driver_configs;
-   const __DRIextension *extensions[4];
+   const __DRIextension **loader_extensions;
    const __DRIextension **driver_extensions;
 
    __DRIimage *(*lookup_image)(__DRIscreen *screen, void *image, void *data);
@@ -67,16 +91,41 @@ struct gbm_dri_device {
                             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;
+
+   const struct gbm_dri_visual *visual_table;
+   int num_visuals;
 };
 
 struct gbm_dri_bo {
-   struct gbm_drm_bo base;
+   struct gbm_bo base;
 
    __DRIimage *image;
 
-   /* Only used for cursors */
+   /* Used for cursors and the swrast front BO */
    uint32_t handle, size;
    void *map;
 };
@@ -105,7 +154,40 @@ gbm_dri_surface(struct gbm_surface *surface)
    return (struct gbm_dri_surface *) surface;
 }
 
-char *
-dri_fd_get_driver_name(int fd);
+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.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.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