X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgbm%2Fbackends%2Fdri%2Fgbm_driint.h;h=a8bfa39e5222f37702d7da56790237a505d892bc;hb=482ed4347d2c672423fcc4659cb20aee19dad7fd;hp=9c4392de05fc032e1ed818efc16703ad840a6421;hpb=5457caa58c048e2df71c7ebc036d5ca010d576b6;p=mesa.git diff --git a/src/gbm/backends/dri/gbm_driint.h b/src/gbm/backends/dri/gbm_driint.h index 9c4392de05f..a8bfa39e522 100644 --- a/src/gbm/backends/dri/gbm_driint.h +++ b/src/gbm/backends/dri/gbm_driint.h @@ -28,30 +28,55 @@ #ifndef _GBM_DRI_INTERNAL_H_ #define _GBM_DRI_INTERNAL_H_ +#include +#include +#include #include "gbmint.h" - -#include "common_drm.h" +#include "c11/threads.h" #include /* 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