VirtualBox

Ignore:
Timestamp:
Aug 27, 2010 5:00:41 PM (14 years ago)
Author:
vboxsync
Message:

wddm/3d: wine: shared resource handling fixes

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

Legend:

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

    r31875 r32061  
    13591359}
    13601360
     1361static CRITICAL_SECTION g_VBoxCritSect;
     1362
     1363void vboxDispLock()
     1364{
     1365    EnterCriticalSection(&g_VBoxCritSect);
     1366}
     1367
     1368void vboxDispUnlock()
     1369{
     1370    LeaveCriticalSection(&g_VBoxCritSect);
     1371}
     1372
     1373void vboxDispLockInit()
     1374{
     1375    InitializeCriticalSection(&g_VBoxCritSect);
     1376}
     1377
    13611378/**
    13621379 * DLL entry point.
     
    13701387        case DLL_PROCESS_ATTACH:
    13711388        {
     1389            vboxDispLockInit();
     1390
    13721391            vboxVDbgPrint(("VBoxDispD3D: DLL loaded.\n"));
    13731392#ifdef VBOXWDDMDISP_DEBUG
     
    13861405#endif
    13871406                {
    1388                     hr = VBoxScreenMRunnerStart(&g_VBoxScreenMonRunner);
    1389                     Assert(hr == S_OK);
     1407//                    hr = VBoxScreenMRunnerStart(&g_VBoxScreenMonRunner);
     1408//                    Assert(hr == S_OK);
    13901409                    /* succeed in any way */
    13911410                    hr = S_OK;
     
    14101429            vboxVDbgVEHandlerUnregister();
    14111430#endif
    1412             HRESULT hr = VBoxScreenMRunnerStop(&g_VBoxScreenMonRunner);
    1413             Assert(hr == S_OK);
    1414             if (hr == S_OK)
     1431            HRESULT hr = S_OK;
     1432//            hr = VBoxScreenMRunnerStop(&g_VBoxScreenMonRunner);
     1433//            Assert(hr == S_OK);
     1434//            if (hr == S_OK)
    14151435            {
    14161436#ifdef VBOXDISPMP_TEST
     
    18501870        Assert(pRc->aAllocations[0].enmD3DIfType == VBOXDISP_D3DIFTYPE_TEXTURE);
    18511871        pD3DIfTex = (IDirect3DTexture9*)pRc->aAllocations[0].pD3DIf;
     1872#ifdef DEBUG_misha
     1873        bool bDo = false;
     1874
     1875        if (bDo)
     1876        {
     1877            vboxVDbgDumpSurfData((pDevice, "SetTexture:\n", pRc, 0 /* alloc index*/, NULL, NULL, "\n"));
     1878        }
     1879#endif
    18521880    }
    18531881    else
     
    57225750    vboxVDbgPrint(("==> "__FUNCTION__"\n"));
    57235751
     5752//    vboxDispLock();
     5753
     5754    HRESULT hr = E_FAIL;
     5755
     5756    do
     5757    {
     5758
    57245759    VBOXWDDM_QI Query;
    57255760    D3DDDICB_QUERYADAPTERINFO DdiQuery;
    57265761    DdiQuery.PrivateDriverDataSize = sizeof(Query);
    57275762    DdiQuery.pPrivateDriverData = &Query;
    5728     HRESULT hr = pOpenData->pAdapterCallbacks->pfnQueryAdapterInfoCb(pOpenData->hAdapter, &DdiQuery);
     5763    hr = pOpenData->pAdapterCallbacks->pfnQueryAdapterInfoCb(pOpenData->hAdapter, &DdiQuery);
    57295764    Assert(hr == S_OK);
    57305765    if (hr != S_OK)
    57315766    {
    57325767        vboxVDbgPrintR((__FUNCTION__": pfnQueryAdapterInfoCb failed, hr (%d)\n", hr));
    5733         return E_FAIL;
     5768        hr = E_FAIL;
     5769        break;
    57345770    }
    57355771
     
    57405776                VBOXVIDEOIF_VERSION,
    57415777                Query.u32Version));
    5742         return E_FAIL;
     5778        hr = E_FAIL;
     5779        break;
    57435780    }
    57445781
     
    57825819                if (hr == S_OK)
    57835820                {
     5821//                    Assert(0);
    57845822                    hr = pAdapter->D3D.pfnDirect3DCreate9Ex(D3D_SDK_VERSION, &pAdapter->pD3D9If);
    57855823                    Assert(hr == S_OK);
     
    58235861    }
    58245862
     5863    } while (0);
     5864
     5865//    vboxDispUnlock();
     5866
    58255867    vboxVDbgPrint(("<== "__FUNCTION__", hr (%d)\n", hr));
    58265868
     
    58515893        Assert(pRect->bottom > pRect->top);
    58525894        vboxVDbgMpPrintRect((pDevice, "rect: ", pRect, "\n"));
     5895    }
     5896
     5897    BOOL bReleaseSurf = false;
     5898    if (!pSurf)
     5899    {
     5900        HRESULT tmpHr = vboxWddmSurfGet(pRc, iAlloc, &pSurf);
     5901        Assert(tmpHr == S_OK);
     5902        bReleaseSurf = TRUE;
    58535903    }
    58545904    HRESULT srcHr = pSurf->LockRect(&Lr, NULL, D3DLOCK_READONLY);
     
    58765926        vboxVDbgMpPrint((pDevice, "%s\n", pSuffix));
    58775927    }
     5928
     5929    if (bReleaseSurf)
     5930        pSurf->Release();
    58785931}
    58795932
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxScreen.cpp

    r31756 r32061  
    479479{
    480480    PVBOXSCREENMONRUNNER pRunner = (PVBOXSCREENMONRUNNER)pvUser;
     481    Assert(0);
     482
     483    BOOL bRc = SetEvent(pRunner->hEvent);
     484    if (!bRc)
     485    {
     486        DWORD winErr = GetLastError();
     487        Log((__FUNCTION__": SetEvent failed, winErr = (%d)", winErr));
     488        HRESULT tmpHr = HRESULT_FROM_WIN32(winErr);
     489        Assert(0);
     490        Assert(tmpHr != S_OK);
     491    }
    481492
    482493    HRESULT hr = vboxScreenMonInit();
     
    497508    memset(pMon, 0, sizeof (VBOXSCREENMONRUNNER));
    498509
    499     pMon->hThread = CreateThread(NULL /* LPSECURITY_ATTRIBUTES lpThreadAttributes */,
    500                                           0 /* SIZE_T dwStackSize */,
    501                                           vboxScreenMRunnerThread,
    502                                           pMon,
    503                                           0 /* DWORD dwCreationFlags */,
    504                                           &pMon->idThread);
    505     if (pMon->hThread)
    506         return S_OK;
    507 
    508     DWORD winErr = GetLastError();
    509     Log((__FUNCTION__": CreateThread failed, winErr = (%d)", winErr));
    510     hr = HRESULT_FROM_WIN32(winErr);
    511     Assert(0);
    512     Assert(hr != S_OK);
     510    pMon->hEvent = CreateEvent(NULL, /* LPSECURITY_ATTRIBUTES lpEventAttributes*/
     511            FALSE, /* BOOL bManualReset*/
     512            FALSE, /* BOOL bInitialState */
     513            NULL /* LPCTSTR lpName */
     514          );
     515    if (pMon->hEvent)
     516    {
     517        pMon->hThread = CreateThread(NULL /* LPSECURITY_ATTRIBUTES lpThreadAttributes */,
     518                                              0 /* SIZE_T dwStackSize */,
     519                                              vboxScreenMRunnerThread,
     520                                              pMon,
     521                                              0 /* DWORD dwCreationFlags */,
     522                                              &pMon->idThread);
     523        if (pMon->hThread)
     524        {
     525            Assert(0);
     526            return S_OK;
     527        }
     528        else
     529        {
     530            DWORD winErr = GetLastError();
     531            Log((__FUNCTION__": CreateThread failed, winErr = (%d)", winErr));
     532            hr = HRESULT_FROM_WIN32(winErr);
     533            Assert(0);
     534            Assert(hr != S_OK);
     535        }
     536        CloseHandle(pMon->hEvent);
     537    }
     538    else
     539    {
     540        DWORD winErr = GetLastError();
     541        Log((__FUNCTION__": CreateEvent failed, winErr = (%d)", winErr));
     542        hr = HRESULT_FROM_WIN32(winErr);
     543        Assert(0);
     544        Assert(hr != S_OK);
     545    }
    513546
    514547    return hr;
     
    520553        return S_OK;
    521554
    522     BOOL bResult = PostThreadMessage(pMon->idThread, WM_QUIT, 0, 0);
    523     HRESULT hr = S_OK;
    524     if (bResult)
    525     {
    526         DWORD dwErr = WaitForSingleObject(pMon->hThread, INFINITE);
    527         if (dwErr == WAIT_OBJECT_0)
    528         {
    529             CloseHandle(pMon->hThread);
    530             pMon->hThread = 0;
     555    Assert(0);
     556
     557    HANDLE ahHandles[2];
     558    ahHandles[0] = pMon->hThread;
     559    ahHandles[1] = pMon->hEvent;
     560    DWORD dwResult = WaitForMultipleObjects(2, ahHandles,
     561      FALSE, /* BOOL bWaitAll */
     562      INFINITE /* DWORD dwMilliseconds */
     563    );
     564    HRESULT hr = E_FAIL;
     565    if (dwResult == WAIT_OBJECT_0 + 1) /* Event is signaled */
     566    {
     567        BOOL bResult = PostThreadMessage(pMon->idThread, WM_QUIT, 0, 0);
     568        if (bResult)
     569        {
     570            DWORD dwErr = WaitForSingleObject(pMon->hThread, INFINITE);
     571            if (dwErr == WAIT_OBJECT_0)
     572            {
     573                hr = S_OK;
     574            }
     575            else
     576            {
     577                DWORD winErr = GetLastError();
     578                hr = HRESULT_FROM_WIN32(winErr);
     579                Assert(0);
     580            }
    531581        }
    532582        else
    533583        {
    534584            DWORD winErr = GetLastError();
    535             hr = HRESULT_FROM_WIN32(winErr);
    536             Assert(0);
    537         }
     585            Assert(winErr != ERROR_SUCCESS);
     586            if (winErr == ERROR_INVALID_THREAD_ID)
     587            {
     588                hr = S_OK;
     589            }
     590            else
     591            {
     592                hr = HRESULT_FROM_WIN32(winErr);
     593                Assert(0);
     594            }
     595        }
     596    }
     597    else if (dwResult == WAIT_OBJECT_0)
     598    {
     599        /* thread has terminated already */
     600        hr = S_OK;
    538601    }
    539602    else
    540603    {
    541         DWORD winErr = GetLastError();
    542         Assert(winErr != ERROR_SUCCESS);
    543         if (winErr != ERROR_INVALID_THREAD_ID)
    544         {
    545             hr = HRESULT_FROM_WIN32(winErr);
    546             Assert(0);
    547         }
    548         /* else - treat as OK */
     604        Assert(0);
     605    }
     606
     607    if (hr == S_OK)
     608    {
     609        CloseHandle(pMon->hThread);
     610        pMon->hThread = 0;
     611        CloseHandle(pMon->hEvent);
     612        pMon->hThread = 0;
    549613    }
    550614
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxScreen.h

    r31687 r32061  
    5656    HANDLE hThread;
    5757    DWORD idThread;
     58    HANDLE hEvent;
    5859} VBOXSCREENMONRUNNER, *PVBOXSCREENMONRUNNER;
    5960
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/surface.c

    r31936 r32061  
    482482        return hr;
    483483    }
    484 #ifdef VBOXWDDM
    485     if (shared_handle && !*shared_handle)
    486     {
    487         *shared_handle = VBOXSHRC_GET_SHAREHANDLE(surface);
    488     }
    489 #endif
    490484
    491485    return hr;
     
    497491
    498492#if defined(DEBUG_misha) && defined (VBOXWDDM)
    499     if (VBOXSHRC_IS_SHARED(This))
     493    if (VBOXSHRC_IS_INITIALIZED(This))
    500494    {
    501495        Assert(0);
     
    20252019    ENTER_GL();
    20262020    glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_FALSE);
    2027     if(This->texture_name)
    2028     {
    2029         surface_bind_and_dirtify(This, FALSE);
    2030         glTexImage2D(This->texture_target, This->texture_level,
    2031                      GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
    2032     }
    2033     if(This->texture_name_srgb)
    2034     {
    2035         surface_bind_and_dirtify(This, TRUE);
    2036         glTexImage2D(This->texture_target, This->texture_level,
    2037                      GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
     2021#ifdef VBOXWDDM
     2022    if (!VBOXSHRC_IS_SHARED_OPENED(This))
     2023#endif
     2024    {
     2025        if(This->texture_name)
     2026        {
     2027            surface_bind_and_dirtify(This, FALSE);
     2028            glTexImage2D(This->texture_target, This->texture_level,
     2029                         GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
     2030        }
     2031        if(This->texture_name_srgb)
     2032        {
     2033            surface_bind_and_dirtify(This, TRUE);
     2034            glTexImage2D(This->texture_target, This->texture_level,
     2035                         GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
     2036        }
    20382037    }
    20392038    glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE);
     
    42804279        if(((This->Flags & SFLAG_INTEXTURE) && !(flag & SFLAG_INTEXTURE)) ||
    42814280           ((This->Flags & SFLAG_INSRGBTEX) && !(flag & SFLAG_INSRGBTEX))) {
    4282 #ifdef VBOXWDDM
    4283             if (VBOXSHRC_IS_SHARED(This))
    4284             {
    4285                 IWineD3DSurfaceImpl_LoadLocation(iface, SFLAG_INTEXTURE, NULL);
    4286             }
    4287             else
    4288 #endif
    42894281            if (IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **)&texture) == WINED3D_OK) {
    42904282                TRACE("Passing to container\n");
     
    42934285            }
    42944286        }
     4287
    42954288        This->Flags &= ~SFLAG_LOCATIONS;
    42964289        This->Flags |= flag;
     
    43044297    } else {
    43054298        if((This->Flags & (SFLAG_INTEXTURE | SFLAG_INSRGBTEX)) && (flag & (SFLAG_INTEXTURE | SFLAG_INSRGBTEX))) {
    4306 #ifdef VBOXWDDM
    4307             if (VBOXSHRC_IS_SHARED(This))
    4308             {
    4309                 IWineD3DSurfaceImpl_LoadLocation(iface, SFLAG_INTEXTURE, NULL);
    4310             }
    4311             else
    4312 #endif
    43134299            if (IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **)&texture) == WINED3D_OK) {
    43144300                TRACE("Passing to container\n");
     
    43174303            }
    43184304        }
     4305
    43194306        This->Flags &= ~flag;
    43204307    }
     4308
     4309#ifdef VBOXWDDM
     4310    if(VBOXSHRC_IS_INITIALIZED(This)) {
     4311        /* with the shared resource only texture can be considered valid
     4312         * to make sure changes done to the resource in the other device context are visible
     4313         * because the resource contents is shared via texture.
     4314         * This is why we ensure texture location is the one and only which is always valid */
     4315        if(!(This->Flags & SFLAG_INTEXTURE)) {
     4316            IWineD3DSurfaceImpl_LoadLocation(iface, SFLAG_INTEXTURE, NULL);
     4317        } else {
     4318            This->Flags &= ~SFLAG_LOCATIONS;
     4319            This->Flags |= SFLAG_INTEXTURE;
     4320        }
     4321    }
     4322#endif
    43214323
    43224324    if(!(This->Flags & SFLAG_LOCATIONS)) {
     
    46194621    }
    46204622
    4621     if(rect == NULL) {
    4622         This->Flags |= flag;
    4623     }
    4624 
    4625     if (in_fbo && (This->Flags & (SFLAG_INTEXTURE | SFLAG_INDRAWABLE))) {
    4626         /* With ORM_FBO, SFLAG_INTEXTURE and SFLAG_INDRAWABLE are the same for offscreen targets. */
    4627         This->Flags |= (SFLAG_INTEXTURE | SFLAG_INDRAWABLE);
     4623#ifdef VBOXWDDM
     4624    if (VBOXSHRC_IS_INITIALIZED(This))
     4625    {
     4626        /* with the shared resource only texture can be considered valid
     4627         * to make sure changes done to the resource in the other device context are visible
     4628         * because the resource contents is shared via texture.
     4629         * One can load and use other locations as needed,
     4630         * but they should be reloaded each time on each usage */
     4631        Assert(!!(This->Flags & SFLAG_INTEXTURE) || !!(flag & SFLAG_INTEXTURE));
     4632        This->Flags &= ~SFLAG_LOCATIONS;
     4633        This->Flags |= SFLAG_INTEXTURE;
     4634        /* @todo: SFLAG_INSRGBTEX ?? */
     4635//        if (in_fbo)
     4636//        {
     4637//            This->Flags |= SFLAG_INDRAWABLE;
     4638//        }
     4639    }
     4640    else
     4641#endif
     4642    {
     4643        if(rect == NULL) {
     4644            This->Flags |= flag;
     4645        }
     4646
     4647        if (in_fbo && (This->Flags & (SFLAG_INTEXTURE | SFLAG_INDRAWABLE))) {
     4648            /* With ORM_FBO, SFLAG_INTEXTURE and SFLAG_INDRAWABLE are the same for offscreen targets. */
     4649            This->Flags |= (SFLAG_INTEXTURE | SFLAG_INDRAWABLE);
     4650        }
    46284651    }
    46294652
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/texture.c

    r31936 r32061  
    620620    {
    621621        Assert(shared_handle);
     622        VBOXSHRC_SET_INITIALIZED(texture);
    622623        IWineD3DSurface_LoadLocation(texture->surfaces[0], SFLAG_INTEXTURE, NULL);
    623624        if (!VBOXSHRC_IS_SHARED_OPENED(texture))
     
    629630        {
    630631            Assert(*shared_handle);
     632            Assert(*shared_handle == VBOXSHRC_GET_SHAREHANDLE(texture));
    631633        }
    632634#ifdef DEBUG
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/vboxsharedrc.h

    r31936 r32061  
    1717#define ___vboxsharedrc_h___
    1818
    19 #define VBOXSHRC_F_SHARED         0x00000001 /* shared rc */
    20 #define VBOXSHRC_F_SHARED_OPENED  0x00000002 /* if set shared rc is opened, otherwise it is created */
     19#define VBOXSHRC_F_SHARED              0x00000001 /* shared rc */
     20#define VBOXSHRC_F_SHARED_OPENED       0x00000002 /* if set shared rc is opened, otherwise it is created */
     21#define VBOXSHRC_F_INITIALIZED         0x00000004 /* set once shared rc is initialized */
    2122
    2223#define VBOXSHRC_GET_SHAREFLAFS(_o) ((_o)->resource.sharerc_flags)
    2324#define VBOXSHRC_GET_SHAREHANDLE(_o) ((_o)->resource.sharerc_handle)
    2425#define VBOXSHRC_SET_SHAREHANDLE(_o, _h) ((_o)->resource.sharerc_handle = (_h))
     26#define VBOXSHRC_SET_INITIALIZED(_o) (VBOXSHRC_GET_SHAREFLAFS(_o) |= VBOXSHRC_F_INITIALIZED)
    2527#define VBOXSHRC_IS_SHARED(_o) (!!(VBOXSHRC_GET_SHAREFLAFS(_o) & VBOXSHRC_F_SHARED))
    2628#define VBOXSHRC_IS_SHARED_OPENED(_o) (!!(VBOXSHRC_GET_SHAREFLAFS(_o) & VBOXSHRC_F_SHARED_OPENED))
     29#define VBOXSHRC_IS_INITIALIZED(_o) (!!(VBOXSHRC_GET_SHAREFLAFS(_o) & VBOXSHRC_F_INITIALIZED))
    2730
    2831#ifdef DEBUG_misha
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