VirtualBox

Changeset 31868 in vbox for trunk/src/VBox/Additions


Ignore:
Timestamp:
Aug 23, 2010 3:22:09 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
65076
Message:

wddm/3d: wine: flush implementation basics

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

Legend:

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

    r31797 r31868  
    41544154    {
    41554155        Assert(pDevice->cScreens);
    4156         for (UINT i = 0; i < RT_ELEMENTS(pDevice->aScreens); ++i)
     4156        UINT cProcessed = 0;
     4157        for (UINT i = 0; cProcessed < pDevice->cScreens && i < RT_ELEMENTS(pDevice->aScreens); ++i)
    41574158        {
    41584159            PVBOXWDDMDISP_SCREEN pScreen = &pDevice->aScreens[i];
    41594160            if (pScreen->pDevice9If)
    41604161            {
    4161                 /* @todo: make a flush */
     4162                ++cProcessed;
     4163                if (pScreen->pRenderTargetRc->cAllocations == 1)
     4164                {
     4165                    hr = pScreen->pDevice9If->Present(NULL, NULL, NULL, NULL);
     4166                    Assert(hr == S_OK);
     4167                }
     4168                else
     4169                {
     4170                    hr = pDevice->pAdapter->D3D.pfnVBoxWineExD3DDev9Flush((IDirect3DDevice9Ex*)pScreen->pDevice9If);
     4171                    Assert(hr == S_OK);
     4172                }
    41624173            }
    41634174        }
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3DIf.cpp

    r30916 r31868  
    3939            if (pD3D->pfnVBoxWineExD3DDev9CreateTexture)
    4040            {
    41                 return S_OK;
     41                pD3D->pfnVBoxWineExD3DDev9Flush = (PFNVBOXWINEEXD3DDEV9_FLUSH)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DDev9Flush");
     42                Assert(pD3D->pfnVBoxWineExD3DDev9Flush);
     43                if (pD3D->pfnVBoxWineExD3DDev9Flush)
     44                {
     45                    return S_OK;
     46                }
    4247            }
    4348        }
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3DIf.h

    r30916 r31868  
    3535    PFNVBOXWINEEXD3DDEV9_CREATETEXTURE pfnVBoxWineExD3DDev9CreateTexture;
    3636
     37    PFNVBOXWINEEXD3DDEV9_FLUSH pfnVBoxWineExD3DDev9Flush;
     38
    3739    /* module handle */
    3840    HMODULE hD3DLib;
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/d3d9/device.c

    r30925 r31868  
    714714
    715715#ifdef VBOXWDDM
     716#pragma comment(linker, "/export:VBoxWineExD3DDev9Flush=_VBoxWineExD3DDev9Flush@4")
     717
     718VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DDev9Flush(IDirect3DDevice9Ex *iface)
     719{
     720    IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
     721    HRESULT hr;
     722
     723    TRACE("iface %p, Flush\n", iface);
     724
     725    wined3d_mutex_lock();
     726    hr = IWineD3DDevice_Flush(This->WineD3DDevice);
     727    wined3d_mutex_unlock();
     728
     729    return hr;
     730}
     731
    716732#pragma comment(linker, "/export:VBoxWineExD3DDev9CreateTexture=_VBoxWineExD3DDev9CreateTexture@40")
    717733
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/include/wine/wined3d.h

    r30916 r31868  
    61266126        WINED3DGAMMARAMP *ramp);
    61276127
     6128#ifdef VBOXWDDM
     6129    HRESULT (STDMETHODCALLTYPE *Flush)(
     6130        IWineD3DSwapChain* This);
     6131#endif
    61286132    END_INTERFACE
    61296133} IWineD3DSwapChainVtbl;
     
    61516155#define IWineD3DSwapChain_SetGammaRamp(This,flags,ramp) (This)->lpVtbl->SetGammaRamp(This,flags,ramp)
    61526156#define IWineD3DSwapChain_GetGammaRamp(This,ramp) (This)->lpVtbl->GetGammaRamp(This,ramp)
     6157#ifdef VBOXWDDM
     6158#define IWineD3DSwapChain_Flush(This) (This)->lpVtbl->Flush(This)
     6159#endif
    61536160#endif
    61546161
     
    80548061    void (STDMETHODCALLTYPE *ReleaseFocusWindow)(
    80558062        IWineD3DDevice* This);
     8063
     8064#ifdef VBOXWDDM
     8065    HRESULT (STDMETHODCALLTYPE *Flush)(
     8066        IWineD3DDevice* This);
     8067#endif
    80568068
    80578069    END_INTERFACE
     
    82108222#define IWineD3DDevice_AcquireFocusWindow(This,window) (This)->lpVtbl->AcquireFocusWindow(This,window)
    82118223#define IWineD3DDevice_ReleaseFocusWindow(This) (This)->lpVtbl->ReleaseFocusWindow(This)
     8224#ifdef VBOXWDDM
     8225#define IWineD3DDevice_Flush(This) (This)->lpVtbl->Flush(This)
     8226#endif
    82128227#endif
    82138228
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/vbox/VBoxWineEx.h

    r31757 r31868  
    2828typedef FNVBOXWINEEXD3DDEV9_CREATETEXTURE *PFNVBOXWINEEXD3DDEV9_CREATETEXTURE;
    2929
     30typedef VBOXWINEEX_DECL(HRESULT) FNVBOXWINEEXD3DDEV9_FLUSH(IDirect3DDevice9Ex *iface);
     31typedef FNVBOXWINEEXD3DDEV9_FLUSH *PFNVBOXWINEEXD3DDEV9_FLUSH;
     32
    3033#ifdef __cplusplus
    3134extern "C"
     
    3740            void *pvClientMem); /* <- extension arg to pass in the client memory buffer,
    3841                                 *    applicable ONLY for SYSMEM textures */
     42
     43VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DDev9Flush(IDirect3DDevice9Ex *iface); /* perform glFlush */
    3944#ifdef __cplusplus
    4045}
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/device.c

    r30916 r31868  
    68366836    return WINED3DERR_INVALIDCALL;
    68376837}
     6838
     6839#ifdef VBOXWDDM
     6840static HRESULT WINAPI IWineD3DDeviceImpl_Flush(IWineD3DDevice *iface)
     6841{
     6842    IWineD3DSwapChain *swapChain = NULL;
     6843    int i;
     6844    int swapchains = IWineD3DDeviceImpl_GetNumberOfSwapChains(iface);
     6845
     6846    TRACE("iface %p.\n", iface);
     6847
     6848    for(i = 0 ; i < swapchains ; i ++) {
     6849
     6850        IWineD3DDeviceImpl_GetSwapChain(iface, i, &swapChain);
     6851        TRACE("presentinng chain %d, %p\n", i, swapChain);
     6852        IWineD3DSwapChain_Flush(swapChain);
     6853        IWineD3DSwapChain_Release(swapChain);
     6854    }
     6855
     6856    return WINED3D_OK;
     6857}
     6858
     6859#endif
    68386860
    68396861/**********************************************************
     
    69897011    IWineD3DDeviceImpl_AcquireFocusWindow,
    69907012    IWineD3DDeviceImpl_ReleaseFocusWindow,
     7013#ifdef VBOXWDDM
     7014    /* VBox WDDM extensions */
     7015    IWineD3DDeviceImpl_Flush,
     7016#endif
    69917017};
    69927018
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/swapchain.c

    r28475 r31868  
    540540}
    541541
     542#ifdef VBOXWDDM
     543static HRESULT WINAPI IWineD3DSwapChainImpl_Flush(IWineD3DSwapChain *iface)
     544{
     545    IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface;
     546    struct wined3d_context *context;
     547    RECT src_rect, dst_rect;
     548    BOOL render_to_fbo;
     549    unsigned int sync;
     550    int retval;
     551
     552    context = context_acquire(This->device, This->backBuffer[0], CTXUSAGE_RESOURCELOAD);
     553
     554    if (context->valid) wglFlush();
     555    else  WARN("Invalid context, skipping flush.\n");
     556
     557    context_release(context);
     558
     559    return WINED3D_OK;
     560}
     561#endif
     562
    542563static const IWineD3DSwapChainVtbl IWineD3DSwapChain_Vtbl =
    543564{
     
    558579    IWineD3DBaseSwapChainImpl_GetPresentParameters,
    559580    IWineD3DBaseSwapChainImpl_SetGammaRamp,
    560     IWineD3DBaseSwapChainImpl_GetGammaRamp
     581    IWineD3DBaseSwapChainImpl_GetGammaRamp,
     582#ifdef VBOXWDDM
     583    IWineD3DSwapChainImpl_Flush,
     584#endif
    561585};
    562586
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/swapchain_gdi.c

    r25949 r31868  
    252252    return WINED3D_OK;
    253253}
     254
     255#ifdef VBOXWDDM
     256static HRESULT WINAPI IWineGDISwapChainImpl_Flush(IWineD3DSwapChain *iface) {
     257    IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *) iface;
     258
     259    WARN("GDI Swapchain doesn't implement flush, returning WINED3DERR_INVALIDCALL\n");
     260    return WINED3DERR_INVALIDCALL;
     261}
     262#endif
    254263
    255264const IWineD3DSwapChainVtbl IWineGDISwapChain_Vtbl =
     
    271280    IWineD3DBaseSwapChainImpl_GetPresentParameters,
    272281    IWineD3DBaseSwapChainImpl_SetGammaRamp,
    273     IWineD3DBaseSwapChainImpl_GetGammaRamp
     282    IWineD3DBaseSwapChainImpl_GetGammaRamp,
     283#ifdef VBOXWDM
     284    IWineGDISwapChainImpl_Flush,
     285#endif
    274286};
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette