VirtualBox

Changeset 50921 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Mar 28, 2014 3:47:50 PM (11 years ago)
Author:
vboxsync
Message:

wddm/graphics/crogl: more new command submission fixes

Location:
trunk/src/VBox
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiDisp.cpp

    r49591 r50921  
    131131            pBuf->BasePrivate.Base.cbBuffer = cbBuf;
    132132
     133            pBuf->BasePrivate.pHgsmi = &pPrivate->BasePrivate;
     134
    133135            pBuf->hAllocation = DdiAllocInfo.hAllocation;
    134136
     
    199201}
    200202
    201 void vboxUhgsmiD3DInit(PVBOXUHGSMI_PRIVATE_D3D pHgsmi, PVBOXWDDMDISP_DEVICE pDevice)
    202 {
    203     pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiD3DBufferCreate;
    204     pHgsmi->BasePrivate.Base.pfnBufferSubmit = vboxUhgsmiD3DBufferSubmit;
    205     /* no escapes (for now) */
    206     pHgsmi->BasePrivate.pfnEscape = NULL;
    207     pHgsmi->pDevice = pDevice;
    208 }
    209 
    210203static DECLCALLBACK(int) vboxCrHhgsmiDispEscape(struct VBOXUHGSMI_PRIVATE_BASE *pHgsmi, void *pvData, uint32_t cbData, BOOL fHwAccess)
    211204{
     
    228221}
    229222
     223void vboxUhgsmiD3DInit(PVBOXUHGSMI_PRIVATE_D3D pHgsmi, PVBOXWDDMDISP_DEVICE pDevice)
     224{
     225    pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiD3DBufferCreate;
     226    pHgsmi->BasePrivate.Base.pfnBufferSubmit = vboxUhgsmiD3DBufferSubmit;
     227    /* escape is still needed, since Ugfsmi uses it e.g. to query connection id */
     228    pHgsmi->BasePrivate.pfnEscape = vboxCrHhgsmiDispEscape;
     229    pHgsmi->pDevice = pDevice;
     230}
    230231
    231232void vboxUhgsmiD3DEscInit(PVBOXUHGSMI_PRIVATE_D3D pHgsmi, struct VBOXWDDMDISP_DEVICE *pDevice)
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiKmt.cpp

    r49591 r50921  
    149149        pBuf->BasePrivate.Base.cbBuffer = cbBuf;
    150150
     151        pBuf->BasePrivate.pHgsmi = &pPrivate->BasePrivate;
     152
    151153        pBuf->hAllocation = DdiAllocInfo.hAllocation;
     154
    152155
    153156        *ppBuf = &pBuf->BasePrivate.Base;
     
    279282    pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiKmtBufferCreate;
    280283    pHgsmi->BasePrivate.Base.pfnBufferSubmit = vboxUhgsmiKmtBufferSubmit;
    281      /* no escapes (for now) */
    282     pHgsmi->BasePrivate.pfnEscape = NULL;
     284    /* escape is still needed, since Ugfsmi uses it e.g. to query connection id */
     285    pHgsmi->BasePrivate.pfnEscape = vboxCrHhgsmiKmtEscape;
    283286}
    284287
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVbva.cpp

    r50913 r50921  
    587587    pCtx->indexRecordFirstUncompleted = (pCtx->indexRecordFirstUncompleted + 1) % VBVA_MAX_RECORDS;
    588588    pCtx->off32DataUncompleted = (pCtx->off32DataUncompleted + cbBuffer) % pVBVA->cbData;
    589 #ifdef DEBUG
    590     vboxHwBufferVerifyCompleted(pCtx);
    591 #endif
    592589}
    593590
     
    10761073    }
    10771074
     1075#ifdef DEBUG
     1076    vboxHwBufferVerifyCompleted(&pVbva->Vbva);
     1077#endif
     1078
    10781079    return fHasCommandsCompletedPreempted;
    10791080}
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp

    r50913 r50921  
    3333#include <stdio.h>
    3434
    35 #define VBOXWDDM_DUMMY_DMABUFFER_SIZE sizeof (RECT)
     35#define VBOXWDDM_DUMMY_DMABUFFER_SIZE (sizeof (VBOXCMDVBVA_HDR) / 2)
    3636
    3737DWORD g_VBoxLogUm = 0;
     
    28632863        Assert(!pAllocationList->PhysicalAddress.HighPart);
    28642864        Assert(!(pAllocationList->PhysicalAddress.QuadPart & 0xfffUL)); /* <- just a check to ensure allocation offset does not go here */
    2865         *poffVram = pAllocationList->PhysicalAddress.LowPart + pPatchList->AllocationOffset;;
     2865        *poffVram = pAllocationList->PhysicalAddress.LowPart + pPatchList->AllocationOffset;
    28662866    }
    28672867
     
    57615761{
    57625762//    LOGF(("ENTER, hContext(0x%x)", hContext));
     5763    vboxVDbgBreakF();
    57635764
    57645765    if (pRender->DmaBufferPrivateDataSize < sizeof (VBOXCMDVBVA_HDR))
     
    57815782
    57825783    uint32_t cbBuffer = 0;
    5783     uint32_t cbCmdDma = 0;
     5784    uint32_t cbPrivateData = 0;
    57845785    VBOXCMDVBVA_HDR* pCmd = (VBOXCMDVBVA_HDR*)pRender->pDmaBufferPrivateData;
    57855786
     
    58075808            }
    58085809
    5809             cbBuffer = RT_OFFSETOF(VBOXCMDVBVA_CRCMD, Cmd.aBuffers[pRender->AllocationListSize]);
    5810             if (cbBuffer > 4096)
    5811             {
    5812                 /* this should not be bigger actually */
    5813                 WARN(("too big command buffer %d", cbBuffer));
     5810            cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
     5811            cbPrivateData = RT_OFFSETOF(VBOXCMDVBVA_CRCMD, Cmd.aBuffers[pRender->AllocationListSize]);
     5812
     5813            if (pRender->DmaBufferPrivateDataSize < cbPrivateData)
     5814            {
     5815                WARN(("pRender->DmaBufferPrivateDataSize too small %d, requested %d", pRender->DmaBufferPrivateDataSize, cbPrivateData));
    58145816                return STATUS_INVALID_PARAMETER;
    58155817            }
    58165818
    5817             cbCmdDma = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
    5818 
    5819             if (pRender->DmaBufferPrivateDataSize < cbBuffer)
    5820             {
    5821                 WARN(("pRender->DmaBufferPrivateDataSize too small %d, requested %d", pRender->DmaBufferPrivateDataSize, cbBuffer));
    5822                 return STATUS_INVALID_PARAMETER;
    5823             }
    5824 
    5825             if (pRender->DmaSize < cbCmdDma)
     5819            if (pRender->DmaSize < cbBuffer)
    58265820            {
    58275821                WARN(("dma buffer %d too small", pRender->DmaSize));
     
    58295823            }
    58305824
    5831             Assert(pRender->PatchLocationListOutSize == pRender->AllocationListSize);
     5825//            Assert(pRender->PatchLocationListOutSize == pRender->AllocationListSize);
    58325826
    58335827            if (pRender->PatchLocationListOutSize < pRender->AllocationListSize)
     
    58805874        case VBOXVDMACMD_TYPE_DMA_NOP:
    58815875        {
    5882             cbBuffer = sizeof (VBOXCMDVBVA_HDR);
    5883             cbCmdDma = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
    5884 
    5885             if (pRender->DmaBufferPrivateDataSize < cbBuffer)
    5886             {
    5887                 WARN(("pRender->DmaBufferPrivateDataSize too small %d, requested %d", pRender->DmaBufferPrivateDataSize, cbBuffer));
     5876            cbPrivateData = sizeof (VBOXCMDVBVA_HDR);
     5877            cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
     5878
     5879            if (pRender->DmaBufferPrivateDataSize < cbPrivateData)
     5880            {
     5881                WARN(("pRender->DmaBufferPrivateDataSize too small %d, requested %d", pRender->DmaBufferPrivateDataSize, cbPrivateData));
    58885882                return STATUS_INVALID_PARAMETER;
    58895883            }
    58905884
    5891             if (pRender->DmaSize < cbCmdDma)
     5885            if (pRender->DmaSize < cbBuffer)
    58925886            {
    58935887                WARN(("dma buffer %d too small", pRender->DmaSize));
     
    59165910    }
    59175911
    5918     pRender->pDmaBufferPrivateData = ((uint8_t*)pRender->pDmaBufferPrivateData) + cbBuffer;
    5919     pRender->pDmaBuffer = ((uint8_t*)pRender->pDmaBuffer) + cbCmdDma;
     5912    pRender->pDmaBufferPrivateData = ((uint8_t*)pRender->pDmaBufferPrivateData) + cbPrivateData;
     5913    pRender->pDmaBuffer = ((uint8_t*)pRender->pDmaBuffer) + cbBuffer;
    59205914
    59215915    pCmd->u8State = VBOXCMDVBVA_STATE_SUBMITTED;
     
    60916085//    LOGF(("ENTER, hContext(0x%x)", hContext));
    60926086
    6093     vboxVDbgBreakF();
     6087    vboxVDbgBreakFv();
    60946088
    60956089    PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)hContext;
     
    61726166            {
    61736167                pBlt->Hdr.u8Flags |= VBOXCMDVBVA_OPF_ALLOC_SRCPRIMARY;
     6168                Assert((UINT)pSrcAlloc->AllocData.SurfDesc.VidPnSourceId < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays);
    61746169                pBlt->Hdr.u.u8PrimaryID = pSrcAlloc->AllocData.SurfDesc.VidPnSourceId;
    61756170
     
    61866181                Assert(fDstPrimary);
    61876182                pBlt->Hdr.u8Flags |= VBOXCMDVBVA_OPF_ALLOC_DSTPRIMARY;
     6183                Assert((UINT)pDstAlloc->AllocData.SurfDesc.VidPnSourceId < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays);
    61886184                pBlt->Hdr.u.u8PrimaryID = pDstAlloc->AllocData.SurfDesc.VidPnSourceId;
    61896185
     
    62526248        pHdr->u8OpCode = VBOXCMDVBVA_OPTYPE_FLIP;
    62536249        pHdr->u8Flags = 0;
     6250        Assert((UINT)pSrcAlloc->AllocData.SurfDesc.VidPnSourceId < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays);
     6251        pHdr->u.u8PrimaryID = pSrcAlloc->AllocData.SurfDesc.VidPnSourceId;
    62546252        VBOXCMDVBVA_FLIP *pFlip = (VBOXCMDVBVA_FLIP*)pHdr;
    62556253
    62566254        if (VBoxCVDdiFillAllocInfo(pHdr, &pFlip->src, pSrcAlloc, pSrc, false))
     6255        {
     6256            WARN(("VBoxCVDdiFillAllocInfo reported no host id for flip!"));
    62576257            u32SrcPatch = RT_OFFSETOF(VBOXCMDVBVA_FLIP, src.u.offVRAM);
     6258        }
    62586259
    62596260        cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
     
    66936694                    case VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D:
    66946695                    {
    6695                         Status = vboxVideoAMgrCtxCreate(&pDevExt->AllocMgr, &pContext->AllocContext);
    6696                         Assert(Status == STATUS_SUCCESS);
     6696                        if (!pDevExt->fCmdVbvaEnabled)
     6697                        {
     6698                            Status = vboxVideoAMgrCtxCreate(&pDevExt->AllocMgr, &pContext->AllocContext);
     6699                            if (!NT_SUCCESS(Status))
     6700                                WARN(("vboxVideoAMgrCtxCreate failed %#x", Status));
     6701                        }
     6702                        else
     6703                            Status = STATUS_SUCCESS;
     6704
    66976705                        if (Status == STATUS_SUCCESS)
    66986706                        {
     
    67476755                    {
    67486756                        pContext->enmType = pInfo->enmType;
    6749                         Status = vboxVideoAMgrCtxCreate(&pDevExt->AllocMgr, &pContext->AllocContext);
    6750                         Assert(Status == STATUS_SUCCESS);
     6757                        if (!pDevExt->fCmdVbvaEnabled)
     6758                        {
     6759                            Status = vboxVideoAMgrCtxCreate(&pDevExt->AllocMgr, &pContext->AllocContext);
     6760                            if (!NT_SUCCESS(Status))
     6761                                WARN(("vboxVideoAMgrCtxCreate failed %#x", Status));
     6762                        }
     6763                        else
     6764                            Status = STATUS_SUCCESS;
     6765
    67516766                        if (Status == STATUS_SUCCESS)
    67526767                        {
     
    69816996{
    69826997    LOGF(("ENTER, hAdapter(0x%x)", hAdapter));
    6983     vboxVDbgBreakF();
     6998    vboxVDbgBreakFv();
    69846999
    69857000    PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)hAdapter;
  • trunk/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp

    r50913 r50921  
    12121212static int vboxVDMACrCmdVbvaProcessPagingEl(PPDMDEVINS pDevIns, VBOXCMDVBVAPAGEIDX iPage, uint8_t *pu8Vram, bool fIn)
    12131213{
    1214     RTGCPHYS phPage = (RTGCPHYS)(iPage >> PAGE_SHIFT);
     1214    RTGCPHYS phPage = (RTGCPHYS)(iPage << PAGE_SHIFT);
    12151215    PGMPAGEMAPLOCK Lock;
    12161216    int rc;
     
    12501250static int vboxVDMACrCmdVbvaProcessPagingEls(PPDMDEVINS pDevIns, const VBOXCMDVBVAPAGEIDX *piPages, uint32_t cPages, uint8_t *pu8Vram, bool fIn)
    12511251{
    1252     for (uint32_t i = 0; i < cPages; ++i)
     1252    for (uint32_t i = 0; i < cPages; ++i, pu8Vram += PAGE_SIZE)
    12531253    {
    12541254        int rc = vboxVDMACrCmdVbvaProcessPagingEl(pDevIns, piPages[i], pu8Vram, fIn);
  • trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp

    r50913 r50921  
    14651465            }
    14661466
    1467             rc = crServerVBoxWindowsShow(paParms[0].u.uint32);
     1467            rc = crServerVBoxWindowsShow(!!paParms[0].u.uint32);
    14681468            if (!RT_SUCCESS(rc))
    14691469                WARN(("crServerVBoxWindowsShow failed rc %d", rc));
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h

    r50913 r50921  
    465465
    466466int8_t crVBoxServerCrCmdBltProcess(const VBOXCMDVBVA_HDR *pCmd, uint32_t cbCmd);
     467int8_t crVBoxServerCrCmdFlipProcess(const VBOXCMDVBVA_FLIP *pFlip);
    467468
    468469//#define VBOX_WITH_CRSERVER_DUMPER
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c

    r50913 r50921  
    30733073                if (cbHdr < sizeof (*pFnCmd))
    30743074                {
    3075                     crWarning("invalid write cmd buffer size!");
     3075                    WARN(("invalid write cmd buffer size!"));
    30763076                    rc = VERR_INVALID_PARAMETER;
    30773077                    break;
     
    30813081                if (!pBuffer)
    30823082                {
    3083                     crWarning("invalid buffer data received from guest!");
     3083                    WARN(("invalid buffer data received from guest!"));
    30843084                    rc = VERR_INVALID_PARAMETER;
    30853085                    break;
     
    30893089                if (RT_FAILURE(rc))
    30903090                {
     3091                    WARN(("crVBoxServerClientGet failed %d", rc));
    30913092                    break;
    30923093                }
     
    31013102                rc = crVBoxServerInternalClientWriteRead(pClient);
    31023103                CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData);
    3103                 return rc;
    3104             }
    3105             else
    3106             {
    3107                 crWarning("invalid number of args");
    3108                 rc = VERR_INVALID_PARAMETER;
     3104                if (RT_FAILURE(rc))
     3105                {
     3106                    WARN(("crVBoxServerInternalClientWriteRead failed %d", rc));
     3107                    break;
     3108                }
    31093109                break;
    31103110            }
     3111
     3112            WARN(("invalid number of args"));
     3113            rc = VERR_INVALID_PARAMETER;
    31113114            break;
    31123115        }
     
    31283131                if (cbHdr < sizeof (*pFnCmd))
    31293132                {
    3130                     crWarning("invalid inject cmd buffer size!");
     3133                    WARN(("invalid inject cmd buffer size!"));
    31313134                    rc = VERR_INVALID_PARAMETER;
    31323135                    break;
     
    31363139                if (!pBuffer)
    31373140                {
    3138                     crWarning("invalid buffer data received from guest!");
     3141                    WARN(("invalid buffer data received from guest!"));
    31393142                    rc = VERR_INVALID_PARAMETER;
    31403143                    break;
     
    31443147                if (RT_FAILURE(rc))
    31453148                {
     3149                    WARN(("crVBoxServerClientGet failed %d", rc));
    31463150                    break;
    31473151                }
     
    31563160                rc = crVBoxServerInternalClientWriteRead(pClient);
    31573161                CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData);
    3158                 return rc;
     3162                if (RT_FAILURE(rc))
     3163                {
     3164                    WARN(("crVBoxServerInternalClientWriteRead failed %d", rc));
     3165                    break;
     3166                }
     3167
     3168                break;
    31593169            }
    31603170
    3161             crWarning("invalid number of args");
     3171            WARN(("invalid number of args"));
    31623172            rc = VERR_INVALID_PARAMETER;
    31633173            break;
     
    31793189                if (cbHdr < sizeof (*pFnCmd))
    31803190                {
    3181                     crWarning("invalid read cmd buffer size!");
     3191                    WARN(("invalid read cmd buffer size!"));
    31823192                    rc = VERR_INVALID_PARAMETER;
    31833193                    break;
    31843194                }
    31853195
    3186 
    31873196                if (!pBuffer)
    31883197                {
    3189                     crWarning("invalid buffer data received from guest!");
     3198                    WARN(("invalid buffer data received from guest!"));
    31903199                    rc = VERR_INVALID_PARAMETER;
    31913200                    break;
     
    31953204                if (RT_FAILURE(rc))
    31963205                {
     3206                    WARN(("crVBoxServerClientGet failed %d", rc));
    31973207                    break;
    31983208                }
     
    32083218
    32093219                /* the read command is never pended, complete it right away */
    3210                 pHdr->result = rc;
    3211 
    3212                 return VINF_SUCCESS;
     3220                if (RT_FAILURE(rc))
     3221                {
     3222                    WARN(("crVBoxServerInternalClientRead failed %d", rc));
     3223                    break;
     3224                }
     3225
     3226                break;
    32133227            }
    32143228
     
    32383252                if (cbHdr < sizeof (*pFnCmd))
    32393253                {
    3240                     crWarning("invalid write_read cmd buffer size!");
     3254                    WARN(("invalid write_read cmd buffer size!"));
    32413255                    rc = VERR_INVALID_PARAMETER;
    32423256                    break;
    32433257                }
    32443258
    3245 
    32463259                CRASSERT(cbBuffer);
    32473260                if (!pBuffer)
    32483261                {
    3249                     crWarning("invalid write buffer data received from guest!");
     3262                    WARN(("invalid write buffer data received from guest!"));
    32503263                    rc = VERR_INVALID_PARAMETER;
    32513264                    break;
     
    32553268                if (!pWriteback)
    32563269                {
    3257                     crWarning("invalid writeback buffer data received from guest!");
     3270                    WARN(("invalid writeback buffer data received from guest!"));
    32583271                    rc = VERR_INVALID_PARAMETER;
    32593272                    break;
    32603273                }
     3274
    32613275                rc = crVBoxServerClientGet(u32ClientID, &pClient);
    32623276                if (RT_FAILURE(rc))
    32633277                {
    3264                     pHdr->result = rc;
    3265                     return VINF_SUCCESS;
     3278                    WARN(("crVBoxServerClientGet failed %d", rc));
     3279                    break;
    32663280                }
    32673281
     
    32753289                rc = crVBoxServerInternalClientWriteRead(pClient);
    32763290                CRVBOXHGSMI_CMDDATA_ASSERT_CLEANED(&pClient->conn->CmdData);
    3277                 return rc;
     3291
     3292                if (RT_FAILURE(rc))
     3293                {
     3294                    WARN(("crVBoxServerInternalClientWriteRead failed %d", rc));
     3295                    break;
     3296                }
     3297
     3298                break;
    32783299            }
    32793300
     
    33063327    }
    33073328
    3308     /* we can be on fail only here */
    3309     CRASSERT(RT_FAILURE(rc));
    33103329    pHdr->result = rc;
    33113330
    3312     return rc;
     3331    return VINF_SUCCESS;
    33133332}
    33143333
     
    35003519            return -1;
    35013520        }
     3521        case VBOXCMDVBVA_OPTYPE_FLIP:
     3522        {
     3523            const VBOXCMDVBVA_FLIP *pFlip;
     3524
     3525            if (cbCmd < sizeof (VBOXCMDVBVA_FLIP))
     3526            {
     3527                WARN(("invalid buffer size"));
     3528                return -1;
     3529            }
     3530
     3531            pFlip = (const VBOXCMDVBVA_FLIP*)pCmd;
     3532            return crVBoxServerCrCmdFlipProcess(pFlip);
     3533        }
    35023534        case VBOXCMDVBVA_OPTYPE_BLT_OFFPRIMSZFMT_OR_ID:
    35033535        {
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp

    r50913 r50921  
    48254825    return 0;
    48264826}
     4827
     4828int8_t crVBoxServerCrCmdFlipProcess(const VBOXCMDVBVA_FLIP *pFlip)
     4829{
     4830    uint32_t hostId;
     4831    if (pFlip->Hdr.u8Flags & VBOXCMDVBVA_OPF_ALLOC_SRCID)
     4832        hostId = pFlip->src.u.id;
     4833    else
     4834    {
     4835        WARN(("VBOXCMDVBVA_OPF_ALLOC_SRCID not specified"));
     4836        hostId = 0;
     4837    }
     4838
     4839    uint32_t idScreen = pFlip->Hdr.u.u8PrimaryID;
     4840    HCR_FRAMEBUFFER hFb = CrPMgrFbGetEnabled(idScreen);
     4841    if (!hFb)
     4842    {
     4843        WARN(("request to present on disabled framebuffer, ignore"));
     4844        return 0;
     4845    }
     4846
     4847    const RTRECT *pRect = CrVrScrCompositorRectGet(&hFb->Compositor);
     4848    crServerDispatchVBoxTexPresent(hostId, idScreen, 0, 0, 1, (const GLint*)pRect);
     4849    return 0;
     4850}
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