r300g: add flush_frontbuffer function to display video surface

This commit is contained in:
Cooper Yuan
2009-10-23 14:46:29 +08:00
parent 0072a26662
commit 6df12aad2f
@@ -33,6 +33,14 @@
#include "radeon_buffer.h"
#include "radeon_bo_gem.h"
#include "softpipe/sp_texture.h"
#include <X11/Xutil.h>
struct radeon_vl_context
{
Display *display;
int screen;
Drawable drawable;
};
static const char *radeon_get_name(struct pipe_winsys *ws)
{
@@ -183,11 +191,53 @@ static int radeon_fence_finish(struct pipe_winsys *ws,
return 0;
}
static void radeon_display_surface(struct pipe_winsys *pws,
struct pipe_surface *psurf,
struct radeon_vl_context *rvl_ctx)
{
struct r300_texture *r300tex = (struct r300_texture *)(psurf->texture);
XImage *ximage;
void *data;
ximage = XCreateImage(rvl_ctx->display,
XDefaultVisual(rvl_ctx->display, rvl_ctx->screen),
XDefaultDepth(rvl_ctx->display, rvl_ctx->screen),
ZPixmap, 0, /* format, offset */
NULL, /* data */
0, 0, /* size */
32, /* bitmap_pad */
0); /* bytes_per_line */
assert(ximage->format);
assert(ximage->bitmap_unit);
data = pws->buffer_map(pws, r300tex->buffer, 0);
/* update XImage's fields */
ximage->data = data;
ximage->width = psurf->width;
ximage->height = psurf->height;
ximage->bytes_per_line = r300tex->stride_override;
XPutImage(rvl_ctx->display, rvl_ctx->drawable,
XDefaultGC(rvl_ctx->display, rvl_ctx->screen),
ximage, 0, 0, 0, 0, psurf->width, psurf->height);
XSync(rvl_ctx->display, 0);
ximage->data = NULL;
XDestroyImage(ximage);
pws->buffer_unmap(pws, r300tex->buffer);
}
static void radeon_flush_frontbuffer(struct pipe_winsys *pipe_winsys,
struct pipe_surface *pipe_surface,
void *context_private)
{
/* XXX TODO: call dri2CopyRegion */
struct radeon_vl_context *rvl_ctx;
rvl_ctx = (struct radeon_vl_context *) context_private;
radeon_display_surface(pipe_winsys, pipe_surface, rvl_ctx);
}
struct radeon_winsys* radeon_pipe_winsys(int fd)