VirtualBox

Changeset 79817 in vbox


Ignore:
Timestamp:
Jul 16, 2019 5:56:18 PM (5 years ago)
Author:
vboxsync
Message:

Additions/3D/win/VBoxGL: fix for r132149: check if the surface format is supported only for render targets. bugref:9483

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/3D/win/VBoxGL/GaDrvEnvKMT.cpp

    r79782 r79817  
    406406    uint32_t                          cbReq;
    407407
    408     /* First check if the format is supported. */
    409     D3DDDIFORMAT const ddiFormat = svgaToD3DDDIFormat((SVGA3dSurfaceFormat)pCreateParms->format);
    410     if (ddiFormat == D3DDDIFMT_UNKNOWN)
    411         return -1;
    412 
    413408    /* Size of the SVGA request data */
    414409    cbReq = sizeof(GASURFCREATE) + cSizes * sizeof(GASURFSIZE);
     
    448443        if (pCreateParms->flags & SVGA3D_SURFACE_HINT_RENDERTARGET)
    449444        {
    450             GAWDDMSURFACEINFO *pSurfaceInfo = (GAWDDMSURFACEINFO *)malloc(sizeof(GAWDDMSURFACEINFO));
    451             if (pSurfaceInfo)
     445            /* First check if the format is supported. */
     446            D3DDDIFORMAT const ddiFormat = svgaToD3DDDIFormat((SVGA3dSurfaceFormat)pCreateParms->format);
     447            if (ddiFormat != D3DDDIFMT_UNKNOWN)
    452448            {
    453                 memset(pSurfaceInfo, 0, sizeof(GAWDDMSURFACEINFO));
    454 
    455                 VBOXWDDM_ALLOCINFO wddmAllocInfo;
    456                 memset(&wddmAllocInfo, 0, sizeof(wddmAllocInfo));
    457 
    458                 wddmAllocInfo.enmType             = VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC;
    459                 wddmAllocInfo.fFlags.RenderTarget = 1;
    460                 wddmAllocInfo.hSharedHandle       = 0;
    461                 wddmAllocInfo.hostID              = pData->u32Sid;
    462                 wddmAllocInfo.SurfDesc.slicePitch = 0;
    463                 wddmAllocInfo.SurfDesc.depth      = paSizes[0].cDepth;
    464                 wddmAllocInfo.SurfDesc.width      = paSizes[0].cWidth;
    465                 wddmAllocInfo.SurfDesc.height     = paSizes[0].cHeight;
    466                 wddmAllocInfo.SurfDesc.format     = ddiFormat;
    467                 wddmAllocInfo.SurfDesc.VidPnSourceId = 0;
    468                 wddmAllocInfo.SurfDesc.bpp        = vboxWddmCalcBitsPerPixel(wddmAllocInfo.SurfDesc.format);
    469                 wddmAllocInfo.SurfDesc.pitch      = vboxWddmCalcPitch(wddmAllocInfo.SurfDesc.width,
    470                                                                       wddmAllocInfo.SurfDesc.format);
    471                 wddmAllocInfo.SurfDesc.cbSize     = vboxWddmCalcSize(wddmAllocInfo.SurfDesc.pitch,
    472                                                                      wddmAllocInfo.SurfDesc.height,
    473                                                                      wddmAllocInfo.SurfDesc.format);
    474                 wddmAllocInfo.SurfDesc.d3dWidth   = vboxWddmCalcWidthForPitch(wddmAllocInfo.SurfDesc.pitch,
    475                                                                               wddmAllocInfo.SurfDesc.format);
    476 
    477                 D3DDDI_ALLOCATIONINFO AllocationInfo;
    478                 memset(&AllocationInfo, 0, sizeof(AllocationInfo));
    479                 // AllocationInfo.hAllocation           = NULL;
    480                 // AllocationInfo.pSystemMem            = NULL;
    481                 AllocationInfo.pPrivateDriverData    = &wddmAllocInfo;
    482                 AllocationInfo.PrivateDriverDataSize = sizeof(wddmAllocInfo);
    483 
    484                 D3DKMT_CREATEALLOCATION CreateAllocation;
    485                 memset(&CreateAllocation, 0, sizeof(CreateAllocation));
    486                 CreateAllocation.hDevice         = pThis->mKmtCallbacks.hDevice;
    487                 CreateAllocation.NumAllocations  = 1;
    488                 CreateAllocation.pAllocationInfo = &AllocationInfo;
    489 
    490                 Status = pThis->mKmtCallbacks.d3dkmt->pfnD3DKMTCreateAllocation(&CreateAllocation);
    491                 if (Status == STATUS_SUCCESS)
     449                GAWDDMSURFACEINFO *pSurfaceInfo = (GAWDDMSURFACEINFO *)malloc(sizeof(GAWDDMSURFACEINFO));
     450                if (pSurfaceInfo)
    492451                {
    493                     pSurfaceInfo->Core.Key    = pData->u32Sid;
    494                     pSurfaceInfo->hAllocation = AllocationInfo.hAllocation;
    495                     if (!RTAvlU32Insert(&pThis->mSurfaceTree, &pSurfaceInfo->Core))
     452                    memset(pSurfaceInfo, 0, sizeof(GAWDDMSURFACEINFO));
     453
     454                    VBOXWDDM_ALLOCINFO wddmAllocInfo;
     455                    memset(&wddmAllocInfo, 0, sizeof(wddmAllocInfo));
     456
     457                    wddmAllocInfo.enmType             = VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC;
     458                    wddmAllocInfo.fFlags.RenderTarget = 1;
     459                    wddmAllocInfo.hSharedHandle       = 0;
     460                    wddmAllocInfo.hostID              = pData->u32Sid;
     461                    wddmAllocInfo.SurfDesc.slicePitch = 0;
     462                    wddmAllocInfo.SurfDesc.depth      = paSizes[0].cDepth;
     463                    wddmAllocInfo.SurfDesc.width      = paSizes[0].cWidth;
     464                    wddmAllocInfo.SurfDesc.height     = paSizes[0].cHeight;
     465                    wddmAllocInfo.SurfDesc.format     = ddiFormat;
     466                    wddmAllocInfo.SurfDesc.VidPnSourceId = 0;
     467                    wddmAllocInfo.SurfDesc.bpp        = vboxWddmCalcBitsPerPixel(wddmAllocInfo.SurfDesc.format);
     468                    wddmAllocInfo.SurfDesc.pitch      = vboxWddmCalcPitch(wddmAllocInfo.SurfDesc.width,
     469                                                                          wddmAllocInfo.SurfDesc.format);
     470                    wddmAllocInfo.SurfDesc.cbSize     = vboxWddmCalcSize(wddmAllocInfo.SurfDesc.pitch,
     471                                                                         wddmAllocInfo.SurfDesc.height,
     472                                                                         wddmAllocInfo.SurfDesc.format);
     473                    wddmAllocInfo.SurfDesc.d3dWidth   = vboxWddmCalcWidthForPitch(wddmAllocInfo.SurfDesc.pitch,
     474                                                                                  wddmAllocInfo.SurfDesc.format);
     475
     476                    D3DDDI_ALLOCATIONINFO AllocationInfo;
     477                    memset(&AllocationInfo, 0, sizeof(AllocationInfo));
     478                    // AllocationInfo.hAllocation           = NULL;
     479                    // AllocationInfo.pSystemMem            = NULL;
     480                    AllocationInfo.pPrivateDriverData    = &wddmAllocInfo;
     481                    AllocationInfo.PrivateDriverDataSize = sizeof(wddmAllocInfo);
     482
     483                    D3DKMT_CREATEALLOCATION CreateAllocation;
     484                    memset(&CreateAllocation, 0, sizeof(CreateAllocation));
     485                    CreateAllocation.hDevice         = pThis->mKmtCallbacks.hDevice;
     486                    CreateAllocation.NumAllocations  = 1;
     487                    CreateAllocation.pAllocationInfo = &AllocationInfo;
     488
     489                    Status = pThis->mKmtCallbacks.d3dkmt->pfnD3DKMTCreateAllocation(&CreateAllocation);
     490                    if (Status == STATUS_SUCCESS)
    496491                    {
    497                         Status = STATUS_NOT_SUPPORTED;
     492                        pSurfaceInfo->Core.Key    = pData->u32Sid;
     493                        pSurfaceInfo->hAllocation = AllocationInfo.hAllocation;
     494                        if (!RTAvlU32Insert(&pThis->mSurfaceTree, &pSurfaceInfo->Core))
     495                        {
     496                            Status = STATUS_NOT_SUPPORTED;
     497                        }
     498                    }
     499
     500                    if (Status != STATUS_SUCCESS)
     501                    {
     502                        free(pSurfaceInfo);
    498503                    }
    499504                }
    500 
    501                 if (Status != STATUS_SUCCESS)
     505                else
    502506                {
    503                     free(pSurfaceInfo);
     507                    Status = STATUS_NOT_SUPPORTED;
    504508                }
    505509            }
    506510            else
    507511            {
     512                /* Unsupported render target format. */
    508513                Status = STATUS_NOT_SUPPORTED;
    509514            }
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