mirror of
https://github.com/mpv-player/mpv
synced 2025-01-12 01:49:33 +00:00
Support for the overlay, that save one stretch blit for bgr16 and YUV formats
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@9568 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
6b271acc7e
commit
1a37f3eb54
@ -70,6 +70,8 @@ static uint8_t current_buffer = 0;
|
|||||||
static uint8_t current_ip_buf = 0;
|
static uint8_t current_ip_buf = 0;
|
||||||
static uint32_t buffer_stride[3];
|
static uint32_t buffer_stride[3];
|
||||||
|
|
||||||
|
static int use_overlay = 1;
|
||||||
|
|
||||||
// FIXME
|
// FIXME
|
||||||
static void clear_screen(void) {
|
static void clear_screen(void) {
|
||||||
tdfx_vid_agp_move_t mov;
|
tdfx_vid_agp_move_t mov;
|
||||||
@ -144,6 +146,33 @@ flip_page(void)
|
|||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
printf("Flip\n");
|
printf("Flip\n");
|
||||||
#endif
|
#endif
|
||||||
|
if(use_overlay) {
|
||||||
|
// These formats need conversion
|
||||||
|
switch(src_fmt) {
|
||||||
|
case IMGFMT_BGR8:
|
||||||
|
case IMGFMT_BGR24:
|
||||||
|
case IMGFMT_BGR32:
|
||||||
|
memset(&blit,0,sizeof(tdfx_vid_blit_t));
|
||||||
|
blit.src = back_buffer;
|
||||||
|
blit.src_stride = src_stride;
|
||||||
|
blit.src_x = 0;
|
||||||
|
blit.src_y = 0;
|
||||||
|
blit.src_w = src_width;
|
||||||
|
blit.src_h = src_height;
|
||||||
|
blit.src_format = src_fmt;
|
||||||
|
|
||||||
|
blit.dst = front_buffer;
|
||||||
|
blit.dst_stride = dst_stride;
|
||||||
|
blit.dst_x = 0;
|
||||||
|
blit.dst_y = 0;
|
||||||
|
blit.dst_w = src_width;
|
||||||
|
blit.dst_h = src_height;
|
||||||
|
blit.dst_format = IMGFMT_BGR16;
|
||||||
|
if(ioctl(tdfx_fd,TDFX_VID_BLIT,&blit))
|
||||||
|
printf("tdfx_vid: Blit failed\n");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
memset(&blit,0,sizeof(tdfx_vid_blit_t));
|
memset(&blit,0,sizeof(tdfx_vid_blit_t));
|
||||||
blit.src = back_buffer;
|
blit.src = back_buffer;
|
||||||
blit.src_stride = src_stride;
|
blit.src_stride = src_stride;
|
||||||
@ -226,10 +255,12 @@ config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uin
|
|||||||
src_fmt = 0;
|
src_fmt = 0;
|
||||||
switch(format) {
|
switch(format) {
|
||||||
case IMGFMT_BGR8:
|
case IMGFMT_BGR8:
|
||||||
case IMGFMT_BGR15:
|
|
||||||
case IMGFMT_BGR16:
|
|
||||||
case IMGFMT_BGR24:
|
case IMGFMT_BGR24:
|
||||||
case IMGFMT_BGR32:
|
case IMGFMT_BGR32:
|
||||||
|
if(use_overlay)
|
||||||
|
printf("tdfx_vid: Non-native overlay format need conversion\n");
|
||||||
|
case IMGFMT_BGR15:
|
||||||
|
case IMGFMT_BGR16:
|
||||||
src_bpp = ((format & 0x3F)+7)/8;
|
src_bpp = ((format & 0x3F)+7)/8;
|
||||||
break;
|
break;
|
||||||
case IMGFMT_YV12:
|
case IMGFMT_YV12:
|
||||||
@ -249,6 +280,9 @@ config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uin
|
|||||||
|
|
||||||
img_fmt = format;
|
img_fmt = format;
|
||||||
src_stride = src_width*src_bpp;
|
src_stride = src_width*src_bpp;
|
||||||
|
// The overlay need a 4 bytes aligned stride
|
||||||
|
if(use_overlay)
|
||||||
|
src_stride = ((src_stride+3)/4)*4;
|
||||||
if(!src_fmt)
|
if(!src_fmt)
|
||||||
src_fmt = format;
|
src_fmt = format;
|
||||||
if(!buffer_size)
|
if(!buffer_size)
|
||||||
@ -266,9 +300,59 @@ config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uin
|
|||||||
front_buffer = tdfx_cfg.screen_start;
|
front_buffer = tdfx_cfg.screen_start;
|
||||||
back_buffer = front_buffer + tdfx_page;
|
back_buffer = front_buffer + tdfx_page;
|
||||||
|
|
||||||
printf("tdfxvid setup : %d(%d) x %d @ %d => %d(%d) x %d @ %d\n",
|
while(use_overlay) {
|
||||||
src_width,src_stride,src_height,src_bpp,
|
tdfx_vid_overlay_t ov;
|
||||||
dst_width,dst_stride,dst_height,dst_bpp);
|
uint32_t ov_fmt = src_fmt, ov_stride = src_stride;
|
||||||
|
// Align the buffer
|
||||||
|
back_buffer = (((back_buffer+3)/4)*4);
|
||||||
|
// With the overlay the front buffer is not on the screen
|
||||||
|
// so we take the back buffer
|
||||||
|
front_buffer = back_buffer;
|
||||||
|
switch(src_fmt) {
|
||||||
|
case IMGFMT_BGR8:
|
||||||
|
case IMGFMT_BGR24:
|
||||||
|
case IMGFMT_BGR32:
|
||||||
|
back_buffer = front_buffer + 2*(src_stride*src_height);
|
||||||
|
ov_stride = dst_stride = src_width<<1;
|
||||||
|
ov_fmt = IMGFMT_BGR16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ov.src[0] = front_buffer;
|
||||||
|
ov.src[1] = front_buffer + (src_stride*src_height);
|
||||||
|
ov.src_width = src_width;
|
||||||
|
ov.src_height = src_height;
|
||||||
|
ov.src_stride = ov_stride;
|
||||||
|
ov.format = ov_fmt;
|
||||||
|
ov.dst_width = dst_width;
|
||||||
|
ov.dst_height = dst_height;
|
||||||
|
ov.dst_x = 0;
|
||||||
|
ov.dst_y = 0;
|
||||||
|
ov.use_colorkey = 0;
|
||||||
|
|
||||||
|
if(ioctl(tdfx_fd,TDFX_VID_SET_OVERLAY,&ov)) {
|
||||||
|
printf("tdfxvid: Overlay setup failed\n");
|
||||||
|
use_overlay = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(use_overlay == 1) {
|
||||||
|
if(ioctl(tdfx_fd,TDFX_VID_OVERLAY_ON)) {
|
||||||
|
printf("tdfx_vid: Overlay on failed\n");
|
||||||
|
use_overlay = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
use_overlay++;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("tdfx_vid: Overlay ready : %d(%d) x %d @ %d => %d(%d) x %d @ %d\n",
|
||||||
|
src_width,src_stride,src_height,src_bpp,
|
||||||
|
dst_width,dst_stride,dst_height,dst_bpp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!use_overlay)
|
||||||
|
printf("tdfx_vid : Texture blit ready %d(%d) x %d @ %d => %d(%d) x %d @ %d\n",
|
||||||
|
src_width,src_stride,src_height,src_bpp,
|
||||||
|
dst_width,dst_stride,dst_height,dst_bpp);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -276,6 +360,11 @@ config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uin
|
|||||||
static void
|
static void
|
||||||
uninit(void)
|
uninit(void)
|
||||||
{
|
{
|
||||||
|
if(use_overlay == 2) {
|
||||||
|
if(ioctl(tdfx_fd,TDFX_VID_OVERLAY_OFF))
|
||||||
|
printf("tdfx_vid: Overlay off failed\n");
|
||||||
|
use_overlay--;
|
||||||
|
}
|
||||||
close(tdfx_fd);
|
close(tdfx_fd);
|
||||||
tdfx_fd = -1;
|
tdfx_fd = -1;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user