VirtualBox

Changeset 38565 in vbox for trunk/src/VBox/Additions/WINNT


Ignore:
Timestamp:
Aug 30, 2011 9:28:15 AM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
73733
Message:

wddm/3d: reuse window for wine swapchains representing one and the same 3d swapchain, bugfixes

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/common/wddm/VBoxMPIf.h

    r38112 r38565  
    321321    {
    322322        VBOXDISP_UMHANDLE hSwapchainUm;
    323         uint64_t u64Alignment;
     323        uint64_t hWnd;
     324        uint64_t u64Value;
    324325    };
    325326    VBOXVIDEOCM_CMD_RECTS Cmd;
    326327} VBOXVIDEOCM_CMD_RECTS_INTERNAL, *PVBOXVIDEOCM_CMD_RECTS_INTERNAL;
     328
     329typedef struct VBOXVIDEOCM_CMD_RECTS_HDR
     330{
     331    VBOXVIDEOCM_CMD_HDR Hdr;
     332    VBOXVIDEOCM_CMD_RECTS_INTERNAL Data;
     333} VBOXVIDEOCM_CMD_RECTS_HDR, *PVBOXVIDEOCM_CMD_RECTS_HDR;
    327334
    328335#define VBOXVIDEOCM_CMD_RECTS_INTERNAL_SIZE4CRECTS(_cRects) (RT_OFFSETOF(VBOXVIDEOCM_CMD_RECTS_INTERNAL, Cmd.RectsInfo.aRects[(_cRects)]))
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispCm.cpp

    r37626 r38565  
    225225}
    226226
     227HRESULT vboxDispCmCmdSessionInterruptWait(PVBOXDISPCM_SESSION pSession)
     228{
     229    SetEvent(pSession->hEvent);
     230    return S_OK;
     231}
     232
    227233HRESULT vboxDispCmSessionCmdGet(PVBOXDISPCM_SESSION pSession, PVBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD pCmd, uint32_t cbCmd, DWORD dwMilliseconds)
    228234{
     
    275281}
    276282
     283HRESULT vboxDispCmCmdInterruptWait()
     284{
     285    return vboxDispCmCmdSessionInterruptWait(&g_pVBoxCmMgr.Session);
     286}
     287
    277288void vboxDispCmLog(LPCSTR pszMsg)
    278289{
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispCm.h

    r36867 r38565  
    3131HRESULT vboxDispCmCmdGet(PVBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD pCmd, uint32_t cbCmd, DWORD dwMilliseconds);
    3232
     33HRESULT vboxDispCmCmdInterruptWait();
     34
    3335void vboxDispCmLog(LPCSTR pszMsg);
    3436
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp

    r38363 r38565  
    23982398                    }
    23992399                }
     2400
     2401                /* re-use swapchain window
     2402                 * this will invalidate the previusly used swapchain */
     2403                Params.hDeviceWindow = pSwapchain->hWnd;
    24002404
    24012405                hr = pDevice->pDevice9If->CreateAdditionalSwapChain(&Params, &pNewIf);
     
    59195923                VBOXVDBG_BREAK_SHARED(pSrcRc);
    59205924                VBOXVDBG_BREAK_SHARED(pDstRc);
    5921                 VBOXVDBG_DUMP_BLT_ENTER(pSrcAlloc, pSrcSurfIf, &pData->SrcRect, pDstAlloc, pDstSurfIf, &pData->DstRect);
     5925                if (   pSrcAlloc->SurfDesc.width == 658 && pSrcAlloc->SurfDesc.height == 493
     5926                    && pData->SrcRect.left == 0 && pData->SrcRect.top == 0
     5927                    && pData->SrcRect.right == 658 && pData->SrcRect.bottom == 493
     5928                    && pDstAlloc->SurfDesc.width == 756 && pDstAlloc->SurfDesc.height == 493
     5929                    && pData->DstRect.left == 0 && pData->DstRect.top == 0
     5930                    && pData->DstRect.right == 658 && pData->DstRect.bottom == 493)
     5931                {
     5932                    VBOXVDBG_DUMP_BLT_ENTER(pSrcAlloc, pSrcSurfIf, &pData->SrcRect, pDstAlloc, pDstSurfIf, &pData->DstRect);
     5933                }
    59225934
    59235935                /* we support only Point & Linear, we ignore [Begin|Continue|End]PresentToDwm */
     
    59305942                Assert(hr == S_OK);
    59315943
    5932                 VBOXVDBG_DUMP_BLT_LEAVE(pSrcAlloc, pSrcSurfIf, &pData->SrcRect, pDstAlloc, pDstSurfIf, &pData->DstRect);
     5944                if (   pSrcAlloc->SurfDesc.width == 658 && pSrcAlloc->SurfDesc.height == 493
     5945                    && pData->SrcRect.left == 0 && pData->SrcRect.top == 0
     5946                    && pData->SrcRect.right == 658 && pData->SrcRect.bottom == 493
     5947                    && pDstAlloc->SurfDesc.width == 756 && pDstAlloc->SurfDesc.height == 493
     5948                    && pData->DstRect.left == 0 && pData->DstRect.top == 0
     5949                    && pData->DstRect.right == 658 && pData->DstRect.bottom == 493)
     5950                {
     5951                    VBOXVDBG_DUMP_BLT_LEAVE(pSrcAlloc, pSrcSurfIf, &pData->SrcRect, pDstAlloc, pDstSurfIf, &pData->DstRect);
     5952                }
    59335953
    59345954                pSrcSurfIf->Release();
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.cpp

    r37490 r38565  
    15321532{
    15331533    PVBOXVIDPNCOFUNCMODALITY pCbContext = (PVBOXVIDPNCOFUNCMODALITY)pContext;
    1534     D3DKMDT_VIDPN_PRESENT_PATH AdjustedPath = {};
     1534    D3DKMDT_VIDPN_PRESENT_PATH AdjustedPath = {0};
    15351535    NTSTATUS Status = STATUS_SUCCESS;
    15361536    bool bUpdatePath = false;
     
    17711771        paItems[i].enmState = VBOXVIDPNPATHITEM_STATE_NOT_EXISTS;
    17721772    }
    1773     VBOXVIDPNGETPATHSINFO CbContext = {};
     1773    VBOXVIDPNGETPATHSINFO CbContext = {0};
    17741774    CbContext.Status = STATUS_SUCCESS;
    17751775    CbContext.fBreakOnDisabled = fBreakOnDisabled;
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp

    r38405 r38565  
    517517{
    518518    NTSTATUS Status = STATUS_SUCCESS;
    519     bool bChanged[VBOX_VIDEO_MAX_SCREENS] = {};
     519    bool bChanged[VBOX_VIDEO_MAX_SCREENS] = {0};
    520520    int i;
    521521
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/arb_program_shader.c

    r38331 r38565  
    69646964    if (dst_swapchain && (IWineD3DSurface *)dst_surface == dst_swapchain->frontBuffer)
    69656965    {
     6966#ifndef VBOX_WITH_WDDM
    69666967        RECT windowsize;
    69676968        POINT offset = {0,0};
    69686969        UINT h;
    6969 #ifdef VBOX_WITH_WDDM
     6970# ifdef VBOX_WITH_WDDM
    69706971        HWND hWnd = context->currentSwapchain->win_handle;
    69716972        ClientToScreen(hWnd, &offset);
    69726973        GetClientRect(hWnd, &windowsize);
    6973 #else
     6974# else
    69746975        ClientToScreen(context->win_handle, &offset);
    69756976        GetClientRect(context->win_handle, &windowsize);
    6976 #endif
     6977# endif
    69776978        h = windowsize.bottom - windowsize.top;
    69786979        dst_rect.left -= offset.x; dst_rect.right -=offset.x;
    69796980        dst_rect.top -= offset.y; dst_rect.bottom -=offset.y;
    69806981        dst_rect.top += dst_surface->currentDesc.Height - h; dst_rect.bottom += dst_surface->currentDesc.Height - h;
     6982#endif
    69816983    }
    69826984    else if (surface_is_offscreen((IWineD3DSurface *)dst_surface))
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/context.c

    r38438 r38565  
    737737static BOOL swapchain_validate(IWineD3DSwapChainImpl *swapchain)
    738738{
    739     HWND hWnd = WindowFromDC(swapchain->hDC);
    740     if (hWnd != swapchain->win_handle)
    741     {
    742         ERR("Unexpected swapchain for dc %p window expected %p, but was %p.\n", swapchain->hDC, swapchain->win_handle, hWnd);
     739    if (!swapchain->hDC)
     740    {
     741        ERR("NULL hDC");
    743742        return FALSE;
    744743    }
     744
     745#ifdef DEBUG
     746    {
     747        HWND hWnd = WindowFromDC(swapchain->hDC);
     748        if (hWnd != swapchain->win_handle)
     749        {
     750            ERR("Unexpected swapchain for dc %p window expected %p, but was %p.\n", swapchain->hDC, swapchain->win_handle, hWnd);
     751        }
     752    }
     753#endif
    745754    return TRUE;
    746755}
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/device.c

    r38363 r38565  
    66366636                        pPresentationParameters->BackBufferHeight);
    66376637            } else {
     6638#ifndef VBOX_WITH_WDDM
    66386639                /* Fullscreen -> fullscreen mode change */
    66396640                MoveWindow(swapchain->device_window, 0, 0,
    66406641                           pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight,
    66416642                           TRUE);
     6643#else
     6644                ERR("reset: fullscreen unexpected!");
     6645#endif
    66426646            }
    66436647        }
     
    66766680    if(wined3d_settings.offscreen_rendering_mode == ORM_FBO)
    66776681    {
     6682#ifndef VBOX_WITH_WDDM
    66786683        RECT client_rect;
    66796684        GetClientRect(swapchain->win_handle, &client_rect);
     6685#endif
    66806686
    66816687        if(!swapchain->presentParms.BackBufferCount)
     
    66846690            swapchain->render_to_fbo = FALSE;
    66856691        }
     6692#ifndef VBOX_WITH_WDDM
    66866693        else if(swapchain->presentParms.BackBufferWidth  != client_rect.right  ||
    66876694                swapchain->presentParms.BackBufferHeight != client_rect.bottom )
     
    66936700            swapchain->render_to_fbo = TRUE;
    66946701        }
     6702#endif
    66956703        else
    66966704        {
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/surface.c

    r38331 r38565  
    31913191    hr = IWineD3DSwapChain_Present((IWineD3DSwapChain *)swapchain,
    31923192            NULL, NULL, swapchain->win_handle, NULL, 0);
     3193
    31933194    IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain);
    31943195    return hr;
     
    36473648    if(dstSwapchain && dstSwapchain == srcSwapchain && dstSwapchain->backBuffer &&
    36483649       ((IWineD3DSurface *) This == dstSwapchain->frontBuffer) && SrcSurface == dstSwapchain->backBuffer[0]) {
     3650#ifdef VBOX_WITH_WDDM
     3651        ERR("should never be here!!");
     3652#endif
    36493653        /* Half-life does a Blt from the back buffer to the front buffer,
    36503654         * Full surface size, no flags... Use present instead
     
    38893893         */
    38903894        if (dstSwapchain && (IWineD3DSurface *)This == dstSwapchain->frontBuffer) {
     3895#ifndef VBOX_WITH_WDDM
    38913896            RECT windowsize;
    38923897            POINT offset = {0,0};
     
    39043909            dst_rect.top -= offset.y; dst_rect.bottom -=offset.y;
    39053910            dst_rect.top += This->currentDesc.Height - h; dst_rect.bottom += This->currentDesc.Height - h;
     3911#endif
    39063912        }
    39073913        else if (surface_is_offscreen((IWineD3DSurface *)This))
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/surface_gdi.c

    r33656 r38565  
    252252    hr = IWineD3DSwapChain_Present((IWineD3DSwapChain *)swapchain,
    253253            NULL, NULL, swapchain->win_handle, NULL, 0);
     254
    254255    IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain);
    255256    return hr;
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/swapchain.c

    r38363 r38565  
    4545#define GLINFO_LOCATION This->device->adapter->gl_info
    4646
     47#ifdef VBOX_WITH_WDDM
     48
     49IWineD3DSwapChainImpl * swapchain_find(IWineD3DDeviceImpl *pDevice, HWND hWnd)
     50{
     51    int i;
     52    for (i = 0; i < pDevice->NumberOfSwapChains; ++i)
     53    {
     54        IWineD3DSwapChainImpl *pSwapchain = (IWineD3DSwapChainImpl*)pDevice->swapchains[i];
     55        if (pSwapchain->win_handle == hWnd)
     56        {
     57            return pSwapchain;
     58        }
     59    }
     60
     61    return NULL;
     62}
     63
     64VOID swapchain_invalidate(IWineD3DSwapChainImpl *pSwapchain)
     65{
     66    pSwapchain->win_handle = NULL;
     67    pSwapchain->hDC = NULL;
     68}
     69
     70#endif
     71
    4772/*IWineD3DSwapChain parts follow: */
    4873static void WINAPI IWineD3DSwapChainImpl_Destroy(IWineD3DSwapChain *iface)
     
    107132    }
    108133#ifdef VBOX_WITH_WDDM
    109     if(This->device_window) {
    110         /* see VBoxExtGet/ReleaseDC for comments */
    111         VBoxExtWndDestroy(This->device_window, This->hDC);
     134    if(This->win_handle) {
     135        VBoxExtWndDestroy(This->win_handle, This->hDC);
     136        swapchain_invalidate(This);
    112137    }
    113138    else
    114139    {
    115         ERR("null device window");
     140        WARN("null win info");
    116141    }
    117142#else
     
    243268    unsigned int sync;
    244269    int retval;
     270
     271#ifdef VBOX_WITH_WDDM
     272    /* quickly sort out invalid swapchains */
     273    if (!This->hDC)
     274    {
     275        WARN("Invalid swapchain");
     276        return WINED3D_OK;
     277    }
     278#endif
    245279
    246280    IWineD3DSwapChain_SetDestWindowOverride(iface, hDestWindowOverride);
     
    291325         */
    292326        if (This->presentParms.Windowed) {
     327#ifdef VBOX_WITH_WDDM
     328            /* @todo: can we actualy be here? */
     329#endif
    293330            MapWindowPoints(NULL, This->win_handle, (LPPOINT)&destRect, 2);
    294331        }
     
    330367
    331368    if (pDestRect) dst_rect = *pDestRect;
    332     else GetClientRect(This->win_handle, &dst_rect);
     369#ifndef VBOX_WITH_WDDM
     370    else
     371        GetClientRect(This->win_handle, &dst_rect);
    333372
    334373    if (!render_to_fbo && (dst_rect.left || dst_rect.top
     
    338377        render_to_fbo = TRUE;
    339378    }
     379#else
     380    else
     381    {
     382        dst_rect.left = 0;
     383        dst_rect.top = 0;
     384        dst_rect.right = This->presentParms.BackBufferWidth;
     385        dst_rect.bottom = This->presentParms.BackBufferHeight;
     386    }
     387#endif
    340388
    341389    /* Rendering to a window of different size, presenting partial rectangles,
     
    568616static HRESULT WINAPI IWineD3DSwapChainImpl_SetDestWindowOverride(IWineD3DSwapChain *iface, HWND window)
    569617{
     618#ifndef VBOX_WITH_WDDM
    570619    IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)iface;
    571620
     
    575624    TRACE("Setting swapchain %p window from %p to %p\n", swapchain, swapchain->win_handle, window);
    576625    swapchain->win_handle = window;
    577 
     626#endif
    578627    return WINED3D_OK;
    579628}
     
    619668void swapchain_setup_fullscreen_window(IWineD3DSwapChainImpl *swapchain, UINT w, UINT h)
    620669{
     670#ifdef VBOX_WITH_WDDM
     671    ERR("not supported");
     672#else
    621673    IWineD3DDeviceImpl *device = swapchain->device;
    622674    HWND window = swapchain->device_window;
     
    649701
    650702    device->filter_messages = filter_messages;
     703#endif
    651704}
    652705
    653706void swapchain_restore_fullscreen_window(IWineD3DSwapChainImpl *swapchain)
    654707{
     708#ifdef VBOX_WITH_WDDM
     709    ERR("not supported");
     710#else
    655711    IWineD3DDeviceImpl *device = swapchain->device;
    656712    HWND window = swapchain->device_window;
     
    685741    device->style = 0;
    686742    device->exStyle = 0;
     743#endif
    687744}
    688745
     
    698755    HWND window = NULL;
    699756#ifdef VBOX_WITH_WDDM
     757    IWineD3DSwapChainImpl *overridenSwapchain = NULL;
    700758    HDC hDC = NULL;
    701759#endif
     
    734792    if (present_parameters->hDeviceWindow)
    735793    {
    736         ERR("non-null device window");
    737         return E_FAIL;
    738     }
    739     hr = VBoxExtWndCreate(present_parameters->BackBufferWidth, present_parameters->BackBufferHeight, &window, &hDC);
    740     if (FAILED(hr))
    741     {
    742         ERR("VBoxExtWndCreate failed, hr 0x%x", hr);
    743         return hr;
     794        overridenSwapchain = swapchain_find(device, present_parameters->hDeviceWindow);
     795        if (!overridenSwapchain)
     796        {
     797            ERR("invalid window handle supplied");
     798            return E_FAIL;
     799        }
     800
     801        window = overridenSwapchain->win_handle;
     802        hDC = overridenSwapchain->hDC;
     803    }
     804    else
     805    {
     806        hr = VBoxExtWndCreate(present_parameters->BackBufferWidth, present_parameters->BackBufferHeight, &window, &hDC);
     807        if (FAILED(hr))
     808        {
     809            ERR("VBoxExtWndCreate failed, hr 0x%x", hr);
     810            return hr;
     811        }
    744812    }
    745813    Assert(window);
     
    754822    swapchain->ref = 1;
    755823    swapchain->win_handle = window;
     824#ifndef VBOX_WITH_WDDM
    756825    swapchain->device_window = window;
    757 #ifdef VBOX_WITH_WDDM
     826#else
    758827    Assert(window);
    759828    swapchain->hDC = hDC;
     
    772841    format_desc = getFormatDescEntry(mode.Format, &adapter->gl_info);
    773842
     843#ifndef VBOX_WITH_WDDM
    774844    GetClientRect(window, &client_rect);
     845#else
     846    client_rect.left = 0;
     847    client_rect.top = 0;
     848    client_rect.right = present_parameters->BackBufferWidth;
     849    client_rect.bottom = present_parameters->BackBufferHeight;
     850#endif
    775851    if (present_parameters->Windowed
    776852            && (!present_parameters->BackBufferWidth || !present_parameters->BackBufferHeight
     
    9661042    IWineD3DSwapChain_GetGammaRamp((IWineD3DSwapChain *)swapchain, &swapchain->orig_gamma);
    9671043
     1044#ifdef VBOX_WITH_WDDM
     1045    if (overridenSwapchain)
     1046    {
     1047        swapchain_invalidate(overridenSwapchain);
     1048    }
     1049#endif
     1050
    9681051    return WINED3D_OK;
    9691052
     
    10181101
    10191102#ifdef VBOX_WITH_WDDM
    1020     if (swapchain->device_window)
    1021     {
    1022         VBoxExtWndDestroy(swapchain->device_window, swapchain->hDC);
    1023     }
     1103    if (!overridenSwapchain && swapchain->win_handle)
     1104    {
     1105        VBoxExtWndDestroy(swapchain->win_handle, swapchain->hDC);
     1106    }
     1107
     1108    swapchain_invalidate(swapchain);
    10241109#endif
    10251110
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/swapchain_base.c

    r34304 r38565  
    191191    IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface;
    192192    HDC hDC;
     193    HWND hWnd;
     194#ifndef VBOX_WITH_WDDM
     195    hWnd = This->device_window;
     196#else
     197    hWnd = This->win_handle;
     198#endif
    193199    TRACE("(%p) : pRamp@%p flags(%d)\n", This, pRamp, Flags);
    194     hDC = GetDC(This->device_window);
     200    hDC = GetDC(hWnd);
    195201    SetDeviceGammaRamp(hDC, (LPVOID)pRamp);
    196     ReleaseDC(This->device_window, hDC);
     202    ReleaseDC(hWnd, hDC);
    197203    return WINED3D_OK;
    198204
     
    203209    IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface;
    204210    HDC hDC;
     211    HWND hWnd;
     212#ifndef VBOX_WITH_WDDM
     213    hWnd = This->device_window;
     214#else
     215    hWnd = This->win_handle;
     216#endif
    205217    TRACE("(%p) : pRamp@%p\n", This, pRamp);
    206     hDC = GetDC(This->device_window);
     218    hDC = GetDC(hWnd);
    207219    GetDeviceGammaRamp(hDC, pRamp);
    208     ReleaseDC(This->device_window, hDC);
    209     return WINED3D_OK;
    210 
    211 }
     220    ReleaseDC(hWnd, hDC);
     221    return WINED3D_OK;
     222
     223}
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/wined3d_gl.h

    r38146 r38565  
    13801380PROC (WINAPI *pwglGetProcAddress)(LPCSTR) DECLSPEC_HIDDEN;
    13811381BOOL (WINAPI *pwglMakeCurrent)(HDC, HGLRC) DECLSPEC_HIDDEN;
    1382 BOOL (WINAPI *pwglSwapLayerBuffers)(HDC) DECLSPEC_HIDDEN;
     1382BOOL (WINAPI *pwglSwapLayerBuffers)(HDC, UINT) DECLSPEC_HIDDEN;
    13831383BOOL (WINAPI *pwglShareLists)(HGLRC, HGLRC) DECLSPEC_HIDDEN;
    13841384
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/wined3d_private.h

    r38363 r38565  
    26862686    struct wined3d_context **context;
    26872687    unsigned int            num_contexts;
    2688 #endif
    2689 
    26902688    HWND                    win_handle;
    26912689    HWND device_window;
    2692 #ifdef VBOX_WITH_WDDM
    26932690    HDC hDC;
     2691#else
     2692    HWND                    win_handle;
     2693    HDC                     hDC;
     2694//    WineWndInfo *pWndInfo;
    26942695#endif
    26952696};
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