mirror of
https://github.com/mpv-player/mpv
synced 2025-03-04 05:07:51 +00:00
Double buffering support
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@2687 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
6dfef68008
commit
11148f0835
@ -147,9 +147,9 @@ static inline void __vbeSwitchBank(unsigned long offset)
|
||||
if((err=vbeSetWindow(win.idx,new_offset)) != VBE_OK)
|
||||
{
|
||||
show_err:
|
||||
vesa_term();
|
||||
PRINT_VBE_ERR("vbeSetWindow",err);
|
||||
printf("vo_vesa: Fatal error occured! Can't continue\n");
|
||||
vesa_term();
|
||||
exit(-1);
|
||||
}
|
||||
win.low = new_offset * gran;
|
||||
@ -313,14 +313,19 @@ static void flip_page(void)
|
||||
if(!HAS_DGA()) __vbeCopyData(dga_buffer);
|
||||
flip_trigger = 0;
|
||||
}
|
||||
#if 0
|
||||
if(vo_doublebuffering && multi_size > 1)
|
||||
{
|
||||
vbeSetDisplayStart(multi_buff[multi_idx],1);
|
||||
multi_idx = multi_idx ? 0 : 1;
|
||||
win.ptr = dga_buffer = video_base + multi_buff[multi_idx];
|
||||
int err;
|
||||
if((err=vbeSetDisplayStart(multi_buff[multi_idx],1)) != VBE_OK)
|
||||
{
|
||||
vesa_term();
|
||||
PRINT_VBE_ERR("vbeSetDispayStart",err);
|
||||
printf("vo_vesa: Fatal error occured! Can't continue\n");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
multi_idx = multi_idx ? 0 : 1;
|
||||
win.ptr = dga_buffer = video_base + multi_buff[multi_idx];
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
else
|
||||
if(tripple_buffering)
|
||||
@ -418,6 +423,34 @@ static void vesa_aspect(uint32_t width,uint32_t height,
|
||||
}
|
||||
}
|
||||
|
||||
static void paintBkGnd( void )
|
||||
{
|
||||
int x_res = video_mode_info.XResolution;
|
||||
int y_res = video_mode_info.YResolution;
|
||||
int x, y;
|
||||
|
||||
for (y = 0; y < y_res; ++y)
|
||||
{
|
||||
for (x = 0; x < x_res; ++x)
|
||||
{
|
||||
int r, g, b;
|
||||
if ((x & 16) ^ (y & 16))
|
||||
{
|
||||
r = x * 255 / x_res;
|
||||
g = y * 255 / y_res;
|
||||
b = 255 - x * 255 / x_res;
|
||||
}
|
||||
else
|
||||
{
|
||||
r = 255 - x * 255 / x_res;
|
||||
g = y * 255 / y_res;
|
||||
b = 255 - y * 255 / y_res;
|
||||
}
|
||||
__vbeSetPixel(x, y, r, g, b);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static char *model2str(unsigned char type)
|
||||
{
|
||||
char *retval;
|
||||
@ -796,42 +829,24 @@ init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint3
|
||||
printf("vo_vesa: VESA initialization complete\n");
|
||||
fflush(stdout);
|
||||
}
|
||||
if(verbose)
|
||||
if(HAS_DGA())
|
||||
{
|
||||
int x_res = video_mode_info.XResolution;
|
||||
int y_res = video_mode_info.YResolution;
|
||||
int x, y;
|
||||
|
||||
for (y = 0; y < y_res; ++y)
|
||||
{
|
||||
for (x = 0; x < x_res; ++x)
|
||||
{
|
||||
int r, g, b;
|
||||
if ((x & 16) ^ (y & 16))
|
||||
{
|
||||
r = x * 255 / x_res;
|
||||
g = y * 255 / y_res;
|
||||
b = 255 - x * 255 / x_res;
|
||||
}
|
||||
else
|
||||
{
|
||||
r = 255 - x * 255 / x_res;
|
||||
g = y * 255 / y_res;
|
||||
b = 255 - y * 255 / y_res;
|
||||
}
|
||||
|
||||
__vbeSetPixel(x, y, r, g, b);
|
||||
}
|
||||
}
|
||||
int y = 0;
|
||||
for(i=0;i<MAX_BUFFERS;i++)
|
||||
{
|
||||
win.ptr = dga_buffer = video_base + multi_buff[i];
|
||||
if(verbose) paintBkGnd();
|
||||
}
|
||||
}
|
||||
/*if(1)*/
|
||||
else
|
||||
{
|
||||
int x;
|
||||
x = video_mode_info.XCharSize ?
|
||||
(video_mode_info.XResolution/video_mode_info.XCharSize)/2-strlen(title)/2 :
|
||||
0;
|
||||
if(x < 0) x = 0;
|
||||
vbeWriteString(x,0,7,title);
|
||||
if(verbose) paintBkGnd();
|
||||
{
|
||||
int x;
|
||||
x = (video_mode_info.XResolution/video_mode_info.XCharSize)/2-strlen(title)/2;
|
||||
if(x < 0) x = 0;
|
||||
vbeWriteString(x,0,7,title);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -847,9 +862,9 @@ get_info(void)
|
||||
static void
|
||||
uninit(void)
|
||||
{
|
||||
vesa_term();
|
||||
if(verbose > 2)
|
||||
printf("vo_vesa: uninit was called\n");
|
||||
vesa_term();
|
||||
}
|
||||
|
||||
|
||||
|
@ -539,25 +539,29 @@ int vbeSetDisplayStart(unsigned long offset, int vsync)
|
||||
"pushl %%ebx\n"
|
||||
"movl %1, %%ebx\n"
|
||||
::"a"(0x4f07),"S"(vsync ? 0x80 : 0),
|
||||
"c"(offset & 0xffff),"d"((offset>>16)&0xffff):"memory");
|
||||
"c"((offset>>2) & 0xffff),"d"((offset>>18)&0xffff):"memory");
|
||||
(*vbe_pm_info.SetDisplayStart)();
|
||||
__asm __volatile("popl %%ebx":::"memory");
|
||||
retval = VBE_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
#if 0
|
||||
/* Something wrong here */
|
||||
struct LRMI_regs r;
|
||||
unsigned long pixel_num;
|
||||
memset(&r,0,sizeof(struct LRMI_regs));
|
||||
r.eax = 0x4f07;
|
||||
r.ebx = vsync ? 0x80 : 0;
|
||||
pixel_num = offset%(unsigned long)curr_mode_info.BytesPerScanLine;
|
||||
if(pixel_num*(unsigned long)curr_mode_info.BytesPerScanLine!=offset) pixel_num++;
|
||||
r.eax = 0x4f07;
|
||||
r.ebx = vsync ? 0x80 : 0;
|
||||
r.ecx = pixel_num;
|
||||
r.edx = offset/(unsigned long)curr_mode_info.BytesPerScanLine;
|
||||
if(!VBE_LRMI_int(0x10,&r)) return VBE_VM86_FAIL;
|
||||
retval = r.eax & 0xffff;
|
||||
if(retval == 0x4f) retval = VBE_OK;
|
||||
#endif
|
||||
retval = VBE_BROKEN_BIOS;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user