From 8305ecd800bb2f9d2d63fb4832b80d8f31ed7394 Mon Sep 17 00:00:00 2001 From: mark Date: Thu, 29 Aug 2002 12:04:21 +0000 Subject: Fixed some breakages of single-buffer rendering of tdfx git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@7138 b3059339-0415-0410-9bf9-f77b7e298cf2 --- drivers/3dfx.h | 2 +- libvo/vo_tdfxfb.c | 45 +++++++++++++++++++++------------------------ 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/drivers/3dfx.h b/drivers/3dfx.h index cc23cfdaae..f784f7d34c 100644 --- a/drivers/3dfx.h +++ b/drivers/3dfx.h @@ -316,7 +316,7 @@ typedef struct voodoo_yuv_fb_t voodoo_yuv_fb; #define TDFXF_HSYNC_MASK 0x03 #define TDFXF_VSYNC_MASK 0x0c -#define XYREG(x,y) (((y) << 16) | (x)) +#define XYREG(x,y) (((((unsigned long)y) & 0xFFFF) << 16) | (((unsigned long)x) & 0xFFFF)) //#define TDFXFB_DEBUG #ifdef TDFXFB_DEBUG diff --git a/libvo/vo_tdfxfb.c b/libvo/vo_tdfxfb.c index b64d2e3135..a3f295f7bb 100644 --- a/libvo/vo_tdfxfb.c +++ b/libvo/vo_tdfxfb.c @@ -153,17 +153,17 @@ static void uninit(void) static void clear_screen() { - /* There needs to be some sort of delay here or else things seriously screw up. - Causes the image to not be the right size on screen if this isn't like this. - A printf before the memset call also seems to work, but this made more sense - since it actually checks the status of the card. - */ - /* first wait for the card to be ready, do not try to write every time - alex */ -// do {} while((reg_IO->status & 0x1f) < 1); - usec_sleep(10*1000); - memset(vidpage, 0, screenwidth * screenheight * screendepth); - - if(vo_doublebuffering) { + /* There needs to be some sort of delay here or else things seriously + * screw up. Causes the image to not be the right size on screen if + * this isn't like this. A printf before the memset call also seems to + * work, but this made more sense since it actually checks the status of + * the card. + */ + if(vo_doublebuffering) { + /* first wait for the card to be ready, do not try to write + * every time - alex */ + do {} while((reg_IO->status & 0x1f) < 1); + memset(vidpage, 0, screenwidth * screenheight * screendepth); memset(hidpage, 0, screenwidth * screenheight * screendepth); } } @@ -180,14 +180,9 @@ static void setup_screen(uint32_t full) if(screenwidth / ratio <= screenheight) vidheight = (double)screenwidth / ratio; - /* Is this really needed? This causes movies that are encoded at YxY - sizes to not be displayed properly (they're squished horizontally). - This might cause problems with videos that are taller than they are wide - but I haven't really seen many of those so we won't worry about it for now. */ -#if 0 else vidwidth = (double)screenheight * ratio; -#endif + vidx = (screenwidth - vidwidth) / 2; vidy = (screenheight - vidheight) / 2; } else { /* Reset to normal size */ @@ -199,7 +194,7 @@ static void setup_screen(uint32_t full) vidheight = r_height; vidx = vidy = 0; } - + clear_screen(); } @@ -279,11 +274,13 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, uint32 in_voodoo_format |= in_width * in_depth; - /* Put the image pages off the console screen so they don't get console messages */ - /* This used to place single buffered movies onto the main console screen */ - vidpageoffset = hidpageoffset = screenwidth * screenheight * screendepth; - if(vo_doublebuffering) - hidpageoffset = vidpageoffset + screenwidth * screenheight * screendepth; + /* Linux lives in the first frame */ + if(vo_doublebuffering) { + vidpageoffset = screenwidth * screenheight * screendepth; + hidpageoffset = vidpageoffset + screenwidth * screenheight * screendepth; + } else + vidpageoffset = hidpageoffset = 0; /* Console background */ + inpageoffset = hidpageoffset + screenwidth * screenheight * screendepth; @@ -364,7 +361,7 @@ static void flip_page(void) reg_2d->dstXY = XYREG(vidx, vidy); reg_2d->dstFormat = vid_voodoo_format; /* The XYREG macro doesn't seem to work for this line so build the register contents very explicitly */ - reg_2d->dstSize = ((((unsigned long)vidheight) & 0x0000FFFF) << 16) | (((unsigned long) vidwidth) & 0x0000FFFF); + reg_2d->dstSize = XYREG(vidwidth, vidheight); reg_2d->command = S2S_STRECH_BLT | S2S_IMMED | S2S_ROP; /* Wait for the command to finish (If we don't do this, we get wierd -- cgit v1.2.3