updated VIA overlay code so it actually works. Still no scaling and colorkeying, still disabled. video witdh temporarily fixed to 'max' 320 pixels, pending extra calc code. Also a chiprev. check needs to be added to choose settings depending on that.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14187 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
2057015b2f
commit
acf4ab3767
@ -312,7 +312,7 @@ status_t SET_DISPLAY_MODE(display_mode *mode_to_set)
|
|||||||
/* set up acceleration for this mode */
|
/* set up acceleration for this mode */
|
||||||
// eng_acc_init();
|
// eng_acc_init();
|
||||||
/* set up overlay unit for this mode */
|
/* set up overlay unit for this mode */
|
||||||
// eng_bes_init();
|
eng_bes_init();
|
||||||
|
|
||||||
LOG(1,("SETMODE: booted since %f mS\n", system_time()/1000.0));
|
LOG(1,("SETMODE: booted since %f mS\n", system_time()/1000.0));
|
||||||
|
|
||||||
|
@ -437,6 +437,18 @@ status_t eng_bes_to_crtc(bool crtc)
|
|||||||
|
|
||||||
status_t eng_bes_init()
|
status_t eng_bes_init()
|
||||||
{
|
{
|
||||||
|
/* select colorspace setup for B_YCbCr422 */
|
||||||
|
//depending on chiprrev:
|
||||||
|
/* Read PCI bus 0, dev 0, function 0, index 0xF6 to get chip rev. */
|
||||||
|
// pVia->ChipRev = pciReadByte(pciTag(0, 0, 0), 0xF6);
|
||||||
|
//rev <= 0x09: (gives more color saturation?)
|
||||||
|
//BTW: Nimble V5 = pre rev 10. (runtime check will be added asap)
|
||||||
|
BESW(VID1_COLSPAC1, 0x140020f2);
|
||||||
|
BESW(VID1_COLSPAC2, 0x0a0a2c00);
|
||||||
|
//rev >= 0x10:
|
||||||
|
//BESW(VID1_COLSPAC1, 0x13000ded);
|
||||||
|
//BESW(VID1_COLSPAC2, 0x13171000);
|
||||||
|
|
||||||
if (si->ps.card_arch < NV10A)
|
if (si->ps.card_arch < NV10A)
|
||||||
{
|
{
|
||||||
/* disable overlay ints (b0 = buffer 0, b4 = buffer 1) */
|
/* disable overlay ints (b0 = buffer 0, b4 = buffer 1) */
|
||||||
@ -754,26 +766,15 @@ status_t eng_configure_bes
|
|||||||
*** actually program the registers ***
|
*** actually program the registers ***
|
||||||
**************************************/
|
**************************************/
|
||||||
|
|
||||||
if (1)//si->ps.card_arch < NV10A)
|
/* setup clipped(!) buffer startadress in RAM */
|
||||||
{
|
/* VIA bes doesn't have clipping registers, so no subpixelprecise clipping
|
||||||
/* unknown, but needed (otherwise high-res distortions and only half the frames */
|
* either. We do pixelprecise vertical and 'two pixel' precise horizontal clipping here. */
|
||||||
// BESW(NV04_OE_STATE, 0x00000000);
|
/* first include 'pixel precise' left clipping... (top clipping was already included) */
|
||||||
/* select buffer 0 as active (b16) */
|
moi.a1orgv += ((moi.hsrcstv >> 16) * 2);
|
||||||
// BESW(NV04_SU_STATE, 0x00000000);
|
/* we need to step in 4-byte (2 pixel) granularity due to the nature of yuy2 */
|
||||||
/* unknown (no effect?) */
|
BESW(VID1Y_ADDR0, (moi.a1orgv & 0x07fffffc));
|
||||||
// BESW(NV04_RM_STATE, 0x00000000);
|
|
||||||
/* setup clipped(!) buffer startadress in RAM */
|
|
||||||
/* RIVA128 - TNT bes doesn't have clipping registers, so no subpixelprecise clipping
|
|
||||||
* either. We do pixelprecise vertical and 'two pixel' precise horizontal clipping here. */
|
|
||||||
/* (program both buffers to prevent sync distortions) */
|
|
||||||
/* first include 'pixel precise' left clipping... (top clipping was already included) */
|
|
||||||
moi.a1orgv += ((moi.hsrcstv >> 16) * 2);
|
|
||||||
/* we need to step in 4-byte (2 pixel) granularity due to the nature of yuy2 */
|
|
||||||
// BESW(NV04_0BUFADR, (moi.a1orgv & ~0x03));
|
|
||||||
// BESW(NV04_1BUFADR, (moi.a1orgv & ~0x03));
|
|
||||||
BESW(VID1Y_ADDR0, (moi.a1orgv & 0x07fffffc));
|
|
||||||
|
|
||||||
/* setup buffersize */
|
/* setup buffersize */
|
||||||
//fixme if needed: width must be even officially...
|
//fixme if needed: width must be even officially...
|
||||||
// BESW(NV10_0SRCSIZE, ((ob->height << 16) | ob->width));
|
// BESW(NV10_0SRCSIZE, ((ob->height << 16) | ob->width));
|
||||||
//linux b0-15:
|
//linux b0-15:
|
||||||
@ -801,56 +802,53 @@ status_t eng_configure_bes
|
|||||||
// to small to handle (limit reached)
|
// to small to handle (limit reached)
|
||||||
//rud +instruct VID1_MINI_CTL register about modified scaling. (V1_X_DIV_2 | V1_X_INTERPOLY)
|
//rud +instruct VID1_MINI_CTL register about modified scaling. (V1_X_DIV_2 | V1_X_INTERPOLY)
|
||||||
BESW(VID1_MINI_CTL, 0);
|
BESW(VID1_MINI_CTL, 0);
|
||||||
|
|
||||||
//fixme for minimize ctrl...
|
//fixme for minimize ctrl...
|
||||||
BESW(V1_SOURCE_WH, ((ob->height << 16) | (ob->width - 0)));
|
BESW(V1_SOURCE_WH, ((ob->height << 16) | (ob->width - 0)));
|
||||||
|
|
||||||
/* setup buffer source pitch including slopspace (in bytes).
|
/* setup buffer source pitch including slopspace (in bytes).
|
||||||
* Note:
|
* Note:
|
||||||
* source pitch granularity = 16 pixels on the RIVA128 - TNT (so pre-NV10) bes */
|
* source pitch granularity = yet unknown (fixme) */
|
||||||
/* (program both buffers to prevent sync distortions) */
|
BESW(VID1_STRIDE, (ob->width * 2));
|
||||||
|
|
||||||
BESW(VID1_STRIDE, (ob->width * 2));
|
/* setup output window position */
|
||||||
// BESW(NV04_0SRCPTCH, (ob->width * 2));
|
BESW(VID1_HVSTART, ((moi.hcoordv & 0xffff0000) | ((moi.vcoordv & 0xffff0000) >> 16)));
|
||||||
// BESW(NV04_1SRCPTCH, (ob->width * 2));
|
|
||||||
/* setup output window position */
|
|
||||||
// BESW(NV04_DSTREF, ((moi.vcoordv & 0xffff0000) | ((moi.hcoordv & 0xffff0000) >> 16)));
|
|
||||||
BESW(VID1_HVSTART, ((moi.hcoordv & 0xffff0000) | ((moi.vcoordv & 0xffff0000) >> 16)));
|
|
||||||
|
|
||||||
/* setup output window size */
|
/* setup output window size */
|
||||||
// BESW(NV04_DSTSIZE, (
|
BESW(VID1_SIZE, (((moi.hcoordv & 0x0000ffff) << 16) | (moi.vcoordv & 0x0000ffff)));
|
||||||
// (((moi.vcoordv & 0x0000ffff) - ((moi.vcoordv & 0xffff0000) >> 16) + 1) << 16) |
|
|
||||||
// ((moi.hcoordv & 0x0000ffff) - ((moi.hcoordv & 0xffff0000) >> 16) + 1)
|
/* setup horizontal and vertical scaling */
|
||||||
// ));
|
|
||||||
BESW(VID1_SIZE, (((moi.hcoordv & 0x0000ffff) << 16) | (moi.vcoordv & 0x0000ffff)));
|
|
||||||
/* setup horizontal and vertical scaling */
|
|
||||||
// BESW(NV04_ISCALVH, (((viscalv << 16) >> 5) | (hiscalv >> 5)));
|
// BESW(NV04_ISCALVH, (((viscalv << 16) >> 5) | (hiscalv >> 5)));
|
||||||
//fixme: scaling 1x
|
//fixme: scaling 1x
|
||||||
BESW(VID1_ZOOM, 0);
|
BESW(VID1_ZOOM, 0);
|
||||||
|
|
||||||
/* enable vertical filtering (b0) */
|
/* enable vertical filtering (b0) */
|
||||||
// BESW(NV04_CTRL_V, 0x00000001);
|
// BESW(NV04_CTRL_V, 0x00000001);
|
||||||
/* enable horizontal filtering (no effect?) */
|
/* enable horizontal filtering (no effect?) */
|
||||||
// BESW(NV04_CTRL_H, 0x00000111);
|
// BESW(NV04_CTRL_H, 0x00000111);
|
||||||
|
|
||||||
/* enable BES (b0), format yuv422 (b2-4 = %000), input is frame (not field) (b9=0) */
|
/* enable BES (b0), format yuv422 (b2-4 = %000), set colorspace sign (b7 = 1),
|
||||||
// BESW(VID1_CTL, 0x00000001);
|
* input is frame (not field) picture (b9 = 0), expire = $f (b16-19),
|
||||||
BESW(VID1_CTL, 0x01050001);
|
* select field (not frame)(!) base (b24 = 0) */
|
||||||
//0x00050000
|
//pre rev 0x10:
|
||||||
/* enable colorkeying (b0 = 1), V1 cmds fire (b31), V1 on top of V3 (b20=0),
|
BESW(VID1_CTL, 0x00050081);
|
||||||
* no chromakey (b1=0) */
|
//rev 0x10 and later:
|
||||||
// BESW(COMPOSE, 0x80000000);
|
// BESW(VID1_CTL, 0x000f0081);
|
||||||
BESW(COMPOSE, 0xe0000000);//a = nu, 9 = vbi load all regs
|
|
||||||
|
|
||||||
//rud: add from MGA driver: horizontal last position in source:
|
/* enable colorkeying (b0 = 1), enable chromakeying (b1 = 1), Vid1 on top of Vid3 (b20 = 0),
|
||||||
//#define V1_FETCHCOUNT_ALIGNMENT 0x0000000f
|
* all registers are loaded immediately (b29 = 1), Vid1 cmds fire (b31 = 1) */
|
||||||
//#define V1_FETCHCOUNT_UNIT 0x00000004 /* Doubld QWORD */
|
BESW(COMPOSE, 0xa0000000);//tst, fixme: 9 = vbi load all regs
|
||||||
//((((dwSrcWidth<<1)+V1_FETCHCOUNT_ALIGNMENT)&~V1_FETCHCOUNT_ALIGNMENT) >> V1_FETCHCOUNT_UNIT)+1;
|
|
||||||
//max = 0x3ff
|
//rud: add from MGA driver: horizontal last position in source: (also update on left+right clips!)
|
||||||
|
//max = 0x3ff BYTES(!)
|
||||||
//test:(fixme!)
|
//test:(fixme!)
|
||||||
BESW(VID1_FETCH, (0x200 << 20));
|
BESW(VID1_FETCH, (0x028 << 20));//mpeg1 temp tst. (320 pixels)
|
||||||
|
|
||||||
/* select buffer 1 as active (b16) */
|
//rud: via special: fifo depth is $20 (b0-5), threshold $10 (b8-13), prethreshold $1d (b24-29)
|
||||||
// BESW(NV04_SU_STATE, 0x00010000);
|
//pre rev 0x10:
|
||||||
|
BESW(VID1_FIFO, 0x1d00101f);
|
||||||
|
//rev 0x10 and later:
|
||||||
|
// BESW(VID1_FIFO, 0x3800383f);
|
||||||
|
|
||||||
/**************************
|
/**************************
|
||||||
*** setup color keying ***
|
*** setup color keying ***
|
||||||
@ -886,75 +884,6 @@ BESW(VID1_MINI_CTL, 0);
|
|||||||
// ));
|
// ));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* >= NV10A */
|
|
||||||
|
|
||||||
/* setup buffer origin: GeForce uses subpixel precise clipping on left and top! (12.4 values) */
|
|
||||||
// BESW(NV10_0SRCREF, ((moi.v1srcstv << 4) & 0xffff0000) | ((moi.hsrcstv >> 12) & 0x0000ffff));
|
|
||||||
/* setup buffersize */
|
|
||||||
//fixme if needed: width must be even officially...
|
|
||||||
// BESW(NV10_0SRCSIZE, ((ob->height << 16) | ob->width));
|
|
||||||
/* setup source pitch including slopspace (in bytes),
|
|
||||||
* b16: select YUY2 (0 = YV12), b20: use colorkey, b24: no iturbt_709 (do iturbt_601) */
|
|
||||||
/* Note:
|
|
||||||
* source pitch granularity = 32 pixels on GeForce cards!! */
|
|
||||||
// BESW(NV10_0SRCPTCH, (((ob->width * 2) & 0x0000ffff) | (1 << 16) | (1 << 20) | (0 << 24)));
|
|
||||||
/* setup output window position */
|
|
||||||
// BESW(NV10_0DSTREF, ((moi.vcoordv & 0xffff0000) | ((moi.hcoordv & 0xffff0000) >> 16)));
|
|
||||||
/* setup output window size */
|
|
||||||
// BESW(NV10_0DSTSIZE, (
|
|
||||||
// (((moi.vcoordv & 0x0000ffff) - ((moi.vcoordv & 0xffff0000) >> 16) + 1) << 16) |
|
|
||||||
// ((moi.hcoordv & 0x0000ffff) - ((moi.hcoordv & 0xffff0000) >> 16) + 1)
|
|
||||||
// ));
|
|
||||||
/* setup horizontal scaling */
|
|
||||||
// BESW(NV10_0ISCALH, (hiscalv << 4));
|
|
||||||
/* setup vertical scaling */
|
|
||||||
// BESW(NV10_0ISCALV, (viscalv << 4));
|
|
||||||
/* setup (unclipped!) buffer startadress in RAM */
|
|
||||||
// BESW(NV10_0BUFADR, moi.a1orgv);
|
|
||||||
/* enable BES (b0 = 0) */
|
|
||||||
// BESW(NV10_GENCTRL, 0x00000000);
|
|
||||||
/* We only use buffer buffer 0: select it. (0x01 = buffer 0, 0x10 = buffer 1) */
|
|
||||||
/* This also triggers activation of programmed values (double buffered registers feature) */
|
|
||||||
// BESW(NV10_BUFSEL, 0x00000001);
|
|
||||||
|
|
||||||
/**************************
|
|
||||||
*** setup color keying ***
|
|
||||||
**************************/
|
|
||||||
|
|
||||||
/* setup colorkeying */
|
|
||||||
switch(si->dm.space)
|
|
||||||
{
|
|
||||||
case B_RGB15_LITTLE:
|
|
||||||
// BESW(NV10_COLKEY, (
|
|
||||||
// ((ow->blue.value & ow->blue.mask) << 0) |
|
|
||||||
// ((ow->green.value & ow->green.mask) << 5) |
|
|
||||||
// ((ow->red.value & ow->red.mask) << 10) |
|
|
||||||
// ((ow->alpha.value & ow->alpha.mask) << 15)
|
|
||||||
// ));
|
|
||||||
break;
|
|
||||||
case B_RGB16_LITTLE:
|
|
||||||
// BESW(NV10_COLKEY, (
|
|
||||||
// ((ow->blue.value & ow->blue.mask) << 0) |
|
|
||||||
// ((ow->green.value & ow->green.mask) << 5) |
|
|
||||||
// ((ow->red.value & ow->red.mask) << 11)
|
|
||||||
/* this space has no alpha bits */
|
|
||||||
// ));
|
|
||||||
break;
|
|
||||||
case B_CMAP8:
|
|
||||||
case B_RGB32_LITTLE:
|
|
||||||
default:
|
|
||||||
// BESW(NV10_COLKEY, (
|
|
||||||
// ((ow->blue.value & ow->blue.mask) << 0) |
|
|
||||||
// ((ow->green.value & ow->green.mask) << 8) |
|
|
||||||
// ((ow->red.value & ow->red.mask) << 16) |
|
|
||||||
// ((ow->alpha.value & ow->alpha.mask) << 24)
|
|
||||||
// ));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* note that overlay is in use (for eng_bes_move_overlay()) */
|
/* note that overlay is in use (for eng_bes_move_overlay()) */
|
||||||
si->overlay.active = true;
|
si->overlay.active = true;
|
||||||
|
Loading…
Reference in New Issue
Block a user