diff options
Diffstat (limited to 'src/gbm/backends/dri')
-rw-r--r-- | src/gbm/backends/dri/gbm_dri.c | 53 | ||||
-rw-r--r-- | src/gbm/backends/dri/gbm_driint.h | 15 |
2 files changed, 66 insertions, 2 deletions
diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c index 5398e3dd400..4df6e8fcf06 100644 --- a/src/gbm/backends/dri/gbm_dri.c +++ b/src/gbm/backends/dri/gbm_dri.c @@ -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; diff --git a/src/gbm/backends/dri/gbm_driint.h b/src/gbm/backends/dri/gbm_driint.h index 514b5a620c1..3b7db65ce9f 100644 --- a/src/gbm/backends/dri/gbm_driint.h +++ b/src/gbm/backends/dri/gbm_driint.h @@ -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 { |