VirtualBox

Changeset 17623 in vbox


Ignore:
Timestamp:
Mar 10, 2009 12:41:29 PM (16 years ago)
Author:
vboxsync
Message:

HGSMI: the windows guest display drivers.

Location:
trunk/src/VBox/Additions/WINNT/Graphics/Display
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/driver.h

    r17610 r17623  
    180180extern HSEMAPHORE ghsemHwBuffer;
    181181#endif /* !VBOX_WITH_HGSMI */
     182
     183
     184#ifdef VBOX_WITH_HGSMI
     185#define VBE_DISPI_IOPORT_INDEX          0x01CE
     186#define VBE_DISPI_IOPORT_DATA           0x01CF
     187#define VBE_DISPI_INDEX_VBVA_GUEST      0xc
     188#endif /* VBOX_WITH_HGSMI */
    182189
    183190extern BOOL  g_bOnNT40;
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/enable.c

    r17610 r17623  
    11601160            DISPDBG((3, "DN_DEVICE_ORIGIN: %d, %d (PSO = %p)\n", ppdev->ptlDevOrg.x,
    11611161                     ppdev->ptlDevOrg.y, pso));
    1162             if (ppdev->bHGSMISupported)
    1163             {
    1164                 VBoxProcessDisplayInfo(ppdev);
    1165             }
     1162            VBoxProcessDisplayInfo(ppdev);
    11661163#endif /* VBOX_WITH_HGSMI */
    11671164            break;
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/screen.c

    r17610 r17623  
    3535#include <VBox/HGSMI/HGSMI.h>
    3636#include <VBox/HGSMI/HGSMIChSetup.h>
    37 
    38 #define VBE_DISPI_IOPORT_INDEX          0x01CE
    39 #define VBE_DISPI_IOPORT_DATA           0x01CF
    40 #define VBE_DISPI_INDEX_VBVA_GUEST      0xc
    4137#endif
    4238
     
    322318    }
    323319}
    324 #else
    325 static void vboxUpdateDisplayInfo (PPDEV ppdev)
    326 {
    327     if (ppdev->bHGSMISupported)
    328     {
    329         /* Inform the host about this display layout. */
    330         DISPDBG((1, "Update: %d,%d\n", ppdev->ptlDevOrg.x, ppdev->ptlDevOrg.y));
    331         VBoxProcessDisplayInfo(ppdev);
    332     }
    333 }
    334 #endif /* VBOX_WITH_HGSMI */
     320#endif /* !VBOX_WITH_HGSMI */
    335321
    336322
     
    493479    DISPDBG((1, "DISP bInitSURF success\n"));
    494480
     481#ifndef VBOX_WITH_HGSMI
    495482    /* Update the display information. */
    496483    vboxUpdateDisplayInfo (ppdev);
     484#else
     485    /* Inform the host about this screen layout. */
     486    DISPDBG((1, "bInitSURF: %d,%d\n", ppdev->ptlDevOrg.x, ppdev->ptlDevOrg.y));
     487    VBoxProcessDisplayInfo (ppdev);
     488#endif /* VBOX_WITH_HGSMI */
    497489   
    498490    return(TRUE);
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/vbox.c

    r17610 r17623  
    340340#else /* VBOX_WITH_HGSMI */
    341341
     342static void vboxHGSMIBufferSubmit (PPDEV ppdev, void *p)
     343{
     344    HGSMIOFFSET offBuffer = HGSMIHeapBufferOffset (&ppdev->hgsmiDisplayHeap, p);
     345
     346    ASMOutU16 (VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_VBVA_GUEST);
     347    ASMOutU32 (VBE_DISPI_IOPORT_DATA, offBuffer);
     348}
     349
     350static BOOL vboxVBVAInformHost (PPDEV ppdev, BOOL bEnable)
     351{
     352    BOOL bRc = FALSE;
     353
     354    if (ppdev->bHGSMISupported)
     355    {
     356        void *p = HGSMIHeapAlloc (&ppdev->hgsmiDisplayHeap,
     357                                  sizeof (VBVAENABLE),
     358                                  HGSMI_CH_VBVA,
     359                                  VBVA_ENABLE);
     360        if (!p)
     361        {
     362            DISPDBG((0, "VBoxDISP::vboxVBVAInformHost: HGSMIHeapAlloc failed\n"));
     363        }
     364        else
     365        {
     366            VBVAENABLE *pEnable = (VBVAENABLE *)p;
     367
     368            pEnable->u32Flags    = bEnable? VBVA_F_ENABLE: VBVA_F_DISABLE;
     369            pEnable->u32Reserved = 0;
     370
     371            vboxHGSMIBufferSubmit (ppdev, p);
     372
     373            HGSMIHeapFree (&ppdev->hgsmiDisplayHeap, p);
     374
     375            bRc = TRUE;
     376        }
     377    }
     378
     379    return bRc;
     380}
     381
    342382/*
    343383 * Public hardware buffer methods.
     
    353393        VBVABUFFER *pVBVA = (VBVABUFFER *)((uint8_t *)ppdev->pjScreen + ppdev->layout.offVBVABuffer);
    354394       
    355         pVBVA->u32HostEvents = 0;
     395        pVBVA->u32HostEvents      = 0;
    356396        pVBVA->u32SupportedOrders = 0;
    357         pVBVA->off32Data;
    358         pVBVA->off32Free;
     397        pVBVA->off32Data          = 0;
     398        pVBVA->off32Free          = 0;
    359399        RtlZeroMemory (pVBVA->aRecords, sizeof (pVBVA->aRecords));
    360         pVBVA->indexRecordFirst;
    361         pVBVA->indexRecordFree;
    362         pVBVA->cbPartialWriteThreshold;
    363         pVBVA->cbData      = ppdev->layout.cbVBVABuffer - sizeof (VBVABUFFER) + sizeof (pVBVA->au8Data);
     400        pVBVA->indexRecordFirst   = 0;
     401        pVBVA->indexRecordFree    = 0;
     402        pVBVA->cbPartialWriteThreshold = 256;
     403        pVBVA->cbData             = ppdev->layout.cbVBVABuffer - sizeof (VBVABUFFER) + sizeof (pVBVA->au8Data);
    364404
    365405        ppdev->fHwBufferOverflow = FALSE;
     
    367407        ppdev->pVBVA             = pVBVA;
    368408       
    369 #if 0
    370         /* @todo inform host that VBVA mode has been entered. */
    371         bRC = vboxVBVAInformHost (ppdev);
    372 #else
    373         /* All have been initialized. */
    374         bRc = TRUE;
    375 #endif
     409        bRc = vboxVBVAInformHost (ppdev, TRUE);
    376410    }
    377411
     
    392426    ppdev->pVBVA             = NULL;
    393427
     428    vboxVBVAInformHost (ppdev, FALSE);
     429
    394430    return;
    395431}
     
    477513static void vboxHwBufferFlush (PPDEV ppdev)
    478514{
    479     VBVA_ASSERT (ppdev->pVBVA);
    480 
    481 #if 0
    482     /* @todo issue the flush command */
     515    /* Issue the flush command. */
    483516    void *p = HGSMIHeapAlloc (&ppdev->hgsmiDisplayHeap,
    484517                              sizeof (VBVA_FLUSH),
    485518                              HGSMI_CH_VBVA,
    486                               HGSMI_CC_VBVA_FLUSH);
    487 ........
     519                              VBVA_FLUSH);
    488520    if (!p)
    489521    {
    490         DISPDBG((0, "VBoxDISP::vboxInitVBoxVideo: HGSMIHeapAlloc failed\n"));
    491         rc = VERR_NO_MEMORY;
     522        DISPDBG((0, "VBoxDISP::vboxHwBufferFlush: HGSMIHeapAlloc failed\n"));
    492523    }
    493524    else
    494525    {
    495         HGSMIOFFSET offBuffer = HGSMIHeapBufferOffset (&ppdev->hgsmiDisplayHeap,
    496                                                        p);
    497 
    498         ((HGSMI_BUFFER_LOCATION *)p)->offLocation = ppdev->layout.offDisplayInformation;
    499         ((HGSMI_BUFFER_LOCATION *)p)->cbLocation = sizeof (HGSMIHOSTFLAGS);
    500 
    501         /* Submit the buffer to the host. */
    502         ASMOutU16 (VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_VBVA_GUEST);
    503         ASMOutU32 (VBE_DISPI_IOPORT_DATA, offBuffer);
     526        VBVAFLUSH *pFlush = (VBVAFLUSH *)p;
     527
     528        pFlush->u32Reserved = 0;
     529
     530        vboxHGSMIBufferSubmit (ppdev, p);
    504531
    505532        HGSMIHeapFree (&ppdev->hgsmiDisplayHeap, p);
    506533    }
    507 #endif
    508534
    509535    return;
     
    629655}
    630656
    631 void VBoxProcessDisplayInfo(PPDEV ppdev)
    632 {
    633 #if 0
    634     DWORD returnedDataLength;
    635 
    636     DISPDBG((1, "Process: %d,%d\n", ppdev->ptlDevOrg.x, ppdev->ptlDevOrg.y));
    637 
    638     EngDeviceIoControl(ppdev->hDriver,
    639                        IOCTL_VIDEO_INTERPRET_DISPLAY_MEMORY,
    640                        NULL,
    641                        0,
    642                        NULL,
    643                        0,
    644                        &returnedDataLength);
    645 #endif
     657void VBoxProcessDisplayInfo (PPDEV ppdev)
     658{
     659    if (ppdev->bHGSMISupported)
     660    {
     661        /* Issue the screen info command. */
     662        void *p = HGSMIHeapAlloc (&ppdev->hgsmiDisplayHeap,
     663                                  sizeof (VBVAINFOSCREEN),
     664                                  HGSMI_CH_VBVA,
     665                                  VBVA_INFO_SCREEN);
     666        if (!p)
     667        {
     668            DISPDBG((0, "VBoxDISP::vboxHwBufferFlush: HGSMIHeapAlloc failed\n"));
     669        }
     670        else
     671        {
     672            VBVAINFOSCREEN *pScreen = (VBVAINFOSCREEN *)p;
     673
     674            pScreen->i32OriginX      = ppdev->ptlDevOrg.x;
     675            pScreen->i32OriginY      = ppdev->ptlDevOrg.y;
     676            pScreen->u32LineSize     = ppdev->lDeltaScreen > 0?ppdev->lDeltaScreen: -ppdev->lDeltaScreen;
     677            pScreen->u32Width        = ppdev->cxScreen;
     678            pScreen->u32Height       = ppdev->cyScreen;
     679            pScreen->u16BitsPerPixel = (uint16_t)ppdev->ulBitCount;
     680            pScreen->u16Flags        = VBVA_SCREEN_F_ACTIVE;
     681
     682            vboxHGSMIBufferSubmit (ppdev, p);
     683
     684            HGSMIHeapFree (&ppdev->hgsmiDisplayHeap, p);
     685        }
     686    }
     687
     688    return;
    646689}
    647690#endif /* VBOX_WITH_HGSMI */
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette