Changeset 49474 in vbox for trunk/src/VBox/HostServices/SharedOpenGL
- Timestamp:
- Nov 14, 2013 6:49:54 AM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 90613
- Location:
- trunk/src/VBox/HostServices/SharedOpenGL
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp
r49163 r49474 953 953 switch (u32Function) 954 954 { 955 case SHCRGL_HOST_FN_CRCMD_NOTIFY_CMDS: 956 { 957 rc = crVBoxServerCrCmdNotifyCmds(); 958 } break; 955 959 #ifdef VBOX_WITH_CRHGSMI 956 960 case SHCRGL_HOST_FN_CRHGSMI_CMD: -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h
r49172 r49474 48 48 49 49 #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)) { \ 51 51 VBOXCRHGSMI_CMD_COMPLETE(_pData, _rc); \ 52 52 } \ -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c
r48798 r49474 3056 3056 * NOTE: it is ALWAYS responsibility of the crVBoxServerCrHgsmiCmd to complete the command! 3057 3057 * */ 3058 int32_t crVBoxServerCrHgsmiCmd(struct VBOXVDMACMD_CHROMIUM_CMD *pCmd, uint32_t cbCmd)3058 static int32_t crVBoxServerCrHgsmiCmdProcess(struct VBOXVDMACMD_CHROMIUM_CMD *pCmd, bool fCompleteNeeded) 3059 3059 { 3060 3060 int32_t rc; … … 3070 3070 { 3071 3071 crWarning("g_pvVRamBase is not initialized"); 3072 if (!fCompleteNeeded) 3073 return VERR_INVALID_STATE; 3074 3072 3075 crServerCrHgsmiCmdComplete(pCmd, VERR_INVALID_STATE); 3073 3076 return VINF_SUCCESS; … … 3077 3080 { 3078 3081 crWarning("zero buffers passed in!"); 3082 if (!fCompleteNeeded) 3083 return VERR_INVALID_PARAMETER; 3084 3079 3085 crServerCrHgsmiCmdComplete(pCmd, VERR_INVALID_PARAMETER); 3080 3086 return VINF_SUCCESS; … … 3088 3094 { 3089 3095 crWarning("invalid header buffer!"); 3096 if (!fCompleteNeeded) 3097 return VERR_INVALID_PARAMETER; 3098 3090 3099 crServerCrHgsmiCmdComplete(pCmd, VERR_INVALID_PARAMETER); 3091 3100 return VINF_SUCCESS; … … 3095 3104 { 3096 3105 crWarning("invalid header buffer size!"); 3106 if (!fCompleteNeeded) 3107 return VERR_INVALID_PARAMETER; 3108 3097 3109 crServerCrHgsmiCmdComplete(pCmd, VERR_INVALID_PARAMETER); 3098 3110 return VINF_SUCCESS; … … 3144 3156 pClient->conn->pBuffer = pBuffer; 3145 3157 pClient->conn->cbBuffer = cbBuffer; 3146 CRVBOXHGSMI_CMDDATA_SET(&pClient->conn->CmdData, pCmd, pHdr );3158 CRVBOXHGSMI_CMDDATA_SET(&pClient->conn->CmdData, pCmd, pHdr, fCompleteNeeded); 3147 3159 rc = crVBoxServerInternalClientWriteRead(pClient); 3148 3160 CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData); … … 3199 3211 pClient->conn->pBuffer = pBuffer; 3200 3212 pClient->conn->cbBuffer = cbBuffer; 3201 CRVBOXHGSMI_CMDDATA_SET(&pClient->conn->CmdData, pCmd, pHdr );3213 CRVBOXHGSMI_CMDDATA_SET(&pClient->conn->CmdData, pCmd, pHdr, fCompleteNeeded); 3202 3214 rc = crVBoxServerInternalClientWriteRead(pClient); 3203 3215 CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData); … … 3255 3267 /* the read command is never pended, complete it right away */ 3256 3268 pHdr->result = rc; 3269 3270 if (!fCompleteNeeded) 3271 return VINF_SUCCESS; 3272 3257 3273 crServerCrHgsmiCmdComplete(pCmd, VINF_SUCCESS); 3258 3274 return VINF_SUCCESS; … … 3319 3335 pClient->conn->pBuffer = pBuffer; 3320 3336 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); 3322 3338 rc = crVBoxServerInternalClientWriteRead(pClient); 3323 3339 CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData); … … 3356 3372 CRASSERT(RT_FAILURE(rc)); 3357 3373 pHdr->result = rc; 3374 3375 if (!fCompleteNeeded) 3376 return rc; 3377 3358 3378 crServerCrHgsmiCmdComplete(pCmd, VINF_SUCCESS); 3359 3379 return rc; 3380 } 3381 3382 int32_t crVBoxServerCrHgsmiCmd(struct VBOXVDMACMD_CHROMIUM_CMD *pCmd, uint32_t cbCmd) 3383 { 3384 return crVBoxServerCrHgsmiCmdProcess(pCmd, true); 3360 3385 } 3361 3386 … … 3371 3396 g_pvVRamBase = (uint8_t*)pSetup->pvVRamBase; 3372 3397 g_cbVRam = pSetup->cbVRam; 3398 cr_server.CltInfo = *pSetup->pCrCmdClientInfo; 3373 3399 rc = VINF_SUCCESS; 3374 3400 break; … … 3399 3425 return rc; 3400 3426 } 3401 #endif 3427 3428 static 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 3457 int32_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 318 318 } 319 319 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 339 320 static void crServerVBoxRootVrTranslateForMural(CRMuralInfo *mural) 340 321 {
Note:
See TracChangeset
for help on using the changeset viewer.