VirtualBox

Ignore:
Timestamp:
Jan 10, 2024 8:16:30 AM (13 months ago)
Author:
vboxsync
Message:

Devices/Graphics: multisampling.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx-dx11.cpp

    r102715 r102808  
    106106    IDXGIFactory               *pDxgiFactory;          /* DXGI Factory. */
    107107    D3D_FEATURE_LEVEL           FeatureLevel;
     108
     109    uint32_t                    MultisampleCountMask;  /* 1 << (MSCount - 1) for MSCount = 2, 4, 8, 16, 32 */
    108110
    109111    ID3D11VideoDevice          *pVideoDevice;
     
    909911                *pu32DevCap |= SVGA3D_DXFMT_DX_VERTEX_BUFFER;
    910912
    911             UINT NumQualityLevels;
    912             hr = pDevice->CheckMultisampleQualityLevels(dxgiFormat, 2, &NumQualityLevels);
    913             if (SUCCEEDED(hr) && NumQualityLevels != 0)
    914                 *pu32DevCap |= SVGA3D_DXFMT_MULTISAMPLE;
     913            if (pState->pBackend->dxDevice.MultisampleCountMask != 0)
     914            {
     915                UINT NumQualityLevels;
     916                hr = pDevice->CheckMultisampleQualityLevels(dxgiFormat, 2, &NumQualityLevels);
     917                if (SUCCEEDED(hr) && NumQualityLevels != 0)
     918                    *pu32DevCap |= SVGA3D_DXFMT_MULTISAMPLE;
     919            }
    915920        }
    916921        else
     
    13571362        rc = VERR_NOT_SUPPORTED;
    13581363
     1364    if (SUCCEEDED(hr))
     1365    {
     1366        /* Query multisample support for a common format. */
     1367        DXGI_FORMAT const dxgiFormat = DXGI_FORMAT_B8G8R8A8_UNORM;
     1368
     1369        for (uint32_t i = 2; i <= D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT; i *= 2)
     1370        {
     1371            UINT NumQualityLevels = 0;
     1372            HRESULT hr2 = pDXDevice->pDevice->CheckMultisampleQualityLevels(dxgiFormat, i, &NumQualityLevels);
     1373            if (SUCCEEDED(hr2) && NumQualityLevels > 0)
     1374                pDXDevice->MultisampleCountMask |= UINT32_C(1) << (i - 1);
     1375        }
     1376    }
    13591377    return rc;
    13601378}
     
    20262044            if (pSurface->surfaceDesc.numArrayElements <= 1)
    20272045            {
    2028                 desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
     2046                desc.ViewDimension = pSurface->surfaceDesc.multisampleCount > 1
     2047                                   ? D3D11_RTV_DIMENSION_TEXTURE2DMS
     2048                                   : D3D11_RTV_DIMENSION_TEXTURE2D;
    20292049                desc.Texture2D.MipSlice = pEntry->desc.tex.mipSlice;
    20302050            }
    20312051            else
    20322052            {
    2033                 desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
     2053                desc.ViewDimension = pSurface->surfaceDesc.multisampleCount > 1
     2054                                   ? D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY
     2055                                   : D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
    20342056                desc.Texture2DArray.MipSlice = pEntry->desc.tex.mipSlice;
    20352057                desc.Texture2DArray.FirstArraySlice = pEntry->desc.tex.firstArraySlice;
     
    21022124            if (pSurface->surfaceDesc.numArrayElements <= 1)
    21032125            {
    2104                 desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
     2126                desc.ViewDimension = pSurface->surfaceDesc.multisampleCount > 1
     2127                                   ? D3D11_SRV_DIMENSION_TEXTURE2DMS
     2128                                   : D3D11_SRV_DIMENSION_TEXTURE2D;
    21052129                desc.Texture2D.MostDetailedMip = pEntry->desc.tex.mostDetailedMip;
    21062130                desc.Texture2D.MipLevels = pEntry->desc.tex.mipLevels;
     
    21082132            else
    21092133            {
    2110                 desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
     2134                desc.ViewDimension = pSurface->surfaceDesc.multisampleCount > 1
     2135                                   ? D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY
     2136                                   : D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
    21112137                desc.Texture2DArray.MostDetailedMip = pEntry->desc.tex.mostDetailedMip;
    21122138                desc.Texture2DArray.MipLevels = pEntry->desc.tex.mipLevels;
     
    22452271            if (pSurface->surfaceDesc.numArrayElements <= 1)
    22462272            {
    2247                 desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
     2273                desc.ViewDimension = pSurface->surfaceDesc.multisampleCount > 1
     2274                                   ? D3D11_DSV_DIMENSION_TEXTURE2DMS
     2275                                   : D3D11_DSV_DIMENSION_TEXTURE2D;
    22482276                desc.Texture2D.MipSlice = pEntry->mipSlice;
    22492277            }
    22502278            else
    22512279            {
    2252                 desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY;
     2280                desc.ViewDimension = pSurface->surfaceDesc.multisampleCount > 1
     2281                                   ? D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY
     2282                                   : D3D11_DSV_DIMENSION_TEXTURE2DARRAY;
    22532283                desc.Texture2DArray.MipSlice = pEntry->mipSlice;
    22542284                desc.Texture2DArray.FirstArraySlice = pEntry->firstArraySlice;
     
    27022732     */
    27032733    D3D11_SUBRESOURCE_DATA *paInitialData = NULL;
    2704     if (pSurface->paMipmapLevels[0].pSurfaceData)
     2734    if (pSurface->paMipmapLevels[0].pSurfaceData && pSurface->surfaceDesc.multisampleCount <= 1)
    27052735    {
    27062736        /* Can happen for a non GBO surface or if GBO texture was updated prior to creation of the hardware resource. */
     
    29122942            td.ArraySize          = pSurface->surfaceDesc.numArrayElements;
    29132943            td.Format             = dxgiFormat;
    2914             td.SampleDesc.Count   = 1;
     2944            td.SampleDesc.Count   = pSurface->surfaceDesc.multisampleCount;
    29152945            td.SampleDesc.Quality = 0;
    29162946            td.Usage              = D3D11_USAGE_DEFAULT;
     
    29302960                td.MipLevels      = 1; /* Must be for D3D11_USAGE_DYNAMIC. */
    29312961                td.ArraySize      = 1; /* Must be for D3D11_USAGE_DYNAMIC. */
     2962                td.SampleDesc.Count   = 1;
     2963                td.SampleDesc.Quality = 0;
    29322964                td.Usage          = D3D11_USAGE_DYNAMIC;
    29332965                td.BindFlags      = D3D11_BIND_SHADER_RESOURCE; /* Have to specify a supported flag, otherwise E_INVALIDARG will be returned. */
     
    34833515    LogRelMax(1, ("VMSVGA: Single DX device mode: %s\n", pBackend->fSingleDevice ? "enabled" : "disabled"));
    34843516
    3485     vmsvga3dDXInitContextMobData(&pBackend->svgaDXContext); /** @todo */
     3517    vmsvga3dDXInitContextMobData(&pBackend->svgaDXContext);
    34863518//DEBUG_BREAKPOINT_TEST();
    34873519    return rc;
     
    35243556        if (pBackend->dxDevice.pVideoDevice)
    35253557            dxLogRelVideoCaps(pBackend->dxDevice.pVideoDevice);
     3558
     3559        if (!pThis->svga.fVMSVGA3dMSAA)
     3560            pBackend->dxDevice.MultisampleCountMask = 0;
    35263561    }
    35273562    return rc;
     
    47694804
    47704805    case SVGA3D_DEVCAP_MULTISAMPLE_2X:
    4771         *pu32Val = 0; /* boolean */
     4806        *pu32Val = RT_BOOL(pState->pBackend->dxDevice.MultisampleCountMask & (1 << (2 - 1))); /* boolean */
    47724807        break;
    47734808
    47744809    case SVGA3D_DEVCAP_MULTISAMPLE_4X:
    4775         *pu32Val = 0; /* boolean */
     4810        *pu32Val = RT_BOOL(pState->pBackend->dxDevice.MultisampleCountMask & (1 << (4 - 1))); /* boolean */
    47764811        break;
    47774812
     
    48004835
    48014836    case SVGA3D_DEVCAP_MULTISAMPLE_8X:
    4802         *pu32Val = 0; /* boolean */
     4837        *pu32Val = RT_BOOL(pState->pBackend->dxDevice.MultisampleCountMask & (1 << (8 - 1))); /* boolean */
    48034838        break;
    48044839
     
    71317166                                case SVGA3D_RESOURCE_TEXTURE2D:
    71327167                                    if (pSurface->surfaceDesc.numArrayElements <= 1)
    7133                                         aResourceDimension[idxSR] = VGPU10_RESOURCE_DIMENSION_TEXTURE2D;
     7168                                        aResourceDimension[idxSR] = pSurface->surfaceDesc.multisampleCount > 1
     7169                                                                  ? VGPU10_RESOURCE_DIMENSION_TEXTURE2DMS
     7170                                                                  : VGPU10_RESOURCE_DIMENSION_TEXTURE2D;
    71347171                                    else
    7135                                         aResourceDimension[idxSR] = VGPU10_RESOURCE_DIMENSION_TEXTURE2DARRAY;
     7172                                        aResourceDimension[idxSR] = pSurface->surfaceDesc.multisampleCount > 1
     7173                                                                  ? VGPU10_RESOURCE_DIMENSION_TEXTURE2DMSARRAY
     7174                                                                  : VGPU10_RESOURCE_DIMENSION_TEXTURE2DARRAY;
    71367175                                    break;
    71377176                                case SVGA3D_RESOURCE_TEXTURE3D:
     
    87698808    }
    87708809
     8810#ifdef DEBUG_sunlover
     8811    if (pSrcSurface->surfaceDesc.multisampleCount > 1 || pDstSurface->surfaceDesc.multisampleCount > 1)
     8812        DEBUG_BREAKPOINT_TEST();
     8813#endif
     8814
    87718815    LogFunc(("cid %d: src cid %d%s -> dst cid %d%s\n",
    87728816             pDXContext->cid, pSrcSurface->idAssociatedContext,
     
    98589902
    98599903
    9860 static DECLCALLBACK(int) vmsvga3dBackDXResolveCopy(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext)
    9861 {
    9862     PVMSVGA3DBACKEND pBackend = pThisCC->svga.p3dState->pBackend;
    9863 
    9864     RT_NOREF(pBackend, pDXContext);
    9865     AssertFailed(); /** @todo Implement */
    9866     return VERR_NOT_IMPLEMENTED;
     9904static DECLCALLBACK(int) vmsvga3dBackDXResolveCopy(PVGASTATECC pThisCC, PVMSVGA3DDXCONTEXT pDXContext,
     9905                                                   SVGA3dSurfaceId dstSid, uint32_t dstSubResource,
     9906                                                   SVGA3dSurfaceId srcSid, uint32_t srcSubResource, SVGA3dSurfaceFormat copyFormat)
     9907{
     9908    DXDEVICE *pDXDevice = dxDeviceFromContext(pThisCC->svga.p3dState, pDXContext);
     9909    AssertReturn(pDXDevice->pDevice, VERR_INVALID_STATE);
     9910
     9911    PVMSVGA3DSURFACE pSrcSurface;
     9912    ID3D11Resource *pSrcResource;
     9913    int rc = dxEnsureResource(pThisCC, pDXContext, srcSid, &pSrcSurface, &pSrcResource);
     9914    AssertRCReturn(rc, rc);
     9915
     9916    PVMSVGA3DSURFACE pDstSurface;
     9917    ID3D11Resource *pDstResource;
     9918    rc = dxEnsureResource(pThisCC, pDXContext, dstSid, &pDstSurface, &pDstResource);
     9919    AssertRCReturn(rc, rc);
     9920
     9921    LogFunc(("cid %d: src sid = %u -> dst sid = %u\n", pDXContext->cid, srcSid, dstSid));
     9922
     9923    DXGI_FORMAT const dxgiFormat = vmsvgaDXSurfaceFormat2Dxgi(copyFormat);
     9924    pDXDevice->pImmediateContext->ResolveSubresource(pDstResource, dstSubResource, pSrcResource, srcSubResource, dxgiFormat);
     9925
     9926    pDstSurface->pBackendSurface->cidDrawing = pDXContext->cid;
     9927    return VINF_SUCCESS;
    98679928}
    98689929
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