This moves drisw-specific code into drisw.c, making it possible to eliminate the extra copy of dri_drawable.c. --- .../state_trackers/dri/common/dri_context.h | 4 ++ src/gallium/state_trackers/dri/drm/dri2.c | 26 +++++++++- src/gallium/state_trackers/dri/sw/dri_drawable.c | 42 +--------------- src/gallium/state_trackers/dri/sw/drisw.c | 55 +++++++++++++++++++- 4 files changed, 84 insertions(+), 43 deletions(-)
diff --git a/src/gallium/state_trackers/dri/common/dri_context.h b/src/gallium/state_trackers/dri/common/dri_context.h index cfc8e33..e2738d2 100644 --- a/src/gallium/state_trackers/dri/common/dri_context.h +++ b/src/gallium/state_trackers/dri/common/dri_context.h @@ -64,6 +64,10 @@ struct dri_context struct st_context_iface *st; struct pp_queue_t *pp; unsigned int pp_enabled[PP_FILTERS]; + + /* copy the contents of the __DRIdrawable to the pipe_resource: */ + void (*copy_drawable)(struct dri_context *, __DRIdrawable *, + struct pipe_resource *); }; static INLINE struct dri_context * diff --git a/src/gallium/state_trackers/dri/drm/dri2.c b/src/gallium/state_trackers/dri/drm/dri2.c index f3c9e10..20a230c 100644 --- a/src/gallium/state_trackers/dri/drm/dri2.c +++ b/src/gallium/state_trackers/dri/drm/dri2.c @@ -711,6 +711,30 @@ dri2_create_buffer(__DRIscreen * sPriv, return TRUE; } +static void +dri2_copy_drawable(struct dri_context *ctx, __DRIdrawable *dPriv, + struct pipe_resource *res) +{ + /* no-op */ + (void)ctx; + (void)dPriv; + (void)res; +} + +static GLboolean +dri2_create_context(gl_api api, const struct gl_config * visual, + __DRIcontext * cPriv, void *sharedContextPrivate) +{ + struct dri_context *ctx; + + if (!dri_create_context(api, visual, cPriv, sharedContextPrivate)) + return FALSE; + + ctx = dri_context(cPriv); + ctx->copy_drawable = dri2_copy_drawable; + return TRUE; +} + /** * DRI driver virtual function table. * @@ -720,7 +744,7 @@ 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 = dri2_create_buffer, .DestroyBuffer = dri_destroy_buffer, diff --git a/src/gallium/state_trackers/dri/sw/dri_drawable.c b/src/gallium/state_trackers/dri/sw/dri_drawable.c index 66997fb..41e2a8d 100644 --- a/src/gallium/state_trackers/dri/sw/dri_drawable.c +++ b/src/gallium/state_trackers/dri/sw/dri_drawable.c @@ -38,7 +38,6 @@ #include "util/u_memory.h" #include "util/u_inlines.h" -#include "state_tracker/st_context.h" static boolean dri_st_framebuffer_validate(struct st_framebuffer_iface *stfbi, @@ -187,44 +186,6 @@ dri_drawable_validate_att(struct dri_drawable *drawable, drawable->base.validate(&drawable->base, statts, count, NULL); } -static void -drisw_copy_drawable(struct dri_context *ctx, __DRIdrawable *dPriv, - struct pipe_resource *res) -{ - struct st_context *stctx = (struct st_context *)ctx->st; - struct pipe_context *pipe = stctx->pipe; - struct pipe_transfer *tex_xfer; - char *map; - __DRIscreen *sPriv = dPriv->driScreenPriv; - int x, y, w, h, line, ximage_stride; - - sPriv->swrast_loader->getDrawableInfo(dPriv, &x, &y, &w, &h, - dPriv->loaderPrivate); - - tex_xfer = pipe_get_transfer(pipe, res, - 0, 0, /* level, layer */ - PIPE_TRANSFER_WRITE, - x, y, - w, h); - - map = pipe_transfer_map(pipe, tex_xfer); - - /* Copy the Drawable content to the mapped texture buffer */ - sPriv->swrast_loader->getImage(dPriv, x, y, w, h, map, - dPriv->loaderPrivate); - - /* The pipe transfer has a pitch rounded up to the nearest 64 pixels. - We assume 32 bit pixels. */ - ximage_stride = w * 4; - for (line = h-1; line; --line) { - memmove(&map[line * tex_xfer->stride], - &map[line * ximage_stride], ximage_stride); - } - - pipe_transfer_unmap(pipe, tex_xfer); - pipe_transfer_destroy(pipe, tex_xfer); -} - /** * These are used for GLX_EXT_texture_from_pixmap */ @@ -258,8 +219,7 @@ dri_set_tex_buffer2(__DRIcontext *pDRICtx, GLint target, } } - /* needed only for drisw: */ - drisw_copy_drawable(ctx, dPriv, res); + ctx->copy_drawable(ctx, dPriv, res); ctx->st->teximage(ctx->st, (target == GL_TEXTURE_2D) ? ST_TEXTURE_2D : ST_TEXTURE_RECT, diff --git a/src/gallium/state_trackers/dri/sw/drisw.c b/src/gallium/state_trackers/dri/sw/drisw.c index 082df55..7d45b00 100644 --- a/src/gallium/state_trackers/dri/sw/drisw.c +++ b/src/gallium/state_trackers/dri/sw/drisw.c @@ -39,6 +39,7 @@ #include "util/u_inlines.h" #include "pipe/p_context.h" #include "state_tracker/drisw_api.h" +#include "state_tracker/st_context.h" #include "dri_screen.h" #include "dri_context.h" @@ -293,6 +294,58 @@ drisw_create_buffer(__DRIscreen * sPriv, return TRUE; } +static void +drisw_copy_drawable(struct dri_context *ctx, __DRIdrawable *dPriv, + struct pipe_resource *res) +{ + struct st_context *stctx = (struct st_context *)ctx->st; + struct pipe_context *pipe = stctx->pipe; + struct pipe_transfer *tex_xfer; + char *map; + __DRIscreen *sPriv = dPriv->driScreenPriv; + int x, y, w, h, line, ximage_stride; + + sPriv->swrast_loader->getDrawableInfo(dPriv, &x, &y, &w, &h, + dPriv->loaderPrivate); + + tex_xfer = pipe_get_transfer(pipe, res, + 0, 0, /* level, layer */ + PIPE_TRANSFER_WRITE, + x, y, + w, h); + + map = pipe_transfer_map(pipe, tex_xfer); + + /* Copy the Drawable content to the mapped texture buffer */ + sPriv->swrast_loader->getImage(dPriv, x, y, w, h, map, + dPriv->loaderPrivate); + + /* The pipe transfer has a pitch rounded up to the nearest 64 pixels. + We assume 32 bit pixels. */ + ximage_stride = w * 4; + for (line = h-1; line; --line) { + memmove(&map[line * tex_xfer->stride], + &map[line * ximage_stride], ximage_stride); + } + + pipe_transfer_unmap(pipe, tex_xfer); + pipe_transfer_destroy(pipe, tex_xfer); +} + +static GLboolean +drisw_create_context(gl_api api, const struct gl_config * visual, + __DRIcontext * cPriv, void *sharedContextPrivate) +{ + struct dri_context *ctx; + + if (!dri_create_context(api, visual, cPriv, sharedContextPrivate)) + return FALSE; + + ctx = dri_context(cPriv); + ctx->copy_drawable = drisw_copy_drawable; + return TRUE; +} + /** * DRI driver virtual function table. * @@ -301,7 +354,7 @@ drisw_create_buffer(__DRIscreen * sPriv, const struct __DriverAPIRec driDriverAPI = { .InitScreen = drisw_init_screen, .DestroyScreen = dri_destroy_screen, - .CreateContext = dri_create_context, + .CreateContext = drisw_create_context, .DestroyContext = dri_destroy_context, .CreateBuffer = drisw_create_buffer, .DestroyBuffer = dri_destroy_buffer, -- 1.7.6.msysgit.0
From f0ba9fe7da311a0764a807e030f189388331bd2a Mon Sep 17 00:00:00 2001 From: nobled <nob...@dreamwidth.org> Date: Wed, 12 Oct 2011 13:17:37 +0000 Subject: [PATCH 2/4 dri] st/dri: add copy_drawable() callback This moves drisw-specific code into drisw.c, making it possible to eliminate the extra copy of dri_drawable.c. --- .../state_trackers/dri/common/dri_context.h | 4 ++ src/gallium/state_trackers/dri/drm/dri2.c | 26 +++++++++- src/gallium/state_trackers/dri/sw/dri_drawable.c | 42 +--------------- src/gallium/state_trackers/dri/sw/drisw.c | 55 +++++++++++++++++++- 4 files changed, 84 insertions(+), 43 deletions(-) diff --git a/src/gallium/state_trackers/dri/common/dri_context.h b/src/gallium/state_trackers/dri/common/dri_context.h index cfc8e33..e2738d2 100644 --- a/src/gallium/state_trackers/dri/common/dri_context.h +++ b/src/gallium/state_trackers/dri/common/dri_context.h @@ -64,6 +64,10 @@ struct dri_context struct st_context_iface *st; struct pp_queue_t *pp; unsigned int pp_enabled[PP_FILTERS]; + + /* copy the contents of the __DRIdrawable to the pipe_resource: */ + void (*copy_drawable)(struct dri_context *, __DRIdrawable *, + struct pipe_resource *); }; static INLINE struct dri_context * diff --git a/src/gallium/state_trackers/dri/drm/dri2.c b/src/gallium/state_trackers/dri/drm/dri2.c index f3c9e10..20a230c 100644 --- a/src/gallium/state_trackers/dri/drm/dri2.c +++ b/src/gallium/state_trackers/dri/drm/dri2.c @@ -711,6 +711,30 @@ dri2_create_buffer(__DRIscreen * sPriv, return TRUE; } +static void +dri2_copy_drawable(struct dri_context *ctx, __DRIdrawable *dPriv, + struct pipe_resource *res) +{ + /* no-op */ + (void)ctx; + (void)dPriv; + (void)res; +} + +static GLboolean +dri2_create_context(gl_api api, const struct gl_config * visual, + __DRIcontext * cPriv, void *sharedContextPrivate) +{ + struct dri_context *ctx; + + if (!dri_create_context(api, visual, cPriv, sharedContextPrivate)) + return FALSE; + + ctx = dri_context(cPriv); + ctx->copy_drawable = dri2_copy_drawable; + return TRUE; +} + /** * DRI driver virtual function table. * @@ -720,7 +744,7 @@ 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 = dri2_create_buffer, .DestroyBuffer = dri_destroy_buffer, diff --git a/src/gallium/state_trackers/dri/sw/dri_drawable.c b/src/gallium/state_trackers/dri/sw/dri_drawable.c index 66997fb..41e2a8d 100644 --- a/src/gallium/state_trackers/dri/sw/dri_drawable.c +++ b/src/gallium/state_trackers/dri/sw/dri_drawable.c @@ -38,7 +38,6 @@ #include "util/u_memory.h" #include "util/u_inlines.h" -#include "state_tracker/st_context.h" static boolean dri_st_framebuffer_validate(struct st_framebuffer_iface *stfbi, @@ -187,44 +186,6 @@ dri_drawable_validate_att(struct dri_drawable *drawable, drawable->base.validate(&drawable->base, statts, count, NULL); } -static void -drisw_copy_drawable(struct dri_context *ctx, __DRIdrawable *dPriv, - struct pipe_resource *res) -{ - struct st_context *stctx = (struct st_context *)ctx->st; - struct pipe_context *pipe = stctx->pipe; - struct pipe_transfer *tex_xfer; - char *map; - __DRIscreen *sPriv = dPriv->driScreenPriv; - int x, y, w, h, line, ximage_stride; - - sPriv->swrast_loader->getDrawableInfo(dPriv, &x, &y, &w, &h, - dPriv->loaderPrivate); - - tex_xfer = pipe_get_transfer(pipe, res, - 0, 0, /* level, layer */ - PIPE_TRANSFER_WRITE, - x, y, - w, h); - - map = pipe_transfer_map(pipe, tex_xfer); - - /* Copy the Drawable content to the mapped texture buffer */ - sPriv->swrast_loader->getImage(dPriv, x, y, w, h, map, - dPriv->loaderPrivate); - - /* The pipe transfer has a pitch rounded up to the nearest 64 pixels. - We assume 32 bit pixels. */ - ximage_stride = w * 4; - for (line = h-1; line; --line) { - memmove(&map[line * tex_xfer->stride], - &map[line * ximage_stride], ximage_stride); - } - - pipe_transfer_unmap(pipe, tex_xfer); - pipe_transfer_destroy(pipe, tex_xfer); -} - /** * These are used for GLX_EXT_texture_from_pixmap */ @@ -258,8 +219,7 @@ dri_set_tex_buffer2(__DRIcontext *pDRICtx, GLint target, } } - /* needed only for drisw: */ - drisw_copy_drawable(ctx, dPriv, res); + ctx->copy_drawable(ctx, dPriv, res); ctx->st->teximage(ctx->st, (target == GL_TEXTURE_2D) ? ST_TEXTURE_2D : ST_TEXTURE_RECT, diff --git a/src/gallium/state_trackers/dri/sw/drisw.c b/src/gallium/state_trackers/dri/sw/drisw.c index 082df55..7d45b00 100644 --- a/src/gallium/state_trackers/dri/sw/drisw.c +++ b/src/gallium/state_trackers/dri/sw/drisw.c @@ -39,6 +39,7 @@ #include "util/u_inlines.h" #include "pipe/p_context.h" #include "state_tracker/drisw_api.h" +#include "state_tracker/st_context.h" #include "dri_screen.h" #include "dri_context.h" @@ -293,6 +294,58 @@ drisw_create_buffer(__DRIscreen * sPriv, return TRUE; } +static void +drisw_copy_drawable(struct dri_context *ctx, __DRIdrawable *dPriv, + struct pipe_resource *res) +{ + struct st_context *stctx = (struct st_context *)ctx->st; + struct pipe_context *pipe = stctx->pipe; + struct pipe_transfer *tex_xfer; + char *map; + __DRIscreen *sPriv = dPriv->driScreenPriv; + int x, y, w, h, line, ximage_stride; + + sPriv->swrast_loader->getDrawableInfo(dPriv, &x, &y, &w, &h, + dPriv->loaderPrivate); + + tex_xfer = pipe_get_transfer(pipe, res, + 0, 0, /* level, layer */ + PIPE_TRANSFER_WRITE, + x, y, + w, h); + + map = pipe_transfer_map(pipe, tex_xfer); + + /* Copy the Drawable content to the mapped texture buffer */ + sPriv->swrast_loader->getImage(dPriv, x, y, w, h, map, + dPriv->loaderPrivate); + + /* The pipe transfer has a pitch rounded up to the nearest 64 pixels. + We assume 32 bit pixels. */ + ximage_stride = w * 4; + for (line = h-1; line; --line) { + memmove(&map[line * tex_xfer->stride], + &map[line * ximage_stride], ximage_stride); + } + + pipe_transfer_unmap(pipe, tex_xfer); + pipe_transfer_destroy(pipe, tex_xfer); +} + +static GLboolean +drisw_create_context(gl_api api, const struct gl_config * visual, + __DRIcontext * cPriv, void *sharedContextPrivate) +{ + struct dri_context *ctx; + + if (!dri_create_context(api, visual, cPriv, sharedContextPrivate)) + return FALSE; + + ctx = dri_context(cPriv); + ctx->copy_drawable = drisw_copy_drawable; + return TRUE; +} + /** * DRI driver virtual function table. * @@ -301,7 +354,7 @@ drisw_create_buffer(__DRIscreen * sPriv, const struct __DriverAPIRec driDriverAPI = { .InitScreen = drisw_init_screen, .DestroyScreen = dri_destroy_screen, - .CreateContext = dri_create_context, + .CreateContext = drisw_create_context, .DestroyContext = dri_destroy_context, .CreateBuffer = drisw_create_buffer, .DestroyBuffer = dri_destroy_buffer, -- 1.7.6.msysgit.0
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev