added overlay colorkeying. Working OK in 15,16 and 32bit spaces. Works (with a tweak) in 8 bit space. The VIA hardware wants the colorpalette INDEX as key instead of the displayed color(cd obos_svn/trunk/src/add-ons/accelerants/via/). Unfortunately a reverse lookup isn't conclusive, as BeOS and Zeta use two palette entries for white. I'll try to find a hardware setup so that it wants a displayed color in 8-bit mode, but no guarantees yet. If this turns out to not be possible, I suggest adding the color-index of the current displayed mode (valid only in indexed mode, so CMAP8) to the system's overlay_window information struct, alongside the displayed color. Somehow (would break compatibility with other BeOS versions?). Anyway, I'll search for a different hardware setup for this. Keep your fingers crossed :)
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14224 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
f10cba9aec
commit
b96e7791c1
|
@ -61,8 +61,7 @@ uint32 OVERLAY_SUPPORTED_FEATURES(uint32 a_color_space)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
return
|
return
|
||||||
( B_OVERLAY_KEYING_USES_ALPHA |
|
( B_OVERLAY_COLOR_KEY |
|
||||||
B_OVERLAY_COLOR_KEY |
|
|
||||||
B_OVERLAY_HORIZONTAL_FILTERING |
|
B_OVERLAY_HORIZONTAL_FILTERING |
|
||||||
B_OVERLAY_VERTICAL_FILTERING );
|
B_OVERLAY_VERTICAL_FILTERING );
|
||||||
}
|
}
|
||||||
|
|
|
@ -884,11 +884,6 @@ status_t eng_configure_bes
|
||||||
BESW(VID1_CTL, 0x000f0081);
|
BESW(VID1_CTL, 0x000f0081);
|
||||||
}
|
}
|
||||||
|
|
||||||
//fixme: best move this instruction to be the last one done (so do after keying)
|
|
||||||
/* enable colorkeying (b0 = 1), enable chromakeying (b1 = 1), Vid1 on top of Vid3 (b20 = 0),
|
|
||||||
* all registers are loaded during the next 'BES-'VBI (b28 = 1), Vid1 cmds fire (b31 = 1) */
|
|
||||||
BESW(COMPOSE, 0x90000000);
|
|
||||||
|
|
||||||
|
|
||||||
/**************************
|
/**************************
|
||||||
*** setup color keying ***
|
*** setup color keying ***
|
||||||
|
@ -897,33 +892,66 @@ status_t eng_configure_bes
|
||||||
/* setup colorkeying */
|
/* setup colorkeying */
|
||||||
switch(si->dm.space)
|
switch(si->dm.space)
|
||||||
{
|
{
|
||||||
case B_RGB15_LITTLE:
|
|
||||||
// BESW(NV04_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(NV04_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_CMAP8:
|
||||||
case B_RGB32_LITTLE:
|
{
|
||||||
default:
|
/* do color palette index lookup for current colorkey */
|
||||||
// BESW(NV04_COLKEY, (
|
/* note:
|
||||||
// ((ow->blue.value & ow->blue.mask) << 0) |
|
* since apparantly some hardware works with color indexes instead of colors,
|
||||||
// ((ow->green.value & ow->green.mask) << 8) |
|
* it might be a good idea(!!) to include the colorindex in the system's
|
||||||
// ((ow->red.value & ow->red.mask) << 16) |
|
* overlay_window struct. */
|
||||||
// ((ow->alpha.value & ow->alpha.mask) << 24)
|
static uint8 *r,*g,*b;
|
||||||
// ));
|
static uint32 idx;
|
||||||
|
r = si->color_data;
|
||||||
|
g = r + 256;
|
||||||
|
b = g + 256;
|
||||||
|
/* if index 1 doesn't help us, we assume 0 will (got to program something anyway) */
|
||||||
|
//fixme, note, find a workaround or better HW setup:
|
||||||
|
//I'm counting down for a reason:
|
||||||
|
//BeOS assigns the color white (0x00ffffff) to two indexes in the palette:
|
||||||
|
//index 0x3f and 0xff. In the framebuffer index 0xff is used (apparantly).
|
||||||
|
//The hardware compares framebuffer to given key, so the BES must receive 0xff.
|
||||||
|
for (idx = 255; idx > 0; idx--)
|
||||||
|
{
|
||||||
|
if ((r[idx] == ow->red.value) &&
|
||||||
|
(g[idx] == ow->green.value) &&
|
||||||
|
(b[idx] == ow->blue.value))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
LOG(4,("Overlay: colorkey's palette index is $%02x\n", idx));
|
||||||
|
/* program color palette index into BES engine */
|
||||||
|
BESW(COLKEY, idx);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case B_RGB15_LITTLE:
|
||||||
|
BESW(COLKEY, (
|
||||||
|
((ow->blue.value & ow->blue.mask) << 0) |
|
||||||
|
((ow->green.value & ow->green.mask) << 5) |
|
||||||
|
((ow->red.value & ow->red.mask) << 10)
|
||||||
|
/* alpha keying is not supported here */
|
||||||
|
));
|
||||||
|
break;
|
||||||
|
case B_RGB16_LITTLE:
|
||||||
|
BESW(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_RGB32_LITTLE:
|
||||||
|
default:
|
||||||
|
BESW(COLKEY, (
|
||||||
|
((ow->blue.value & ow->blue.mask) << 0) |
|
||||||
|
((ow->green.value & ow->green.mask) << 8) |
|
||||||
|
((ow->red.value & ow->red.mask) << 16)
|
||||||
|
/* alpha keying is not supported here */
|
||||||
|
));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* enable colorkeying (b0 = 1), disable chromakeying (b1 = 0), Vid1 on top of Vid3 (b20 = 0),
|
||||||
|
* all registers are loaded during the next 'BES-'VBI (b28 = 1), Vid1 cmds fire (b31 = 1) */
|
||||||
|
BESW(COMPOSE, 0x90000001);
|
||||||
|
|
||||||
/* 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;
|
||||||
|
|
|
@ -120,7 +120,7 @@ status_t eng_dac_palette(uint8 r[256],uint8 g[256],uint8 b[256])
|
||||||
LOG(8,("DAC: PAL write index incorrect after programming\n"));
|
LOG(8,("DAC: PAL write index incorrect after programming\n"));
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
if (1)
|
if (0)
|
||||||
{//reread LUT
|
{//reread LUT
|
||||||
uint8 R, G, B;
|
uint8 R, G, B;
|
||||||
|
|
||||||
|
@ -131,7 +131,6 @@ if (1)
|
||||||
R = ENG_REG8(RG8_PALDATA);
|
R = ENG_REG8(RG8_PALDATA);
|
||||||
G = ENG_REG8(RG8_PALDATA);
|
G = ENG_REG8(RG8_PALDATA);
|
||||||
B = ENG_REG8(RG8_PALDATA);
|
B = ENG_REG8(RG8_PALDATA);
|
||||||
/* only compare the most significant 6 bits */
|
|
||||||
if ((r[i] != R) || (g[i] != G) || (b[i] != B))
|
if ((r[i] != R) || (g[i] != G) || (b[i] != B))
|
||||||
LOG(1,("DAC palette %d: w %x %x %x, r %x %x %x\n", i, r[i], g[i], b[i], R, G, B)); // apsed
|
LOG(1,("DAC palette %d: w %x %x %x, r %x %x %x\n", i, r[i], g[i], b[i], R, G, B)); // apsed
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,7 +90,7 @@ status_t eng_general_powerup()
|
||||||
{
|
{
|
||||||
status_t status;
|
status_t status;
|
||||||
|
|
||||||
LOG(1,("POWERUP: Haiku VIA Accelerant 0.14 running.\n"));
|
LOG(1,("POWERUP: Haiku VIA Accelerant 0.15 running.\n"));
|
||||||
|
|
||||||
/* preset no laptop */
|
/* preset no laptop */
|
||||||
si->ps.laptop = false;
|
si->ps.laptop = false;
|
||||||
|
|
Loading…
Reference in New Issue