gbm: Create hooks for dri2_loader_extension in dri backend

Pass a dri2_loader extension to the dri driver when gbm creates the dri
screen.  The implementation jumps through pointers in the gbm device
so that an EGL on GBM implementation can provide the real implementations.
This commit is contained in:
Ander Conselvan de Oliveira
2012-01-25 16:24:18 +02:00
committed by Kristian Høgsberg
parent 0d1ef1f57f
commit fd6acb97fb
2 changed files with 66 additions and 2 deletions

View File

@@ -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;

View File

@@ -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 {