#ifndef _GR_H_ #define _GR_H_ /***************************************************************************\ |* *| |* Copyright (c) 1993-2000 NVIDIA, Corp. All rights reserved. *| |* *| |* NOTICE TO USER: The source code is copyrighted under U.S. and *| |* international laws. NVIDIA, Corp. of Sunnyvale, California owns *| |* the copyright and as design patents pending on the design and *| |* interface of the NV chips. Users and possessors of this source *| |* code are hereby granted a nonexclusive, royalty-free copyright *| |* and design patent license to use this code in individual and *| |* commercial software. *| |* *| |* Any use of this source code must include, in the user documenta- *| |* tion and internal comments to the code, notices to the end user *| |* as follows: *| |* *| |* Copyright (c) 1993-2000 NVIDIA, Corp. NVIDIA design patents *| |* pending in the U.S. and foreign countries. *| |* *| |* NVIDIA, CORP. MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF *| |* THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT *| |* EXPRESS OR IMPLIED WARRANTY OF ANY KIND. NVIDIA, CORP. DISCLAIMS *| |* ALL WARRANTIES WITH REGARD TO THIS SOURCE CODE, INCLUDING ALL *| |* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *| |* PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA, CORP. BE LIABLE *| |* FOR ANY SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, *| |* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR *| |* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER *| |* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR *| |* PERFORMANCE OF THIS SOURCE CODE. *| |* *| \***************************************************************************/ /**************************** Graphics Manager *****************************\ * * * Module: GR.H * * Graphics engine management. * * * ***************************************************************************** * * * History: * * * \***************************************************************************/ // // Include balanced tree defines. // #ifndef _BTREE_H_ #include #endif // _BTREE_H_ #ifndef _VBLANK_H_ #include #endif // _VBLANK_H_ //--------------------------------------------------------------------------- // // Defines. // //--------------------------------------------------------------------------- #define INVALID_COLOR_FORMAT 0xFFFFFFFF #define INVALID_MONO_FORMAT 0xFFFFFFFF #define INVALID_CHID 0xFFFFFFFF #define INVALID_BUFFER 0xFFFFFFFF #define BOTH_BUFFERS 3 #define BUFFER(b) BIT(b) #define PACK_XY(x,y) ((((y)&0xFFFF)<<16)|((x)&0xFFFF)) #define PACK_WH(x,y) ((((h)&0xFFFF)<<16)|((w)&0xFFFF)) #define MAX_GRPATCH_FANOUT 56 #define MAX_GRPATCH_INPUT 56 // If we are using a window manager, then we will allow complex canvas shapes // If we are not, we will just support the CLIP REGIONS allowed in hardware #ifdef USE_GUI #define MAX_CLIP_REGIONS 16 #else #define MAX_CLIP_REGIONS 2 #endif #define NUM_GRAPHICS_DEVICES 0x1C #define FIRST_RENDERING_DEVICE 0x07 #define GR_RAM_SIZE 32 #define ZFOG_RAM_SIZE 16 #define GR_DEVICE_INDEX(d) ((((d)>>16)&0x7F)-0x41) #define GR_IDLE() while ((volatile U032)REG_RD32(NV_PGRAPH_STATUS)) { \ V032 pmc; \ pmc = REG_RD32(NV_PMC_INTR_0); \ if (pmc & DRF_DEF(_PMC, _INTR_0, _PGRAPH, _PENDING)) { \ grService(pDev); \ } \ if (pmc & DRF_DEF(_PMC, _INTR_0, _PCRTC, _PENDING)) { \ VBlank(pDev); \ } \ } #define GR_DONE() while ((volatile U032)REG_RD32(NV_PGRAPH_STATUS)) \ ; #define GR_SAVE_STATE(misc) \ { \ misc = REG_RD32(NV_PGRAPH_FIFO); \ REG_WR32(NV_PGRAPH_FIFO, DRF_DEF(_PGRAPH, _FIFO, _ACCESS, _DISABLED)); \ } #define GR_RESTORE_STATE(misc) \ { \ REG_WR32(NV_PGRAPH_FIFO, misc); \ } #define GR_ASSERT_CHID(chid) (!(REG_RD32(NV_PGRAPH_INTR_0) & DRF_DEF(_PGRAPH, _INTR_0, _CONTEXT_SWITCH, _PENDING)) && (REG_RD_DRF(_PGRAPH, _CTX_USER, _CHID) == (chid))) #define NV3_GR_OPERATIONS 3 #define NV4_GR_OPERATIONS 6 #define NV_SRCCOPY NV_PGRAPH_CTX_SWITCH1_PATCH_CONFIG_SRCCOPY #define NV_SRCCOPY_AND NV_PGRAPH_CTX_SWITCH1_PATCH_CONFIG_SRCCOPY_AND #define NV_ROP_AND NV_PGRAPH_CTX_SWITCH1_PATCH_CONFIG_ROP_AND #define NV_BLEND_AND NV_PGRAPH_CTX_SWITCH1_PATCH_CONFIG_BLEND_AND #define NV_BLEND_PREMULT NV_PGRAPH_CTX_SWITCH1_PATCH_CONFIG_BLEND_PRE #define NV_SRCCOPY_PREMULT NV_PGRAPH_CTX_SWITCH1_PATCH_CONFIG_SRCCOPY_PRE //--------------------------------------------------------------------------- // // Miscellaneous structure definitions. // //--------------------------------------------------------------------------- #define REGION_UPDATE_CANVAS 0x00000001 #define REGION_UPDATE_CLIP 0x00000002 #define REGION_UPDATE_DISABLE 0x00000003 typedef struct _def_canvas_region { U032 hwnd; S032 CanvasLeft; S032 CanvasRight; S032 CanvasTop; S032 CanvasBottom; U032 ClipCount; S032 ClipLeft[MAX_CLIP_REGIONS]; S032 ClipRight[MAX_CLIP_REGIONS]; S032 ClipTop[MAX_CLIP_REGIONS]; S032 ClipBottom[MAX_CLIP_REGIONS]; U032 ClipInOut[MAX_CLIP_REGIONS]; U032 UpdateFlags; } CANVASREGION, * PCANVASREGION; //--------------------------------------------------------------------------- // // Graphics class defines. // //--------------------------------------------------------------------------- typedef struct _def_ordinal_object ORDINALOBJECT, *PORDINALOBJECT; typedef struct _def_video_patchcord VIDEOPATCHCORD, *PVIDEOPATCHCORD; typedef struct _def_image_patchcord IMAGEPATCHCORD, *PIMAGEPATCHCORD; typedef struct _def_beta_patchcord BETAPATCHCORD, *PBETAPATCHCORD; typedef struct _def_rop_patchcord ROPPATCHCORD, *PROPPATCHCORD; typedef struct _def_image_in_mem_object IMAGEINMEMOBJECT, *PIMAGEINMEMOBJECT; typedef struct _def_canvas { NODE Node; U032 CanvasID; U032 UsageCount; U032 BufferToggle; U032 xyMin; U032 xyMax; U032 ClipCount; U032 ClipMisc; U032 xyClipMin[MAX_CLIP_REGIONS]; U032 xyClipMax[MAX_CLIP_REGIONS]; U032 InOutClip[MAX_CLIP_REGIONS]; U032 CplxClipCount; U032 xyCplxClipMin[2]; U032 xyCplxClipMax[2]; } CANVAS, *PCANVAS; // Common fields between most graphics object structures. typedef struct _def_common_object COMMONOBJECT, *PCOMMONOBJECT; struct _def_common_object { OBJECT Base; U032 Valid; U032 NotifyPending; U032 Instance; PDMAOBJECT NotifyObject; PDMAOBJECT Dma0Object; PDMAOBJECT Dma1Object; PCOMMONOBJECT Next; }; // Macros to get to the common fields #define CBase Common.Base #define CValid Common.Valid #define CNotifyPending Common.NotifyPending #define CInstance Common.Instance #define CNext Common.Next typedef struct _def_video_object { OBJECT Base; PVIDEOPATCHCORD VideoOutput; PVIDEOPATCHCORD VideoInput[MAX_GRPATCH_INPUT]; } VIDEOOBJECT, *PVIDEOOBJECT; struct _def_video_patchcord { COMMONOBJECT Common; //OBJECT Base; U032 FanOut; PVIDEOOBJECT Source; PVIDEOOBJECT Destination[MAX_GRPATCH_FANOUT]; }; typedef struct _def_video_switch_object { OBJECT Base; PVIDEOPATCHCORD VideoOutput; PVIDEOPATCHCORD VideoInput[2]; VBLANKNOTIFY VBlankNotify[2]; PORDINALOBJECT Ordinal; PCANVAS Canvas; } VIDEOSWITCHOBJECT, *PVIDEOSWITCHOBJECT; struct _def_ordinal_object { OBJECT Base; U032 Value; PVIDEOSWITCHOBJECT Switch[MAX_GRPATCH_FANOUT]; U032 FanOut; }; typedef struct _def_video_sink { COMMONOBJECT Common; //OBJECT Base; PDMAOBJECT NameXlate; PVIDEOPATCHCORD VideoInput[MAX_GRPATCH_INPUT]; } VIDEOSINKOBJECT, *PVIDEOSINKOBJECT; typedef struct _def_video_colormap_object { COMMONOBJECT Common; //OBJECT Base; PVIDEOPATCHCORD VideoOutput; PVIDEOPATCHCORD VideoInput; U032 ColorFormat; PDMAOBJECT Xlate; U032 Start; U032 Length; U032 DirtyStart; U032 DirtyLength; U032 ColorMap[256]; } VIDEOCOLORMAPOBJECT, *PVIDEOCOLORMAPOBJECT; typedef struct _def_video_scaler_object { COMMONOBJECT Common; VIDEOSCALERHALOBJECT HalObject; } VIDEOSCALEROBJECT, *PVIDEOSCALEROBJECT; typedef struct _def_video_colorkey_object { COMMONOBJECT Common; VIDEOCOLORKEYHALOBJECT HalObject; #if 0 U032 ColorFormat; U032 Color; U032 xClipMin; U032 xClipMax; U032 yClipMin; U032 yClipMax; #endif } VIDEOCOLORKEYOBJECT, *PVIDEOCOLORKEYOBJECT; // // Pixel source/destination objects. // typedef struct _def_render_common RENDERCOMMON, *PRENDERCOMMON; typedef struct _def_render_common_object RENDERCOMMONOBJECT, *PRENDERCOMMONOBJECT; // // Graphics patch context representation // // This is a "snapshot" of the graphics context as it // relates to a given patch. // typedef struct _def_patch_context { U032 VideoConfig; PVIDEOCOLORMAPOBJECT ColorMap0; PVIDEOCOLORMAPOBJECT ColorMap1; PVIDEOSCALEROBJECT VideoScaler; PVIDEOCOLORKEYOBJECT VideoColorKey; PCOMMONOBJECT ColorKey; PCOMMONOBJECT Pattern; PCOMMONOBJECT Clip; PCOMMONOBJECT Rop; PCOMMONOBJECT Beta1; PCOMMONOBJECT Beta4; PCOMMONOBJECT Surface; PCOMMONOBJECT SurfaceSource; PCOMMONOBJECT SurfaceZeta; U032 Operation; } PATCHCONTEXT, *PPATCHCONTEXT; // Common field within the various render objects struct _def_render_common { PATCHCONTEXT PatchContext; PDMAOBJECT Xlate; }; // Macros to get to the common fields //#define RCPatch RenderCommon.Patch #define RCPatchContext RenderCommon.PatchContext #define RCXlate RenderCommon.Xlate // Common structure to be used as template structure for various render objects struct _def_render_common_object { COMMONOBJECT Common; RENDERCOMMON RenderCommon; }; /* typedef */ struct _def_image_in_mem_object { COMMONOBJECT Common; RENDERCOMMON RenderCommon; PIMAGEPATCHCORD ImageOutput; PIMAGEPATCHCORD ImageInput[MAX_GRPATCH_INPUT]; PDMAOBJECT NameXlate; PCANVAS Canvas; U032 Offset; U032 Pitch; U032 Buffer; }; //--------------------------------------------------------------------------- // // Function prototypes. // //--------------------------------------------------------------------------- RM_STATUS grCreateObj(VOID*, PCLASSOBJECT, U032, POBJECT *, VOID*); RM_STATUS grDestroyObj(VOID*, POBJECT); VOID grInitCommon(PCOMMONOBJECT, U032); VOID grInitRenderCommon(PRENDERCOMMON); RM_STATUS grNotifyComplete(VOID); RM_STATUS grValidateVideoPatchcord(PVIDEOPATCHCORD, PPATCHCONTEXT, U032); RM_STATUS grInvalidateVideoPatchcord(PVIDEOPATCHCORD); RM_STATUS grUnloadCurrentChannelContext(PHWINFO); RM_STATUS grLoadChannelContext(PHWINFO, U032); RM_STATUS grContextInstanceToObject(PHWINFO, U032, U032, POBJECT *); RM_STATUS grWaitVBlank(PHWINFO, PVBLANKNOTIFY, U032); RM_STATUS grCancelVBlank(PHWINFO, PVBLANKNOTIFY); RM_STATUS grVBlank(PHWINFO); V032 grService(PHWINFO); V032 grDmaService(VOID); RM_STATUS grVideoSwitchComplete(PHWINFO, POBJECT, U032, V032, RM_STATUS); RM_STATUS grUpdateObjectInstance(PHWINFO, PCOMMONOBJECT); RM_STATUS grDeleteObjectInstance(PHWINFO, PCOMMONOBJECT); BOOL grIsSetContextInHardware(PHWINFO); #endif // _GR_H_