st/dri: move backend hooks to appropriate object

This commit is contained in:
George Sapountzis 2010-07-18 18:23:36 +03:00
parent a30b966f83
commit 873ddf547d
7 changed files with 78 additions and 29 deletions

View file

@ -60,6 +60,9 @@ struct dri_context
/* gallium */
struct st_context_iface *st;
/* hooks filled in by dri2 & drisw */
__DRIimage * (*lookup_egl_image)(struct dri_context *ctx, void *handle);
};
static INLINE struct dri_context *

View file

@ -67,10 +67,10 @@ dri_st_framebuffer_validate(struct st_framebuffer_iface *stfbi,
new_stamp = (drawable->texture_stamp != drawable->dPriv->lastStamp);
if (new_stamp || new_mask || screen->broken_invalidate) {
if (new_stamp && screen->update_drawable_info)
screen->update_drawable_info(drawable);
if (new_stamp && drawable->update_drawable_info)
drawable->update_drawable_info(drawable);
screen->allocate_textures(drawable, statts, count);
drawable->allocate_textures(drawable, statts, count);
/* add existing textures */
for (i = 0; i < ST_ATTACHMENT_COUNT; i++) {
@ -99,10 +99,9 @@ dri_st_framebuffer_flush_front(struct st_framebuffer_iface *stfbi,
{
struct dri_drawable *drawable =
(struct dri_drawable *) stfbi->st_manager_private;
struct dri_screen *screen = dri_screen(drawable->sPriv);
/* XXX remove this and just set the correct one on the framebuffer */
screen->flush_frontbuffer(drawable, statt);
drawable->flush_frontbuffer(drawable, statt);
return TRUE;
}

View file

@ -55,6 +55,16 @@ struct dri_drawable
/* used only by DRISW */
struct pipe_surface *drisw_surface;
/* hooks filled in by dri2 & drisw */
void (*allocate_textures)(struct dri_drawable *drawable,
const enum st_attachment_type *statts,
unsigned count);
void (*update_drawable_info)(struct dri_drawable *drawable);
void (*flush_frontbuffer)(struct dri_drawable *drawable,
enum st_attachment_type statt);
};
static INLINE struct dri_drawable *

View file

@ -294,11 +294,10 @@ dri_get_egl_image(struct st_manager *smapi,
{
struct dri_context *ctx =
(struct dri_context *)stctxi->st_manager_private;
struct dri_screen *screen = dri_screen(ctx->sPriv);
__DRIimage *img = NULL;
if (screen->lookup_egl_image) {
img = screen->lookup_egl_image(ctx, egl_image);
if (ctx->lookup_egl_image) {
img = ctx->lookup_egl_image(ctx, egl_image);
}
if (!img)

View file

@ -64,15 +64,6 @@ struct dri_screen
int fd;
drmLock *drmLock;
/* hooks filled in by dri2 & drisw */
__DRIimage * (*lookup_egl_image)(struct dri_context *ctx, void *handle);
void (*allocate_textures)(struct dri_drawable *drawable,
const enum st_attachment_type *statts,
unsigned count);
void (*update_drawable_info)(struct dri_drawable *drawable);
void (*flush_frontbuffer)(struct dri_drawable *drawable,
enum st_attachment_type statt);
/* gallium */
boolean d_depth_bits_last;
boolean sd_depth_bits_last;

View file

@ -507,9 +507,6 @@ dri2_init_screen(__DRIscreen * sPriv)
screen->sPriv = sPriv;
screen->fd = sPriv->fd;
screen->lookup_egl_image = dri2_lookup_egl_image;
screen->allocate_textures = dri2_allocate_textures;
screen->flush_frontbuffer = dri2_flush_frontbuffer;
sPriv->private = (void *)screen;
sPriv->extensions = dri_screen_extensions;
@ -531,16 +528,52 @@ fail:
return NULL;
}
static boolean
dri2_create_context(gl_api api, const __GLcontextModes * visual,
__DRIcontext * cPriv, void *sharedContextPrivate)
{
struct dri_context *ctx = NULL;
if (!dri_create_context(api, visual, cPriv, sharedContextPrivate))
return FALSE;
ctx = cPriv->driverPrivate;
ctx->lookup_egl_image = dri2_lookup_egl_image;
return TRUE;
}
static boolean
dri2_create_buffer(__DRIscreen * sPriv,
__DRIdrawable * dPriv,
const __GLcontextModes * visual, boolean isPixmap)
{
struct dri_drawable *drawable = NULL;
if (!dri_create_buffer(sPriv, dPriv, visual, isPixmap))
return FALSE;
drawable = dPriv->driverPrivate;
drawable->allocate_textures = dri2_allocate_textures;
drawable->flush_frontbuffer = dri2_flush_frontbuffer;
return TRUE;
}
/**
* DRI driver virtual function table.
*
* DRI versions differ in their implementation of init_screen and swap_buffers.
*/
const struct __DriverAPIRec driDriverAPI = {
.InitScreen = NULL,
.InitScreen2 = dri2_init_screen,
.DestroyScreen = dri_destroy_screen,
.CreateContext = dri_create_context,
.CreateContext = dri2_create_context,
.DestroyContext = dri_destroy_context,
.CreateBuffer = dri_create_buffer,
.CreateBuffer = dri2_create_buffer,
.DestroyBuffer = dri_destroy_buffer,
.MakeCurrent = dri_make_current,
.UnbindContext = dri_unbind_context,
@ -548,9 +581,7 @@ const struct __DriverAPIRec driDriverAPI = {
.GetSwapInfo = NULL,
.GetDrawableMSC = NULL,
.WaitForMSC = NULL,
.InitScreen2 = dri2_init_screen,
.InitScreen = NULL,
.SwapBuffers = NULL,
.CopySubBuffer = NULL,
};

View file

@ -275,9 +275,6 @@ drisw_init_screen(__DRIscreen * sPriv)
screen->sPriv = sPriv;
screen->fd = -1;
screen->allocate_textures = drisw_allocate_textures;
screen->update_drawable_info = drisw_update_drawable_info;
screen->flush_frontbuffer = drisw_flush_frontbuffer;
swrast_no_present = debug_get_option_swrast_no_present();
@ -298,21 +295,40 @@ fail:
return NULL;
}
static boolean
drisw_create_buffer(__DRIscreen * sPriv,
__DRIdrawable * dPriv,
const __GLcontextModes * visual, boolean isPixmap)
{
struct dri_drawable *drawable = NULL;
if (!dri_create_buffer(sPriv, dPriv, visual, isPixmap))
return FALSE;
drawable = dPriv->driverPrivate;
drawable->allocate_textures = drisw_allocate_textures;
drawable->update_drawable_info = drisw_update_drawable_info;
drawable->flush_frontbuffer = drisw_flush_frontbuffer;
return TRUE;
}
/**
* DRI driver virtual function table.
*
* DRI versions differ in their implementation of init_screen and swap_buffers.
*/
const struct __DriverAPIRec driDriverAPI = {
.InitScreen = drisw_init_screen,
.DestroyScreen = dri_destroy_screen,
.CreateContext = dri_create_context,
.DestroyContext = dri_destroy_context,
.CreateBuffer = dri_create_buffer,
.CreateBuffer = drisw_create_buffer,
.DestroyBuffer = dri_destroy_buffer,
.MakeCurrent = dri_make_current,
.UnbindContext = dri_unbind_context,
.InitScreen = drisw_init_screen,
.SwapBuffers = drisw_swap_buffers,
};