2d and overlay restrictions update, 'comments doc' update

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@8525 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Rudolf Cornelissen 2004-08-02 11:45:53 +00:00
parent 612899f22c
commit c60b4ca002
4 changed files with 47 additions and 81 deletions

View File

@ -1,4 +1,4 @@
/* Written by Rudolf Cornelissen 05-2002/03-2004 */
/* Written by Rudolf Cornelissen 05-2002/08-2004 */
/* Note on 'missing features' in BeOS 5.0.3 and DANO:
* BeOS needs to define more colorspaces! It would be nice if BeOS would support the FourCC 'definitions'
@ -423,11 +423,11 @@ status_t GET_OVERLAY_CONSTRAINTS
}
/* NeoMagic scaling restrictions */
/* Note: NM BES does not support downscaling! */
/* Note: official max is 8.0, and NM BES does not support downscaling! */
oc->h_scale.min = 1.0;
oc->h_scale.max = 1024/(float)(ob->width - si->overlay.myBufInfo[offset].slopspace);
oc->h_scale.max = 8.0;
oc->v_scale.min = 1.0;
oc->v_scale.max = 1024/(float)ob->height;
oc->v_scale.max = 8.0;
return B_OK;
}

View File

@ -1,7 +1,7 @@
/* nm Acceleration functions */
/* Author:
Rudolf Cornelissen 3/2004-7/2004.
Rudolf Cornelissen 3/2004-8/2004.
*/
/*
@ -170,10 +170,10 @@ status_t nm_acc_init()
// so:
nm_acc_wait_idle();
/* setup engine depth and pixel pitch */
/* setup engine depth and engine destination-pitch */
ACCW(STATUS, ((si->engine.control & 0x0000ffff) << 16));
/* setup memory pitch */
ACCW(2200_PITCH,
/* setup engine source-pitch */
ACCW(2200_SRC_PITCH,
((si->fbc.bytes_per_row << 16) | (si->fbc.bytes_per_row & 0x0000ffff)));
break;
default:

View File

@ -1,5 +1,5 @@
/* NeoMagic Back End Scaler functions */
/* Written by Rudolf Cornelissen 05/2002-07/2004 */
/* Written by Rudolf Cornelissen 05/2002-08/2004 */
#define MODULE_BIT 0x00000200
@ -197,10 +197,11 @@ status_t nm_configure_bes
LOG(4,("Overlay: horizontal scaling factor is %f\n", (float)4096 / ifactor));
/* check scaling factor (and modify if needed) to be within scaling limits */
if (((((uint32)my_ov.width) << 12) / 1024) > bi.hiscalv)
/* the upscaling limit is 8.0 (see official Neomagic specsheets) */
if (bi.hiscalv < 0x00000200)
{
/* (non-inverse) factor too large, set factor to max. valid value */
bi.hiscalv = ((((uint32)my_ov.width) << 12) / 1024);
bi.hiscalv = 0x00000200;
LOG(4,("Overlay: horizontal scaling factor too large, clamping at %f\n", (float)4096 / bi.hiscalv));
}
/* horizontal downscaling cannot be done by NM BES hardware */
@ -245,8 +246,6 @@ status_t nm_configure_bes
}
/* take zoom into account */
bi.hsrcstv += ((uint32)my_ov.h_start) << 16;
/* AND below required by hardware */
bi.hsrcstv &= 0x03fffffc;
LOG(4,("Overlay: first hor. (sub)pixel of input bitmap contributing %f\n", bi.hsrcstv / (float)65536));
@ -292,13 +291,6 @@ status_t nm_configure_bes
LOG(4,("Overlay: last horizontal (sub)pixel of input bitmap contributing %f\n", bi.hsrcendv / (float)65536));
/* setup horizontal source last position excluding slopspace:
* this is the last pixel that will be used for calculating interpolated pixels */
bi.hsrclstv = ((ob->width - 1) - si->overlay.myBufInfo[offset].slopspace) << 16;
/* AND below required by hardware */
bi.hsrclstv &= 0x03ff0000;
/*******************************************
*** setup vertical scaling and clipping ***
*******************************************/
@ -314,10 +306,11 @@ status_t nm_configure_bes
bi.viscalv = ifactor;
/* check scaling factor (and modify if needed) to be within scaling limits */
if (((((uint32)my_ov.height) << 12) / 1024) > bi.viscalv)
/* the upscaling limit is 8.0 (see official Neomagic specsheets) */
if (bi.viscalv < 0x00000200)
{
/* (non-inverse) factor too large, set factor to max. valid value */
bi.viscalv = ((((uint32)my_ov.height) << 12) / 1024);
bi.viscalv = 0x00000200;
LOG(4,("Overlay: vertical scaling factor too large, clamping at %f\n", (float)4096 / bi.viscalv));
}
/* vertical downscaling cannot be done by NM BES hardware */
@ -374,23 +367,15 @@ status_t nm_configure_bes
/* take zoom into account */
bi.a1orgv += (my_ov.v_start * ob->bytes_per_row);
bi.weight += (((uint32)my_ov.v_start) << 16);
/* now include 'pixel precise' left clipping...
* (subpixel precision is not supported by NeoMagic cards) */
bi.a1orgv += ((bi.hsrcstv >> 16) * 2);
/* we need to step in 4-byte (2 pixel) granularity due to the nature of yuy2 */
bi.a1orgv &= ~0x03;
LOG(4,("Overlay: 'contributing part of buffer' origin is (cardRAM offset) $%08x\n",bi.a1orgv));
LOG(4,("Overlay: first vert. (sub)pixel of input bitmap contributing %f\n", bi.weight / (float)65536));
/* AND below is required by NM hardware. */
/* Buffer A topleft corner of field 1 (origin)(field 1 contains our full frames) */
bi.a1orgv &= 0x00fffff0;
/* field 1 weight: AND below required by hardware, also make sure 'sign' is always 'positive' */
bi.v1wghtv = bi.weight & 0x0000fffc;
/* setup field 1 (is our complete frame) vertical source last position.
* this is the last pixel that will be used for calculating interpolated pixels */
bi.v1srclstv = (ob->height - 1);
/* AND below required by hardware */
bi.v1srclstv &= 0x000003ff;
/*****************************
*** log color keying info ***
@ -460,13 +445,13 @@ status_t nm_configure_bes
LOG(4,("Overlay: accelerant is programming BES\n"));
/* unlock card overlay sequencer registers (b5 = 1) */
PCIGRPHW(GENLOCK, (PCIGRPHR(GENLOCK) | 0x20));
/* destination rectangle */
PCIGRPHW(HDCOORD1L, ((bi.hcoordv >> 16) & 0xff));
PCIGRPHW(HDCOORD2L, (bi.hcoordv & 0xff));
PCIGRPHW(HDCOORD21H, (((bi.hcoordv >> 4) & 0xf0) | ((bi.hcoordv >> 24) & 0x0f)));
PCIGRPHW(VDCOORD1L, ((bi.vcoordv >> 16) & 0xff));
PCIGRPHW(VDCOORD2L, (bi.vcoordv & 0xff));
PCIGRPHW(VDCOORD21H, (((bi.vcoordv >> 4) & 0xf0) | ((bi.vcoordv >> 24) & 0x0f)));
/* destination rectangle #1 (output window position and size) */
PCIGRPHW(HD1COORD1L, ((bi.hcoordv >> 16) & 0xff));
PCIGRPHW(HD1COORD2L, (bi.hcoordv & 0xff));
PCIGRPHW(HD1COORD21H, (((bi.hcoordv >> 4) & 0xf0) | ((bi.hcoordv >> 24) & 0x0f)));
PCIGRPHW(VD1COORD1L, ((bi.vcoordv >> 16) & 0xff));
PCIGRPHW(VD1COORD2L, (bi.vcoordv & 0xff));
PCIGRPHW(VD1COORD21H, (((bi.vcoordv >> 4) & 0xf0) | ((bi.vcoordv >> 24) & 0x0f)));
/* scaling */
PCIGRPHW(XSCALEL, (bi.hiscalv & 0xff));
PCIGRPHW(XSCALEH, ((bi.hiscalv >> 8) & 0xff));
@ -474,16 +459,11 @@ status_t nm_configure_bes
PCIGRPHW(YSCALEH, ((bi.viscalv >> 8) & 0xff));
/* inputbuffer #1 origin */
/* (we don't program buffer #2 as it's unused.) */
/* first include 'pixel precise' left clipping...
* (subpixel precision is not supported by NeoMagic cards) */
bi.a1orgv += ((bi.hsrcstv >> 16) * 2);
/* we need to step in 4-byte (2 pixel) granularity due to the nature of yuy2 */
bi.a1orgv &= ~0x03;
/* now setup buffer startadress and horizontal source end (minimizes used bandwidth) */
if (si->ps.card_type < NM2200)
{
bi.a1orgv >>= 1;
/* horizontal source end does not use subpixelprecision: granularity is 8 pixels */
/* (horizontal source end minimizes used bandwidth) */
PCIGRPHW(0xbc, (((((bi.hsrcendv >> 16) + 7) & ~8) / 8) - 1));
}
else
@ -491,6 +471,7 @@ status_t nm_configure_bes
/* NM2200 and later cards use bytes to define buffer pitch */
buf_pitch <<= 1;
/* horizontal source end does not use subpixelprecision: granularity is 16 pixels */
/* (horizontal source end minimizes used bandwidth) */
//fixme? divide by 16 instead of 8 (if >= NM2200 owners report trouble then use 8!)
//fixme? check if overlaybuffer width should also have granularity of 16 now!
PCIGRPHW(0xbc, (((((bi.hsrcendv >> 16) + 15) & ~16) / 16) - 1));
@ -504,11 +485,8 @@ status_t nm_configure_bes
/* b2 = 0: don't use horizontal mirroring (NM2160) */
/* other bits do ??? */
PCIGRPHW(0xbf, 0x02);
/* (subpixel precise) source rect clipping is not supported on NeoMagic cards;
* so we do 'pixel precise' left clipping via modification of buffer
* startadress above instead.
* (pixel precise top clipping is also done this way..) */
//fixme: checkout real pixel precise clipping on NM2200 and later cards!!!
/* destination rectangle #2 (output window position and size) */
/*
{
uint16 left = 0;
@ -516,17 +494,12 @@ status_t nm_configure_bes
uint16 top = 0;
uint16 bottom = 128;
left = (bi.hsrcstv >> 16);
right = (bi.hsrclstv >> 16);
top = (bi.weight >> 16);
bottom = (bi.v1srclstv >> 16);
PCISEQW(HSCOORD1L, (left & 0xff));
PCISEQW(HSCOORD2L, (right & 0xff));
PCISEQW(HSCOORD21H, (((right >> 4) & 0xf0) | ((left >> 8) & 0x0f)));
PCISEQW(VSCOORD1L, (top & 0xff));
PCISEQW(VSCOORD2L, (bottom & 0xff));
PCISEQW(VSCOORD21H, (((bottom >> 4) & 0xf0) | ((top >> 8) & 0x0f)));
PCISEQW(HD2COORD1L, (left & 0xff));
PCISEQW(HD2COORD2L, (right & 0xff));
PCISEQW(HD2COORD21H, (((right >> 4) & 0xf0) | ((left >> 8) & 0x0f)));
PCISEQW(VD2COORD1L, (top & 0xff));
PCISEQW(VD2COORD2L, (bottom & 0xff));
PCISEQW(VD2COORD21H, (((bottom >> 4) & 0xf0) | ((top >> 8) & 0x0f)));
}
*/
/* ??? */
@ -537,8 +510,10 @@ status_t nm_configure_bes
/* b1 = 0: disable alternating hardware buffers (NM2160) */
/* other bits do ??? */
PCISEQW(0x09, 0x11);
/* ??? */
PCISEQW(0x0a, 0x00);
/* we don't use PCMCIA Zoomed Video port capturing, set 1:1 scale just in case */
/* (b6-4 = Y downscale = 100%, b2-0 = X downscale = 100%;
* downscaling selectable in 12.5% steps on increasing setting by 1) */
PCISEQW(ZVCAP_DSCAL, 0x00);
/* global BES control */
PCIGRPHW(BESCTRL1, (bi.globctlv & 0xff));
PCISEQW(BESCTRL2, ((bi.globctlv >> 8) & 0xff));

View File

@ -1,5 +1,5 @@
/* Author:
Rudolf Cornelissen 4/2003-7/2004
Rudolf Cornelissen 4/2003-8/2004
*/
#define MODULE_BIT 0x00008000
@ -485,8 +485,8 @@ status_t nm_general_validate_pic_size (display_mode *target, uint32 *bytes_per_r
/* check if we can setup this mode with acceleration: */
*acc_mode = true;
/* NM2230 and later cards only support accelerated 24bit modes */
if ((si->ps.card_type < NM2230) && (target->space == B_RGB24)) *acc_mode = false;
/* pre-NM2200 cards don't support accelerated 24bit modes */
if ((si->ps.card_type < NM2200) && (target->space == B_RGB24)) *acc_mode = false;
/* virtual_width */
if (si->ps.card_type == NM2070)
@ -500,17 +500,8 @@ status_t nm_general_validate_pic_size (display_mode *target, uint32 *bytes_per_r
if (target->virtual_width > 1600) *acc_mode = false;
}
/* virtual_height */
if (si->ps.card_type < NM2200)
{
/* confirmed NM2070, NM2097 and NM2160 */
if (target->virtual_height > 1024) *acc_mode = false;
}
else
{
/* fixme: needs confirmation, assuming this height will still work.. */
if (target->virtual_height > 2048) *acc_mode = false;
}
/* virtual_height (confirmed NM2070, NM2097, NM2160 and NM2200 */
if (target->virtual_height > 1024) *acc_mode = false;
/* now check virtual_size based on CRTC constraints and modify if needed */
//fixme: checkout cardspecs here!! (NM2160 can do 8192 _bytes_ at least (in theory))