egl: Handle dri configs with floating point pixel data
[mesa.git] / src / gbm / backends / dri / gbm_driint.h
index 9c4392de05fc032e1ed818efc16703ad840a6421..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_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;
 
    const __DRIcoreExtension   *core;
    const __DRIdri2Extension   *dri2;
+   const __DRI2fenceExtension *fence;
    const __DRIimageExtension  *image;
+   const __DRIswrastExtension *swrast;
    const __DRI2flushExtension *flush;
-   const __DRIdri2LoaderExtension *loader;
 
    const __DRIconfig   **driver_configs;
-   const __DRIextension **extensions;
+   const __DRIextension **loader_extensions;
    const __DRIextension **driver_extensions;
 
    __DRIimage *(*lookup_image)(__DRIscreen *screen, void *image, void *data);
@@ -72,16 +97,35 @@ struct gbm_dri_device {
                             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;
 };
@@ -110,4 +154,40 @@ 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.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