Annotation of ntddk/src/video/displays/s3/bankmgr.c, revision 1.1.1.1

1.1       root        1: /******************************************************************************
                      2:  *
                      3:  *  S3 Bank Manager
                      4:  *
                      5:  * Copyright (c) 1992 Microsoft Corporation
                      6:  *****************************************************************************/
                      7: 
                      8: #include "driver.h"
                      9: 
                     10: // Bank select forward prototype.
                     11: 
                     12: VOID vSetS3Bank(PPDEV ppdev, UINT iBank);
                     13: 
                     14: /******************************************************************************
                     15:  * bBankInit - Initialize the bank manager.
                     16:  *
                     17:  *  Setup the ppdev->arclBanks Array.  Since this driver is chip specific,
                     18:  *  we can take a number of short cuts.  We know there will always
                     19:  *  be 1 meg of memory on the board, and there will only be 1 64K R/W
                     20:  *  bank.
                     21:  *
                     22:  *****************************************************************************/
                     23: BOOL bBankInit(
                     24:     PPDEV ppdev,
                     25:     BOOL fFirstTime)
                     26: {
                     27:     INT     i;
                     28:     BYTE    jMemCfg;
                     29: 
                     30:     DISPDBG((3, "S3.DLL: bBankInit - Entry\n"));
                     31: 
                     32:     if (fFirstTime)
                     33:     {
                     34:         ppdev->BankSize     = MEMORY_APERTURE_SIZE;
                     35:         ppdev->ScansPerBank = ppdev->BankSize / ppdev->cxMaxRam;
                     36:         ppdev->MaxBanks     = ppdev->cyMaxRam / ppdev->ScansPerBank;
                     37: 
                     38:         ppdev->prclBanks = LocalAlloc(LPTR, ppdev->MaxBanks * sizeof (RECT));
                     39:         if (ppdev->prclBanks == NULL)
                     40:         {
                     41:             DISPDBG((0, "S3.DLL!bBankInit -  LocalAlloc (prclBanks) failed \n"));
                     42:             EngSetLastError(ERROR_NOT_ENOUGH_MEMORY);
                     43:             return (FALSE);
                     44:         }
                     45: 
                     46:         ppdev->pBanks = LocalAlloc(LPTR, ppdev->MaxBanks * sizeof (BANK));
                     47:         if (ppdev->pBanks == NULL)
                     48:         {
                     49:             DISPDBG((0, "S3.DLL!bBankInit -  LocalAlloc (pBanks) failed \n"));
                     50:             EngSetLastError(ERROR_NOT_ENOUGH_MEMORY);
                     51:             return (FALSE);
                     52:         }
                     53: 
                     54:         // Note: We only care about scans for the S3 chip.  So don't
                     55:         // bother initializing the left and right sides of the rectangle.
                     56: 
                     57:         for (i = 0; i < ppdev->MaxBanks; i++) {
                     58:             ppdev->prclBanks[i].top    = i * ppdev->ScansPerBank;
                     59:             ppdev->prclBanks[i].bottom = ppdev->prclBanks[i].top + ppdev->ScansPerBank;
                     60:         }
                     61:     }
                     62: 
                     63:     // Unlock some of the S3 registers.
                     64: 
                     65:     OUTPW (CRTC_INDEX, ((REG_UNLOCK_1 << 8) | S3R8));
                     66: 
                     67:     // Enable the Memory Aperture.
                     68: 
                     69:     OUTP(CRTC_INDEX, S3R1);
                     70:     jMemCfg = INP(CRTC_DATA);
                     71:     jMemCfg |= CPUA_BASE;
                     72:     OUTP(CRTC_DATA, jMemCfg);
                     73: 
                     74:     // Get the initial value of S3R5 and save it away.
                     75:     // This will prevent reading the Aperature control register
                     76:     // each time we want to set the bank.
                     77: 
                     78:     OUTP(CRTC_INDEX, S3R5);
                     79:     ppdev->jS3R5 = INP(CRTC_DATA);
                     80:     ppdev->jS3R5 &= 0xF0;                 // Just mask for the bits we want.
                     81: 
                     82:     return(TRUE);
                     83: }
                     84: 
                     85: /******************************************************************************
                     86:  * bBankEnumStart - Start the bank enumeration.
                     87:  *
                     88:  *  Save the original values for pvScan0 and rclBounds (The start of the
                     89:  *  engine managed bitmap and the clipping bounding rectangle.)
                     90:  *
                     91:  *  Setup all the banks to enumerate in the ppdev->pBanks array.
                     92:  *  Setup the first bank to enumerate.
                     93:  *
                     94:  *  Entry:  prclScan->bottom - Ptr to the top (first) scan to render (inclusive)
                     95:  *          prclScan->top    - Ptr to the bottom (last) scan to render (inclusive)
                     96:  *          pso              - The surface object.
                     97:  *          pco              - The clipping object.
                     98:  *
                     99:  *  Exit:   TRUE             - if any rendering needs to be done.
                    100:  *          FALSE            - if there is nothing to render, (i.e. the object
                    101:  *                             is completely clipped out.)
                    102:  *          prclScan->bottom - The Top Scan to render into.
                    103:  *          prclScan->top    - The Bottom Scan to render into.
                    104:  *
                    105:  *****************************************************************************/
                    106: BOOL bBankEnumStart(
                    107:     PPDEV ppdev,
                    108:     PRECTL prclScans,
                    109:     SURFOBJ *pso,
                    110:     CLIPOBJ *pco)
                    111: {
                    112:     LONG    TopScan, BottomScan, BankBottom;
                    113:     PBYTE   pbScan0;
                    114:     INT     i, iFirstBank, iLastBank;
                    115: 
                    116:     DISPDBG((3, "S3.DLL: bBankEnumStart - Entry\n"));
                    117: 
                    118:     // Save the original pvScan0 and the ClipObj's rclBounds.
                    119: 
                    120:     ppdev->pvOrgScan0      = pso->pvScan0;
                    121:     ppdev->rclOrgBounds    = pco->rclBounds;
                    122:     ppdev->iOrgDComplexity = pco->iDComplexity;
                    123:     ppdev->fjOptions       = pco->fjOptions;
                    124: 
                    125:     // Set the flag in the clip object to tell the engine to forcible
                    126:     // clip to the rclBounds of the clip object.
                    127: 
                    128:     pco->fjOptions |= OC_BANK_CLIP;
                    129: 
                    130:     // If the clipping is not trivial, do an intersection of the
                    131:     // top & bottom scans with the clipping bounds.
                    132: 
                    133:     if (pco->iDComplexity != DC_TRIVIAL)
                    134:     {
                    135:         TopScan    = max (pco->rclBounds.top, prclScans->top);
                    136:         BottomScan = min (pco->rclBounds.bottom, prclScans->bottom);
                    137:     }
                    138:     else
                    139:     {
                    140:         TopScan    = prclScans->top;
                    141:         BottomScan = prclScans->bottom;
                    142:     }
                    143: 
                    144:     // Init the variables used to set up the banks.
                    145: 
                    146:     iLastBank = -1;
                    147:     ppdev->cBanks    = 0;
                    148:     ppdev->iBank     = 0;
                    149:     pbScan0   = (PBYTE) pso->pvScan0;
                    150: 
                    151:     // Find the bank that contains the top scan (the first bank).
                    152: 
                    153:     for (i = 0; i < ppdev->MaxBanks; i++)
                    154:     {
                    155:         BankBottom = ppdev->prclBanks[i].bottom;
                    156:         if (BankBottom > TopScan)
                    157:         {
                    158:             // The Top scan is within this bank,
                    159: 
                    160:             iFirstBank = i;
                    161: 
                    162:             // Set up the bank entry.
                    163: 
                    164:             ppdev->pBanks[ppdev->iBank].pvScan0     = pbScan0 - (i * ppdev->BankSize);
                    165:             ppdev->pBanks[ppdev->iBank].Bank        = i;
                    166:             ppdev->pBanks[ppdev->iBank].rclClip.top = TopScan;
                    167: 
                    168:             if (BankBottom < BottomScan)
                    169:             {
                    170:                 ppdev->pBanks[ppdev->iBank].rclClip.bottom = BankBottom;
                    171:             }
                    172:             else
                    173:             {
                    174:                 ppdev->pBanks[ppdev->iBank].rclClip.bottom = BottomScan;
                    175:                 iLastBank = iFirstBank;
                    176:             }
                    177: 
                    178:             // Set the left and right bounds of the bank clip rect.
                    179: 
                    180:             ppdev->pBanks[ppdev->iBank].rclClip.left  = pco->rclBounds.left;
                    181:             ppdev->pBanks[ppdev->iBank].rclClip.right = pco->rclBounds.right;
                    182: 
                    183:             // Bump bank array index to next entry and the bank
                    184:             // count.
                    185: 
                    186:             ppdev->iBank++;
                    187:             ppdev->cBanks++;
                    188: 
                    189:             // Since we found the first bank, bail out of this loop.
                    190: 
                    191:             break;
                    192: 
                    193:         }
                    194:     }
                    195: 
                    196:     if (i == ppdev->MaxBanks) {
                    197: 
                    198:         RIP("S3.DLL: bBankEnumStart - error \n");
                    199:         return FALSE;
                    200:     }
                    201: 
                    202:     if (iLastBank != iFirstBank)
                    203:     {
                    204:         // Set the last bank to the first bank in case there are no
                    205:         // middle banks.
                    206: 
                    207:         iLastBank = iFirstBank;
                    208: 
                    209:         // Take care of all the middle banks.
                    210: 
                    211:         for (i = iFirstBank+1; i < ppdev->MaxBanks; i++)
                    212:         {
                    213:             if (ppdev->prclBanks[i].bottom < BottomScan)
                    214:             {
                    215:                 // This bank is completely within the rendering rectangle.
                    216: 
                    217:                 ppdev->pBanks[ppdev->iBank].pvScan0        = pbScan0 - (i * ppdev->BankSize);
                    218:                 ppdev->pBanks[ppdev->iBank].Bank           = i;
                    219:                 ppdev->pBanks[ppdev->iBank].rclClip.top    = ppdev->prclBanks[i].top;
                    220:                 ppdev->pBanks[ppdev->iBank].rclClip.bottom = ppdev->prclBanks[i].bottom;
                    221: 
                    222:                 // Set the left and right bounds of the bank clip rect.
                    223: 
                    224:                 ppdev->pBanks[ppdev->iBank].rclClip.left  = pco->rclBounds.left;
                    225:                 ppdev->pBanks[ppdev->iBank].rclClip.right = pco->rclBounds.right;
                    226: 
                    227:                 // Bump bank array index to next entry and the bank
                    228:                 // count.
                    229: 
                    230:                 ppdev->iBank++;
                    231:                 ppdev->cBanks++;
                    232: 
                    233:                 iLastBank = i;
                    234:             }
                    235:             else
                    236:             {
                    237:                 // The bottom of the bank we're currently "looking" at is
                    238:                 // below (greater in value) than the bottom of the rectangle
                    239:                 // were rendering, so there we're done looking at the middle
                    240:                 // banks.
                    241: 
                    242:                 break;
                    243:             }
                    244:         }
                    245: 
                    246:         // Now take care of the last bank.
                    247: 
                    248:         iLastBank++;
                    249: 
                    250:         if (ppdev->prclBanks[iLastBank].top < BottomScan)
                    251:         {
                    252:             ppdev->pBanks[ppdev->iBank].pvScan0        = pbScan0 - (iLastBank * ppdev->BankSize);
                    253:             ppdev->pBanks[ppdev->iBank].Bank           = iLastBank;
                    254: 
                    255:             ppdev->pBanks[ppdev->iBank].rclClip.top    = ppdev->prclBanks[iLastBank].top;
                    256:             ppdev->pBanks[ppdev->iBank].rclClip.bottom = BottomScan;
                    257: 
                    258:             ppdev->pBanks[ppdev->iBank].rclClip.left   = pco->rclBounds.left;
                    259:             ppdev->pBanks[ppdev->iBank].rclClip.right  = pco->rclBounds.right;
                    260: 
                    261:             ppdev->cBanks++;
                    262: 
                    263:         }
                    264:     }
                    265: 
                    266:     // We need to make sure the clipping level is at least DC_RECT.
                    267:     // Some code in the engine (like EngCopybits) will ignore the
                    268:     // clip rectangle entirely if the level is DC_TRIVIAL.
                    269: 
                    270:     if (pco->iDComplexity == DC_TRIVIAL)
                    271:         pco->iDComplexity = DC_RECT;
                    272: 
                    273:     // Now take care of setting the first bank
                    274: 
                    275:     ppdev->iBank = 1;                     // set the next bank index
                    276:     ppdev->cBanks--;                      // set # of remaining banks
                    277: 
                    278:     // Set the top and bottom scans for the caller
                    279: 
                    280:     prclScans->top    = ppdev->pBanks[0].rclClip.top;     // set top scan.
                    281:     prclScans->bottom = ppdev->pBanks[0].rclClip.bottom;  // set bottom scan.
                    282: 
                    283:     // Set the S3 chip.
                    284: 
                    285:     vSetS3Bank(ppdev, ppdev->pBanks[0].Bank);
                    286: 
                    287:     // Set the clip rectangle for the engine.
                    288: 
                    289:     pco->rclBounds = ppdev->pBanks[0].rclClip;
                    290: 
                    291:     // Set pvScan0 for the engine.
                    292: 
                    293:     pso->pvScan0 = ppdev->pBanks[0].pvScan0;
                    294: 
                    295:     ENABLE_DIRECT_ACCESS;
                    296: 
                    297:     return (TRUE);
                    298: }
                    299: 
                    300: /******************************************************************************
                    301:  * bSrcBankEnumStart - Start the bank enumeration when the screen is the
                    302:  *                     source
                    303:  *
                    304:  *  Save the original values for pvScan0 and rclBounds (The start of the
                    305:  *  engine managed bitmap and the clipping bounding rectangle.)
                    306:  *
                    307:  *  Setup all the banks to enumerate in the ppdev->pBanks array.
                    308:  *  Setup the first bank to enumerate.
                    309:  *
                    310:  *  Entry:  prclScan->bottom - Ptr to the top (first) scan to render (inclusive)
                    311:  *          prclScan->top    - Ptr to the bottom (last) scan to render (inclusive)
                    312:  *          pso              - The surface object.
                    313:  *          pco              - The clipping object.
                    314:  *
                    315:  *  Exit:   TRUE             - if any rendering needs to be done.
                    316:  *          FALSE            - if there is nothing to render, (i.e. the object
                    317:  *                             is completely clipped out.)
                    318:  *          prclScan->bottom - The Top Scan to render into.
                    319:  *          prclScan->top    - The Bottom Scan to render into.
                    320:  *
                    321:  * NOTE: This routine is a little trickier than bBankEnumStart.  We make GDI
                    322:  * read only the current bank by altering the CLIPOBJ before passing the
                    323:  * call back to GDI.  The problem here is that the CLIPOBJ applies only to the
                    324:  * destination, but for this case it's the screen that is the source.  So we
                    325:  * have to adjust for this accordingly.
                    326:  *
                    327:  *****************************************************************************/
                    328: BOOL bSrcBankEnumStart(
                    329:     PPDEV ppdev,
                    330:     PRECTL prclScans,
                    331:     SURFOBJ *pso,
                    332:     CLIPOBJ *pco,
                    333:     PRECTL  prclDest)
                    334: {
                    335:     LONG    TopScan, BottomScan, BankBottom;
                    336:     PBYTE   pbScan0;
                    337:     INT     i, iFirstBank, iLastBank, cyFirstBank, cyMiddleBanks;
                    338:     RECTL   rclBounds;
                    339: 
                    340:     DISPDBG((3, "S3.DLL: bSrcBankEnumStart - Entry\n"));
                    341: 
                    342:     // Save the original pvScan0 and the ClipObj's rclBounds.
                    343: 
                    344:     ppdev->pvOrgScan0      = pso->pvScan0;
                    345:     ppdev->rclOrgBounds    = pco->rclBounds;
                    346:     ppdev->iOrgDComplexity = pco->iDComplexity;
                    347:     ppdev->fjOptions       = pco->fjOptions;
                    348: 
                    349:     // If the clipping is not trivial, do an intersection of the
                    350:     // Set the flag in the clip object to tell the engine to forcible
                    351:     // clip to the rclBounds of the clip object.
                    352: 
                    353:     pco->fjOptions |= OC_BANK_CLIP;
                    354: 
                    355:     // top & bottom scans with the clipping bounds.
                    356: 
                    357:     // NOTE: Since the Scans rectangle and the clipping rectangle
                    358:     //       refer to two different surfaces, we will always use the
                    359:     //       the Scans rectangle to determine the bank(s) we need to
                    360:     //       enumerate.
                    361: 
                    362:     // rclBounds keeps track of the y-extents of the destination, and is
                    363:     // calculated from the intersection of the destination rectangle
                    364:     // and the CLIPOBJ's bounds:
                    365: 
                    366:     if (pco->iDComplexity != DC_TRIVIAL)
                    367:     {
                    368:         rclBounds.top    = max(prclDest->top,    pco->rclBounds.top);
                    369:         rclBounds.bottom = min(prclDest->bottom, pco->rclBounds.bottom);
                    370:     }
                    371:     else
                    372:     {
                    373:         rclBounds.top    = prclDest->top;
                    374:         rclBounds.bottom = prclDest->bottom;
                    375:     }
                    376: 
                    377:     // TopScan and BottomScan keep track of the corresponding y-extents of
                    378:     // the source:
                    379: 
                    380:     TopScan    = prclScans->top    + (rclBounds.top    - prclDest->top);
                    381:     BottomScan = prclScans->bottom + (rclBounds.bottom - prclDest->bottom);
                    382: 
                    383:     // Init the variables used to set up the banks.
                    384: 
                    385:     iLastBank     = -1;
                    386:     ppdev->cBanks = 0;
                    387:     ppdev->iBank  = 0;
                    388:     pbScan0       = (PBYTE) pso->pvScan0;
                    389: 
                    390:     // Find the bank that contains the top scan (the first bank).
                    391: 
                    392:     for (i = 0; i < ppdev->MaxBanks; i++)
                    393:     {
                    394:         BankBottom = ppdev->prclBanks[i].bottom;
                    395:         if (BankBottom > TopScan)
                    396:         {
                    397:             // The Top scan is within this bank,
                    398: 
                    399:             iFirstBank = i;
                    400: 
                    401:             // Set up the bank entry.
                    402: 
                    403:             ppdev->pBanks[ppdev->iBank].pvScan0     = pbScan0 - (i * ppdev->BankSize);
                    404:             ppdev->pBanks[ppdev->iBank].Bank        = i;
                    405:             ppdev->pBanks[ppdev->iBank].rclClip.top = rclBounds.top;
                    406: 
                    407:             // Take care of the case where the entire operation
                    408:             // fits within one bank.
                    409: 
                    410:             if (BankBottom < BottomScan)
                    411:             {
                    412:                 // The operation spans more than this one bank.
                    413: 
                    414:                 cyFirstBank = BankBottom - TopScan;
                    415:                 ppdev->pBanks[ppdev->iBank].rclClip.bottom = rclBounds.top + cyFirstBank;
                    416:             }
                    417:             else
                    418:             {
                    419:                 // The operation is completel contained with in this
                    420:                 // single bank.
                    421: 
                    422:                 ppdev->pBanks[ppdev->iBank].rclClip.bottom = rclBounds.bottom;
                    423:                 iLastBank = iFirstBank;
                    424:             }
                    425: 
                    426:             // Set the left and right bounds of the bank clip rect.
                    427: 
                    428:             ppdev->pBanks[ppdev->iBank].rclClip.left  = pco->rclBounds.left;
                    429:             ppdev->pBanks[ppdev->iBank].rclClip.right = pco->rclBounds.right;
                    430: 
                    431:             // Bump bank array index to next entry and the bank
                    432:             // count.
                    433: 
                    434:             ppdev->iBank++;
                    435:             ppdev->cBanks++;
                    436: 
                    437:             // Since we found the first bank, bail out of this loop.
                    438: 
                    439:             break;
                    440: 
                    441:         }
                    442:     }
                    443: 
                    444:     if (i == ppdev->MaxBanks) {
                    445: 
                    446:         RIP("S3.DLL: bSrcBankEnumStart - error \n");
                    447:         return FALSE;
                    448:     }
                    449: 
                    450:     if (iLastBank != iFirstBank)
                    451:     {
                    452:         // Set the last bank to the first bank in case there are no
                    453:         // middle banks.
                    454: 
                    455:         iLastBank = iFirstBank;
                    456: 
                    457:         // Take care of all the middle banks.
                    458:         // Update rclBounds for this bank.
                    459: 
                    460:         rclBounds.top += cyFirstBank;
                    461: 
                    462:         cyMiddleBanks = ppdev->ScansPerBank;
                    463:         rclBounds.bottom = rclBounds.top + cyMiddleBanks;
                    464: 
                    465:         for (i = iFirstBank+1; i < ppdev->MaxBanks; i++)
                    466:         {
                    467:             if (ppdev->prclBanks[i].bottom < BottomScan)
                    468:             {
                    469:                 // This bank is completely within the rendering rectangle.
                    470: 
                    471:                 ppdev->pBanks[ppdev->iBank].pvScan0        = pbScan0 - (i * ppdev->BankSize);
                    472:                 ppdev->pBanks[ppdev->iBank].Bank           = i;
                    473: 
                    474:                 ppdev->pBanks[ppdev->iBank].rclClip.top    = rclBounds.top;
                    475:                 ppdev->pBanks[ppdev->iBank].rclClip.bottom = rclBounds.bottom;
                    476: 
                    477:                 // Set the left and right bounds of the bank clip rect.
                    478: 
                    479:                 ppdev->pBanks[ppdev->iBank].rclClip.left  = pco->rclBounds.left;
                    480:                 ppdev->pBanks[ppdev->iBank].rclClip.right = pco->rclBounds.right;
                    481: 
                    482:                 // Update for the next bank bounds.
                    483: 
                    484:                 rclBounds.top += cyMiddleBanks;
                    485: 
                    486:                 rclBounds.bottom = rclBounds.top + cyMiddleBanks;
                    487: 
                    488:                 // Bump bank array index to next entry and the bank
                    489:                 // count.
                    490: 
                    491:                 ppdev->iBank++;
                    492:                 ppdev->cBanks++;
                    493: 
                    494:                 iLastBank = i;
                    495: 
                    496:             }
                    497:         }
                    498: 
                    499:         // Now take care of the last bank.
                    500: 
                    501:         iLastBank++;
                    502: 
                    503:         if (ppdev->prclBanks[iLastBank].top < BottomScan)
                    504:         {
                    505:             ppdev->pBanks[ppdev->iBank].pvScan0        = pbScan0 - (iLastBank * ppdev->BankSize);
                    506:             ppdev->pBanks[ppdev->iBank].Bank           = iLastBank;
                    507: 
                    508:             ppdev->pBanks[ppdev->iBank].rclClip.top    = rclBounds.top;
                    509:             ppdev->pBanks[ppdev->iBank].rclClip.bottom = rclBounds.bottom;
                    510: 
                    511:             ppdev->pBanks[ppdev->iBank].rclClip.left   = pco->rclBounds.left;
                    512:             ppdev->pBanks[ppdev->iBank].rclClip.right  = pco->rclBounds.right;
                    513: 
                    514:             ppdev->cBanks++;
                    515: 
                    516:         }
                    517:     }
                    518: 
                    519:     // We need to make sure the clipping level is at least DC_RECT.
                    520:     // Some code in the engine (like EngCopybits) will ignore the
                    521:     // clip rectangle entirely if the level is DC_TRIVIAL.
                    522: 
                    523:     if (pco->iDComplexity == DC_TRIVIAL)
                    524:         pco->iDComplexity = DC_RECT;
                    525: 
                    526:     // Now take care of setting the first bank
                    527: 
                    528:     ppdev->iBank = 1;                     // set the next bank index
                    529:     ppdev->cBanks--;                      // set # of remaining banks
                    530: 
                    531:     // Set the top and bottom scans for the caller
                    532: 
                    533:     prclScans->top    = ppdev->pBanks[0].rclClip.top;     // set top scan.
                    534:     prclScans->bottom = ppdev->pBanks[0].rclClip.bottom;  // set bottom scan.
                    535: 
                    536:     // Set the S3 chip.
                    537: 
                    538:     vSetS3Bank(ppdev, ppdev->pBanks[0].Bank);
                    539: 
                    540:     // Set the clip rectangle for the engine.
                    541: 
                    542:     pco->rclBounds = ppdev->pBanks[0].rclClip;
                    543: 
                    544:     // Set pvScan0 for the engine.
                    545: 
                    546:     pso->pvScan0 = ppdev->pBanks[0].pvScan0;
                    547: 
                    548:     ENABLE_DIRECT_ACCESS;
                    549: 
                    550:     return (TRUE);
                    551: }
                    552: 
                    553: /******************************************************************************
                    554:  * bBankEnum - Enumerate the next bank.
                    555:  *
                    556:  *  Just enumerate the next bank.  pvScan0, the clipping Rect, and the
                    557:  *  chip are all set up for this bank.
                    558:  *
                    559:  *  Entry:  none
                    560:  *
                    561:  *  Exit:   TRUE        - if this bank needs any rendering.
                    562:  *          FALSE       - if there is nothing to render.
                    563:  *
                    564:  *          prclScans   - The Scans to render into.
                    565:  *
                    566:  ******************************************************************************/
                    567: BOOL bBankEnum(
                    568:     PPDEV ppdev,
                    569:     PRECTL prclScans,
                    570:     SURFOBJ *pso,
                    571:     CLIPOBJ *pco)
                    572: {
                    573:     DISPDBG((3, "S3.DLL: bBankEnum - Entry\n"));
                    574: 
                    575:     if (ppdev->cBanks == 0)
                    576:         return (FALSE);
                    577: 
                    578:     // Set the top and bottom scans for the caller
                    579: 
                    580:     prclScans->top    = ppdev->pBanks[ppdev->iBank].rclClip.top;     // set top scan.
                    581:     prclScans->bottom = ppdev->pBanks[ppdev->iBank].rclClip.bottom;  // set bottom scan.
                    582: 
                    583:     // Set the S3 chip.
                    584: 
                    585:     vSetS3Bank(ppdev, ppdev->pBanks[ppdev->iBank].Bank);
                    586: 
                    587:     // Set the clip rectangle for the engine.
                    588: 
                    589:     pco->rclBounds = ppdev->pBanks[ppdev->iBank].rclClip;
                    590: 
                    591:     // Set pvScan0 for the engine.
                    592: 
                    593:     pso->pvScan0 = ppdev->pBanks[ppdev->iBank].pvScan0;
                    594: 
                    595:     // Update the bank index and bank count.
                    596: 
                    597:     ppdev->cBanks--;
                    598:     ppdev->iBank++;
                    599: 
                    600:     return (TRUE);
                    601: }
                    602: 
                    603: /******************************************************************************
                    604:  * bBankEnumEnd - Finish the bank enumeration.
                    605:  *
                    606:  *  Cleanup from the enumeration.  This restores the original pvScan0 and
                    607:  *  ClipRectangle.
                    608:  *
                    609:  ******************************************************************************/
                    610: BOOL bBankEnumEnd(
                    611:     PPDEV ppdev,
                    612:     SURFOBJ *pso,
                    613:     CLIPOBJ *pco)
                    614: {
                    615:     DISPDBG((3, "S3.DLL: bBankEnumEnd - Entry\n"));
                    616: 
                    617:     pso->pvScan0      = ppdev->pvOrgScan0;
                    618:     pco->rclBounds    = ppdev->rclOrgBounds;
                    619:     pco->iDComplexity = ppdev->iOrgDComplexity;
                    620:     pco->fjOptions    = ppdev->fjOptions;
                    621: 
                    622:     ENABLE_S3_ENGINE;
                    623: 
                    624:     return (TRUE);
                    625: }
                    626: 
                    627: 
                    628: 
                    629: 
                    630: /******************************************************************************
                    631:  * vSetS3Bank - Set the bank on the S3 chip.
                    632:  ******************************************************************************/
                    633: VOID vSetS3Bank(
                    634:     PPDEV ppdev,
                    635:     UINT iBank)
                    636: {
                    637: 
                    638:     TEST_928("S3.DLL!vSetS3Bank - pre bank switch 928 failure\n");
                    639: 
                    640:     // Set the bank
                    641: 
                    642:     OUTPW1 (CRTC_INDEX, (((ppdev->jS3R5 | (0x0F & iBank)) << 8) | S3R5));
                    643: 
                    644:     if (ppdev->bNewBankControl == TRUE)
                    645:     {
                    646:         OUTP1 (CRTC_INDEX, EX_SCTL_2);
                    647:         OUTP1 (CRTC_DATA, ppdev->ExtSysCtl2 | ((0x30 & iBank) >> 2));
                    648:     }
                    649: 
                    650:     // CHIPBUG.
                    651:     // Anil said I should read this back.
                    652: 
                    653:     INP1(CRTC_DATA);
                    654: 
                    655:     TEST_928("S3.DLL!vSetS3Bank - post bank switch 928 failure\n");
                    656: 
                    657: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.