VirtualBox

Changeset 33146 in vbox for trunk/src/VBox/Devices/Graphics


Ignore:
Timestamp:
Oct 15, 2010 10:34:58 AM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
66679
Message:

wddm/3d: chromium hgsmi, host part + guest part debugging

Location:
trunk/src/VBox/Devices/Graphics
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Graphics/DevVGA.cpp

    r33091 r33146  
    63576357    pThis->IPort.pfnSetRenderVRAM       = vgaPortSetRenderVRAM;
    63586358
    6359 #if defined(VBOX_WITH_HGSMI) && defined(VBOX_WITH_VIDEOHWACCEL)
     6359#if defined(VBOX_WITH_HGSMI)
     6360# if defined(VBOX_WITH_VIDEOHWACCEL)
    63606361    pThis->IVBVACallbacks.pfnVHWACommandCompleteAsynch = vbvaVHWACommandCompleteAsynch;
     6362# endif
     6363#if defined(VBOX_WITH_CRHGSMI)
     6364    pThis->IVBVACallbacks.pfnCrHgsmiCommandCompleteAsync = vboxVDMACrHgsmiCommandCompleteAsync;
     6365    pThis->IVBVACallbacks.pfnCrHgsmiControlCompleteAsync = vboxVDMACrHgsmiControlCompleteAsync;
     6366# endif
    63616367#endif
    63626368
  • trunk/src/VBox/Devices/Graphics/DevVGA.h

    r33089 r33146  
    492492# endif
    493493
     494#ifdef VBOX_WITH_HGSMI
     495#define PPDMIDISPLAYVBVACALLBACKS_2_PVGASTATE(_pcb) ( (PVGASTATE)((uint8_t *)(_pcb) - RT_OFFSETOF(VGASTATE, IVBVACallbacks)) )
     496#endif
     497
     498# ifdef VBOX_WITH_CRHGSMI
     499int vboxVDMACrHgsmiCommandCompleteAsync(PPDMIDISPLAYVBVACALLBACKS pInterface, PVBOXVDMACMD_CHROMIUM_CMD pCmd, int rc);
     500int vboxVDMACrHgsmiControlCompleteAsync(PPDMIDISPLAYVBVACALLBACKS pInterface, PVBOXVDMACMD_CHROMIUM_CTL pCmd, int rc);
     501# endif
     502
    494503int vboxVBVASaveStateExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSM);
    495504int vboxVBVALoadStateExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t u32Version);
  • trunk/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp

    r32877 r33146  
    12371237}
    12381238
    1239 #define PPDMIDISPLAYVBVACALLBACKS_2_PVGASTATE(_pcb) ( (PVGASTATE)((uint8_t *)(_pcb) - RT_OFFSETOF(VGASTATE, IVBVACallbacks)) )
    1240 
    12411239int vbvaVHWACommandCompleteAsynch(PPDMIDISPLAYVBVACALLBACKS pInterface, PVBOXVHWACMD pCmd)
    12421240{
  • trunk/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp

    r32904 r33146  
    2020#include <iprt/thread.h>
    2121#include <iprt/mem.h>
     22#include <iprt/asm.h>
    2223
    2324#include "DevVGA.h"
     
    8687    VBOXVDMAPIPE_CMD_POOL CmdPool;
    8788} VBOXVDMAHOST, *PVBOXVDMAHOST;
     89
     90
     91#ifdef VBOX_WITH_CRHGSMI
     92
     93typedef DECLCALLBACK(void) FNVBOXVDMACRCTL_CALLBACK(PVGASTATE pVGAState, PVBOXVDMACMD_CHROMIUM_CTL pCmd, void* pvContext);
     94typedef FNVBOXVDMACRCTL_CALLBACK *PFNVBOXVDMACRCTL_CALLBACK;
     95
     96typedef struct VBOXVDMACMD_CHROMIUM_CTL_PRIVATE
     97{
     98    uint32_t cRefs;
     99    uint32_t rc;
     100    PFNVBOXVDMACRCTL_CALLBACK pfnCompletion;
     101    void *pvCompletion;
     102    VBOXVDMACMD_CHROMIUM_CTL Cmd;
     103} VBOXVDMACMD_CHROMIUM_CTL_PRIVATE, *PVBOXVDMACMD_CHROMIUM_CTL_PRIVATE;
     104
     105#define VBOXVDMACMD_CHROMIUM_CTL_PRIVATE_FROM_CTL(_p) ((PVBOXVDMACMD_CHROMIUM_CTL_PRIVATE)(((uint8_t*)(_p)) - RT_OFFSETOF(VBOXVDMACMD_CHROMIUM_CTL_PRIVATE, Cmd)))
     106
     107static PVBOXVDMACMD_CHROMIUM_CTL vboxVDMACrCtlCreate(VBOXVDMACMD_CHROMIUM_CTL_TYPE enmCmd, uint32_t cbCmd)
     108{
     109    PVBOXVDMACMD_CHROMIUM_CTL_PRIVATE pHdr = (PVBOXVDMACMD_CHROMIUM_CTL_PRIVATE)RTMemAllocZ(cbCmd + RT_OFFSETOF(VBOXVDMACMD_CHROMIUM_CTL_PRIVATE, Cmd));
     110    Assert(pHdr);
     111    if (pHdr)
     112    {
     113        pHdr->cRefs = 1;
     114        pHdr->rc = VERR_NOT_IMPLEMENTED;
     115        pHdr->Cmd.enmType = enmCmd;
     116        pHdr->Cmd.cbCmd = cbCmd;
     117        return &pHdr->Cmd;
     118    }
     119
     120    return NULL;
     121}
     122
     123DECLINLINE(void) vboxVDMACrCtlRelease (PVBOXVDMACMD_CHROMIUM_CTL pCmd)
     124{
     125    PVBOXVDMACMD_CHROMIUM_CTL_PRIVATE pHdr = VBOXVDMACMD_CHROMIUM_CTL_PRIVATE_FROM_CTL(pCmd);
     126    uint32_t cRefs = ASMAtomicDecU32(&pHdr->cRefs);
     127    if(!cRefs)
     128    {
     129        RTMemFree(pHdr);
     130    }
     131}
     132
     133DECLINLINE(void) vboxVDMACrCtlRetain (PVBOXVDMACMD_CHROMIUM_CTL pCmd)
     134{
     135    PVBOXVDMACMD_CHROMIUM_CTL_PRIVATE pHdr = VBOXVDMACMD_CHROMIUM_CTL_PRIVATE_FROM_CTL(pCmd);
     136    ASMAtomicIncU32(&pHdr->cRefs);
     137}
     138
     139DECLINLINE(int) vboxVDMACrCtlGetRc (PVBOXVDMACMD_CHROMIUM_CTL pCmd)
     140{
     141    PVBOXVDMACMD_CHROMIUM_CTL_PRIVATE pHdr = VBOXVDMACMD_CHROMIUM_CTL_PRIVATE_FROM_CTL(pCmd);
     142    return pHdr->rc;
     143}
     144
     145static DECLCALLBACK(void) vboxVDMACrCtlCbSetEvent(PVGASTATE pVGAState, PVBOXVDMACMD_CHROMIUM_CTL pCmd, void* pvContext)
     146{
     147    RTSemEventSignal((RTSEMEVENT)pvContext);
     148}
     149
     150static DECLCALLBACK(void) vboxVDMACrCtlCbReleaseCmd(PVGASTATE pVGAState, PVBOXVDMACMD_CHROMIUM_CTL pCmd, void* pvContext)
     151{
     152    vboxVDMACrCtlRelease(pCmd);
     153}
     154
     155
     156static int vboxVDMACrCtlPostAsync (PVGASTATE pVGAState, PVBOXVDMACMD_CHROMIUM_CTL pCmd, PFNVBOXVDMACRCTL_CALLBACK pfnCompletion, void *pvCompletion)
     157{
     158    if (pVGAState->pDrv->pfnCrHgsmiControlProcess)
     159    {
     160        PVBOXVDMACMD_CHROMIUM_CTL_PRIVATE pHdr = VBOXVDMACMD_CHROMIUM_CTL_PRIVATE_FROM_CTL(pCmd);
     161        pHdr->pfnCompletion = pfnCompletion;
     162        pHdr->pvCompletion = pvCompletion;
     163        pVGAState->pDrv->pfnCrHgsmiControlProcess(pVGAState->pDrv, pCmd);
     164        return VINF_SUCCESS;
     165    }
     166#ifdef DEBUG_misha
     167    Assert(0);
     168#endif
     169    return VERR_NOT_SUPPORTED;
     170}
     171
     172static int vboxVDMACrCtlPost(PVGASTATE pVGAState, PVBOXVDMACMD_CHROMIUM_CTL pCmd)
     173{
     174    RTSEMEVENT hComplEvent;
     175    int rc = RTSemEventCreate(&hComplEvent);
     176    AssertRC(rc);
     177    if(RT_SUCCESS(rc))
     178    {
     179        rc = vboxVDMACrCtlPostAsync (pVGAState, pCmd, vboxVDMACrCtlCbSetEvent, (void*)hComplEvent);
     180#ifdef DEBUG_misha
     181        AssertRC(rc);
     182#endif
     183        if (RT_SUCCESS(rc))
     184        {
     185            rc = RTSemEventWaitNoResume(hComplEvent, RT_INDEFINITE_WAIT);
     186            AssertRC(rc);
     187            if(RT_SUCCESS(rc))
     188            {
     189                RTSemEventDestroy(hComplEvent);
     190            }
     191        }
     192        else
     193        {
     194            /* the command is completed */
     195            RTSemEventDestroy(hComplEvent);
     196        }
     197    }
     198    return rc;
     199}
     200
     201static int vboxVDMACrCtlHgsmiSetupAsync(struct VBOXVDMAHOST *pVdma)
     202{
     203    PVBOXVDMACMD_CHROMIUM_CTL_CRHGSMI_SETUP pCmd = (PVBOXVDMACMD_CHROMIUM_CTL_CRHGSMI_SETUP)vboxVDMACrCtlCreate(
     204            VBOXVDMACMD_CHROMIUM_CTL_TYPE_CRHGSMI_SETUP, sizeof (*pCmd));
     205    if (pCmd)
     206    {
     207        PVGASTATE pVGAState = pVdma->pVGAState;
     208        pCmd->pvRamBase = pVGAState->vram_ptrR3;
     209        int rc = vboxVDMACrCtlPostAsync(pVGAState, &pCmd->Hdr, vboxVDMACrCtlCbReleaseCmd, NULL);
     210#ifdef DEBUG_misha
     211        AssertRC(rc);
     212#endif
     213#if 0
     214        if (RT_SUCCESS(rc))
     215        {
     216            rc = vboxVDMACrCtlGetRc(&pCmd->Hdr);
     217        }
     218        vboxVDMACrCtlRelease(&pCmd->Hdr);
     219#endif
     220        return rc;
     221    }
     222    return VERR_NO_MEMORY;
     223}
     224
     225/* check if this is external cmd to be passed to chromium backend */
     226static bool vboxVDMACmdCheckCrCmd(struct VBOXVDMAHOST *pVdma, PVBOXVDMACBUF_DR pCmd)
     227{
     228    PVBOXVDMACMD pDmaCmd;
     229    uint8_t * pvRam = pVdma->pVGAState->vram_ptrR3;
     230
     231    if (pCmd->fFlags & VBOXVDMACBUF_FLAG_BUF_FOLLOWS_DR)
     232        pDmaCmd = VBOXVDMACBUF_DR_TAIL(pCmd, VBOXVDMACMD);
     233    else
     234        pDmaCmd = NULL;
     235
     236    if (pDmaCmd)
     237    {
     238        uint32_t cbCmd = pCmd->cbBuf;
     239        Assert(cbCmd >= VBOXVDMACMD_HEADER_SIZE());
     240
     241        if (cbCmd >= VBOXVDMACMD_HEADER_SIZE())
     242        {
     243            if (pDmaCmd->enmType == VBOXVDMACMD_TYPE_CHROMIUM_CMD)
     244            {
     245                PVBOXVDMACMD_CHROMIUM_CMD pCrCmd = VBOXVDMACMD_BODY(pDmaCmd, VBOXVDMACMD_CHROMIUM_CMD);
     246                PVGASTATE pVGAState = pVdma->pVGAState;
     247                if (pVGAState->pDrv->pfnCrHgsmiCommandProcess)
     248                {
     249                    pVGAState->pDrv->pfnCrHgsmiCommandProcess(pVGAState->pDrv, pCrCmd);
     250                    return true;
     251                }
     252                else
     253                {
     254                    Assert(0);
     255                }
     256
     257                int tmpRc = VBoxSHGSMICommandComplete (pVdma->pHgsmi, pCmd);
     258                AssertRC(tmpRc);
     259//                uint32_t cBufs = pCrCmd->cBuffers;
     260//                for (uint32_t i = 0; i < cBufs; ++i)
     261//                {
     262//                    PVBOXVDMACMD_CHROMIUM_BUFFER pBuf = &pCrCmd->aBuffers[i];
     263//                    void *pvBuffer = pvRam + pBuf->offBuffer;
     264//                    uint32_t cbBuffer = pBuf->cbBuffer;
     265//                }
     266            }
     267        }
     268    }
     269    return false;
     270}
     271
     272int vboxVDMACrHgsmiCommandCompleteAsync(PPDMIDISPLAYVBVACALLBACKS pInterface, PVBOXVDMACMD_CHROMIUM_CMD pCmd, int rc)
     273{
     274    PVGASTATE pVGAState = PPDMIDISPLAYVBVACALLBACKS_2_PVGASTATE(pInterface);
     275    PHGSMIINSTANCE pIns = pVGAState->pHGSMI;
     276    VBOXVDMACMD *pDmaHdr = VBOXVDMACMD_FROM_BODY(pCmd);
     277    VBOXVDMACBUF_DR *pDr = VBOXVDMACBUF_DR_FROM_TAIL(pDmaHdr);
     278    pDr->rc = rc;
     279
     280    Assert(pVGAState->fGuestCaps & VBVACAPS_COMPLETEGCMD_BY_IOREAD);
     281    rc = HGSMICompleteGuestCommand(pIns, pDr, true /* do Irq */);
     282    AssertRC(rc);
     283    return rc;
     284}
     285
     286int vboxVDMACrHgsmiControlCompleteAsync(PPDMIDISPLAYVBVACALLBACKS pInterface, PVBOXVDMACMD_CHROMIUM_CTL pCmd, int rc)
     287{
     288    PVGASTATE pVGAState = PPDMIDISPLAYVBVACALLBACKS_2_PVGASTATE(pInterface);
     289    PVBOXVDMACMD_CHROMIUM_CTL_PRIVATE pCmdPrivate = VBOXVDMACMD_CHROMIUM_CTL_PRIVATE_FROM_CTL(pCmd);
     290    pCmdPrivate->rc = rc;
     291    if (pCmdPrivate->pfnCompletion)
     292    {
     293        pCmdPrivate->pfnCompletion(pVGAState, pCmd, pCmdPrivate->pvCompletion);
     294    }
     295    return VINF_SUCCESS;
     296}
     297
     298#endif
     299
    88300
    89301/* to simplify things and to avoid extra backend if modifications we assume the VBOXVDMA_RECTL is the same as VBVACMDHDR */
     
    739951                    hgsmiListAppend(&pVdma->CmdPool.List, &pVdma->CmdPool.aCmds[i].Entry);
    740952                }
     953#if 0 //def VBOX_WITH_CRHGSMI
     954                int tmpRc = vboxVDMACrCtlHgsmiSetup(pVdma);
     955# ifdef DEBUG_misha
     956                AssertRC(tmpRc);
     957# endif
     958#endif
    741959                *ppVdma = pVdma;
    742960                return VINF_SUCCESS;
     
    7971015    {
    7981016        case VBOXVDMA_CTL_TYPE_ENABLE:
     1017        {
    7991018            pVdma->bEnabled = true;
    8001019            pCmd->i32Result = VINF_SUCCESS;
     1020#ifdef VBOX_WITH_CRHGSMI
     1021            /* @todo: use async completion to ensure we notify a status to guest */
     1022            int tmpRc = vboxVDMACrCtlHgsmiSetupAsync(pVdma);
     1023            AssertRC(tmpRc);
     1024#endif
     1025        }
    8011026            break;
    8021027        case VBOXVDMA_CTL_TYPE_DISABLE:
     
    8461071void vboxVDMACommand(struct VBOXVDMAHOST *pVdma, PVBOXVDMACBUF_DR pCmd)
    8471072{
     1073#ifdef VBOX_WITH_CRHGSMI
     1074    if (vboxVDMACmdCheckCrCmd(pVdma, pCmd))
     1075        return;
     1076#endif
     1077
    8481078    VBOXVDMACMD_SUBMIT_CONTEXT Context;
    8491079    Context.pVdma = pVdma;
Note: See TracChangeset for help on using the changeset viewer.

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