VirtualBox

Ignore:
Timestamp:
Nov 14, 2013 6:49:54 AM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
90613
Message:

crOpenGL: some host bits for buffer-based command submission

Location:
trunk/src/VBox/HostServices/SharedOpenGL
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp

    r49163 r49474  
    953953    switch (u32Function)
    954954    {
     955        case SHCRGL_HOST_FN_CRCMD_NOTIFY_CMDS:
     956        {
     957            rc = crVBoxServerCrCmdNotifyCmds();
     958        } break;
    955959#ifdef VBOX_WITH_CRHGSMI
    956960        case SHCRGL_HOST_FN_CRHGSMI_CMD:
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h

    r49172 r49474  
    4848
    4949#define VBOXCRHGSMI_CMD_CHECK_COMPLETE(_pData, _rc) do { \
    50         if (CRVBOXHGSMI_CMDDATA_IS_SET(_pData)) { \
     50        if (CRVBOXHGSMI_CMDDATA_IS_COMPLETE_NEEDED(_pData) && CRVBOXHGSMI_CMDDATA_IS_SET(_pData)) { \
    5151            VBOXCRHGSMI_CMD_COMPLETE(_pData, _rc); \
    5252        } \
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c

    r48798 r49474  
    30563056 * NOTE: it is ALWAYS responsibility of the crVBoxServerCrHgsmiCmd to complete the command!
    30573057 * */
    3058 int32_t crVBoxServerCrHgsmiCmd(struct VBOXVDMACMD_CHROMIUM_CMD *pCmd, uint32_t cbCmd)
     3058static int32_t crVBoxServerCrHgsmiCmdProcess(struct VBOXVDMACMD_CHROMIUM_CMD *pCmd, bool fCompleteNeeded)
    30593059{
    30603060    int32_t rc;
     
    30703070    {
    30713071        crWarning("g_pvVRamBase is not initialized");
     3072        if (!fCompleteNeeded)
     3073            return VERR_INVALID_STATE;
     3074
    30723075        crServerCrHgsmiCmdComplete(pCmd, VERR_INVALID_STATE);
    30733076        return VINF_SUCCESS;
     
    30773080    {
    30783081        crWarning("zero buffers passed in!");
     3082        if (!fCompleteNeeded)
     3083            return VERR_INVALID_PARAMETER;
     3084
    30793085        crServerCrHgsmiCmdComplete(pCmd, VERR_INVALID_PARAMETER);
    30803086        return VINF_SUCCESS;
     
    30883094    {
    30893095        crWarning("invalid header buffer!");
     3096        if (!fCompleteNeeded)
     3097            return VERR_INVALID_PARAMETER;
     3098
    30903099        crServerCrHgsmiCmdComplete(pCmd, VERR_INVALID_PARAMETER);
    30913100        return VINF_SUCCESS;
     
    30953104    {
    30963105        crWarning("invalid header buffer size!");
     3106        if (!fCompleteNeeded)
     3107            return VERR_INVALID_PARAMETER;
     3108
    30973109        crServerCrHgsmiCmdComplete(pCmd, VERR_INVALID_PARAMETER);
    30983110        return VINF_SUCCESS;
     
    31443156                pClient->conn->pBuffer = pBuffer;
    31453157                pClient->conn->cbBuffer = cbBuffer;
    3146                 CRVBOXHGSMI_CMDDATA_SET(&pClient->conn->CmdData, pCmd, pHdr);
     3158                CRVBOXHGSMI_CMDDATA_SET(&pClient->conn->CmdData, pCmd, pHdr, fCompleteNeeded);
    31473159                rc = crVBoxServerInternalClientWriteRead(pClient);
    31483160                CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData);
     
    31993211                pClient->conn->pBuffer = pBuffer;
    32003212                pClient->conn->cbBuffer = cbBuffer;
    3201                 CRVBOXHGSMI_CMDDATA_SET(&pClient->conn->CmdData, pCmd, pHdr);
     3213                CRVBOXHGSMI_CMDDATA_SET(&pClient->conn->CmdData, pCmd, pHdr, fCompleteNeeded);
    32023214                rc = crVBoxServerInternalClientWriteRead(pClient);
    32033215                CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData);
     
    32553267                /* the read command is never pended, complete it right away */
    32563268                pHdr->result = rc;
     3269
     3270                if (!fCompleteNeeded)
     3271                    return VINF_SUCCESS;
     3272
    32573273                crServerCrHgsmiCmdComplete(pCmd, VINF_SUCCESS);
    32583274                return VINF_SUCCESS;
     
    33193335                pClient->conn->pBuffer = pBuffer;
    33203336                pClient->conn->cbBuffer = cbBuffer;
    3321                 CRVBOXHGSMI_CMDDATA_SETWB(&pClient->conn->CmdData, pCmd, pHdr, pWriteback, cbWriteback, &pFnCmd->cbWriteback);
     3337                CRVBOXHGSMI_CMDDATA_SETWB(&pClient->conn->CmdData, pCmd, pHdr, pWriteback, cbWriteback, &pFnCmd->cbWriteback, fCompleteNeeded);
    33223338                rc = crVBoxServerInternalClientWriteRead(pClient);
    33233339                CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData);
     
    33563372    CRASSERT(RT_FAILURE(rc));
    33573373    pHdr->result = rc;
     3374
     3375    if (!fCompleteNeeded)
     3376        return rc;
     3377
    33583378    crServerCrHgsmiCmdComplete(pCmd, VINF_SUCCESS);
    33593379    return rc;
     3380}
     3381
     3382int32_t crVBoxServerCrHgsmiCmd(struct VBOXVDMACMD_CHROMIUM_CMD *pCmd, uint32_t cbCmd)
     3383{
     3384    return crVBoxServerCrHgsmiCmdProcess(pCmd, true);
    33603385}
    33613386
     
    33713396            g_pvVRamBase = (uint8_t*)pSetup->pvVRamBase;
    33723397            g_cbVRam = pSetup->cbVRam;
     3398            cr_server.CltInfo = *pSetup->pCrCmdClientInfo;
    33733399            rc = VINF_SUCCESS;
    33743400            break;
     
    33993425    return rc;
    34003426}
    3401 #endif
     3427
     3428static int32_t crVBoxServerCrCmdProcess(PVBOXCMDVBVA_HDR pCmd, uint32_t cbCmd)
     3429{
     3430    switch (pCmd->u8OpCode)
     3431    {
     3432        case VBOXCMDVBVA_OPTYPE_CRCMD:
     3433        {
     3434            VBOXCMDVBVA_CRCMD *pCrCmdDr = (VBOXCMDVBVA_CRCMD*)pCmd;
     3435            VBOXCMDVBVAOFFSET offCmd = pCrCmdDr->offCmd;
     3436            if (offCmd < g_cbVRam && offCmd + cbCmd < g_cbVRam)
     3437            {
     3438                VBOXVDMACMD_CHROMIUM_CMD *pCrCmd = (VBOXVDMACMD_CHROMIUM_CMD*)(g_pvVRamBase + offCmd);
     3439                crVBoxServerCrHgsmiCmdProcess(pCrCmd, false);
     3440                /* success */
     3441                pCmd->i8Result = 0;
     3442            }
     3443            else
     3444            {
     3445                crWarning("incorrect command info!");
     3446                pCmd->i8Result = -1;
     3447            }
     3448            break;
     3449        }
     3450        default:
     3451            crWarning("unsupported command");
     3452            pCmd->i8Result = -1;
     3453    }
     3454    return VINF_SUCCESS;
     3455}
     3456
     3457int32_t crVBoxServerCrCmdNotifyCmds()
     3458{
     3459    PVBOXCMDVBVA_HDR pCmd = NULL;
     3460    uint32_t cbCmd;
     3461
     3462    for (;;)
     3463    {
     3464        int rc = cr_server.CltInfo.pfnCmdGet(cr_server.CltInfo.hClient, &pCmd, &cbCmd);
     3465        if (rc == VINF_EOF)
     3466            return VINF_SUCCESS;
     3467        if (!RT_SUCCESS(rc))
     3468            return rc;
     3469
     3470        rc = crVBoxServerCrCmdProcess(pCmd, cbCmd);
     3471        if (!RT_SUCCESS(rc))
     3472            return rc;
     3473    }
     3474
     3475    /* should not be here! */
     3476    AssertFailed();
     3477    return VERR_INTERNAL_ERROR;
     3478}
     3479#endif
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_window.c

    r48726 r49474  
    318318}
    319319
    320 static bool crServerVBoxTranslateIntersectRect(CRMuralInfo *mural, const RTRECT *pSrcRect, PRTRECT pDstRect)
    321 {
    322     int32_t xLeft = RT_MAX(mural->gX, pSrcRect->xRight);
    323     int32_t yTop = RT_MAX(mural->gY, pSrcRect->yBottom);
    324     int32_t xRight = RT_MIN(mural->gX + mural->width, pSrcRect->xLeft);
    325     int32_t yBottom = RT_MIN(mural->gY + mural->height, pSrcRect->yTop);
    326 
    327     if (xLeft < xRight && yTop < yBottom)
    328     {
    329         pDstRect->xLeft = xLeft;
    330         pDstRect->yTop = yTop;
    331         pDstRect->xRight = xRight;
    332         pDstRect->yBottom = yBottom;
    333         return true;
    334     }
    335 
    336     return false;
    337 }
    338 
    339320static void crServerVBoxRootVrTranslateForMural(CRMuralInfo *mural)
    340321{
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