VirtualBox

Ignore:
Timestamp:
Oct 4, 2010 11:14:12 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
66372
Message:

wddm/3d: chromium over hgsmi transport fixing & perf measurement

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/Makefile.kmk

    r32877 r32889  
    8888 VBoxDispD3D_DEFS   += VBOX_WDDMDISP_WITH_PROFILE
    8989endif
     90ifdef VBOXWDDM_TEST_UHGSMI
     91 VBoxDispD3D_DEFS   += VBOXWDDM_TEST_UHGSMI
     92endif
    9093VBoxDispD3D_SOURCES  = \
    9194        wddm/VBoxDispD3D.cpp \
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp

    r32877 r32889  
    53645364    return hr;
    53655365}
     5366
     5367#ifdef VBOXWDDM_TEST_UHGSMI
     5368int vboxUhgsmiTst(PVBOXUHGSMI pUhgsmi, uint32_t cbBuf, uint32_t cNumCals, uint64_t * pTimeMs);
     5369#endif
     5370
    53665371static HRESULT APIENTRY vboxWddmDDevPresent(HANDLE hDevice, CONST D3DDDIARG_PRESENT* pData)
    53675372{
     
    53745379    if (VBOXDISPMODE_IS_3D(pDevice->pAdapter))
    53755380    {
     5381#ifdef VBOXWDDM_TEST_UHGSMI
     5382        {
     5383            Assert(0);
     5384            static uint32_t cCals = 10000;
     5385            static uint32_t cbData = 8 * 1024 * 1024;
     5386            uint64_t TimeMs;
     5387            int rc = vboxUhgsmiTst(&pDevice->Uhgsmi.Base, cbData, cCals, &TimeMs);
     5388            uint32_t cCPS = (((uint64_t)cCals) * 1000ULL)/TimeMs;
     5389            Assert(0);
     5390            vboxVDbgDoMpPrintF(pDevice, "Time : %I64u ms, calls: %d, cps: %d\n", TimeMs, cCals, cCPS);
     5391        }
     5392#endif
    53765393#if 1
    53775394        PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hSrcResource;
     
    71227139                    && !pCreateData->PatchLocationListSize)
    71237140            {
    7124                 hr = vboxDispCmCtxCreate(pDevice, &pDevice->DefaultContext);
     7141                hr = vboxUhgsmiD3DInit(&pDevice->Uhgsmi, pDevice);
    71257142                Assert(hr == S_OK);
    71267143                if (hr == S_OK)
    71277144                {
    7128 #ifdef VBOXDISP_EARLYCREATEDEVICE
    7129                     PVBOXWDDMDISP_RESOURCE pRc = vboxResourceAlloc(2);
    7130                     Assert(pRc);
    7131                     if (pRc)
     7145                    hr = vboxDispCmCtxCreate(pDevice, &pDevice->DefaultContext);
     7146                    Assert(hr == S_OK);
     7147                    if (hr == S_OK)
    71327148                    {
    7133                         D3DPRESENT_PARAMETERS params;
    7134                         memset(&params, 0, sizeof (params));
    7135 //                        params.BackBufferWidth = 640;
    7136 //                        params.BackBufferHeight = 480;
    7137                         params.BackBufferWidth = 0x400;
    7138                         params.BackBufferHeight = 0x300;
    7139                         params.BackBufferFormat = D3DFMT_A8R8G8B8;
    7140 //                        params.BackBufferCount = 0;
    7141                         params.BackBufferCount = 1;
    7142                         params.MultiSampleType = D3DMULTISAMPLE_NONE;
    7143                         params.SwapEffect = D3DSWAPEFFECT_DISCARD;
    7144     //                    params.hDeviceWindow = hWnd;
    7145                                     /* @todo: it seems there should be a way to detect this correctly since
    7146                                      * our vboxWddmDDevSetDisplayMode will be called in case we are using full-screen */
    7147                         params.Windowed = TRUE;
    7148                         //            params.EnableAutoDepthStencil = FALSE;
    7149                         //            params.AutoDepthStencilFormat = D3DFMT_UNKNOWN;
    7150                         //            params.Flags;
    7151                         //            params.FullScreen_RefreshRateInHz;
    7152                         //            params.FullScreen_PresentationInterval;
    7153 
    7154                         hr = vboxWddmD3DDeviceCreate(pDevice, 0, pRc, &params, TRUE /*BOOL bLockable*/);
    7155                         Assert(hr == S_OK);
    7156                         if (hr == S_OK)
    7157                             break;
    7158                         vboxResourceFree(pRc);
     7149    #ifdef VBOXDISP_EARLYCREATEDEVICE
     7150                        PVBOXWDDMDISP_RESOURCE pRc = vboxResourceAlloc(2);
     7151                        Assert(pRc);
     7152                        if (pRc)
     7153                        {
     7154                            D3DPRESENT_PARAMETERS params;
     7155                            memset(&params, 0, sizeof (params));
     7156    //                        params.BackBufferWidth = 640;
     7157    //                        params.BackBufferHeight = 480;
     7158                            params.BackBufferWidth = 0x400;
     7159                            params.BackBufferHeight = 0x300;
     7160                            params.BackBufferFormat = D3DFMT_A8R8G8B8;
     7161    //                        params.BackBufferCount = 0;
     7162                            params.BackBufferCount = 1;
     7163                            params.MultiSampleType = D3DMULTISAMPLE_NONE;
     7164                            params.SwapEffect = D3DSWAPEFFECT_DISCARD;
     7165        //                    params.hDeviceWindow = hWnd;
     7166                                        /* @todo: it seems there should be a way to detect this correctly since
     7167                                         * our vboxWddmDDevSetDisplayMode will be called in case we are using full-screen */
     7168                            params.Windowed = TRUE;
     7169                            //            params.EnableAutoDepthStencil = FALSE;
     7170                            //            params.AutoDepthStencilFormat = D3DFMT_UNKNOWN;
     7171                            //            params.Flags;
     7172                            //            params.FullScreen_RefreshRateInHz;
     7173                            //            params.FullScreen_PresentationInterval;
     7174
     7175                            hr = vboxWddmD3DDeviceCreate(pDevice, 0, pRc, &params, TRUE /*BOOL bLockable*/);
     7176                            Assert(hr == S_OK);
     7177                            if (hr == S_OK)
     7178                                break;
     7179                            vboxResourceFree(pRc);
     7180                        }
     7181                        else
     7182                        {
     7183                            hr = E_OUTOFMEMORY;
     7184                        }
     7185    #else
     7186    //# define VBOXDISP_TEST_SWAPCHAIN
     7187    # ifdef VBOXDISP_TEST_SWAPCHAIN
     7188                        VBOXDISP_D3DEV(pDevice);
     7189    # endif
     7190                        break;
     7191    #endif
     7192
     7193                        HRESULT tmpHr = vboxDispCmCtxDestroy(pDevice, &pDevice->DefaultContext);
     7194                        Assert(tmpHr == S_OK);
    71597195                    }
    7160                     else
    7161                     {
    7162                         hr = E_OUTOFMEMORY;
    7163                     }
    7164 #else
    7165 //# define VBOXDISP_TEST_SWAPCHAIN
    7166 # ifdef VBOXDISP_TEST_SWAPCHAIN
    7167                     VBOXDISP_D3DEV(pDevice);
    7168 # endif
    7169                     break;
    7170 #endif
    7171 
    7172                     HRESULT tmpHr = vboxDispCmCtxDestroy(pDevice, &pDevice->DefaultContext);
    7173                     Assert(tmpHr == S_OK);
    71747196                }
    71757197            }
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.h

    r32697 r32889  
    1818#include "VBoxDispD3DIf.h"
    1919#include "../../Miniport/wddm/VBoxVideoIf.h"
     20#include "VBoxUhgsmiDisp.h"
    2021
    2122#include <iprt/cdefs.h>
     
    177178    D3DVIEWPORT9 ViewPort;
    178179    VBOXWDDMDISP_CONTEXT DefaultContext;
     180    VBOXUHGSMI_PRIVATE_D3D Uhgsmi;
    179181
    180182    CRITICAL_SECTION DirtyAllocListLock;
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3DCmn.h

    r32739 r32889  
    3333#include "../../Miniport/wddm/VBoxVideoIf.h"
    3434#include "VBoxDispCm.h"
     35#include "VBoxUhgsmiDisp.h"
    3536#include "VBoxDispD3D.h"
    3637
     
    4142#endif
    4243
    43 #if defined(VBOXWDDMDISP_DEBUG) || defined(VBOX_WDDMDISP_WITH_PROFILE)
     44#if defined(VBOXWDDMDISP_DEBUG) || defined(VBOX_WDDMDISP_WITH_PROFILE) || defined(VBOXWDDM_TEST_UHGSMI)
    4445# define VBOXWDDMDISP_DEBUG_PRINT
    4546#endif
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispMpTst.cpp

    r30515 r32889  
    1616
    1717#include <iprt/thread.h>
     18#include <iprt/err.h>
    1819
    1920#include "VBoxDispD3DCmn.h"
     21
     22#include "VBoxDispProfile.h"
    2023
    2124static RTTHREAD g_VBoxDispMpTstThread;
     
    143146}
    144147
     148int vboxUhgsmiTst(PVBOXUHGSMI pUhgsmi, uint32_t cbBuf, uint32_t cNumCals, uint64_t * pTimeMs)
     149{
     150    PVBOXUHGSMI_BUFFER pBuf;
     151    int rc = pUhgsmi->pfnBufferCreate(pUhgsmi, cbBuf, VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT, NULL, &pBuf);
     152    AssertRC(rc);
     153    if (RT_SUCCESS(rc))
     154    {
     155        uint64_t TimeMs = VBOXDISPPROFILE_GET_TIME_MILLI();
     156        do
     157        {
     158            VBOXUHGSMI_BUFFER_LOCK_FLAGS fFlags;
     159            fFlags.Value = 0;
     160            fFlags.bLockEntire = 1;
     161            fFlags.bDiscard = 1;
     162
     163            void *pvLock;
     164            rc = pBuf->pfnLock(pBuf, 0, cbBuf, fFlags, &pvLock);
     165            AssertRC(rc);
     166            if (!RT_SUCCESS(rc))
     167                break;
     168
     169            rc = pBuf->pfnUnlock(pBuf);
     170            AssertRC(rc);
     171            if (!RT_SUCCESS(rc))
     172                break;
     173
     174            VBOXUHGSMI_BUFFER_SUBMIT SubmitData;
     175            SubmitData.pBuf = pBuf;
     176            SubmitData.fFlags.Value = 0;
     177            SubmitData.fFlags.bDoNotRetire = 1;
     178            SubmitData.fFlags.bEntireBuffer = 1;
     179
     180            rc = pUhgsmi->pfnBufferSubmitAsynch(pUhgsmi, &SubmitData, 1);
     181            AssertRC(rc);
     182            if (!RT_SUCCESS(rc))
     183                break;
     184
     185            DWORD dw = WaitForSingleObject(pBuf->hSynch, INFINITE);
     186            Assert(dw == WAIT_OBJECT_0);
     187            if (dw)
     188                break;
     189        } while (--cNumCals);
     190
     191        TimeMs = VBOXDISPPROFILE_GET_TIME_MILLI() - TimeMs;
     192        *pTimeMs = TimeMs;
     193
     194        pBuf->pfnDestroy(pBuf);
     195    }
     196    return rc;
     197}
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxUhgsmiDisp.cpp

    r32877 r32889  
    1313 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
    1414 */
    15 #include "VBoxUhgsmiDisp.h"
     15#include "VBoxDispD3DCmn.h"
    1616
    1717#include <iprt/mem.h>
     
    5454{
    5555    PVBOXUHGSMI_BUFFER_PRIVATE_D3D pBuffer = VBOXUHGSMID3D_GET_BUFFER(pBuf);
    56     if (!cbLock)
    57     {
    58         Assert(0);
    59         return VERR_INVALID_PARAMETER;
    60     }
    61     if (offLock + cbLock > pBuf->cbBuffer)
    62     {
    63         Assert(0);
    64         return VERR_INVALID_PARAMETER;
    65     }
    66     uint32_t iFirstPage = offLock >> 0x1000;
    67     uint32_t iAfterLastPage = (cbLock + 0xfff) >> 0x1000;
    68     uint32_t cPages = iAfterLastPage - iFirstPage;
    69     uint32_t cBufPages = pBuf->cbBuffer >> 0x1000;
    70     Assert(cPages <= (cBufPages));
    7156    D3DDDICB_LOCK DdiLock;
    7257    DdiLock.hAllocation = pBuffer->hAllocation;
    7358    DdiLock.PrivateDriverData = 0;
    74     if (cPages == cBufPages)
    75     {
    76         DdiLock.NumPages = 0;
    77         DdiLock.pPages = NULL;
     59
     60    if (fFlags.bLockEntire)
     61    {
     62        offLock = 0;
    7863        DdiLock.Flags.Value = 0;
    7964        DdiLock.Flags.LockEntire = 1;
     
    8166    else
    8267    {
    83         DdiLock.NumPages = cPages;
    84         DdiLock.pPages = pBuffer->aLockPageIndices;
    85         DdiLock.Flags.Value = 0;
    86         for (UINT i = 0, j = iFirstPage; i < cPages; ++i, ++j)
    87         {
    88             pBuffer->aLockPageIndices[i] = j;
    89         }
     68        if (!cbLock)
     69        {
     70            Assert(0);
     71            return VERR_INVALID_PARAMETER;
     72        }
     73        if (offLock + cbLock > pBuf->cbBuffer)
     74        {
     75            Assert(0);
     76            return VERR_INVALID_PARAMETER;
     77        }
     78
     79        uint32_t iFirstPage = offLock >> 0x1000;
     80        uint32_t iAfterLastPage = (cbLock + 0xfff) >> 0x1000;
     81        uint32_t cPages = iAfterLastPage - iFirstPage;
     82        uint32_t cBufPages = pBuf->cbBuffer >> 0x1000;
     83        Assert(cPages <= (cBufPages));
     84
     85        if (cPages == cBufPages)
     86        {
     87            DdiLock.NumPages = 0;
     88            DdiLock.pPages = NULL;
     89            DdiLock.Flags.Value = 0;
     90            DdiLock.Flags.LockEntire = 1;
     91        }
     92        else
     93        {
     94            DdiLock.NumPages = cPages;
     95            DdiLock.pPages = pBuffer->aLockPageIndices;
     96            DdiLock.Flags.Value = 0;
     97            for (UINT i = 0, j = iFirstPage; i < cPages; ++i, ++j)
     98            {
     99                pBuffer->aLockPageIndices[i] = j;
     100            }
     101        }
     102
    90103    }
    91104    DdiLock.pData = NULL;
     
    93106    DdiLock.Flags.WriteOnly = fFlags.bWriteOnly;
    94107    DdiLock.Flags.DonotWait = fFlags.bDonotWait;
    95     DdiLock.Flags.Discard = fFlags.bDiscard;
     108//    DdiLock.Flags.Discard = fFlags.bDiscard;
    96109
    97110    HRESULT hr = pBuffer->pDevice->RtCallbacks.pfnLockCb(pBuffer->pDevice->hDevice, &DdiLock);
     
    99112    if (hr == S_OK)
    100113    {
    101         *pvLock = (void*)(((uint8_t*)DdiLock.pPages) + (offLock & 0xfff));
     114        *pvLock = (void*)(((uint8_t*)DdiLock.pData) + (offLock & 0xfff));
    102115        return VINF_SUCCESS;
    103116    }
     
    217230            pBuf->pDevice = pPrivate->pDevice;
    218231            pBuf->hAllocation = Buf.DdiAllocInfo.hAllocation;
     232
     233            *ppBuf = &pBuf->Base;
     234
    219235            return VINF_SUCCESS;
    220236        }
     
    264280        pAllocationList->DoNotRetireInstance = pBufInfo->fFlags.bDoNotRetire;
    265281        pBufSubmInfo->fSubFlags = pBufInfo->fFlags;
    266         pBufSubmInfo->offData = pBufInfo->offData;
    267         pBufSubmInfo->cbData = pBufInfo->cbData;
     282        if (pBufInfo->fFlags.bEntireBuffer)
     283        {
     284            pBufSubmInfo->offData = 0;
     285            pBufSubmInfo->cbData = pBuffer->Base.cbBuffer;
     286        }
     287        else
     288        {
     289            pBufSubmInfo->offData = pBufInfo->offData;
     290            pBufSubmInfo->cbData = pBufInfo->cbData;
     291        }
    268292
    269293        ++pAllocationList;
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxUhgsmiDisp.h

    r32877 r32889  
    2222{
    2323    VBOXUHGSMI Base;
    24     PVBOXWDDMDISP_DEVICE pDevice;
     24    struct VBOXWDDMDISP_DEVICE *pDevice;
    2525} VBOXUHGSMI_PRIVATE_D3D, *PVBOXUHGSMI_PRIVATE_D3D;
    2626
    27 HRESULT vboxUhgsmiD3DInit(PVBOXUHGSMI_PRIVATE_D3D pHgsmi, PVBOXWDDMDISP_DEVICE pDevice);
     27HRESULT vboxUhgsmiD3DInit(PVBOXUHGSMI_PRIVATE_D3D pHgsmi, struct VBOXWDDMDISP_DEVICE *pDevice);
    2828#endif /* #ifndef ___VBoxUhgsmiDisp_h__ */
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