VirtualBox

Ignore:
Timestamp:
Sep 13, 2010 5:59:01 PM (14 years ago)
Author:
vboxsync
Message:

wddm/3d: wine multi-swapchain fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/context.c

    r31828 r32461  
    331331{
    332332    const struct wined3d_gl_info *gl_info = context->gl_info;
     333#ifdef VBOXWDDM
     334    IWineD3DDeviceImpl *device = context->device;
     335#else
    333336    IWineD3DDeviceImpl *device = context->swapchain->device;
     337#endif
    334338    struct fbo_entry *entry;
    335339
     
    348352{
    349353    const struct wined3d_gl_info *gl_info = context->gl_info;
     354#ifdef VBOXWDDM
     355    IWineD3DDeviceImpl *device = context->device;
     356#else
    350357    IWineD3DDeviceImpl *device = context->swapchain->device;
     358#endif
    351359
    352360    context_bind_fbo(context, GL_FRAMEBUFFER, &entry->id);
     
    377385{
    378386    const struct wined3d_gl_info *gl_info = context->gl_info;
     387#ifdef VBOXWDDM
     388    IWineD3DDeviceImpl *device = context->device;
     389#else
    379390    IWineD3DDeviceImpl *device = context->swapchain->device;
     391#endif
    380392    struct fbo_entry *entry;
    381393
     
    413425{
    414426    const struct wined3d_gl_info *gl_info = context->gl_info;
     427#ifdef VBOXWDDM
     428    IWineD3DDeviceImpl *device = context->device;
     429#else
    415430    IWineD3DDeviceImpl *device = context->swapchain->device;
     431#endif
    416432    unsigned int i;
    417433
     
    734750}
    735751
    736 static void context_update_window(struct wined3d_context *context)
    737 {
     752static void context_update_window(struct wined3d_context *context
     753#ifdef VBOXWDDM
     754        , IWineD3DSwapChainImpl *swapchain
     755#endif
     756        )
     757{
     758#ifdef VBOXWDDM
     759    TRACE("Updating context %p window from %p to %p.\n",
     760            context, context->win_handle, swapchain->win_handle);
     761#else
    738762    TRACE("Updating context %p window from %p to %p.\n",
    739763            context, context->win_handle, context->swapchain->win_handle);
     764#endif
    740765
    741766    if (context->valid)
     
    749774    else context->valid = 1;
    750775
     776#ifdef VBOXWDDM
     777    context->win_handle = swapchain->win_handle;
     778    context->hdc = GetDC(context->win_handle);
     779    context->currentSwapchain = swapchain;
     780#else
    751781    context->win_handle = context->swapchain->win_handle;
    752782
     
    756786        goto err;
    757787    }
     788#endif
    758789
    759790    if (!context_set_pixel_format(context->gl_info, context->hdc, context->pixel_format))
     
    777808}
    778809
    779 static void context_validate(struct wined3d_context *context)
     810static void context_validate(struct wined3d_context *context
     811#ifdef VBOXWDDM
     812        , IWineD3DSwapChainImpl *swapchain
     813#endif
     814        )
    780815{
    781816    HWND wnd = WindowFromDC(context->hdc);
     
    788823    }
    789824
    790     if (context->win_handle != context->swapchain->win_handle)
    791         context_update_window(context);
     825    if (
     826#ifdef VBOXWDDM
     827            swapchain && context->win_handle != swapchain->win_handle
     828#else
     829            context->win_handle != context->swapchain->win_handle
     830#endif
     831            )
     832    {
     833        context_update_window(context
     834#ifdef VBOXWDDM
     835                , swapchain
     836#endif
     837                );
     838    }
    792839}
    793840
     
    805852    restore_dc = pwglGetCurrentDC();
    806853
    807     context_validate(context);
     854    context_validate(context
     855#ifdef VBOXWDDM
     856            , NULL//context->device->swapchains[0]
     857#endif
     858            );
    808859    if (context->valid && restore_ctx != context->glCtx) pwglMakeCurrent(context->hdc, context->glCtx);
    809860    else restore_ctx = NULL;
     
    12101261}
    12111262
     1263
     1264
     1265
    12121266/*****************************************************************************
    12131267 * context_create
     
    13611415    }
    13621416
     1417#ifdef VBOXWDDM
     1418    ret->device = device;
     1419    ret->currentSwapchain = swapchain;
     1420#else
    13631421    ret->swapchain = swapchain;
     1422#endif
    13641423    ret->current_rt = (IWineD3DSurface *)target;
    13651424    ret->tid = GetCurrentThreadId();
     
    15291588    return NULL;
    15301589}
     1590
     1591#ifdef VBOXWDDM
     1592static void context_setup_target(IWineD3DDeviceImpl *device, struct wined3d_context *context, IWineD3DSurface *target);
     1593
     1594struct wined3d_context *context_find_create(IWineD3DDeviceImpl *device, IWineD3DSwapChainImpl *swapchain, IWineD3DSurfaceImpl *target,
     1595        const struct wined3d_format_desc *ds_format_desc)
     1596{
     1597    IWineD3DSwapChainImpl *swapChain = NULL;
     1598    int i, j;
     1599    int swapchains = IWineD3DDevice_GetNumberOfSwapChains(device);
     1600    DWORD tid = GetCurrentThreadId();
     1601    struct wined3d_context *context = NULL;
     1602
     1603    Assert(0);
     1604
     1605    for(i = 0 ; i < swapchains ; i ++)
     1606    {
     1607        IWineD3DDevice_GetSwapChain(device, i, &swapChain);
     1608        if (swapChain->ds_format == ds_format_desc)
     1609        {
     1610            for(j = 0; j < swapChain->num_contexts; j++) {
     1611                if(swapChain->context[j]->tid == tid
     1612                        && swapChain->context[j]->tid == tid) {
     1613                    context = swapChain->context[j];
     1614                    break;
     1615                }
     1616            }
     1617        }
     1618        else
     1619        {
     1620            Assert(0);
     1621        }
     1622
     1623        if (context)
     1624            break;
     1625        IWineD3DSwapChain_Release(swapChain);
     1626    }
     1627
     1628    if (!context)
     1629    {
     1630        Assert(!swapchains);
     1631        context = context_create(swapchain, target, ds_format_desc);
     1632    }
     1633    else
     1634    {
     1635        Assert(swapChain);
     1636        context_validate(context, swapChain);
     1637        context_setup_target(device, context, target);
     1638        context_enter(context);
     1639        Assert(context->valid);
     1640        IWineD3DSwapChain_Release(swapChain);
     1641    }
     1642
     1643    return context;
     1644}
     1645#endif
    15311646
    15321647/*****************************************************************************
     
    18071922            return ((IWineD3DSwapChainImpl *) swapchain)->context[i];
    18081923        }
    1809 
    1810     }
     1924    }
     1925
     1926#ifdef VBOXWDDM
     1927    Assert(0);
     1928#endif
    18111929
    18121930    /* Create a new context for the thread */
     
    18391957        if (current_context
    18401958                && current_context->current_rt
    1841                 && current_context->swapchain->device == This)
     1959#ifdef VBOXWDDM
     1960                && current_context->device == This
     1961#else
     1962                && current_context->swapchain->device == This
     1963#endif
     1964                )
    18421965        {
    18431966            target = current_context->current_rt;
     
    18531976    if (current_context && current_context->current_rt == target)
    18541977    {
    1855         context_validate(current_context);
     1978        context_validate(current_context
     1979#ifdef VBOXWDDM
     1980                , NULL// current_context->device->swapchains[0]
     1981#endif
     1982                                                    );
    18561983        return current_context;
    18571984    }
     
    18621989        context = findThreadContextForSwapChain(swapchain, tid);
    18631990        IWineD3DSwapChain_Release(swapchain);
     1991#ifdef VBOXWDDM
     1992        context_validate(context, swapchain);
     1993#endif
    18641994    }
    18651995    else
     
    18681998
    18691999        /* Stay with the currently active context. */
    1870         if (current_context && current_context->swapchain->device == This)
     2000        if (current_context
     2001#ifdef VBOXWDDM
     2002                && current_context->device == This
     2003#else
     2004                && current_context->swapchain->device == This
     2005#endif
     2006                )
    18712007        {
    18722008            context = current_context;
     
    18822018            context = findThreadContextForSwapChain(This->swapchains[0], tid);
    18832019        }
    1884     }
    1885 
     2020#ifdef VBOXWDDM
     2021        context_validate(context,
     2022                NULL//This->swapchains[0]
     2023                                 );
     2024#endif
     2025    }
     2026
     2027#ifndef VBOXWDDM
    18862028    context_validate(context);
     2029#endif
    18872030
    18882031    return context;
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