VirtualBox

Ignore:
Timestamp:
Jun 11, 2010 4:52:04 PM (15 years ago)
Author:
vboxsync
Message:

wddm/3d: make first dx9 test app draw correctly

Location:
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm
Files:
2 edited

Legend:

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

    r30161 r30167  
    3535#endif
    3636
    37 /*#define VBOXWDDMDISP_WITH_TMPWORKAROUND 1*/
     37#define VBOXWDDMDISP_WITH_TMPWORKAROUND 1
    3838
    3939static FORMATOP gVBoxFormatOps3D[] = {
     
    18481848    Assert(pDevice);
    18491849    Assert(pDevice->pDevice9If);
    1850     HRESULT hr = pDevice->pDevice9If->DrawPrimitive(pData->PrimitiveType, pData->FirstVertexOffset, pData->PrimitiveCount);
     1850    HRESULT hr;
     1851
     1852#if 0
     1853    int stream;
     1854    for (stream=0; stream<VBOXWDDMDISP_MAX_VERTEX_STREAMS; ++stream)
     1855    {
     1856        if (pDevice->aStreamSource[stream] && pDevice->aStreamSource[stream]->LockInfo.cLocks)
     1857        {
     1858            VBOXWDDMDISP_LOCKINFO *pLock = &pDevice->aStreamSource[stream]->LockInfo;
     1859            if (pLock->fFlags.MightDrawFromLocked && (pLock->fFlags.Discard || pLock->fFlags.NoOverwrite))
     1860            {
     1861                IDirect3DVertexBuffer9 *pD3D9VBuf = (IDirect3DVertexBuffer9*)pDevice->aStreamSource[stream]->pD3DIf;
     1862                Assert(pLock->fFlags.RangeValid);
     1863                pD3D9VBuf->Lock(pLock->Range.Offset, pLock->Range.Size,
     1864                                &pLock->LockedRect.pBits,
     1865                                vboxDDI2D3DLockFlags(pLock->fFlags));
     1866                RECT r;
     1867                r.top = 0;
     1868                r.left = pLock->Range.Offset;
     1869                r.bottom = 1;
     1870                r.right = pLock->Range.Offset + pLock->Range.Size;
     1871
     1872                vboxWddmLockUnlockMemSynch(pDevice->aStreamSource[stream], &pLock->LockedRect, &r, true /*bool bToLockInfo*/);
     1873
     1874                pD3D9VBuf->Unlock();
     1875            }
     1876        }
     1877    }
     1878
     1879    hr = pDevice->pDevice9If->DrawPrimitive(pData->PrimitiveType, pData->FirstVertexOffset, pData->PrimitiveCount);
     1880#else
     1881    int stream;
     1882    for (stream=0; stream<VBOXWDDMDISP_MAX_VERTEX_STREAMS; ++stream)
     1883    {
     1884        if (pDevice->aStreamSource[stream])
     1885        {
     1886            Assert(stream==0); /*only stream 0 should be accessed here*/
     1887            Assert(pDevice->StreamSourceInfo[stream].uiStride!=0);
     1888            VBOXWDDMDISP_LOCKINFO *pLock = &pDevice->aStreamSource[stream]->LockInfo;
     1889
     1890            if (pDevice->aStreamSource[stream]->LockInfo.cLocks)
     1891            {
     1892                Assert(pLock->fFlags.MightDrawFromLocked && (pLock->fFlags.Discard || pLock->fFlags.NoOverwrite));
     1893                hr = pDevice->pDevice9If->DrawPrimitiveUP(pData->PrimitiveType, pData->PrimitiveCount,
     1894                        (void*)((uintptr_t)pDevice->aStreamSource[stream]->pvMem+pDevice->StreamSourceInfo[stream].uiOffset+pData->FirstVertexOffset),
     1895                         pDevice->StreamSourceInfo[stream].uiStride);
     1896                Assert(hr == S_OK);
     1897                hr = pDevice->pDevice9If->SetStreamSource(stream, (IDirect3DVertexBuffer9*)pDevice->aStreamSource[stream]->pD3DIf, pDevice->StreamSourceInfo[stream].uiOffset, pDevice->StreamSourceInfo[stream].uiStride);
     1898            }
     1899            else
     1900            {
     1901                hr = pDevice->pDevice9If->DrawPrimitive(pData->PrimitiveType, pData->FirstVertexOffset/pDevice->StreamSourceInfo[stream].uiStride, pData->PrimitiveCount);
     1902            }
     1903        }
     1904    }
     1905#endif
     1906
    18511907    Assert(hr == S_OK);
    18521908    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
     
    22042260            PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->SubResourceIndex];
    22052261            IDirect3DVertexBuffer9 *pD3D9VBuf = (IDirect3DVertexBuffer9*)pAlloc->pD3DIf;
     2262            BOOL bLocked = false;
    22062263            Assert(pD3D9VBuf);
    22072264            Assert(!pData->Flags.AreaValid);
     
    22182275            if (!pAlloc->LockInfo.cLocks)
    22192276            {
    2220                 hr = pD3D9VBuf->Lock(pRange ? pRange->Offset : 0,
    2221                                       pRange ? pRange->Size : 0,
    2222                                       &pAlloc->LockInfo.LockedRect.pBits,
    2223                                       vboxDDI2D3DLockFlags(pData->Flags));
    2224 #ifdef VBOXWDDMDISP_WITH_TMPWORKAROUND
    2225                 if (pData->Flags.MightDrawFromLocked)
    2226                 {
    2227                         RECT r, *pr;
    2228                         if (pRange)
    2229                         {
    2230                             r.top = 0;
    2231                             r.left = pRange->Offset;
    2232                             r.bottom = 1;
    2233                             r.right = pRange->Offset + pRange->Size;
    2234                             pr = &r;
    2235                         }
    2236                         else
    2237                             pr = NULL;
    2238 
    2239                         pAlloc->LockInfo.LockedRect.Pitch = pAlloc->SurfDesc.width;
    2240 
    2241                         vboxWddmLockUnlockMemSynch(pAlloc, &pAlloc->LockInfo.LockedRect, pr, true /*bool bToLockInfo*/);
    2242                     pD3D9VBuf->Unlock();
     2277                if (!pData->Flags.MightDrawFromLocked || (!pData->Flags.Discard && !pData->Flags.NoOverwrite))
     2278                {
     2279                    hr = pD3D9VBuf->Lock(pRange ? pRange->Offset : 0,
     2280                                          pRange ? pRange->Size : 0,
     2281                                          &pAlloc->LockInfo.LockedRect.pBits,
     2282                                          vboxDDI2D3DLockFlags(pData->Flags));
     2283                    bLocked = true;
    22432284                }
    2244 #endif
     2285
    22452286                Assert(hr == S_OK);
    22462287                if (hr == S_OK)
     
    22932334                    Assert(pAlloc->pvMem);
    22942335                    Assert(pRc->RcDesc.enmPool == D3DDDIPOOL_SYSTEMMEM);
    2295                     if (/* !pData->Flags.WriteOnly && */ !pData->Flags.Discard)
     2336                    if (bLocked && !pData->Flags.Discard)
    22962337                    {
    22972338                        RECT r, *pr;
     
    24192460            --pAlloc->LockInfo.cLocks;
    24202461            Assert(pAlloc->LockInfo.cLocks < UINT32_MAX);
    2421 //            pAlloc->LockInfo.cLocks = 0;
    2422 #ifdef VBOXWDDMDISP_WITH_TMPWORKAROUND
    2423             if (!pAlloc->LockInfo.cLocks && !pAlloc->LockInfo.fFlags.MightDrawFromLocked)
    2424 #else
    2425             if (!pAlloc->LockInfo.cLocks)
    2426 #endif
     2462            if (!pAlloc->LockInfo.cLocks
     2463                && (!pAlloc->LockInfo.fFlags.MightDrawFromLocked
     2464                    || (!pAlloc->LockInfo.fFlags.Discard && !pAlloc->LockInfo.fFlags.NoOverwrite)))
    24272465            {
    24282466//                Assert(!pAlloc->LockInfo.cLocks);
     
    30493087    Assert(pDevice);
    30503088    Assert(pDevice->pDevice9If);
     3089#if 0
    30513090    HRESULT hr = pDevice->pDevice9If->Present(NULL, /* CONST RECT * pSourceRect */
    30523091            NULL, /* CONST RECT * pDestRect */
     
    30553094            );
    30563095    Assert(hr == S_OK);
     3096#else
     3097    HRESULT hr = S_OK;
     3098#endif
    30573099    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
    30583100    return hr;
     
    32173259    IDirect3DVertexBuffer9 *pStreamData = (IDirect3DVertexBuffer9*)pAlloc->pD3DIf;
    32183260    HRESULT hr = pDevice->pDevice9If->SetStreamSource(pData->Stream, pStreamData, pData->Offset, pData->Stride);
     3261    Assert(pData->Stream<VBOXWDDMDISP_MAX_VERTEX_STREAMS);
     3262    pDevice->aStreamSource[pData->Stream] = pAlloc;
     3263    pDevice->StreamSourceInfo[pData->Stream].uiOffset = pData->Offset;
     3264    pDevice->StreamSourceInfo[pData->Stream].uiStride = pData->Stride;
    32193265    Assert(hr == S_OK);
    32203266    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.h

    r30162 r30167  
    2020
    2121#include <iprt/cdefs.h>
     22
     23#define VBOXWDDMDISP_MAX_VERTEX_STREAMS 16
    2224
    2325#ifdef VBOX_WITH_VIDEOHWACCEL
     
    6870} VBOXWDDMDISP_STREAMSOURCEUM, *PVBOXWDDMDISP_STREAMSOURCEUM;
    6971
     72struct VBOXWDDMDISP_ALLOCATION;
     73
     74typedef struct VBOXWDDMDISP_STREAM_SOURCE_INFO
     75{
     76  UINT   uiOffset;
     77  UINT   uiStride;
     78} VBOXWDDMDISP_STREAM_SOURCE_INFO;
     79
    7080typedef struct VBOXWDDMDISP_DEVICE
    7181{
     
    8191    /* number of StreamSources set */
    8292    UINT cStreamSources;
    83     VBOXWDDMDISP_STREAMSOURCEUM aStreamSourceUm[16];
     93    VBOXWDDMDISP_STREAMSOURCEUM aStreamSourceUm[VBOXWDDMDISP_MAX_VERTEX_STREAMS];
     94    VBOXWDDMDISP_ALLOCATION *aStreamSource[VBOXWDDMDISP_MAX_VERTEX_STREAMS];
     95    VBOXWDDMDISP_STREAM_SOURCE_INFO StreamSourceInfo[VBOXWDDMDISP_MAX_VERTEX_STREAMS];
    8496    IDirect3DDevice9 *pDevice9If;
    8597    /* need to cache the ViewPort data because IDirect3DDevice9::SetViewport
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