mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-21 07:40:38 +02:00
st/dri: move backend hooks to appropriate object
This commit is contained in:
parent
a30b966f83
commit
873ddf547d
7 changed files with 78 additions and 29 deletions
|
|
@ -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 *
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 *
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue