- Timestamp:
- Jun 7, 2010 6:46:35 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp
r30058 r30084 619 619 }, 620 620 }; 621 622 static D3DDDIQUERYTYPE gVBoxQueryTypes[] = { 623 D3DDDIQUERYTYPE_EVENT, 624 D3DDDIQUERYTYPE_OCCLUSION 625 }; 626 627 #define VBOX_QUERYTYPE_COUNT() RT_ELEMENTS(gVBoxQueryTypes) 621 628 622 629 #ifdef VBOX_WITH_VIDEOHWACCEL … … 992 999 case D3DDDICAPS_DDRAW: 993 1000 { 994 Assert(pData->DataSize >= sizeof (DDRAW_CAPS)); 1001 Assert(!VBOXDISPMODE_IS_3D(pAdapter)); 1002 Assert(pData->DataSize == sizeof (DDRAW_CAPS)); 995 1003 if (pData->DataSize >= sizeof (DDRAW_CAPS)) 996 1004 { … … 1013 1021 case D3DDDICAPS_DDRAW_MODE_SPECIFIC: 1014 1022 { 1015 Assert(pData->DataSize >= sizeof (DDRAW_MODE_SPECIFIC_CAPS)); 1023 Assert(!VBOXDISPMODE_IS_3D(pAdapter)); 1024 Assert(pData->DataSize == sizeof (DDRAW_MODE_SPECIFIC_CAPS)); 1016 1025 if (pData->DataSize >= sizeof (DDRAW_MODE_SPECIFIC_CAPS)) 1017 1026 { … … 1062 1071 break; 1063 1072 case D3DDDICAPS_GETFORMATDATA: 1064 Assert(pData->DataSize >= pAdapter->cFormstOps * sizeof (FORMATOP));1073 Assert(pData->DataSize == pAdapter->cFormstOps * sizeof (FORMATOP)); 1065 1074 memcpy(pData->pData, pAdapter->paFormstOps, pAdapter->cFormstOps * sizeof (FORMATOP)); 1066 1075 break; 1067 1076 case D3DDDICAPS_GETD3DQUERYCOUNT: 1068 *((uint32_t*)pData->pData) = 0;//VBOX_QUERYTYPE_COUNT(); 1077 #if 0 1078 *((uint32_t*)pData->pData) = VBOX_QUERYTYPE_COUNT(); 1079 #else 1080 *((uint32_t*)pData->pData) = 0; 1081 #endif 1069 1082 break; 1070 1083 case D3DDDICAPS_GETD3DQUERYDATA: 1084 #if 0 1085 Assert(pData->DataSize == VBOX_QUERYTYPE_COUNT() * sizeof (D3DDDIQUERYTYPE)); 1086 memcpy(pData->pData, gVBoxQueryTypes, VBOX_QUERYTYPE_COUNT() * sizeof (D3DDDIQUERYTYPE)); 1087 #else 1071 1088 AssertBreakpoint(); 1072 1089 memset(pData->pData, 0, pData->DataSize); 1073 // Assert(pData->DataSize >= VBOX_QUERYTYPE_COUNT() * sizeof (D3DDDIQUERYTYPE)); 1074 // memcpy(pData->pData, gVBoxQueryTypes, VBOX_QUERYTYPE_COUNT() * sizeof (D3DDDIQUERYTYPE)); 1090 #endif 1075 1091 break; 1076 1092 case D3DDDICAPS_GETD3D3CAPS: 1093 Assert(!VBOXDISPMODE_IS_3D(pAdapter)); 1077 1094 Assert(pData->DataSize >= sizeof (D3DHAL_GLOBALDRIVERDATA)); 1078 1095 if (pData->DataSize >= sizeof (D3DHAL_GLOBALDRIVERDATA)) … … 1146 1163 break; 1147 1164 case D3DDDICAPS_GETD3D7CAPS: 1165 Assert(!VBOXDISPMODE_IS_3D(pAdapter)); 1148 1166 Assert(pData->DataSize >= sizeof (D3DHAL_D3DEXTENDEDCAPS)); 1149 1167 if (pData->DataSize >= sizeof (D3DHAL_D3DEXTENDEDCAPS)) … … 1158 1176 if (pData->DataSize >= sizeof (D3DCAPS9)) 1159 1177 { 1178 Assert(VBOXDISPMODE_IS_3D(pAdapter)); 1160 1179 if (VBOXDISPMODE_IS_3D(pAdapter)) 1161 1180 { … … 1569 1588 { 1570 1589 vboxVDbgPrintF(("==> "__FUNCTION__", hDevice(0x%p)\n", hDevice)); 1571 AssertBreakpoint();1572 1590 PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice; 1573 1591 PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hResource; … … 1576 1594 return E_INVALIDARG; 1577 1595 1578 PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->SubResourceIndex]; 1579 D3DDDICB_LOCK LockData; 1580 LockData.hAllocation = pAlloc->hAllocation; 1581 LockData.PrivateDriverData = 0; 1582 LockData.NumPages = 0; 1583 LockData.pPages = NULL; 1584 LockData.pData = NULL; /* out */ 1585 LockData.Flags.Value = 0; 1586 LockData.Flags.Discard = pData->Flags.Discard; 1587 LockData.Flags.DonotWait = pData->Flags.DoNotWait; 1588 1589 1590 HRESULT hr = pDevice->RtCallbacks.pfnLockCb(hDevice, &LockData); 1591 Assert(hr == S_OK || (hr == D3DERR_WASSTILLDRAWING && pData->Flags.DoNotWait)); 1592 if (hr == S_OK) 1596 HRESULT hr = S_OK; 1597 1598 if (VBOXDISPMODE_IS_3D(pDevice->pAdapter)) 1593 1599 { 1594 uintptr_t offset; 1595 if (pData->Flags.AreaValid) 1600 if (pRc->RcDesc.fFlags.Texture) 1596 1601 { 1597 offset = pAlloc->SurfDesc.pitch * pData->Area.top + 1598 ((pAlloc->SurfDesc.bpp * pData->Area.left) >> 3); 1599 } 1600 else if (pData->Flags.RangeValid) 1601 { 1602 offset = pData->Range.Offset; 1603 } 1604 else if (pData->Flags.BoxValid) 1605 { 1606 vboxVDbgPrintF((__FUNCTION__": Implement Box area")); 1607 AssertBreakpoint(); 1602 PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[0]; 1608 1603 } 1609 1604 else … … 1611 1606 AssertBreakpoint(); 1612 1607 } 1613 1614 if (pData->Flags.Discard) 1608 } 1609 else 1610 { 1611 PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->SubResourceIndex]; 1612 D3DDDICB_LOCK LockData; 1613 LockData.hAllocation = pAlloc->hAllocation; 1614 LockData.PrivateDriverData = 0; 1615 LockData.NumPages = 0; 1616 LockData.pPages = NULL; 1617 LockData.pData = NULL; /* out */ 1618 LockData.Flags.Value = 0; 1619 LockData.Flags.Discard = pData->Flags.Discard; 1620 LockData.Flags.DonotWait = pData->Flags.DoNotWait; 1621 1622 1623 hr = pDevice->RtCallbacks.pfnLockCb(hDevice, &LockData); 1624 Assert(hr == S_OK || (hr == D3DERR_WASSTILLDRAWING && pData->Flags.DoNotWait)); 1625 if (hr == S_OK) 1615 1626 { 1616 /* check if the surface was renamed */ 1617 if (LockData.hAllocation) 1618 pAlloc->hAllocation = LockData.hAllocation; 1627 uintptr_t offset; 1628 if (pData->Flags.AreaValid) 1629 { 1630 offset = pAlloc->SurfDesc.pitch * pData->Area.top + 1631 ((pAlloc->SurfDesc.bpp * pData->Area.left) >> 3); 1632 } 1633 else if (pData->Flags.RangeValid) 1634 { 1635 offset = pData->Range.Offset; 1636 } 1637 else if (pData->Flags.BoxValid) 1638 { 1639 vboxVDbgPrintF((__FUNCTION__": Implement Box area")); 1640 AssertBreakpoint(); 1641 } 1642 else 1643 { 1644 AssertBreakpoint(); 1645 } 1646 1647 if (pData->Flags.Discard) 1648 { 1649 /* check if the surface was renamed */ 1650 if (LockData.hAllocation) 1651 pAlloc->hAllocation = LockData.hAllocation; 1652 } 1653 1654 pData->pSurfData = ((uint8_t*)LockData.pData) + offset; 1655 pData->Pitch = pAlloc->SurfDesc.pitch; 1656 pData->SlicePitch = pAlloc->SurfDesc.slicePitch; 1619 1657 } 1620 1621 pData->pSurfData = ((uint8_t*)LockData.pData) + offset;1622 pData->Pitch = pAlloc->SurfDesc.pitch;1623 pData->SlicePitch = pAlloc->SurfDesc.slicePitch;1624 1658 } 1625 1659 … … 1766 1800 PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i]; 1767 1801 CONST D3DDDI_SURFACEINFO* pSurf = &pResource->pSurfList[i]; 1802 Assert(!pSurf->pSysMem); 1768 1803 IDirect3DSurface9 *pD3D9Surf; 1769 1804 hr = pDevice->pDevice9If->CreateDepthStencilSurface(pSurf->Width, … … 1798 1833 PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i]; 1799 1834 CONST D3DDDI_SURFACEINFO* pSurf = &pResource->pSurfList[i]; 1835 Assert(!pSurf->pSysMem); 1800 1836 IDirect3DVertexBuffer9 *pD3D9VBuf; 1801 1837 hr = pDevice->pDevice9If->CreateVertexBuffer(pSurf->Width, … … 1828 1864 PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i]; 1829 1865 CONST D3DDDI_SURFACEINFO* pSurf = &pResource->pSurfList[i]; 1866 Assert(!pSurf->pSysMem); 1830 1867 IDirect3DIndexBuffer9 *pD3D9IBuf; 1831 1868 hr = pDevice->pDevice9If->CreateIndexBuffer(pSurf->Width, … … 1849 1886 } 1850 1887 break; 1888 } 1889 } 1890 } 1891 else if (pResource->Flags.Texture) 1892 { 1893 Assert(pDevice->pDevice9If); 1894 #ifdef DEBUG 1895 { 1896 uint32_t tstW = pResource->pSurfList[0].Width; 1897 uint32_t tstH = pResource->pSurfList[0].Height; 1898 for (UINT i = 1; i < pResource->SurfCount; ++i) 1899 { 1900 tstW /= 2; 1901 tstH /= 2; 1902 CONST D3DDDI_SURFACEINFO* pSurf = &pResource->pSurfList[i]; 1903 Assert(pSurf->Width == tstW); 1904 Assert(pSurf->Height == tstH); 1905 } 1906 } 1907 #endif 1908 1909 PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[0]; 1910 CONST D3DDDI_SURFACEINFO* pSurf = &pResource->pSurfList[0]; 1911 IDirect3DTexture9 *pD3DIfTex; 1912 hr = pDevice->pDevice9If->CreateTexture(pSurf->Width, 1913 pSurf->Height, 1914 pResource->SurfCount, 1915 vboxDDI2D3DUsage(pResource->Flags), 1916 vboxDDI2D3DFormat(pResource->Format), 1917 vboxDDI2D3DPool(pResource->Pool), 1918 &pD3DIfTex, 1919 NULL /* HANDLE* pSharedHandle */ 1920 ); 1921 Assert(hr == S_OK); 1922 if (hr == S_OK) 1923 { 1924 Assert(pD3DIfTex); 1925 pAllocation->pD3DIf = pD3DIfTex; 1926 for (UINT i = 0; i < pResource->SurfCount; ++i) 1927 { 1928 D3DLOCKED_RECT lockInfo; 1929 CONST D3DDDI_SURFACEINFO* pSurf = &pResource->pSurfList[i]; 1930 hr = pD3DIfTex->LockRect(i, &lockInfo, NULL, D3DLOCK_DISCARD); 1931 Assert(hr == S_OK); 1932 if (hr == S_OK) 1933 { 1934 Assert(lockInfo.Pitch == pSurf->SysMemPitch); 1935 if (pSurf->SysMemPitch == lockInfo.Pitch) 1936 { 1937 memcpy(lockInfo.pBits, pSurf->pSysMem, pSurf->SysMemPitch * pSurf->Height); 1938 } 1939 else 1940 { 1941 uint8_t * pvSrc = (uint8_t *)pSurf->pSysMem; 1942 uint8_t * pvDst = (uint8_t *)lockInfo.pBits; 1943 uint32_t pitch = RT_MIN(pSurf->SysMemPitch, (UINT)lockInfo.Pitch); 1944 Assert(pitch); 1945 for (UINT j = 0; j < pSurf->Height; ++j) 1946 { 1947 memcpy(pvDst, pvSrc, pitch); 1948 pvSrc += pSurf->SysMemPitch; 1949 pvDst += lockInfo.Pitch; 1950 } 1951 } 1952 pD3DIfTex->UnlockRect(i); 1953 } 1954 else 1955 pD3DIfTex->Release(); 1851 1956 } 1852 1957 }
Note:
See TracChangeset
for help on using the changeset viewer.