/******************************Module*Header***********************************\ * Module Name: hwmisc.c * * Hardware specific support routines and structures. * * Copyright (c) 1994-1998 3Dlabs Inc. Ltd. All rights reserved. * Copyright (c) 1995-1999 Microsoft Corporation. All rights reserved. * \******************************************************************************/ #include "precomp.h" #include "gdi.h" #include "tvp4020.h" // table to determine which logicops need read dest turned on in FBReadMode DWORD LogicopReadDest[] = { 0, /* 00 */ __FB_READ_DESTINATION, /* 01 */ __FB_READ_DESTINATION, /* 02 */ 0, /* 03 */ __FB_READ_DESTINATION, /* 04 */ __FB_READ_DESTINATION, /* 05 */ __FB_READ_DESTINATION, /* 06 */ __FB_READ_DESTINATION, /* 07 */ __FB_READ_DESTINATION, /* 08 */ __FB_READ_DESTINATION, /* 09 */ __FB_READ_DESTINATION, /* 10 */ __FB_READ_DESTINATION, /* 11 */ 0, /* 12 */ __FB_READ_DESTINATION, /* 13 */ __FB_READ_DESTINATION, /* 14 */ 0, /* 15 */ }; // table to determine which logicops need read dest turned on in Config DWORD ConfigReadDest[] = { 0, /* 00 */ __PERMEDIA_CONFIG_FBREAD_DST, /* 01 */ __PERMEDIA_CONFIG_FBREAD_DST, /* 02 */ 0, /* 03 */ __PERMEDIA_CONFIG_FBREAD_DST, /* 04 */ __PERMEDIA_CONFIG_FBREAD_DST, /* 05 */ __PERMEDIA_CONFIG_FBREAD_DST, /* 06 */ __PERMEDIA_CONFIG_FBREAD_DST, /* 07 */ __PERMEDIA_CONFIG_FBREAD_DST, /* 08 */ __PERMEDIA_CONFIG_FBREAD_DST, /* 09 */ __PERMEDIA_CONFIG_FBREAD_DST, /* 10 */ __PERMEDIA_CONFIG_FBREAD_DST, /* 11 */ 0, /* 12 */ __PERMEDIA_CONFIG_FBREAD_DST, /* 13 */ __PERMEDIA_CONFIG_FBREAD_DST, /* 14 */ 0, /* 15 */ }; // // Partial products array for width multiples of 32: // Use GET_PPCODE macro to access this // const PPCODE aPartialProducts[] = { 0, (0 << 6) | (0 << 3) | 0, 32, (0 << 6) | (0 << 3) | 1, 64, (0 << 6) | (1 << 3) | 1, 96, (1 << 6) | (1 << 3) | 1, 128, (1 << 6) | (1 << 3) | 2, 160, (1 << 6) | (2 << 3) | 2, 192, (2 << 6) | (2 << 3) | 2, 224, (1 << 6) | (2 << 3) | 3, 256, (2 << 6) | (2 << 3) | 3, 288, (1 << 6) | (3 << 3) | 3, 320, (2 << 6) | (3 << 3) | 3, 384, (3 << 6) | (3 << 3) | 3, // 352 = 384 384, (3 << 6) | (3 << 3) | 3, 416, (1 << 6) | (3 << 3) | 4, 448, (2 << 6) | (3 << 3) | 4, 512, (3 << 6) | (3 << 3) | 4, // 480 = 512 512, (3 << 6) | (3 << 3) | 4, 544, (1 << 6) | (4 << 3) | 4, 576, (2 << 6) | (4 << 3) | 4, 640, (3 << 6) | (4 << 3) | 4, // 608 = 640 640, (3 << 6) | (4 << 3) | 4, 768, (4 << 6) | (4 << 3) | 4, // 672 = 768 768, (4 << 6) | (4 << 3) | 4, // 704 = 768 768, (4 << 6) | (4 << 3) | 4, // 736 = 768 768, (4 << 6) | (4 << 3) | 4, 800, (1 << 6) | (4 << 3) | 5, 832, (2 << 6) | (4 << 3) | 5, 896, (3 << 6) | (4 << 3) | 5, // 864 = 896 896, (3 << 6) | (4 << 3) | 5, 1024, (4 << 6) | (4 << 3) | 5, // 928 = 1024 1024, (4 << 6) | (4 << 3) | 5, // 960 = 1024 1024, (4 << 6) | (4 << 3) | 5, // 992 = 1024 1024, (4 << 6) | (4 << 3) | 5, 1056, (1 << 6) | (5 << 3) | 5, 1088, (2 << 6) | (5 << 3) | 5, 1152, (3 << 6) | (5 << 3) | 5, // 1120 = 1152 1152, (3 << 6) | (5 << 3) | 5, 1280, (4 << 6) | (5 << 3) | 5, // 1184 = 1280 1280, (4 << 6) | (5 << 3) | 5, // 1216 = 1280 1280, (4 << 6) | (5 << 3) | 5, // 1248 = 1280 1280, (4 << 6) | (5 << 3) | 5, 1536, (5 << 6) | (5 << 3) | 5, // 1312 = 1536 1536, (5 << 6) | (5 << 3) | 5, // 1344 = 1536 1536, (5 << 6) | (5 << 3) | 5, // 1376 = 1536 1536, (5 << 6) | (5 << 3) | 5, // 1408 = 1536 1536, (5 << 6) | (5 << 3) | 5, // 1440 = 1536 1536, (5 << 6) | (5 << 3) | 5, // 1472 = 1536 1536, (5 << 6) | (5 << 3) | 5, // 1504 = 1536 1536, (5 << 6) | (5 << 3) | 5, 2048, (5 << 6) | (5 << 3) | 6, // 1568 = 2048 2048, (5 << 6) | (5 << 3) | 6, // 1600 = 2048 2048, (5 << 6) | (5 << 3) | 6, // 1632 = 2048 2048, (5 << 6) | (5 << 3) | 6, // 1664 = 2048 2048, (5 << 6) | (5 << 3) | 6, // 1696 = 2048 2048, (5 << 6) | (5 << 3) | 6, // 1728 = 2048 2048, (5 << 6) | (5 << 3) | 6, // 1760 = 2048 2048, (5 << 6) | (5 << 3) | 6, // 1792 = 2048 2048, (5 << 6) | (5 << 3) | 6, // 1824 = 2048 2048, (5 << 6) | (5 << 3) | 6, // 1856 = 2048 2048, (5 << 6) | (5 << 3) | 6, // 1888 = 2048 2048, (5 << 6) | (5 << 3) | 6, // 1920 = 2048 2048, (5 << 6) | (5 << 3) | 6, // 1952 = 2048 2048, (5 << 6) | (5 << 3) | 6, // 1984 = 2048 2048, (5 << 6) | (5 << 3) | 6, // 2016 = 2048 2048, (5 << 6) | (5 << 3) | 6, // 2048 = 2048 }; //------------------------------------------------------------------------------ // VOID vCheckDefaultState // // Checks that the default state of the hardware is set. // //------------------------------------------------------------------------------ VOID vCheckDefaultState(PPDev * ppdev) { #if 0 // Make sure we sync before checking vInputBufferSync(ppdev); ASSERTDD(READ_FIFO_REG(__Permedia2TagdY) == INTtoFIXED(1), "vCheckDefaultState: dY is not 1.0"); ASSERTDD(READ_FIFO_REG(__Permedia2TagTextureAddressMode) == __PERMEDIA_DISABLE, "vCheckDefaultState: TextureAddressMode is not disabled"); ASSERTDD(READ_FIFO_REG(__Permedia2TagTextureColorMode) == __PERMEDIA_DISABLE, "vCheckDefaultState: TextureColorMode is not disabled"); // ASSERTDD(P2_READ_FIFO_REG(__Permedia2TagTextureReadMode) // == __PERMEDIA_DISABLE, // "vCheckDefaultState: TextureReadMode is not disabled"); ASSERTDD(READ_FIFO_REG(__Permedia2TagAlphaBlendMode) == __PERMEDIA_DISABLE, "vCheckDefaultState: AlphaBlendMode is not disabled"); ASSERTDD(READ_FIFO_REG(__Permedia2TagColorDDAMode) == __PERMEDIA_DISABLE, "vCheckDefaultState: ColorDDAMode is not disabled"); ASSERTDD(READ_FIFO_REG(__Permedia2TagDitherMode) == __PERMEDIA_DISABLE, "vCheckDefaultState: DitherMode is not disabled"); ASSERTDD(READ_FIFO_REG(__Permedia2TagYUVMode) == __PERMEDIA_DISABLE, "vCheckDefaultState: YUVMode is not disabled"); #endif } //----------------------------------------------------------------------------- // // VOID vCalcPackedPP // // Function: // Calculate the packed partial products for the given width. // If outPitch is not NULL, then return the pitch in pixels // for the passed back packed partial product. // //----------------------------------------------------------------------------- VOID vCalcPackedPP(LONG width, LONG* outPitch, ULONG* outPackedPP) { LONG pitch = (width + 31) & ~31; LONG pp[4]; LONG ppn; LONG j; do { ppn = pp[0] = pp[1] = pp[2] = pp[3] = 0; if ( pitch >= MAX_PARTIAL_PRODUCT_P2 ) { ppn = pitch >> (MAX_PARTIAL_PRODUCT_P2); for ( j = 0; j < ppn; j++ ) { pp[j] = 1 + MAX_PARTIAL_PRODUCT_P2 - MIN_PARTIAL_PRODUCT_P2; } } for ( j = MIN_PARTIAL_PRODUCT_P2 ; j < MAX_PARTIAL_PRODUCT_P2 ; j++ ) { if ( pitch & (1 << j) ) { if ( ppn < 4 ) pp[ppn] = j + 1 - MIN_PARTIAL_PRODUCT_P2; ppn++; } } pitch += 32; // Add 32 to the pitch just in case we have // too many pps. } while ( ppn > 3 ); // We have to loop until we get a pitch // with < 4 pps pitch -= 32; // Pitch is now the correct number of words if (outPitch != NULL) { *outPitch = pitch; } else { // if outPitch is null, then caller expects calculated pitch to be // the same as the width ASSERTDD(pitch == width, "vCalcPackedPP: pitch does not equal width"); } *outPackedPP = pp[0] | (pp[1] << 3) | (pp[2] << 6); }// vCalcPackedPP()