ngle_manual.txt revision 1.1
11.1Smacallan$NetBSD: ngle_manual.txt,v 1.1 2025/12/25 11:41:09 macallan Exp $
21.1Smacallan
31.1SmacallanThe Unofficial NGLE Manual
41.1Smacallan
51.1SmacallanPreface
61.1SmacallanThis manual covers what I've been able to figure out about HP's NGLE family of
71.1Smacallangraphics devices commonly used in HP PA-RISC workstations, namely HCRX24 and
81.1SmacallanPCI Visualize EG.
91.1SmacallanSince there is no official documentation available I used the NGLE code found in
101.1SmacallanXFree86 3.3 as a starting point, with plenty of guesswork and experimentation.
111.1SmacallanThe xf86 code is somewhat obfuscated ( register names are random numbers, and 
121.1Smacallanfew of the values written into them are explained ) and does not actually
131.1Smacallanaccelerate any graphics operations. It does however use the blitter to clear the
141.1Smacallanframebuffer and attribute planes, show how to use a cursor sprite, colour LUTs
151.1Smacallanand so on.
161.1SmacallanNone of this is endorsed, supported, or (likely) known to Hewlett-Packard.
171.1SmacallanAll register definitions are from
181.1Smacallanhttps://cvsweb.netbsd.org/bsdweb.cgi/src/sys/dev/ic/nglereg.h
191.1Smacallankernel drivers for HCRX and PCI Visualize EG:
201.1Smacallanhttps://cvsweb.netbsd.org/bsdweb.cgi/src/sys/arch/hppa/dev/hyperfb.c
211.1Smacallanhttps://cvsweb.netbsd.org/bsdweb.cgi/src/sys/arch/hppa/dev/gftfb.c
221.1SmacallanXorg driver:
231.1Smacallanhttps://cvsweb.netbsd.org/bsdweb.cgi/xsrc/external/mit/xf86-video-ngle/dist/src/
241.1Smacallan
251.1Smacallan1. Now how does this thing work
261.1SmacallanAll NGLE devices work in more or less the same way, with some differences in
271.1Smacallandetails and additional features. Every device occupies a 32MB range, half of
281.1Smacallanwhich contains the STI ROM and registers, the other is for framebuffer access.
291.1SmacallanThe framebuffer aperture can map exactly one chunk video memory - things like
301.1Smacallanfront or back buffers, overlay, attribute planes, and a few unusual things, like
311.1Smacallancolour maps and cursor sprite bitmaps. Read and write access can be controlled
321.1Smacallanindependently, and all settings apply to both the drawing engine and CPU access
331.1Smacallanthrough the framebuffer aperture.
341.1SmacallanThat means there is no such thing as direct framebuffer access, everything goes
351.1Smacallanthrough the graphics pipeline. If you set the engine to 32bit colour expansion
361.1Smacallanthen whatever you write into the aperture will be expanded. Also, care must be
371.1Smacallantaken to not atempt to access video memory while updating the cursor image or
381.1Smacallancolour maps.
391.1SmacallanAll framebuffer access applies a fixed pitch of 2048 pixels.
401.1SmacallanThe chips support the usual selection of graphics primitives - rectangle fill,
411.1Smacallancopy, colour expansion, and indirect access. There's plenty more ( many have 3D
421.1Smacallanfeatures ) but these are completely unknown.
431.1SmacallanAll register addresses are relative to STI region 2, and all registers are big
441.1Smacallanendian, even on PCI.
451.1Smacallan
461.1Smacallan2. Framebuffer access
471.1Smacallan#define	NGLE_BAboth		0x018000	/* read and write mode */
481.1Smacallan#define	NGLE_DBA		0x018004	/* Dest. Bitmap Access */
491.1Smacallan#define	NGLE_SBA		0x018008	/* Source Bitmap Access */
501.1Smacallan
511.1Smacallan#define BA(F,C,S,A,J,B,I)						\
521.1Smacallan	(((F)<<31)|((C)<<27)|((S)<<24)|((A)<<21)|((J)<<16)|((B)<<12)|(I))
531.1Smacallan	/* FCCC CSSS AAAJ JJJJ BBBB IIII IIII IIII */
541.1Smacallan
551.1Smacallan/* F */
561.1Smacallan#define	    IndexedDcd	0	/* Pixel data is indexed (pseudo) color */
571.1Smacallan#define	    FractDcd	1	/* Pixel data is Fractional 8-8-8 */
581.1Smacallan/* C */
591.1Smacallan#define	    Otc04	2	/* Pixels in each longword transfer (4) */
601.1Smacallan#define	    Otc32	5	/* Pixels in each longword transfer (32) */
611.1Smacallan#define	    Otc24	7	/* NGLE uses this for 24bit blits */
621.1Smacallan				/* Should really be... */
631.1Smacallan#define	    Otc01	7	/* one pixel per longword */
641.1Smacallan/* S */
651.1Smacallan#define	    Ots08	3	/* Each pixel is size (8)d transfer (1) */
661.1Smacallan#define	    OtsIndirect	6	/* Each bit goes through FG/BG color(8) */
671.1Smacallan/* A */
681.1Smacallan#define	    AddrByte	3	/* byte access? Used by NGLE for direct fb */
691.1Smacallan#define	    AddrLong	5	/* FB address is Long aligned (pixel) */
701.1Smacallan#define     Addr24	7	/* used for colour map access */
711.1Smacallan/* B */
721.1Smacallan#define	    BINapp0I	0x0	/* Application Buffer 0, Indexed */
731.1Smacallan#define	    BINapp1I	0x1	/* Application Buffer 1, Indexed */
741.1Smacallan#define	    BINovly	0x2	/* 8 bit overlay */
751.1Smacallan#define	    BINcursor	0x6	/* cursor bitmap on EG */
761.1Smacallan#define	    BINcmask	0x7	/* cursor mask on EG */
771.1Smacallan#define	    BINapp0F8	0xa	/* Application Buffer 0, Fractional 8-8-8 */
781.1Smacallan/* next one is a guess, my HCRX24 doesn't seem to have it */
791.1Smacallan#define	    BINapp1F8	0xb	/* Application Buffer 1, Fractional 8-8-8 */
801.1Smacallan#define	    BINattr	0xd	/* Attribute Bitmap */
811.1Smacallan#define	    BINcmap	0xf	/* colour map(s) */
821.1Smacallan/* I assume one of the undefined BIN* accesses the HCRX Z-buffer add-on. No clue
831.1Smacallan * about bit depth or if any bits are used for stencil */
841.1Smacallan 
851.1Smacallan/* other buffers are unknown */
861.1Smacallan/* J - 'BA just point' - function unknown */
871.1Smacallan/* I - 'BA index base' - function unknown */
881.1Smacallan
891.1SmacallanThe BIN* values control which buffer we access, Addr* controls how memory is
901.1Smacallanpresented to the CPU. With AddrLong all pixels are at 32bit boundaries, no
911.1Smacallanmatter the actual colour depth. Otc* controls how many pixels we write with a
921.1Smacallansingle 32bit access, so for 8bit we would use Otc04, for 24bit colour Otc01,
931.1Smacallanand Otc32 is for mono to colour expansion. OtsIndirect enables colour
941.1Smacallanexpansion, combined with Otc32 every set bit writes a foreground colour pixel,
951.1Smacallanunset bits can be transparent or background.
961.1SmacallanThe *Dcd bit's exact function is a bit unclear - we set it for 24bit colour
971.1Smacallanaccess to both framebuffer and colour maps. I suspect enabling it on an 8bit
981.1Smacallanbuffer will result in R3G3B2 output from rendering and blending operations,
991.1Smacallanwhich we know nothing about.
1001.1SmacallanSo, for normal access to the overlay on an HCRX we would use IndexedDcd, Otc04,
1011.1SmacallanOts8, AddrByte, BINovly.
1021.1SmacallanFramebuffer geometry is always 2048 pixels ( with pixel size determined by
1031.1SmacallanAddr* ) by whatever your hardware allows, memory outside the visible screen may
1041.1Smacallanor may not be accessible.
1051.1SmacallanHCRX always runs in 1280x1024, there is always an overlay and at least one 8bit
1061.1Smacallanimage buffer, HCRX24 has a 24bit buffer that can be used as two 8bit buffers.
1071.1SmacallanThere is no usable off-screen memory, in fact there seem to be registers to the
1081.1Smacallanright of the visible area.
1091.1SmacallanOn a PCI Visualize EG we get an actual 2048x2048 buffer which we can use any
1101.1Smacallanway we want.
1111.1SmacallanFinally, the xf86 code writes a one into
1121.1Smacallan#define	NGLE_CONTROL_FB		0x200005
1131.1Smacallanbefore framebuffer access, function is unknown but I suspect it turns off
1141.1Smacallanpipeline pacing, which is then re-enabled whenever we touch the blitter.
1151.1Smacallan
1161.1Smacallan3. Drawing engine
1171.1SmacallanBasically, you poke coordinates into registers and apply an opcode to the last
1181.1Smacallanwrite's address to start an operation ( and specify which ), and there are
1191.1Smacallanregisters to control drawing mode, ROPs etc.
1201.1SmacallanAll register writes go through a pipeline which has 32 entries on HCRX.
1211.1Smacallan
1221.1Smacallan#define	NGLE_BUSY		0x200000	/* busy register */
1231.1Smacallanthe first byte will be non-zero if the drawing engine is busy
1241.1Smacallan
1251.1Smacallan#define	NGLE_FIFO		0x200008	/* # of fifo slots */
1261.1Smacallan
1271.1SmacallanX and width in the upper 16bit, Y / height in the lower.
1281.1Smacallan#define	NGLE_DST_XY		0x000800	/* destination XY */
1291.1Smacallan#define	NGLE_SIZE		0x000804	/* size WH */
1301.1Smacallan#define	NGLE_SRC_XY		0x000808	/* source XY */
1311.1Smacallan#define	NGLE_TRANSFER_DATA	0x000820	/* 'transfer data' - this is */
1321.1Smacallan						/* a pixel mask on fills */
1331.1Smacallan#define NGLE_RECT		0x000200	/* opcode to start a fill */
1341.1Smacallan#define NGLE_BLIT		0x000300	/* opcode to start a blit */
1351.1Smacallan#define NGLE_HCRX_FASTFILL	0x000140	/* opcode for HCRX fast rect */
1361.1Smacallan#define	NGLE_RECT_SIZE_START	(NGLE_SIZE | NGLE_RECT)
1371.1Smacallan#define	NGLE_BLT_DST_START	(NGLE_DST_XY | NGLE_BLIT)
1381.1Smacallan
1391.1SmacallanSo, in order to draw a rectangle you write coordinates into NGLE_DST_XY, set
1401.1SmacallanNGLE_TRANSFER_DATA to all ones unless you want it stippled, then write the
1411.1Smacallanwidth/height into NGLE_SIZE|NGLE_RECT. Rectangle fills move the destination
1421.1Smacallancoordinates down by the rectangle's height.
1431.1SmacallanNGLE_BLIT copies a retangle from SRC_XY to DST_XY with ROP etc. applied. It is
1441.1Smacallanpossible to copy data between buffers, supported combinations of source and
1451.1Smacallandestination access modes need to be investigated.
1461.1SmacallanThere are likely other opcodes for things like vectors, triangles and so on.
1471.1SmacallanHCRX_FASTFILL is implied by the xf86 code, but not actually used. It seems to
1481.1Smacallanwork, more or less, but with strange side effects. More invastigation is needed.
1491.1Smacallan
1501.1Smacallan#define	NGLE_CPR		0x01800c	/* control plane register */
1511.1SmacallanThis is used when drawing into BINattr, on EG we use 0x00000102, on HCRX 
1521.1Smacallan0x04000F00 for 24bit. There has to be some conversion, there is no way the
1531.1Smacallanattribute plane is actually 32bit. No idea what the individual bits do, has to
1541.1Smacallanbe a combination of buffer selection ( front or back), colour mode / LUT
1551.1Smacallanselection, likely chip specific. Known values are from xf86.
1561.1Smacallan
1571.1Smacallan#define	NGLE_FG			0x018010	/* fg colour */
1581.1Smacallan#define	NGLE_BG			0x018014	/* bg colour */
1591.1Smacallan#define	NGLE_PLANEMASK		0x018018	/* image planemask */
1601.1Smacallan#define	NGLE_IBO		0x01801c	/* image binary op */
1611.1Smacallan
1621.1Smacallan#define IBOvals(R,M,X,S,D,L,B,F)					\
1631.1Smacallan	(((R)<<8)|((M)<<16)|((X)<<24)|((S)<<29)|((D)<<28)|((L)<<31)|((B)<<1)|(F))
1641.1Smacallan	/* LSSD XXXX MMMM MMMM RRRR RRRR ???? ??BF */
1651.1Smacallan
1661.1Smacallan/* R is a standard X11 ROP, no idea if the other bits are used for anything  */
1671.1Smacallan#define	    RopClr 	0x0
1681.1Smacallan#define	    RopSrc 	0x3
1691.1Smacallan#define	    RopInv 	0xc
1701.1Smacallan#define	    RopSet 	0xf
1711.1Smacallan/* M: 'mask addr offset' - function unknown */
1721.1Smacallan/* X */
1731.1Smacallan#define	    BitmapExtent08  3	/* Each write hits ( 8) bits in depth */
1741.1Smacallan#define	    BitmapExtent32  5	/* Each write hits (32) bits in depth */
1751.1Smacallan/* S: 'static reg' flag, NGLE sets it for blits, function is unknown but
1761.1Smacallan      we get occasional garbage in 8bit blits without it  */
1771.1Smacallan/* D */
1781.1Smacallan#define	    DataDynamic	    0	/* Data register reloaded by direct access */
1791.1Smacallan#define	    MaskDynamic	    1	/* Mask register reloaded by direct access */
1801.1Smacallan/* L */
1811.1SmacallanI suspect this selects how many mask bits to use in Otc* less than 32.
1821.1Smacallan#define	    MaskOtc	    0	/* Mask contains Object Count valid bits */
1831.1Smacallan/* B = 1 -> background transparency for masked fills */
1841.1Smacallan/* F probably the same for foreground */
1851.1Smacallan
1861.1SmacallanThese bit definitions are from xf86, the S bit seems to control masking off
1871.1Smacallanextra bits when the number of pixels written Otc* exceeds the right border.
1881.1SmacallanNot sure what exactly the *Dynamic and MaskOtc bits do.
1891.1SmacallanFor a plain rectangle fill into the overlay we would use 
1901.1SmacallanIBOvals(RopSrc, 0, BitmapExtent08, 1, DataDynamic, 0, 0, 0)
1911.1Smacallanand
1921.1SmacallanBA(IndexedDcd, Otc32, OtsIndirect, AddrLong, 0, BINovly, 0)
1931.1Smacallan... which draws 32 pixels at a time, without the S bit we would get our width
1941.1Smacallanexpanded to the next multiple of 32. Enable colour expansion so we draw in 
1951.1Smacallanwhatever colour is in NGLE_FG.
1961.1Smacallan
1971.1SmacallanFor a simple copy we would use
1981.1SmacallanBA(IndexedDcd, Otc04, Ots08, AddrLong, 0, BINovly, 0))
1991.1Smacallan... top copy four pixels at a time, Addr* doesn't seem to matter, disable colour
2001.1Smacallanexpansion.
2011.1SmacallanIBOvals(RopSrc, 0, BitmapExtent08, 1, DataDynamic, MaskOtc, 0, 0)
2021.1Smacallan... to write 8bit deep, plain copy, mask off extra pixels if our width isn't a
2031.1Smacallanmultiple of 4.
2041.1Smacallan
2051.1SmacallanTo do the same operations on a 24bit buffer just use Otc01, FractionalDcd and
2061.1SmacallanBitmapExtent32. No need to set the S bit on copies since all pixels are 32bit
2071.1Smacallananyway.
2081.1Smacallan
2091.1Smacallan4. Indirect framebuffer writes
2101.1SmacallanHP calls the mechanism 'BINC', no idea what it stands for. Basically, you set a
2111.1Smacallantarget address and then write data into registers which trigger operations
2121.1Smacallanprogrammed in DBA and IBO, with the traget address being updated according to
2131.1Smacallanwhich data register we write to. There is also a mechanism to copy blocks, used
2141.1Smacallanfor colour map and cursor bitmaps.
2151.1Smacallan
2161.1Smacallan#define	NGLE_BINC_SRC		0x000480	/* BINC src */
2171.1Smacallan#define	NGLE_BINC_DST		0x0004a0	/* BINC dst */
2181.1Smacallan#define	NGLE_BINC_MASK		0x0005a0	/* BINC pixel mask */
2191.1Smacallan#define	NGLE_BINC_DATA		0x0005c0	/* BINC data, inc X, some sort of blending */
2201.1Smacallan#define	NGLE_BINC_DATA_R	0x000600	/* BINC data, inc X */
2211.1Smacallan#define	NGLE_BINC_DATA_D	0x000620	/* BINC data, inc Y */
2221.1Smacallan#define	NGLE_BINC_DATA_U	0x000640	/* BINC data, dec Y */
2231.1Smacallan#define	NGLE_BINC_DATA_L	0x000660	/* BINC data, dec X */
2241.1Smacallan#define	NGLE_BINC_DATA_DR	0x000680	/* BINC data, inc X, inc Y */
2251.1Smacallan#define	NGLE_BINC_DATA_DL	0x0006a0	/* BINC data, dec X, inc Y */
2261.1Smacallan#define	NGLE_BINC_DATA_UR	0x0006c0	/* BINC data, inc X, dec Y */
2271.1Smacallan#define	NGLE_BINC_DATA_UL	0x0006e0	/* BINC data, dec X, dec Y */
2281.1Smacallan
2291.1SmacallanSRC and DST are 'linear' addresses, depending on Addr* in DBA, pitch is Addr*
2301.1Smacallantimes 2048.
2311.1SmacallanThe BINC_DATA registers differ only in the way the destination address is
2321.1Smacallanupdated, up or down a line, left or right by Otc* pixels.
2331.1SmacallanSo, in order to draw a 12x20 pixel character to (100,150) we would use the same
2341.1SmacallanDBA and IBO values we used for rectangles, write 0xfff00000 into NGLE_BINC_MASK
2351.1Smacallanto make sure we only write 12 pixels per line, set FG and BG as needed, set
2361.1SmacallanBINC_DST to (100 * 4 + 150 * 8192) - we're in AddrLong - then poke our character
2371.1Smacallanbitmap into NGLE_BINC_DATA_D, one left aligned line at a time.
2381.1SmacallanBINC operations by themselves are unlikely to overrun the pipeline but they may
2391.1Smacallanif a lot of them happen while something more time consuming, like a full screen
2401.1Smacallanscroll, is in progress.
2411.1SmacallanNot sure what exactly NGLE_BINC_DATA does, the xf86 code uses it for colour map
2421.1Smacallanupdates.
2431.1Smacallan
2441.1Smacallan5. Colour maps
2451.1SmacallanLUTs are held in their own buffer ( BINcmap ), size is likely chip-specific.
2461.1SmacallanHCRX has room for at least three 256 entry colour maps, EG probably has two or
2471.1Smacallanthree.
2481.1SmacallanBasically, we BINC-write our colour map into BINcmap, then tell the hardware to
2491.1Smacallanupdate the actual colour map(s) from that buffer.
2501.1SmacallanWe'd use:
2511.1SmacallanBA(FractDcd, Otc01, Ots08, Addr24, 0, BINcmap, 0)
2521.1SmacallanIBOvals(RopSrc, 0, BitmapExtent08, 0, DataDynamic, MaskOtc, 0, 0)
2531.1SmacallanNot sure how 'Addr24' differs from AddrLong, but that's what the xf86 code uses.
2541.1SmacallanThen set BINC_DST to 0 ( or whichever entry we want to update - 4 for the 2nd
2551.1Smacallanentry etc. ) and poke our colour map into BINC_DATA_R, one entry at a time.
2561.1SmacallanSending it to the DAC works like this - set BINC_SRC to 0, then write a command
2571.1Smacallaninto the appropriate LUTBLT register:
2581.1Smacallan#define	NGLE_EG_LUTBLT		0x200118	/* EG LUT blt ctrl */
2591.1Smacallan	/* EWRRRROO OOOOOOOO TTRRRRLL LLLLLLLL */
2601.1Smacallan	#define LBC_ENABLE	0x80000000
2611.1Smacallan	#define LBC_WAIT_BLANK	0x40000000
2621.1Smacallan	#define LBS_OFFSET_SHIFT	16
2631.1Smacallan	#define LBC_TYPE_MASK		0xc000
2641.1Smacallan	#define LBC_TYPE_CMAP		0
2651.1Smacallan	#define LBC_TYPE_CURSOR		0x8000
2661.1Smacallan	#define LBC_TYPE_OVERLAY	0xc000
2671.1Smacallan	#define LBC_LENGTH_SHIFT	0
2681.1SmacallanIn order to update the whole thing we would use 
2691.1SmacallanLBC_ENABLE | LBC_TYPE_CMAP | 0x100
2701.1SmacallanLength and offset are in 32bit words.
2711.1Smacallan
2721.1SmacallanHCRX uses a different register:
2731.1Smacallan#define	NGLE_HCRX_LUTBLT	0x210020	/* HCRX LUT blt ctrl */
2741.1Smacallan... which otherwise works exactly the same way.
2751.1Smacallan
2761.1SmacallanOn HCRX we need:
2771.1Smacallan- a linear ramp in the first 256 entries, 24bit output goes through this.
2781.1Smacallan- the overlay's colour map starts at entry 512
2791.1Smacallan- hardware sprite colours are controlled by two entries using LBC_TYPE_CURSOR
2801.1Smacallan  and offset 0
2811.1Smacallan
2821.1SmacallanOn EG:
2831.1Smacallan- the main colour map lives at offset 0, type LBC_TYPE_CMAP
2841.1Smacallan- four entries at offset 0 with LBC_TYPE_CURSOR, the first two do nothing, the
2851.1Smacallan  other two are cursor sprite colours
2861.1Smacallan
2871.1Smacallan6. Hardware cursor
2881.1SmacallanAgain, chip-specific. Cursor position works the same on HCRX and  PCI EG, uses
2891.1Smacallandifferent registers though. Older chips use a different register layout.
2901.1SmacallanBitmap access is different on HCRX, both support a 64x64 sprite.
2911.1Smacallan
2921.1Smacallan#define	NGLE_EG_CURSOR		0x200100	/* cursor coordinates on EG */
2931.1Smacallan	#define EG_ENABLE_CURSOR	0x80000000
2941.1Smacallan#define	NGLE_HCRX_CURSOR	0x210000	/* HCRX cursor coord & enable */
2951.1Smacallan	#define HCRX_ENABLE_CURSOR	0x80000000
2961.1SmacallanCoordinates are signed 12bit quantities, X in the upper halfword, Y in the
2971.1Smacallanlower, enable bit at 0x80000000. There is no hotspot register, negative
2981.1Smacallancoordinates will move the sprite partially off screen as expected.
2991.1SmacallanOn HCRX we need to write zero into
3001.1Smacallan#define	NGLE_HCRX_VBUS		0x000420	/* HCRX video bus access */
3011.1Smacallanbefore writing NGLE_HCRX_CURSOR.
3021.1Smacallan
3031.1SmacallanCursor bitmap access on HCRX is simple:
3041.1Smacallan#define	NGLE_HCRX_CURSOR_ADDR	0x210004	/* HCRX cursor address */
3051.1Smacallan#define	NGLE_HCRX_CURSOR_DATA	0x210008	/* HCRX cursor data */
3061.1SmacallanThe mask is at offset 0, bitmap at 0x80. Subsequent writes to CURSOR_DATA update
3071.1Smacallanthe address as expected.
3081.1Smacallan
3091.1SmacallanOn EG we have to use BINC writes:
3101.1SmacallanBA(IndexedDcd, Otc32, 0, AddrLong, 0, BINcmask, 0)
3111.1SmacallanIBOvals(RopSrc, 0, 0, 0, DataDynamic, MaskOtc, 0, 0)
3121.1Smacallanset BINC_DST to 0, then poke the mask into NGLE_BINC_DATA_R and
3131.1SmacallanNGLE_BINC_DATA_DL - write 32bit, move right, write the rest of the line, move
3141.1Smacallandown/left to the next line etc.
3151.1SmacallanNo LUTBLT analog here, for the the cursor bitmap use BINcursor.
3161.1Smacallan
3171.1Smacallan7. Miscellaneous
3181.1Smacallan#define	NGLE_HCRX_PLANE_ENABLE	0x21003c	/* HCRX plane enable */ 
3191.1Smacallan#define	NGLE_HCRX_MISCVID	0x210040	/* HCRX misc video */
3201.1Smacallan	#define HCRX_BOOST_ENABLE	0x80000000 /* extra high signal level */
3211.1Smacallan	#define HCRX_VIDEO_ENABLE	0x0A000000
3221.1Smacallan	#define HCRX_OUTPUT_ENABLE	0x01000000
3231.1Smacallanxf86 uses HCRX_VIDEO_ENABLE, the other bits were found by experiment, functions
3241.1Smacallanare guesswork. There are other bits with unknown function.
3251.1Smacallan
3261.1SmacallanThis is set by xf86, other values unknown.
3271.1Smacallan#define	NGLE_HCRX_HB_MODE2	0x210120	/* HCRX 'hyperbowl' mode 2 */
3281.1Smacallan	#define HYPERBOWL_MODE2_8_24					15
3291.1Smacallan
3301.1SmacallanThis seems to be the HCRX's analogue to FX's force attribute register - we can
3311.1Smacallanswitch between overlay opacity and image plane display mode on the fly
3321.1Smacallan#define	NGLE_HCRX_HB_MODE	0x210130	/* HCRX 'hyperbowl' */
3331.1Smacallan	#define HYPERBOWL_MODE_FOR_8_OVER_88_LUT0_NO_TRANSPARENCIES	4
3341.1Smacallan	#define HYPERBOWL_MODE01_8_24_LUT0_TRANSPARENT_LUT1_OPAQUE	8
3351.1Smacallan	#define HYPERBOWL_MODE01_8_24_LUT0_OPAQUE_LUT1_OPAQUE		10
3361.1Smacallan
3371.1Smacallan8. Visualize EG notes
3381.1SmacallanAll referenves to 'EG' and the like strictly refer to the PCI Visualize EG card
3391.1Smacallanwith 4MB video memory. There is a GSC variant whch may have 2MB or 4MB, other
3401.1Smacallandifferences are unknown.
3411.1SmacallanThe xf86 code does not support the PCI EG at all, it seems to be somewhat
3421.1Smacallansimilar to the 'Artist' variant, the cursor register is at the same address but
3431.1Smacallanworks as on HCRX. I suspect the GSC variant to be more like Artist.
3441.1SmacallanIt is possible to put cards with enough memory into double buffer mode using
3451.1Smacallanthe firmware configuration menu - I need to figure out what exactly that does.
3461.1SmacallanSame with grey scale mode, which may just select a different default palette. 
347