Changeset 102808 in vbox for trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx-dx11.cpp
- Timestamp:
- Jan 10, 2024 8:16:30 AM (13 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx-dx11.cpp
r102715 r102808 106 106 IDXGIFactory *pDxgiFactory; /* DXGI Factory. */ 107 107 D3D_FEATURE_LEVEL FeatureLevel; 108 109 uint32_t MultisampleCountMask; /* 1 << (MSCount - 1) for MSCount = 2, 4, 8, 16, 32 */ 108 110 109 111 ID3D11VideoDevice *pVideoDevice; … … 909 911 *pu32DevCap |= SVGA3D_DXFMT_DX_VERTEX_BUFFER; 910 912 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 } 915 920 } 916 921 else … … 1357 1362 rc = VERR_NOT_SUPPORTED; 1358 1363 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 } 1359 1377 return rc; 1360 1378 } … … 2026 2044 if (pSurface->surfaceDesc.numArrayElements <= 1) 2027 2045 { 2028 desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; 2046 desc.ViewDimension = pSurface->surfaceDesc.multisampleCount > 1 2047 ? D3D11_RTV_DIMENSION_TEXTURE2DMS 2048 : D3D11_RTV_DIMENSION_TEXTURE2D; 2029 2049 desc.Texture2D.MipSlice = pEntry->desc.tex.mipSlice; 2030 2050 } 2031 2051 else 2032 2052 { 2033 desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; 2053 desc.ViewDimension = pSurface->surfaceDesc.multisampleCount > 1 2054 ? D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY 2055 : D3D11_RTV_DIMENSION_TEXTURE2DARRAY; 2034 2056 desc.Texture2DArray.MipSlice = pEntry->desc.tex.mipSlice; 2035 2057 desc.Texture2DArray.FirstArraySlice = pEntry->desc.tex.firstArraySlice; … … 2102 2124 if (pSurface->surfaceDesc.numArrayElements <= 1) 2103 2125 { 2104 desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; 2126 desc.ViewDimension = pSurface->surfaceDesc.multisampleCount > 1 2127 ? D3D11_SRV_DIMENSION_TEXTURE2DMS 2128 : D3D11_SRV_DIMENSION_TEXTURE2D; 2105 2129 desc.Texture2D.MostDetailedMip = pEntry->desc.tex.mostDetailedMip; 2106 2130 desc.Texture2D.MipLevels = pEntry->desc.tex.mipLevels; … … 2108 2132 else 2109 2133 { 2110 desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY; 2134 desc.ViewDimension = pSurface->surfaceDesc.multisampleCount > 1 2135 ? D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY 2136 : D3D11_SRV_DIMENSION_TEXTURE2DARRAY; 2111 2137 desc.Texture2DArray.MostDetailedMip = pEntry->desc.tex.mostDetailedMip; 2112 2138 desc.Texture2DArray.MipLevels = pEntry->desc.tex.mipLevels; … … 2245 2271 if (pSurface->surfaceDesc.numArrayElements <= 1) 2246 2272 { 2247 desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; 2273 desc.ViewDimension = pSurface->surfaceDesc.multisampleCount > 1 2274 ? D3D11_DSV_DIMENSION_TEXTURE2DMS 2275 : D3D11_DSV_DIMENSION_TEXTURE2D; 2248 2276 desc.Texture2D.MipSlice = pEntry->mipSlice; 2249 2277 } 2250 2278 else 2251 2279 { 2252 desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY; 2280 desc.ViewDimension = pSurface->surfaceDesc.multisampleCount > 1 2281 ? D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY 2282 : D3D11_DSV_DIMENSION_TEXTURE2DARRAY; 2253 2283 desc.Texture2DArray.MipSlice = pEntry->mipSlice; 2254 2284 desc.Texture2DArray.FirstArraySlice = pEntry->firstArraySlice; … … 2702 2732 */ 2703 2733 D3D11_SUBRESOURCE_DATA *paInitialData = NULL; 2704 if (pSurface->paMipmapLevels[0].pSurfaceData )2734 if (pSurface->paMipmapLevels[0].pSurfaceData && pSurface->surfaceDesc.multisampleCount <= 1) 2705 2735 { 2706 2736 /* Can happen for a non GBO surface or if GBO texture was updated prior to creation of the hardware resource. */ … … 2912 2942 td.ArraySize = pSurface->surfaceDesc.numArrayElements; 2913 2943 td.Format = dxgiFormat; 2914 td.SampleDesc.Count = 1;2944 td.SampleDesc.Count = pSurface->surfaceDesc.multisampleCount; 2915 2945 td.SampleDesc.Quality = 0; 2916 2946 td.Usage = D3D11_USAGE_DEFAULT; … … 2930 2960 td.MipLevels = 1; /* Must be for D3D11_USAGE_DYNAMIC. */ 2931 2961 td.ArraySize = 1; /* Must be for D3D11_USAGE_DYNAMIC. */ 2962 td.SampleDesc.Count = 1; 2963 td.SampleDesc.Quality = 0; 2932 2964 td.Usage = D3D11_USAGE_DYNAMIC; 2933 2965 td.BindFlags = D3D11_BIND_SHADER_RESOURCE; /* Have to specify a supported flag, otherwise E_INVALIDARG will be returned. */ … … 3483 3515 LogRelMax(1, ("VMSVGA: Single DX device mode: %s\n", pBackend->fSingleDevice ? "enabled" : "disabled")); 3484 3516 3485 vmsvga3dDXInitContextMobData(&pBackend->svgaDXContext); /** @todo */3517 vmsvga3dDXInitContextMobData(&pBackend->svgaDXContext); 3486 3518 //DEBUG_BREAKPOINT_TEST(); 3487 3519 return rc; … … 3524 3556 if (pBackend->dxDevice.pVideoDevice) 3525 3557 dxLogRelVideoCaps(pBackend->dxDevice.pVideoDevice); 3558 3559 if (!pThis->svga.fVMSVGA3dMSAA) 3560 pBackend->dxDevice.MultisampleCountMask = 0; 3526 3561 } 3527 3562 return rc; … … 4769 4804 4770 4805 case SVGA3D_DEVCAP_MULTISAMPLE_2X: 4771 *pu32Val = 0; /* boolean */4806 *pu32Val = RT_BOOL(pState->pBackend->dxDevice.MultisampleCountMask & (1 << (2 - 1))); /* boolean */ 4772 4807 break; 4773 4808 4774 4809 case SVGA3D_DEVCAP_MULTISAMPLE_4X: 4775 *pu32Val = 0; /* boolean */4810 *pu32Val = RT_BOOL(pState->pBackend->dxDevice.MultisampleCountMask & (1 << (4 - 1))); /* boolean */ 4776 4811 break; 4777 4812 … … 4800 4835 4801 4836 case SVGA3D_DEVCAP_MULTISAMPLE_8X: 4802 *pu32Val = 0; /* boolean */4837 *pu32Val = RT_BOOL(pState->pBackend->dxDevice.MultisampleCountMask & (1 << (8 - 1))); /* boolean */ 4803 4838 break; 4804 4839 … … 7131 7166 case SVGA3D_RESOURCE_TEXTURE2D: 7132 7167 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; 7134 7171 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; 7136 7175 break; 7137 7176 case SVGA3D_RESOURCE_TEXTURE3D: … … 8769 8808 } 8770 8809 8810 #ifdef DEBUG_sunlover 8811 if (pSrcSurface->surfaceDesc.multisampleCount > 1 || pDstSurface->surfaceDesc.multisampleCount > 1) 8812 DEBUG_BREAKPOINT_TEST(); 8813 #endif 8814 8771 8815 LogFunc(("cid %d: src cid %d%s -> dst cid %d%s\n", 8772 8816 pDXContext->cid, pSrcSurface->idAssociatedContext, … … 9858 9902 9859 9903 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; 9904 static 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; 9867 9928 } 9868 9929
Note:
See TracChangeset
for help on using the changeset viewer.