VirtualBox

Changeset 30084 in vbox for trunk


Ignore:
Timestamp:
Jun 7, 2010 6:46:35 PM (15 years ago)
Author:
vboxsync
Message:

wddm/3d: texture resource creation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp

    r30058 r30084  
    619619        },
    620620};
     621
     622static D3DDDIQUERYTYPE gVBoxQueryTypes[] = {
     623        D3DDDIQUERYTYPE_EVENT,
     624        D3DDDIQUERYTYPE_OCCLUSION
     625};
     626
     627#define VBOX_QUERYTYPE_COUNT() RT_ELEMENTS(gVBoxQueryTypes)
    621628
    622629#ifdef VBOX_WITH_VIDEOHWACCEL
     
    992999        case D3DDDICAPS_DDRAW:
    9931000        {
    994             Assert(pData->DataSize >= sizeof (DDRAW_CAPS));
     1001            Assert(!VBOXDISPMODE_IS_3D(pAdapter));
     1002            Assert(pData->DataSize == sizeof (DDRAW_CAPS));
    9951003            if (pData->DataSize >= sizeof (DDRAW_CAPS))
    9961004            {
     
    10131021        case D3DDDICAPS_DDRAW_MODE_SPECIFIC:
    10141022        {
    1015             Assert(pData->DataSize >= sizeof (DDRAW_MODE_SPECIFIC_CAPS));
     1023            Assert(!VBOXDISPMODE_IS_3D(pAdapter));
     1024            Assert(pData->DataSize == sizeof (DDRAW_MODE_SPECIFIC_CAPS));
    10161025            if (pData->DataSize >= sizeof (DDRAW_MODE_SPECIFIC_CAPS))
    10171026            {
     
    10621071            break;
    10631072        case D3DDDICAPS_GETFORMATDATA:
    1064             Assert(pData->DataSize >= pAdapter->cFormstOps * sizeof (FORMATOP));
     1073            Assert(pData->DataSize == pAdapter->cFormstOps * sizeof (FORMATOP));
    10651074            memcpy(pData->pData, pAdapter->paFormstOps, pAdapter->cFormstOps * sizeof (FORMATOP));
    10661075            break;
    10671076        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
    10691082            break;
    10701083        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
    10711088            AssertBreakpoint();
    10721089            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
    10751091            break;
    10761092        case D3DDDICAPS_GETD3D3CAPS:
     1093            Assert(!VBOXDISPMODE_IS_3D(pAdapter));
    10771094            Assert(pData->DataSize >= sizeof (D3DHAL_GLOBALDRIVERDATA));
    10781095            if (pData->DataSize >= sizeof (D3DHAL_GLOBALDRIVERDATA))
     
    11461163            break;
    11471164        case D3DDDICAPS_GETD3D7CAPS:
     1165            Assert(!VBOXDISPMODE_IS_3D(pAdapter));
    11481166            Assert(pData->DataSize >= sizeof (D3DHAL_D3DEXTENDEDCAPS));
    11491167            if (pData->DataSize >= sizeof (D3DHAL_D3DEXTENDEDCAPS))
     
    11581176            if (pData->DataSize >= sizeof (D3DCAPS9))
    11591177            {
     1178                Assert(VBOXDISPMODE_IS_3D(pAdapter));
    11601179                if (VBOXDISPMODE_IS_3D(pAdapter))
    11611180                {
     
    15691588{
    15701589    vboxVDbgPrintF(("==> "__FUNCTION__", hDevice(0x%p)\n", hDevice));
    1571     AssertBreakpoint();
    15721590    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    15731591    PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hResource;
     
    15761594        return E_INVALIDARG;
    15771595
    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))
    15931599    {
    1594         uintptr_t offset;
    1595         if (pData->Flags.AreaValid)
     1600        if (pRc->RcDesc.fFlags.Texture)
    15961601        {
    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];
    16081603        }
    16091604        else
     
    16111606            AssertBreakpoint();
    16121607        }
    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)
    16151626        {
    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;
    16191657        }
    1620 
    1621         pData->pSurfData = ((uint8_t*)LockData.pData) + offset;
    1622         pData->Pitch = pAlloc->SurfDesc.pitch;
    1623         pData->SlicePitch = pAlloc->SurfDesc.slicePitch;
    16241658    }
    16251659
     
    17661800                    PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i];
    17671801                    CONST D3DDDI_SURFACEINFO* pSurf = &pResource->pSurfList[i];
     1802                    Assert(!pSurf->pSysMem);
    17681803                    IDirect3DSurface9 *pD3D9Surf;
    17691804                    hr = pDevice->pDevice9If->CreateDepthStencilSurface(pSurf->Width,
     
    17981833                    PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i];
    17991834                    CONST D3DDDI_SURFACEINFO* pSurf = &pResource->pSurfList[i];
     1835                    Assert(!pSurf->pSysMem);
    18001836                    IDirect3DVertexBuffer9  *pD3D9VBuf;
    18011837                    hr = pDevice->pDevice9If->CreateVertexBuffer(pSurf->Width,
     
    18281864                    PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i];
    18291865                    CONST D3DDDI_SURFACEINFO* pSurf = &pResource->pSurfList[i];
     1866                    Assert(!pSurf->pSysMem);
    18301867                    IDirect3DIndexBuffer9  *pD3D9IBuf;
    18311868                    hr = pDevice->pDevice9If->CreateIndexBuffer(pSurf->Width,
     
    18491886                        }
    18501887                        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();
    18511956                    }
    18521957                }
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