VirtualBox

Ignore:
Timestamp:
Oct 15, 2010 10:34:58 AM (14 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/HostServices/SharedOpenGL
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/SharedOpenGL/Makefile.kmk

    r32175 r33146  
    9090 VBoxSharedCrOpenGL_LIBS += \
    9191        $(LIB_XPCOM)
     92endif
     93ifdef VBOX_WITH_CRHGSMI
     94VBoxSharedCrOpenGL_DEFS += VBOX_WITH_CRHGSMI
    9295endif
    9396
  • trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp

    r32420 r33146  
    5353#endif /* RT_OS_WINDOWS */
    5454
     55#ifdef VBOX_WITH_CRHGSMI
     56#include <VBox/VBoxVideo.h>
     57#endif
     58
    5559#include <VBox/com/errorprint.h>
    5660
     
    5862static IConsole* g_pConsole = NULL;
    5963static PVM g_pVM = NULL;
     64#ifdef VBOX_WITH_CRHGSMI
     65static uint8_t* g_pvVRamBase;
     66#endif
    6067
    6168#ifndef RT_OS_WINDOWS
     
    450457}
    451458
     459#ifdef VBOX_WITH_CRHGSMI
     460static int vboxCrHgsmiCtl(PVBOXVDMACMD_CHROMIUM_CTL pCtl)
     461{
     462    int rc;
     463    switch (pCtl->enmType)
     464    {
     465        case VBOXVDMACMD_CHROMIUM_CTL_TYPE_CRHGSMI_SETUP:
     466        {
     467            PVBOXVDMACMD_CHROMIUM_CTL_CRHGSMI_SETUP pSetup = (PVBOXVDMACMD_CHROMIUM_CTL_CRHGSMI_SETUP)pCtl;
     468            g_pvVRamBase = (uint8_t*)pSetup->pvRamBase;
     469            rc = VINF_SUCCESS;
     470        } break;
     471        default:
     472            Assert(0);
     473            rc = VERR_INVALID_PARAMETER;
     474    }
     475
     476    return rc;
     477}
     478
     479#define VBOXCRHGSMI_PTR(_off, _t) ((_t*)(g_pvVRamBase + (_off)))
     480static int vboxCrHgsmiCmd(PVBOXVDMACMD_CHROMIUM_CMD pCmd)
     481{
     482    int rc;
     483    uint32_t cBuffers = pCmd->cBuffers;
     484    uint32_t cParams;
     485
     486    if (!g_pvVRamBase)
     487    {
     488        Assert(0);
     489        return VERR_INVALID_STATE;
     490    }
     491
     492    if (!cBuffers)
     493    {
     494        Assert(0);
     495        return VERR_INVALID_PARAMETER;
     496    }
     497
     498    cParams = cBuffers-1;
     499
     500    CRVBOXHGSMIHDR *pHdr = VBOXCRHGSMI_PTR(pCmd->aBuffers[0].offBuffer, CRVBOXHGSMIHDR);
     501    uint32_t u32Function = pHdr->u32Function;
     502    uint32_t u32ClientID = pHdr->u32ClientID;
     503    /* now we compile HGCM params out of HGSMI
     504     * @todo: can we avoid this ? */
     505    switch (u32Function)
     506    {
     507
     508        case SHCRGL_GUEST_FN_WRITE:
     509        {
     510            Log(("svcCall: SHCRGL_GUEST_FN_WRITE\n"));
     511
     512            CRVBOXHGSMIWRITE* pFnCmd = (CRVBOXHGSMIWRITE*)pHdr;
     513
     514            /* @todo: Verify  */
     515            if (cParams == 1)
     516            {
     517                VBOXVDMACMD_CHROMIUM_BUFFER *pBuf = &pCmd->aBuffers[1];
     518                /* Fetch parameters. */
     519                uint8_t *pBuffer  = VBOXCRHGSMI_PTR(pBuf->offBuffer, uint8_t);
     520                uint32_t cbBuffer = pBuf->cbBuffer;
     521
     522                /* Execute the function. */
     523                rc = crVBoxServerClientWrite(u32ClientID, pBuffer, cbBuffer);
     524                if (!RT_SUCCESS(rc))
     525                {
     526                    Assert(VERR_NOT_SUPPORTED==rc);
     527                    svcClientVersionUnsupported(0, 0);
     528                }
     529            }
     530            else
     531            {
     532                Assert(0);
     533                rc = VERR_INVALID_PARAMETER;
     534            }
     535            break;
     536        }
     537
     538        case SHCRGL_GUEST_FN_INJECT:
     539        {
     540            Log(("svcCall: SHCRGL_GUEST_FN_INJECT\n"));
     541
     542            CRVBOXHGSMIINJECT *pFnCmd = (CRVBOXHGSMIINJECT*)pHdr;
     543
     544            /* @todo: Verify  */
     545            if (cParams == 1)
     546            {
     547                /* Fetch parameters. */
     548                uint32_t u32InjectClientID = pFnCmd->u32ClientID;
     549                VBOXVDMACMD_CHROMIUM_BUFFER *pBuf = &pCmd->aBuffers[1];
     550                uint8_t *pBuffer  = VBOXCRHGSMI_PTR(pBuf->offBuffer, uint8_t);
     551                uint32_t cbBuffer = pBuf->cbBuffer;
     552
     553                /* Execute the function. */
     554                rc = crVBoxServerClientWrite(u32InjectClientID, pBuffer, cbBuffer);
     555                if (!RT_SUCCESS(rc))
     556                {
     557                    if (VERR_NOT_SUPPORTED==rc)
     558                    {
     559                        svcClientVersionUnsupported(0, 0);
     560                    }
     561                    else
     562                    {
     563                        crWarning("SHCRGL_GUEST_FN_INJECT failed to inject for %i from %i", u32InjectClientID, u32ClientID);
     564                    }
     565                }
     566            }
     567            else
     568            {
     569                Assert(0);
     570                rc = VERR_INVALID_PARAMETER;
     571            }
     572            break;
     573        }
     574
     575        case SHCRGL_GUEST_FN_READ:
     576        {
     577            Log(("svcCall: SHCRGL_GUEST_FN_READ\n"));
     578
     579            /* @todo: Verify  */
     580            if (cParams == 1)
     581            {
     582                CRVBOXHGSMIREAD *pFnCmd = (CRVBOXHGSMIREAD*)pHdr;
     583                VBOXVDMACMD_CHROMIUM_BUFFER *pBuf = &pCmd->aBuffers[1];
     584                /* Fetch parameters. */
     585                uint8_t *pBuffer  = VBOXCRHGSMI_PTR(pBuf->offBuffer, uint8_t);
     586                uint32_t cbBuffer = pBuf->cbBuffer;
     587
     588                /* Execute the function. */
     589                rc = crVBoxServerClientRead(u32ClientID, pBuffer, &cbBuffer);
     590
     591                if (RT_SUCCESS(rc))
     592                {
     593                    /* Update parameters.*/
     594//                    paParms[0].u.pointer.size = cbBuffer; //@todo guest doesn't see this change somehow?
     595                } else if (VERR_NOT_SUPPORTED==rc)
     596                {
     597                    svcClientVersionUnsupported(0, 0);
     598                }
     599
     600                /* Return the required buffer size always */
     601                pFnCmd->cbBuffer = cbBuffer;
     602            }
     603            else
     604            {
     605                Assert(0);
     606                rc = VERR_INVALID_PARAMETER;
     607            }
     608
     609            break;
     610        }
     611
     612        case SHCRGL_GUEST_FN_WRITE_READ:
     613        {
     614            Log(("svcCall: SHCRGL_GUEST_FN_WRITE_READ\n"));
     615
     616            /* @todo: Verify  */
     617            if (cParams == 2)
     618            {
     619                CRVBOXHGSMIWRITEREAD *pFnCmd = (CRVBOXHGSMIWRITEREAD*)pHdr;
     620                VBOXVDMACMD_CHROMIUM_BUFFER *pBuf = &pCmd->aBuffers[1];
     621                VBOXVDMACMD_CHROMIUM_BUFFER *pWbBuf = &pCmd->aBuffers[2];
     622
     623                /* Fetch parameters. */
     624                uint8_t *pBuffer  = VBOXCRHGSMI_PTR(pBuf->offBuffer, uint8_t);
     625                uint32_t cbBuffer = pBuf->cbBuffer;
     626
     627                uint8_t *pWriteback  = VBOXCRHGSMI_PTR(pWbBuf->offBuffer, uint8_t);
     628                uint32_t cbWriteback = pWbBuf->cbBuffer;
     629
     630                /* Execute the function. */
     631                rc = crVBoxServerClientWrite(u32ClientID, pBuffer, cbBuffer);
     632                if (!RT_SUCCESS(rc))
     633                {
     634                    Assert(VERR_NOT_SUPPORTED==rc);
     635                    svcClientVersionUnsupported(0, 0);
     636                }
     637
     638                rc = crVBoxServerClientRead(u32ClientID, pWriteback, &cbWriteback);
     639
     640//                if (RT_SUCCESS(rc))
     641//                {
     642//                    /* Update parameters.*/
     643//                    paParms[1].u.pointer.size = cbWriteback;
     644//                }
     645                /* Return the required buffer size always */
     646                pFnCmd->cbWriteback = cbWriteback;
     647            }
     648            else
     649            {
     650                Assert(0);
     651                rc = VERR_INVALID_PARAMETER;
     652            }
     653
     654            break;
     655        }
     656
     657        case SHCRGL_GUEST_FN_SET_VERSION:
     658        {
     659            Assert(0);
     660            rc = VERR_NOT_IMPLEMENTED;
     661            break;
     662        }
     663
     664        default:
     665        {
     666            Assert(0);
     667            rc = VERR_NOT_IMPLEMENTED;
     668        }
     669
     670    }
     671
     672    pHdr->result = rc;
     673
     674    return VINF_SUCCESS;
     675}
     676#endif
     677
    452678/*
    453679 * We differentiate between a function handler for the guest and one for the host.
     
    471697    switch (u32Function)
    472698    {
     699#ifdef VBOX_WITH_CRHGSMI
     700        case SHCRGL_HOST_FN_CRHGSMI_CMD:
     701        {
     702            Assert(cParms == 1 && paParms[0].type == VBOX_HGCM_SVC_PARM_PTR);
     703            if (cParms == 1 && paParms[0].type == VBOX_HGCM_SVC_PARM_PTR)
     704                rc = vboxCrHgsmiCmd((PVBOXVDMACMD_CHROMIUM_CMD)paParms[0].u.pointer.addr);
     705            else
     706                rc = VERR_INVALID_PARAMETER;
     707        } break;
     708        case SHCRGL_HOST_FN_CRHGSMI_CTL:
     709        {
     710            Assert(cParms == 1 && paParms[0].type == VBOX_HGCM_SVC_PARM_PTR);
     711            if (cParms == 1 && paParms[0].type == VBOX_HGCM_SVC_PARM_PTR)
     712                rc = vboxCrHgsmiCtl((PVBOXVDMACMD_CHROMIUM_CTL)paParms[0].u.pointer.addr);
     713            else
     714                rc = VERR_INVALID_PARAMETER;
     715        } break;
     716#endif
    473717        case SHCRGL_HOST_FN_SET_CONSOLE:
    474718        {
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