VirtualBox

Changeset 38331 in vbox


Ignore:
Timestamp:
Aug 5, 2011 3:29:06 PM (13 years ago)
Author:
vboxsync
Message:

wddm/wine: fix winsat crashes (context adjustments for multiswapchains), basics for window creation inside wine

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

Legend:

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

    r38112 r38331  
    5858    } while (0)
    5959
     60/* we can not print paged strings to RT logger, do it this way */
     61#define _LOGMSG_STR(_logger, _a, _f) do {\
     62        int _i = 0; \
     63        for (;(_a)[_i];++_i) { \
     64            _logger(("%"_f, (_a)[_i])); \
     65        }\
     66        _logger(("\n")); \
     67    } while (0)
     68
    6069#define WARN_NOBP(_a)                                                          \
    6170    do                                                                            \
     
    7887#define LOGF_ENTER() LOGF(("ENTER"))
    7988#define LOGF_LEAVE() LOGF(("LEAVE"))
    80 #define LOGREL_EXACT(_a) _LOGMSG_EXACT(Log, _a)
     89#define LOG_EXACT(_a) _LOGMSG_EXACT(Log, _a)
     90#define LOGREL_EXACT(_a) _LOGMSG_EXACT(LogRel, _a)
     91/* we can not print paged strings to RT logger, do it this way */
     92#define LOG_STRA(_a) do {\
     93        _LOGMSG_STR(Log, _a, "c"); \
     94    } while (0)
     95#define LOG_STRW(_a) do {\
     96        _LOGMSG_STR(Log, _a, "c"); \
     97    } while (0)
     98#define LOGREL_STRA(_a) do {\
     99        _LOGMSG_STR(LogRel, _a, "c"); \
     100    } while (0)
     101#define LOGREL_STRW(_a) do {\
     102        _LOGMSG_STR(LogRel, _a, "c"); \
     103    } while (0)
     104
    81105
    82106#endif /*VBOXVIDEOLOG_H*/
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispDbg.cpp

    r38238 r38331  
    556556    switch (pExceptionRecord->ExceptionCode)
    557557    {
    558         case 0x40010006: /* <- OutputDebugString exception, ignore */
    559         case 0xe06d7363: /* <- ms compiler - generated exception related to C++ exception */
    560         case 0x000006d9: /* <- RPC exception, ignore */
    561         case 0x406d1388: /* <- VS/WinDbg thread naming exception, ignore */
    562         case 0xe0434f4d: /* <- CLR exception */
     558        case 0xc0000005: /* only access violation and debug exceptions actually matter */
     559        case 0xc0000003:
     560            AssertRelease(0);
    563561            break;
    564562        default:
    565             AssertRelease(0);
    566563            break;
    567564    }
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/arb_program_shader.c

    r37550 r38331  
    69676967        POINT offset = {0,0};
    69686968        UINT h;
     6969#ifdef VBOX_WITH_WDDM
     6970        HWND hWnd = context->currentSwapchain->win_handle;
     6971        ClientToScreen(hWnd, &offset);
     6972        GetClientRect(hWnd, &windowsize);
     6973#else
    69696974        ClientToScreen(context->win_handle, &offset);
    69706975        GetClientRect(context->win_handle, &windowsize);
     6976#endif
    69716977        h = windowsize.bottom - windowsize.top;
    69726978        dst_rect.left -= offset.x; dst_rect.right -=offset.x;
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/context.c

    r38236 r38331  
    768768{
    769769#ifdef VBOX_WITH_WDDM
    770     TRACE("Updating context %p window from %p to %p.\n",
    771             context, context->win_handle, swapchain->win_handle);
     770    TRACE("Updating context %p swapchain from %p to %p.\n",
     771            context, context->currentSwapchain, swapchain);
     772
     773    context->valid = 1;
     774
     775    if (!swapchain_validate(swapchain))
     776    {
     777        ERR("invalid swapchain %p\n", swapchain);
     778        goto err;
     779    }
     780    context->currentSwapchain = swapchain;
     781
     782    if (!context_set_pixel_format(context->gl_info, swapchain->hDC, context->pixel_format))
     783    {
     784        ERR("Failed to set pixel format %d on device context %p.\n",
     785                context->pixel_format, swapchain->hDC);
     786        goto err;
     787    }
     788
     789    if (!pwglMakeCurrent(swapchain->hDC, context->glCtx))
     790    {
     791        ERR("Failed to make GL context %p current on device context %p, last error %#x.\n",
     792                context->glCtx, swapchain->hDC, GetLastError());
     793        goto err;
     794    }
    772795#else
    773796    TRACE("Updating context %p window from %p to %p.\n",
    774797            context, context->win_handle, context->swapchain->win_handle);
    775 #endif
    776798
    777799    if (context->valid)
    778800    {
    779 #ifndef VBOX_WITH_WDDM
    780801        if (!ReleaseDC(context->win_handle, context->hdc))
    781802        {
     
    783804                    context->hdc, GetLastError());
    784805        }
    785 #endif
    786806    }
    787807    else context->valid = 1;
    788808
    789 #ifdef VBOX_WITH_WDDM
    790     if (!swapchain_validate(swapchain))
    791     {
    792         ERR("invalid swapchain %p\n", swapchain);
    793         goto err;
    794     }
    795     context->win_handle = swapchain->win_handle;
    796     context->currentSwapchain = swapchain;
    797     context->hdc = swapchain->hDC;
    798 #else
    799809    context->win_handle = context->swapchain->win_handle;
    800810    if (!(context->hdc = GetDC(context->win_handle)))
     
    803813        goto err;
    804814    }
    805 #endif
    806815
    807816    if (!context_set_pixel_format(context->gl_info, context->hdc, context->pixel_format))
     
    818827        goto err;
    819828    }
     829#endif
    820830
    821831    return;
    822 
    823832err:
    824833    context->valid = 0;
     
    831840        )
    832841{
     842#ifdef VBOX_WITH_WDDM
     843    if (!swapchain || context->currentSwapchain == swapchain)
     844    {
     845        context->valid = swapchain_validate(context->currentSwapchain);
     846    }
     847    else
     848#else
    833849    HWND wnd = WindowFromDC(context->hdc);
    834850
     
    838854        WARN("DC %p belongs to window %p instead of %p., winEr(%d)\n",
    839855                context->hdc, wnd, context->win_handle, winEr);
    840 #ifdef VBOX_WITH_WDDM
    841         if (!swapchain || context->win_handle == swapchain->win_handle)
    842         {
    843             ERR("!!!unexpected equal HWND!!!: DC %p belongs to window %p instead of %p., winEr(%d)\n",
    844                             context->hdc, wnd, context->win_handle, winEr);
    845         }
    846 #endif
    847856        context->valid = 0;
    848857    }
    849858
    850     if (
    851 #ifdef VBOX_WITH_WDDM
    852             swapchain && context->win_handle != swapchain->win_handle
    853 #else
    854             context->win_handle != context->swapchain->win_handle
    855 #endif
    856             )
     859    if (context->win_handle != context->swapchain->win_handle)
     860#endif
    857861    {
    858862        context_update_window(context
     
    904908#ifdef VBOX_WITH_WDDM
    905909    context_validate_adjust_wnd(context);
     910    if (context->valid && restore_ctx != context->glCtx) pwglMakeCurrent(context->currentSwapchain->hDC, context->glCtx);
     911    else restore_ctx = NULL;
    906912#else
    907913    context_validate(context);
    908 #endif
    909914    if (context->valid && restore_ctx != context->glCtx) pwglMakeCurrent(context->hdc, context->glCtx);
    910915    else restore_ctx = NULL;
     916#endif
    911917
    912918    ENTER_GL();
     
    11001106    if (ctx)
    11011107    {
     1108#ifdef VBOX_WITH_WDDM
     1109        TRACE("Switching to D3D context %p, GL context %p, device context %p.\n", ctx, ctx->glCtx, ctx->currentSwapchain->hDC);
     1110        if (!pwglMakeCurrent(ctx->currentSwapchain->hDC, ctx->glCtx))
     1111        {
     1112            DWORD err = GetLastError();
     1113            ERR("Failed to make GL context %p current on device context %p, last error %#x.\n",
     1114                    ctx->glCtx, ctx->currentSwapchain->hDC, err);
     1115            TlsSetValue(wined3d_context_tls_idx, NULL);
     1116            return FALSE;
     1117        }
     1118#else
    11021119        TRACE("Switching to D3D context %p, GL context %p, device context %p.\n", ctx, ctx->glCtx, ctx->hdc);
    11031120        if (!pwglMakeCurrent(ctx->hdc, ctx->glCtx))
     
    11091126            return FALSE;
    11101127        }
     1128#endif
    11111129        ctx->current = 1;
    11121130    }
     
    11731191            {
    11741192                IWineD3DDeviceImpl *device = context->device;
    1175                 int i = 0;
     1193                UINT i = 0;
    11761194                for (; i < device->numContexts; ++i)
    11771195                {
    1178                     const struct wined3d_context *ctx = device->contexts[i];
     1196                    struct wined3d_context *ctx = device->contexts[i];
    11791197                    if (ctx->glCtx == context->restore_ctx)
    11801198                    {
     
    15881606
    15891607    ret->glCtx = ctx;
     1608#ifndef VBOX_WITH_WDDM
    15901609    ret->win_handle = swapchain->win_handle;
    1591 #ifdef VBOX_WITH_WDDM
    1592     Assert(WindowFromDC(hdc) == ret->win_handle);
    1593 #endif
    15941610    ret->hdc = hdc;
     1611#endif
    15951612    ret->pixel_format = pixel_format;
    15961613
     
    17961813    else if (context->restore_ctx)
    17971814    {
    1798         if (!pwglMakeCurrent(context->hdc, context->glCtx))
     1815        if (!pwglMakeCurrent(context->currentSwapchain->hDC, context->glCtx))
    17991816        {
    18001817            DWORD err = GetLastError();
    18011818            ERR("Failed to make GL context %p current on device context %p, last error %#x.\n",
    1802                     context->hdc, context->glCtx, err);
     1819                    context->currentSwapchain->hDC, context->glCtx, err);
    18031820        }
    18041821    }
     
    23482365            if (!swapchain)
    23492366                swapchain = (IWineD3DSwapChainImpl *)This->swapchains[This->NumberOfSwapChains-1]; /* just fallback to anything to avoid NPE */
    2350             context = findThreadContextForSwapChain(swapchain);
     2367            context = findThreadContextForSwapChain((IWineD3DSwapChain*)swapchain);
    23512368            context_validate(context, swapchain);
    23522369        }
     
    26982715    else if (context->restore_ctx)
    26992716    {
     2717#ifdef VBOX_WITH_WDDM
     2718        if (!pwglMakeCurrent(context->currentSwapchain->hDC, context->glCtx))
     2719        {
     2720            DWORD err = GetLastError();
     2721            ERR("Failed to make GL context %p current on device context %p, last error %#x.\n",
     2722                    context->currentSwapchain->hDC, context->glCtx, err);
     2723        }
     2724#else
    27002725        if (!pwglMakeCurrent(context->hdc, context->glCtx))
    27012726        {
     
    27042729                    context->hdc, context->glCtx, err);
    27052730        }
     2731#endif
    27062732    }
    27072733
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/surface.c

    r38283 r38331  
    38923892            POINT offset = {0,0};
    38933893            UINT h;
     3894#ifdef VBOX_WITH_WDDM
     3895            HWND hWnd = context->currentSwapchain->win_handle;
     3896            ClientToScreen(hWnd, &offset);
     3897            GetClientRect(hWnd, &windowsize);
     3898#else
    38943899            ClientToScreen(context->win_handle, &offset);
    38953900            GetClientRect(context->win_handle, &windowsize);
     3901#endif
    38963902            h = windowsize.bottom - windowsize.top;
    38973903            dst_rect.left -= offset.x; dst_rect.right -=offset.x;
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/swapchain.c

    r38112 r38331  
    299299    }
    300300
     301#ifdef VBOX_WITH_WDDM
     302    TRACE("Presenting HDC %p.\n", context->currentSwapchain->hDC);
     303#else
    301304    TRACE("Presenting HDC %p.\n", context->hdc);
     305#endif
    302306
    303307    render_to_fbo = This->render_to_fbo;
     
    373377#if defined(VBOX_WITH_WDDM) && defined(DEBUG)
    374378    {
    375         HWND wnd = WindowFromDC(context->hdc);
    376         Assert(context->currentSwapchain && context->win_handle==context->currentSwapchain->win_handle);
    377         Assert(wnd==context->win_handle);
    378         Assert(IsWindow(context->win_handle));
    379         Assert(wnd == context->win_handle);
     379        HWND wnd = WindowFromDC(context->currentSwapchain->hDC);
     380        Assert(wnd == context->currentSwapchain->win_handle);
    380381    }
    381382#endif
     
    385386     * call glFinish, which doesn't have any context set. So we use wglSwapLayerBuffers directly as well.
    386387     */
    387     pwglSwapLayerBuffers(context->hdc, WGL_SWAP_MAIN_PLANE);
     388    pwglSwapLayerBuffers(context->currentSwapchain->hDC, WGL_SWAP_MAIN_PLANE);
    388389#else
    389390    SwapBuffers(context->hdc); /* TODO: cycle through the swapchain buffers */
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/vboxext.c

    r38114 r38331  
    174174    HRESULT hr = E_FAIL;
    175175    BOOL bResult;
    176     /* need to serialize since vboxDispWorkerThread is using one pWorker->hEvent
     176    /* need to serialize since vboxExtWorkerThread is using one pWorker->hEvent
    177177     * to signal job completion */
    178178    EnterCriticalSection(&pWorker->CritSect);
     
    328328}
    329329
     330/* window creation API */
     331static LRESULT CALLBACK vboxExtWndProc(HWND hwnd,
     332    UINT uMsg,
     333    WPARAM wParam,
     334    LPARAM lParam
     335)
     336{
     337    switch(uMsg)
     338    {
     339        case WM_CLOSE:
     340            TRACE("got WM_CLOSE for hwnd(0x%x)", hwnd);
     341            return 0;
     342        case WM_DESTROY:
     343            TRACE("got WM_DESTROY for hwnd(0x%x)", hwnd);
     344            return 0;
     345        case WM_NCHITTEST:
     346            TRACE("got WM_NCHITTEST for hwnd(0x%x)\n", hwnd);
     347            return HTNOWHERE;
     348    }
     349
     350    return DefWindowProc(hwnd, uMsg, wParam, lParam);
     351}
     352
     353#define VBOXEXTWND_NAME "VboxDispD3DWineWnd"
     354
     355HRESULT vboxExtWndDoCreate(DWORD w, DWORD h, HWND *phWnd)
     356{
     357    HRESULT hr = S_OK;
     358    HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL);
     359    /* Register the Window Class. */
     360    WNDCLASS wc;
     361    if (!GetClassInfo(hInstance, VBOXEXTWND_NAME, &wc))
     362    {
     363        wc.style = 0;//CS_OWNDC;
     364        wc.lpfnWndProc = vboxExtWndProc;
     365        wc.cbClsExtra = 0;
     366        wc.cbWndExtra = 0;
     367        wc.hInstance = hInstance;
     368        wc.hIcon = NULL;
     369        wc.hCursor = NULL;
     370        wc.hbrBackground = NULL;
     371        wc.lpszMenuName = NULL;
     372        wc.lpszClassName = VBOXEXTWND_NAME;
     373        if (!RegisterClass(&wc))
     374        {
     375            DWORD winErr = GetLastError();
     376            ERR("RegisterClass failed, winErr(%d)\n", winErr);
     377            hr = E_FAIL;
     378        }
     379    }
     380
     381    if (hr == S_OK)
     382    {
     383        HWND hWnd = CreateWindowEx (WS_EX_TOOLWINDOW,
     384                                        VBOXEXTWND_NAME, VBOXEXTWND_NAME,
     385                                        WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_DISABLED,
     386                                        0, 0,
     387                                        w, h,
     388                                        NULL, //GetDesktopWindow() /* hWndParent */,
     389                                        NULL /* hMenu */,
     390                                        hInstance,
     391                                        NULL /* lpParam */);
     392        Assert(hWnd);
     393        if (hWnd)
     394        {
     395            *phWnd = hWnd;
     396        }
     397        else
     398        {
     399            DWORD winErr = GetLastError();
     400            ERR("CreateWindowEx failed, winErr(%d)\n", winErr);
     401            hr = E_FAIL;
     402        }
     403    }
     404
     405    return hr;
     406}
     407
     408static HRESULT vboxExtWndDoDestroy(HWND hWnd)
     409{
     410    BOOL bResult = DestroyWindow(hWnd);
     411    DWORD winErr;
     412    Assert(bResult);
     413    if (bResult)
     414        return S_OK;
     415
     416    winErr = GetLastError();
     417    ERR("DestroyWindow failed, winErr(%d) for hWnd(0x%x)\n", winErr, hWnd);
     418
     419    return E_FAIL;
     420}
     421
     422typedef struct VBOXEXTWND_CREATE_INFO
     423{
     424    int hr;
     425    HWND hWnd;
     426    DWORD width;
     427    DWORD height;
     428} VBOXEXTWND_CREATE_INFO;
     429
     430typedef struct VBOXEXTWND_DESTROY_INFO
     431{
     432    int hr;
     433    HWND hWnd;
     434} VBOXEXTWND_DESTROY_INFO;
     435
     436DECLCALLBACK(void) vboxExtWndDestroyWorker(void *pvUser)
     437{
     438    VBOXEXTWND_DESTROY_INFO *pInfo = (VBOXEXTWND_DESTROY_INFO*)pvUser;
     439    pInfo->hr = vboxExtWndDoDestroy(pInfo->hWnd);
     440    Assert(pInfo->hr == S_OK);
     441}
     442
     443DECLCALLBACK(void) vboxExtWndCreateWorker(void *pvUser)
     444{
     445    VBOXEXTWND_CREATE_INFO *pInfo = (VBOXEXTWND_CREATE_INFO*)pvUser;
     446    pInfo->hr = vboxExtWndDoCreate(pInfo->width, pInfo->height, &pInfo->hWnd);
     447    Assert(pInfo->hr == S_OK);
     448}
     449
     450HRESULT VBoxExtWndDestroy(HWND hWnd)
     451{
     452    HRESULT hr;
     453    VBOXEXTWND_DESTROY_INFO Info;
     454    Info.hr = E_FAIL;
     455    Info.hWnd = hWnd;
     456    hr = VBoxExtDwSubmitProc(vboxExtWndDestroyWorker, &Info);
     457    Assert(hr == S_OK);
     458    if (hr == S_OK)
     459    {
     460        Assert(Info.hr == S_OK);
     461        return Info.hr;
     462    }
     463    return hr;
     464}
     465
     466HRESULT VBoxExtWndCreate(DWORD width, DWORD height, HWND *phWnd)
     467{
     468    HRESULT hr;
     469    VBOXEXTWND_CREATE_INFO Info;
     470    Info.hr = E_FAIL;
     471    Info.width = width;
     472    Info.height = height;
     473    hr = VBoxExtDwSubmitProc(vboxExtWndCreateWorker, &Info);
     474    Assert(hr == S_OK);
     475    if (hr == S_OK)
     476    {
     477        Assert(Info.hr == S_OK);
     478        if (Info.hr == S_OK)
     479            *phWnd = Info.hWnd;
     480        return Info.hr;
     481    }
     482    return hr;
     483}
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/vboxext.h

    r38114 r38331  
    3030int VBoxExtReleaseDC(HWND hWnd, HDC hDC);
    3131
     32/* API for creating & destroying windows */
     33HRESULT VBoxExtWndDestroy(HWND hWnd);
     34HRESULT VBoxExtWndCreate(DWORD width, DWORD height, HWND *phWnd);
     35
    3236#endif /* #ifndef ___VBOXEXT_H__*/
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/wined3d_private.h

    r38112 r38331  
    11381138    HDC restore_dc;
    11391139    HGLRC                   glCtx;
     1140#ifndef VBOX_WITH_WDDM
    11401141    HWND                    win_handle;
    11411142    HDC                     hdc;
     1143#endif
    11421144    int pixel_format;
    11431145    GLint                   aux_buffers;
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