VirtualBox

Changeset 102809 in vbox


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

WDDM: multisampling

Location:
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/dx
Files:
5 edited

Legend:

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

    r102639 r102809  
    589589                                                      pResource->AllocationDesc.surfaceInfo.numMipLevels,
    590590                                                      pResource->AllocationDesc.surfaceInfo.arraySize,
    591                                                       1);
     591                                                      pResource->AllocationDesc.surfaceInfo.multisampleCount);
    592592}
    593593
     
    662662        f |= SVGA3D_SURFACE_RESOURCE_CLAMP;
    663663
    664     /** @todo SVGA3D_SURFACE_MULTISAMPLE */
    665     Assert(pCreateResource->SampleDesc.Count <= 1);
     664    if (pCreateResource->SampleDesc.Count > 1)
     665        f |= SVGA3D_SURFACE_MULTISAMPLE;
    666666
    667667    return f;
     
    704704    pDesc->surfaceInfo.format             = vboxDXDxgiToSvgaFormat(pCreateResource->Format);
    705705    pDesc->surfaceInfo.numMipLevels       = pCreateResource->MipLevels;
    706     pDesc->surfaceInfo.multisampleCount   = 0;
    707     pDesc->surfaceInfo.multisamplePattern = SVGA3D_MS_PATTERN_NONE;
    708     pDesc->surfaceInfo.qualityLevel       = SVGA3D_MS_QUALITY_NONE;
     706    pDesc->surfaceInfo.multisampleCount   = pCreateResource->SampleDesc.Count;
     707    if (pDesc->surfaceInfo.multisampleCount > 1)
     708    {
     709        pDesc->surfaceInfo.multisamplePattern = SVGA3D_MS_PATTERN_STANDARD;
     710        pDesc->surfaceInfo.qualityLevel       = SVGA3D_MS_QUALITY_FULL;
     711    }
     712    else
     713    {
     714        pDesc->surfaceInfo.multisamplePattern = SVGA3D_MS_PATTERN_NONE;
     715        pDesc->surfaceInfo.qualityLevel       = SVGA3D_MS_QUALITY_NONE;
     716    }
    709717    pDesc->surfaceInfo.autogenFilter      = SVGA3D_TEX_FILTER_NONE;
    710718    pDesc->surfaceInfo.size.width         = pCreateResource->pMipInfoList[0].TexelWidth;
     
    31123120
    31133121
     3122void vboxDXResourceResolveSubresource(PVBOXDX_DEVICE pDevice, PVBOXDX_RESOURCE pDstResource, UINT DstSubresource,
     3123                                      PVBOXDX_RESOURCE pSrcResource, UINT SrcSubresource, DXGI_FORMAT ResolveFormat)
     3124{
     3125    SVGA3dSurfaceFormat const copyFormat = vboxDXDxgiToSvgaFormat(ResolveFormat);
     3126    vgpu10ResolveCopy(pDevice, vboxDXGetAllocation(pDstResource), DstSubresource,
     3127                      vboxDXGetAllocation(pSrcResource), SrcSubresource, copyFormat);
     3128}
     3129
    31143130static void vboxDXUndefineResourceViews(PVBOXDX_DEVICE pDevice, PVBOXDX_RESOURCE pResource)
    31153131{
     
    36483664{
    36493665    AssertReturn(Rotate == DXGI_DDI_MODE_ROTATION_IDENTITY, DXGI_ERROR_INVALID_CALL);
    3650     AssertReturn(Flags.Resolve == 0, DXGI_ERROR_INVALID_CALL);
     3666    AssertReturn(Flags.Resolve == 0, DXGI_ERROR_INVALID_CALL); /** @todo Multisampled resources. */
    36513667
    36523668    SVGA3dBox boxSrc;
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/dx/VBoxDX.h

    r102631 r102809  
    724724                              const D3D10_DDI_BOX *pSrcBox, UINT CopyFlags);
    725725void vboxDXResourceCopy(PVBOXDX_DEVICE pDevice, PVBOXDX_RESOURCE pDstResource, PVBOXDX_RESOURCE pSrcResource);
     726void vboxDXResourceResolveSubresource(PVBOXDX_DEVICE pDevice, PVBOXDX_RESOURCE pDstResource, UINT DstSubresource,
     727                                      PVBOXDX_RESOURCE pSrcResource, UINT SrcSubresource, DXGI_FORMAT ResolveFormat);
    726728void vboxDXCreateUnorderedAccessView(PVBOXDX_DEVICE pDevice, PVBOXDXUNORDEREDACCESSVIEW pUnorderedAccessView);
    727729void vboxDXDestroyUnorderedAccessView(PVBOXDX_DEVICE pDevice, PVBOXDXUNORDEREDACCESSVIEW pUnorderedAccessView);
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/dx/VBoxDXCmd.cpp

    r102631 r102809  
    12591259
    12601260
     1261int vgpu10ResolveCopy(PVBOXDX_DEVICE pDevice,
     1262                      D3DKMT_HANDLE hDstAllocation,
     1263                      uint32 dstSubResource,
     1264                      D3DKMT_HANDLE hSrcAllocation,
     1265                      uint32 srcSubResource,
     1266                      SVGA3dSurfaceFormat copyFormat)
     1267{
     1268    void *pvCmd = vboxDXCommandBufferReserve(pDevice, SVGA_3D_CMD_DX_RESOLVE_COPY,
     1269                                             sizeof(SVGA3dCmdDXResolveCopy), 2);
     1270    if (!pvCmd)
     1271        return VERR_NO_MEMORY;
     1272
     1273    SVGA3dCmdDXResolveCopy *cmd = (SVGA3dCmdDXResolveCopy *)pvCmd;
     1274    cmd->dstSid = SVGA3D_INVALID_ID;
     1275    SET_CMD_FIELD(dstSubResource);
     1276    cmd->srcSid = SVGA3D_INVALID_ID;
     1277    SET_CMD_FIELD(srcSubResource);
     1278    SET_CMD_FIELD(copyFormat);
     1279
     1280    vboxDXStorePatchLocation(pDevice, &cmd->dstSid, VBOXDXALLOCATIONTYPE_SURFACE,
     1281                             hDstAllocation, 0, true);
     1282    vboxDXStorePatchLocation(pDevice, &cmd->srcSid, VBOXDXALLOCATIONTYPE_SURFACE,
     1283                             hSrcAllocation, 0, false);
     1284
     1285    vboxDXCommandBufferCommit(pDevice);
     1286    return VINF_SUCCESS;
     1287}
     1288
     1289
    12611290int vgpu10MobFence64(PVBOXDX_DEVICE pDevice,
    12621291                     uint64 value,
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/dx/VBoxDXCmd.h

    r102631 r102809  
    262262                       D3DKMT_HANDLE hDstAllocation,
    263263                       D3DKMT_HANDLE hSrcAllocation);
     264int vgpu10ResolveCopy(PVBOXDX_DEVICE pDevice,
     265                      D3DKMT_HANDLE hDstAllocation,
     266                      uint32 dstSubResource,
     267                      D3DKMT_HANDLE hSrcAllocation,
     268                      uint32 srcSubResource,
     269                      SVGA3dSurfaceFormat copyFormat);
    264270int vgpu10MobFence64(PVBOXDX_DEVICE pDevice,
    265271                     uint64 value,
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/dx/VBoxDXDDI.cpp

    r102631 r102809  
    11271127}
    11281128
    1129 void APIENTRY vboxDXResourceResolveSubresource(
     1129static void APIENTRY ddi10ResourceResolveSubresource(
    11301130    D3D10DDI_HDEVICE hDevice,
    11311131    D3D10DDI_HRESOURCE hDstResource, // A handle to the destination resource to resolve to. This resource must have been created as D3D10_USAGE_DEFAULT and single sampled.
     
    11361136)
    11371137{
    1138     DEBUG_BREAKPOINT_TEST();
    1139     RT_NOREF(hDevice, hDstResource, DstSubresource, hSrcResource, SrcSubresource, ResolveFormat);
    1140     LogFlowFuncEnter();
     1138    //DEBUG_BREAKPOINT_TEST();
     1139    PVBOXDX_DEVICE pDevice = (PVBOXDX_DEVICE)hDevice.pDrvPrivate;
     1140    PVBOXDX_RESOURCE pDstResource = (PVBOXDX_RESOURCE)hDstResource.pDrvPrivate;
     1141    PVBOXDX_RESOURCE pSrcResource = (PVBOXDX_RESOURCE)hSrcResource.pDrvPrivate;
     1142    LogFlowFunc(("pDevice 0x%p, pDstResource 0x%p, pSrcResource 0x%p",
     1143                 pDevice, pDstResource, pSrcResource));
     1144
     1145    vboxDXResourceResolveSubresource(pDevice, pDstResource, DstSubresource,
     1146                                     pSrcResource, SrcSubresource, ResolveFormat);
    11411147}
    11421148
     
    18401846    PVBOXDX_DEVICE pDevice = (PVBOXDX_DEVICE)hDevice.pDrvPrivate;
    18411847    PVBOXDX_BLENDSTATE pBlendState = (PVBOXDX_BLENDSTATE)hBlendState.pDrvPrivate;
    1842     LogFlowFunc(("pDevice 0x%p, pBlendState 0x%p, RT[0] BlendEnable %d", pDevice, pBlendState, pBlendDesc->RenderTarget[0].BlendEnable));
     1848    LogFlowFunc(("pDevice 0x%p, pBlendState 0x%p, RT[0] BlendEnable %d\n", pDevice, pBlendState, pBlendDesc->RenderTarget[0].BlendEnable));
    18431849
    18441850    /* Init the blend state and allocate blend id. */
     
    18591865    PVBOXDX_DEVICE pDevice = (PVBOXDX_DEVICE)hDevice.pDrvPrivate;
    18601866    PVBOXDX_BLENDSTATE pBlendState = (PVBOXDX_BLENDSTATE)hBlendState.pDrvPrivate;
    1861     LogFlowFunc(("pDevice 0x%p, pBlendState 0x%p, RT[0] BlendEnable %d", pDevice, pBlendState, pBlendDesc->RenderTarget[0].BlendEnable));
     1867    LogFlowFunc(("pDevice 0x%p, pBlendState 0x%p, RT[0] BlendEnable %d\n", pDevice, pBlendState, pBlendDesc->RenderTarget[0].BlendEnable));
    18621868
    18631869    /* Init the blend state and allocate blend id. */
     
    27712777            if (u32Cap & SVGA3D_DXFMT_ARRAY)
    27722778            if (u32Cap & SVGA3D_DXFMT_VOLUME)*/
     2779
     2780            if (u32Cap & SVGA3D_DXFMT_MULTISAMPLE)
     2781                *pFormatCaps |= D3D10_DDI_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET;
    27732782        }
    27742783    } else {
     
    27862795    //DEBUG_BREAKPOINT_TEST();
    27872796    PVBOXDX_DEVICE pDevice = (PVBOXDX_DEVICE)hDevice.pDrvPrivate;
    2788     RT_NOREF(pDevice, Format, SampleCount, pNumQualityLevels);
    2789  //   LogFlowFunc(("pDevice 0x%p, Format %d, SampleCount %d", pDevice, Format, SampleCount));
     2797    //LogFlowFunc(("pDevice 0x%p, Format %d, SampleCount %d", pDevice, Format, SampleCount));
    27902798
    27912799    if (SampleCount == 1)
    27922800        *pNumQualityLevels = 1;
    27932801    else
     2802    {
    27942803        *pNumQualityLevels = 0;
     2804
     2805        SVGA3dDevCapIndex const idxDevCap = vboxDXGIFormat2CapIdx(Format);
     2806        if (idxDevCap != SVGA3D_DEVCAP_INVALID)
     2807        {
     2808            PVBOXDXADAPTER pVBoxAdapter = pDevice->pAdapter;
     2809            uint32_t const *au32Caps = pVBoxAdapter->AdapterInfo.u.vmsvga.HWInfo.u.svga.au32Caps;
     2810            uint32_t const u32Cap = au32Caps[idxDevCap];
     2811            if (u32Cap & SVGA3D_DXFMT_MULTISAMPLE)
     2812            {
     2813                bool fSampleCountSupported = false;
     2814                if (SampleCount == 2)
     2815                   fSampleCountSupported = RT_BOOL(au32Caps[SVGA3D_DEVCAP_MULTISAMPLE_2X]);
     2816                else if (SampleCount == 4)
     2817                   fSampleCountSupported = RT_BOOL(au32Caps[SVGA3D_DEVCAP_MULTISAMPLE_4X]);
     2818                else if (SampleCount == 8)
     2819                   fSampleCountSupported = RT_BOOL(au32Caps[SVGA3D_DEVCAP_MULTISAMPLE_8X]);
     2820                *pNumQualityLevels = fSampleCountSupported ? 1 : 0;
     2821            }
     2822        }
     2823    }
    27952824}
    27962825
     
    41294158        p11_1DeviceFuncs->pfnGenMips                                   = ddi10GenMips;
    41304159        p11_1DeviceFuncs->pfnResourceCopy                              = ddi10ResourceCopy;
    4131         p11_1DeviceFuncs->pfnResourceResolveSubresource                = vboxDXResourceResolveSubresource;
     4160        p11_1DeviceFuncs->pfnResourceResolveSubresource                = ddi10ResourceResolveSubresource;
    41324161
    41334162        /* Infrequent paths. */
     
    43064335        p11DeviceFuncs->pfnGenMips                                   = ddi10GenMips;
    43074336        p11DeviceFuncs->pfnResourceCopy                              = ddi10ResourceCopy;
    4308         p11DeviceFuncs->pfnResourceResolveSubresource                = vboxDXResourceResolveSubresource;
     4337        p11DeviceFuncs->pfnResourceResolveSubresource                = ddi10ResourceResolveSubresource;
    43094338
    43104339        /* Infrequent paths. */
     
    44764505        p10_1DeviceFuncs->pfnGenMips                                   = ddi10GenMips;
    44774506        p10_1DeviceFuncs->pfnResourceCopy                              = ddi10ResourceCopy;
    4478         p10_1DeviceFuncs->pfnResourceResolveSubresource                = vboxDXResourceResolveSubresource;
     4507        p10_1DeviceFuncs->pfnResourceResolveSubresource                = ddi10ResourceResolveSubresource;
    44794508
    44804509        /* Infrequent paths. */
     
    45974626        p10DeviceFuncs->pfnGenMips                                   = ddi10GenMips;
    45984627        p10DeviceFuncs->pfnResourceCopy                              = ddi10ResourceCopy;
    4599         p10DeviceFuncs->pfnResourceResolveSubresource                = vboxDXResourceResolveSubresource;
     4628        p10DeviceFuncs->pfnResourceResolveSubresource                = ddi10ResourceResolveSubresource;
    46004629
    46014630        /* Infrequent paths. */
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