VirtualBox

Changeset 41858 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jun 21, 2012 11:30:30 AM (13 years ago)
Author:
vboxsync
Message:

wddm/3d: better event query support

Location:
trunk/src/VBox/Additions/WINNT/Graphics
Files:
3 edited

Legend:

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

    r41637 r41858  
    18631863}
    18641864
     1865static D3DQUERYTYPE vboxDDI2D3DQueryType(D3DDDIQUERYTYPE enmType)
     1866{
     1867    return (D3DQUERYTYPE)enmType;
     1868}
     1869
     1870static DWORD vboxDDI2D3DIssueQueryFlags(D3DDDI_ISSUEQUERYFLAGS Flags)
     1871{
     1872    DWORD fFlags = 0;
     1873    if (Flags.Begin)
     1874        fFlags |= D3DISSUE_BEGIN;
     1875    if (Flags.End)
     1876        fFlags |= D3DISSUE_END;
     1877    return fFlags;
     1878}
    18651879
    18661880/******/
     
    63436357    VBOXDISP_DDI_PROLOGUE_DEV(hDevice);
    63446358    vboxVDbgPrintF(("==> "__FUNCTION__", hDevice(0x%p)\n", hDevice));
    6345 //    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    6346 //    Assert(pDevice);
    6347 //    VBOXDISPCRHGSMI_SCOPE_SET_DEV(pDevice);
     6359    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
     6360    Assert(pDevice);
     6361    VBOXDISPCRHGSMI_SCOPE_SET_DEV(pDevice);
     6362
     6363    IDirect3DDevice9 * pDevice9If = VBOXDISP_D3DEV(pDevice);
    63486364    HRESULT hr = S_OK;
    6349     if (pData->QueryType == D3DDDIQUERYTYPE_EVENT)
    6350     {
    6351         PVBOXWDDMDISP_QUERY pQuery = (PVBOXWDDMDISP_QUERY)RTMemAllocZ(sizeof (VBOXWDDMDISP_QUERY));
    6352         Assert(pQuery);
    6353         if (pQuery)
    6354         {
    6355             pQuery->enmType = pData->QueryType;
    6356             pData->hQuery = pQuery;
    6357         }
    6358         else
    6359         {
    6360             hr = E_OUTOFMEMORY;
    6361         }
    6362     }
    6363     else
    6364     {
    6365         Assert(0);
    6366         hr = E_FAIL;
    6367     }
     6365    PVBOXWDDMDISP_QUERY pQuery = (PVBOXWDDMDISP_QUERY)RTMemAllocZ(sizeof (VBOXWDDMDISP_QUERY));
     6366    if (!pQuery)
     6367    {
     6368        WARN(("RTMemAllocZ failed"));
     6369        return E_OUTOFMEMORY;
     6370    }
     6371
     6372    hr = pDevice9If->CreateQuery(vboxDDI2D3DQueryType(pData->QueryType), &pQuery->pQueryIf);
     6373    if (FAILED(hr))
     6374    {
     6375        WARN(("CreateQuery failed, hr 0x%x", hr));
     6376        RTMemFree(pQuery);
     6377        return hr;
     6378    }
     6379
     6380    Assert(hr == S_OK);
     6381
     6382    pQuery->enmType = pData->QueryType;
     6383    pData->hQuery = pQuery;
     6384
    63686385    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p)\n", hDevice));
    63696386    return hr;
     
    63746391    vboxVDbgPrintF(("==> "__FUNCTION__", hDevice(0x%p)\n", hDevice));
    63756392    HRESULT hr = S_OK;
    6376 //    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    6377 //    Assert(pDevice);
    6378 //    VBOXDISPCRHGSMI_SCOPE_SET_DEV(pDevice);
     6393    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
     6394    Assert(pDevice);
     6395    VBOXDISPCRHGSMI_SCOPE_SET_DEV(pDevice);
    63796396
    63806397    PVBOXWDDMDISP_QUERY pQuery = (PVBOXWDDMDISP_QUERY)hQuery;
    63816398    Assert(pQuery);
     6399    pQuery->pQueryIf->Release();
    63826400    RTMemFree(pQuery);
    63836401    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p)\n", hDevice));
     
    63896407    vboxVDbgPrintF(("==> "__FUNCTION__", hDevice(0x%p)\n", hDevice));
    63906408    HRESULT hr = S_OK;
    6391 //    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    6392 //    Assert(pDevice);
    6393 //    VBOXDISPCRHGSMI_SCOPE_SET_DEV(pDevice);
     6409    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
     6410    Assert(pDevice);
     6411    VBOXDISPCRHGSMI_SCOPE_SET_DEV(pDevice);
    63946412
    63956413    PVBOXWDDMDISP_QUERY pQuery = (PVBOXWDDMDISP_QUERY)pData->hQuery;
    63966414    Assert(pQuery);
    63976415    pQuery->fQueryState.Value |= pData->Flags.Value;
     6416    hr = pQuery->pQueryIf->Issue(vboxDDI2D3DIssueQueryFlags(pData->Flags));
     6417    if (hr != S_OK)
     6418        WARN(("Issue failed, hr = 0x%x", hr));
     6419
    63986420    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p)\n", hDevice));
    63996421    return hr;
     
    64046426    vboxVDbgPrintF(("==> "__FUNCTION__", hDevice(0x%p)\n", hDevice));
    64056427    HRESULT hr = S_OK;
    6406 //    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    6407 //    Assert(pDevice);
    6408 //    VBOXDISPCRHGSMI_SCOPE_SET_DEV(pDevice);
     6428    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
     6429    Assert(pDevice);
     6430    VBOXDISPCRHGSMI_SCOPE_SET_DEV(pDevice);
    64096431
    64106432    PVBOXWDDMDISP_QUERY pQuery = (PVBOXWDDMDISP_QUERY)pData->hQuery;
    64116433    Assert(pQuery);
     6434    DWORD cbData = pQuery->pQueryIf->GetDataSize();
     6435#ifdef DEBUG
    64126436    switch (pQuery->enmType)
    64136437    {
    64146438        case D3DDDIQUERYTYPE_EVENT:
    6415             pQuery->data.bData = TRUE;
    6416             Assert(pData->pData);
    6417             *((BOOL*)pData->pData) = TRUE;
     6439            Assert(cbData == sizeof (BOOL));
    64186440            break;
    64196441        default:
    64206442            Assert(0);
    6421             hr = E_FAIL;
    64226443            break;
    64236444    }
     6445#endif
     6446    hr = pQuery->pQueryIf->GetData(pData->pData, cbData, 0);
     6447    if (hr != S_OK)
     6448        WARN(("GetData failed, hr = 0x%x", hr));
     6449
    64246450    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p)\n", hDevice));
    64256451    return hr;
     
    75627588}
    75637589
     7590
    75647591HRESULT APIENTRY OpenAdapter(__inout D3DDDIARG_OPENADAPTER*  pOpenData)
    75657592{
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.h

    r41637 r41858  
    293293    D3DDDIQUERYTYPE enmType;
    294294    D3DDDI_ISSUEQUERYFLAGS fQueryState;
    295     union
    296     {
    297         BOOL bData;
    298         UINT u32Data;
    299     } data ;
     295    IDirect3DQuery9 *pQueryIf;
    300296} VBOXWDDMDISP_QUERY, *PVBOXWDDMDISP_QUERY;
    301297
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/query.c

    r38112 r41858  
    6262    }
    6363
     64#if !defined(VBOX_WINE_WITH_SINGLE_CONTEXT) && !defined(VBOX_WINE_WITH_SINGLE_SWAPCHAIN_CONTEXT)
    6465    if (!query->context->gl_info->supported[ARB_SYNC] && query->context->tid != GetCurrentThreadId())
    6566    {
    66 #ifdef VBOX_WINE_WITH_SINGLE_CONTEXT
    67         ERR("Event query tested from wrong thread\n");
    68 #else
    6967        WARN("Event query tested from wrong thread\n");
     68        return WINED3D_EVENT_QUERY_WRONG_THREAD;
     69    }
    7070#endif
    71         return WINED3D_EVENT_QUERY_WRONG_THREAD;
    72     }
    7371
    7472    context = context_acquire(device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
     
    115113    else
    116114    {
     115#ifdef VBOX_WITH_WDDM
     116        Assert(0);
     117        /* doing Flush (rather than Finish) should be enough since we're serialized on the host in any way */
     118        wglFlush();
     119        ret = WINED3D_EVENT_QUERY_OK;
     120#else
    117121        ERR("Event query created despite lack of GL support\n");
    118122        ret = WINED3D_EVENT_QUERY_ERROR;
     123#endif
    119124    }
    120125
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