st/dri/sw: add get_image inline helper similar to put_image

TODO: check if GetImage works with passing the pitch as width, similar to PutImage,
which avoids the extra copy, ala dri_sw_displaytarget_display() in src/gallium/winsys/sw/dri/dri_sw_winsys.c
This commit is contained in:
George Sapountzis 2011-11-02 15:02:10 +02:00
parent 31156c07b0
commit 0c425ac18c
1 changed files with 16 additions and 4 deletions

View File

@ -70,6 +70,17 @@ put_image(__DRIdrawable *dPriv, void *data, unsigned width, unsigned height)
data, dPriv->loaderPrivate);
}
static INLINE void
get_image(__DRIdrawable *dPriv, int x, int y, int width, int height, void *data)
{
__DRIscreen *sPriv = dPriv->driScreenPriv;
const __DRIswrastLoaderExtension *loader = sPriv->swrast_loader;
loader->getImage(dPriv,
x, y, width, height,
data, dPriv->loaderPrivate);
}
static void
drisw_update_drawable_info(struct dri_drawable *drawable)
{
@ -234,12 +245,13 @@ drisw_update_tex_buffer(struct dri_drawable *drawable,
struct dri_context *ctx,
struct pipe_resource *res)
{
struct pipe_context *pipe = ((struct st_context *) ctx->st)->pipe;
__DRIdrawable *dPriv = drawable->dPriv;
__DRIscreen *sPriv = dPriv->driScreenPriv;
int x, y, w, h;
struct st_context *st_ctx = (struct st_context *)ctx->st;
struct pipe_context *pipe = st_ctx->pipe;
struct pipe_transfer *transfer;
char *map;
int x, y, w, h;
int ximage_stride, line;
get_drawable_info(dPriv, &x, &y, &w, &h);
@ -251,7 +263,7 @@ drisw_update_tex_buffer(struct dri_drawable *drawable,
map = pipe_transfer_map(pipe, transfer);
/* Copy the Drawable content to the mapped texture buffer */
sPriv->swrast_loader->getImage(dPriv, x, y, w, h, map, dPriv->loaderPrivate);
get_image(dPriv, x, y, w, h, map);
/* The pipe transfer has a pitch rounded up to the nearest 64 pixels.
We assume 32 bit pixels. */