VirtualBox

Ignore:
Timestamp:
Jun 28, 2010 7:00:55 PM (14 years ago)
Author:
vboxsync
Message:

wddm/3d: visible regions impl & fixes

Location:
trunk/src/VBox/Additions/WINNT/Graphics/Display
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/Makefile.kmk

    r30462 r30483  
    7676 endif
    7777VBoxDispD3D_TEMPLATE = VBOXGUESTR3DLL
    78 VBoxDispD3D_DEFS     = UNICODE _UNICODE VBOXWDDM VBOXVDMA
     78VBoxDispD3D_DEFS     = UNICODE _UNICODE VBOXWDDM VBOXVDMA VBOXWDDMDISP
     79VBoxDispD3D_DEFS    += VBOXDISPMP_TEST
    7980ifdef VBOXWDDM_WITH_VBVA
    8081VBoxDispD3D_DEFS    += VBOXWDDM_WITH_VBVA
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispCm.cpp

    r30462 r30483  
    166166        return E_INVALIDARG;
    167167
    168     DWORD dwResult = WaitForSingleObject(pSession->hEvent, dwMilliseconds);
    169     switch(dwResult)
    170     {
    171         case WAIT_OBJECT_0:
     168    do
     169    {
     170        DWORD dwResult = WaitForSingleObject(pSession->hEvent, dwMilliseconds);
     171        switch(dwResult)
    172172        {
    173             HRESULT hr = S_OK;
    174             D3DDDICB_ESCAPE DdiEscape;
    175             DdiEscape.Flags.Value = 0;
    176             DdiEscape.pPrivateDriverData = pCmd;
    177             DdiEscape.PrivateDriverDataSize = cbCmd;
    178 
    179             pCmd->EscapeHdr.escapeCode = VBOXESC_GETVBOXVIDEOCMCMD;
    180             /* lock to ensure the context is not distructed */
    181             EnterCriticalSection(&pSession->CritSect);
    182             /* use any context for identifying the kernel CmSession. We're using the first one */
    183             PVBOXWDDMDISP_CONTEXT pContext = RTListNodeGetFirst(&pSession->CtxList, VBOXWDDMDISP_CONTEXT, ListNode);
    184             if (pContext)
     173            case WAIT_OBJECT_0:
    185174            {
    186                 PVBOXWDDMDISP_DEVICE pDevice = pContext->pDevice;
    187                 DdiEscape.hDevice = pDevice->hDevice;
    188                 DdiEscape.hContext = pContext->ContextInfo.hContext;
    189                 Assert (DdiEscape.hContext);
    190                 Assert (DdiEscape.hDevice);
    191                 hr = pDevice->RtCallbacks.pfnEscapeCb(pDevice->pAdapter->hAdapter, &DdiEscape);
    192                 Assert(hr == S_OK);
    193                 LeaveCriticalSection(&pSession->CritSect);
     175                HRESULT hr = S_OK;
     176                D3DDDICB_ESCAPE DdiEscape;
     177                DdiEscape.Flags.Value = 0;
     178                DdiEscape.pPrivateDriverData = pCmd;
     179                DdiEscape.PrivateDriverDataSize = cbCmd;
     180
     181                pCmd->EscapeHdr.escapeCode = VBOXESC_GETVBOXVIDEOCMCMD;
     182                /* lock to ensure the context is not distructed */
     183                EnterCriticalSection(&pSession->CritSect);
     184                /* use any context for identifying the kernel CmSession. We're using the first one */
     185                PVBOXWDDMDISP_CONTEXT pContext = RTListNodeGetFirst(&pSession->CtxList, VBOXWDDMDISP_CONTEXT, ListNode);
     186                if (pContext)
     187                {
     188                    PVBOXWDDMDISP_DEVICE pDevice = pContext->pDevice;
     189                    DdiEscape.hDevice = pDevice->hDevice;
     190                    DdiEscape.hContext = pContext->ContextInfo.hContext;
     191                    Assert (DdiEscape.hContext);
     192                    Assert (DdiEscape.hDevice);
     193                    hr = pDevice->RtCallbacks.pfnEscapeCb(pDevice->pAdapter->hAdapter, &DdiEscape);
     194                    LeaveCriticalSection(&pSession->CritSect);
     195                    Assert(hr == S_OK);
     196                    if (hr == S_OK)
     197                    {
     198                        if (!pCmd->Hdr.cbCmdsReturned && !pCmd->Hdr.cbRemainingFirstCmd)
     199                            break; /* <- break to enter a new wait cycle */
     200                    }
     201                }
     202                else
     203                {
     204                    LeaveCriticalSection(&pSession->CritSect);
     205                    pCmd->Hdr.cbCmdsReturned = 0;
     206                    pCmd->Hdr.cbRemainingCmds = 0;
     207                    pCmd->Hdr.cbRemainingFirstCmd = 0;
     208                }
     209
     210                return hr;
    194211            }
    195             else
     212            case WAIT_TIMEOUT:
    196213            {
    197                 LeaveCriticalSection(&pSession->CritSect);
    198214                pCmd->Hdr.cbCmdsReturned = 0;
    199215                pCmd->Hdr.cbRemainingCmds = 0;
    200216                pCmd->Hdr.cbRemainingFirstCmd = 0;
     217                return WAIT_TIMEOUT;
    201218            }
    202 
    203             return hr;
     219            default:
     220                AssertBreakpoint();
     221                return E_FAIL;
    204222        }
    205         case WAIT_TIMEOUT:
    206         {
    207             pCmd->Hdr.cbCmdsReturned = 0;
    208             pCmd->Hdr.cbRemainingCmds = 0;
    209             pCmd->Hdr.cbRemainingFirstCmd = 0;
    210             return S_OK;
    211         }
    212         default:
    213             AssertBreakpoint();
    214             return E_FAIL;
    215     }
     223    } while (1);
    216224}
    217225
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp

    r30462 r30483  
    2323#include "VBoxDispD3DCmn.h"
    2424#include "VBoxDispD3D.h"
     25
     26#ifdef VBOXDISPMP_TEST
     27HRESULT vboxDispMpTstStart();
     28HRESULT vboxDispMpTstStop();
     29#endif
    2530
    2631#ifdef VBOXWDDMDISP_DEBUG
     
    10951100            HRESULT hr = vboxDispCmInit();
    10961101            Assert(hr == S_OK);
     1102#ifdef VBOXDISPMP_TEST
     1103            if (hr == S_OK)
     1104            {
     1105                hr = vboxDispMpTstStart();
     1106                Assert(hr == S_OK);
     1107            }
     1108#endif
    10971109            if (hr == S_OK)
    10981110                vboxVDbgPrint(("VBoxDispD3D: DLL loaded.\n"));
     
    11061118        case DLL_PROCESS_DETACH:
    11071119        {
    1108             HRESULT hr = vboxDispCmTerm();
     1120            HRESULT hr;
     1121#ifdef VBOXDISPMP_TEST
     1122            hr = vboxDispMpTstStop();
    11091123            Assert(hr == S_OK);
    11101124            if (hr == S_OK)
    1111                 vboxVDbgPrint(("VBoxDispD3D: DLL unloaded.\n"));
    1112             else
    1113                 bOk = FALSE;
     1125#endif
     1126            {
     1127                hr = vboxDispCmTerm();
     1128                Assert(hr == S_OK);
     1129                if (hr == S_OK)
     1130                    vboxVDbgPrint(("VBoxDispD3D: DLL unloaded.\n"));
     1131                else
     1132                    bOk = FALSE;
     1133            }
    11141134//                VbglR3Term();
    11151135            /// @todo RTR3Term();
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.def

    r28800 r30483  
    1919EXPORTS
    2020        OpenAdapter
     21        VBoxDispMpGetCallbacks
    2122
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D64.def

    r28800 r30483  
    1919EXPORTS
    2020        OpenAdapter
     21        VBoxDispMpGetCallbacks
    2122
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispMp.cpp

    r30464 r30483  
    5656static VBOXDISPMP g_VBoxDispMp;
    5757
    58 HRESULT vboxDispMpEnable()
     58DECLCALLBACK(HRESULT) vboxDispMpEnableEvents()
    5959{
    6060    g_VBoxDispMp.pEscapeCmd = NULL;
     
    6565
    6666
    67 HRESULT vboxDispMpDisable()
     67DECLCALLBACK(HRESULT) vboxDispMpDisableEvents()
    6868{
    6969    if (g_VBoxDispMp.pEscapeCmd)
     
    7676#define VBOXDISPMP_BUF_MAXSIZE  ((4096*4096)-96)
    7777
    78 HRESULT vboxDispMpGetRegions(PVBOXDISPMP_REGIONS pRegions, DWORD dwMilliseconds)
     78DECLCALLBACK(HRESULT) vboxDispMpGetRegions(PVBOXDISPMP_REGIONS pRegions, DWORD dwMilliseconds)
    7979{
    8080    HRESULT hr = S_OK;
     
    106106                    break;
    107107                }
    108                 else if (g_VBoxDispMp.pEscapeCmd->Hdr.cbRemainingCmds)
     108                else
    109109                {
     110                    Assert(g_VBoxDispMp.pEscapeCmd->Hdr.cbRemainingCmds);
     111                    Assert(g_VBoxDispMp.pEscapeCmd->Hdr.cbRemainingFirstCmd);
    110112                    RTMemFree(g_VBoxDispMp.pEscapeCmd);
    111113                    uint32_t newSize = RT_MAX(g_VBoxDispMp.cbEscapeCmd + VBOXDISPMP_BUF_INCREASE, g_VBoxDispMp.pEscapeCmd->Hdr.cbRemainingFirstCmd);
    112114                    if (newSize < VBOXDISPMP_BUF_MAXSIZE)
    113115                        newSize = RT_MAX(newSize, RT_MIN(g_VBoxDispMp.pEscapeCmd->Hdr.cbRemainingCmds, VBOXDISPMP_BUF_MAXSIZE));
     116                    Assert(g_VBoxDispMp.cbEscapeCmd < newSize);
    114117                    g_VBoxDispMp.pEscapeCmd = (PVBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD)RTMemAlloc(newSize);
    115118                    Assert(g_VBoxDispMp.pEscapeCmd);
    116119                    if (g_VBoxDispMp.pEscapeCmd)
    117120                        g_VBoxDispMp.cbEscapeCmd = newSize;
     121                    else
     122                    {
     123                        g_VBoxDispMp.pEscapeCmd = NULL;
     124                        g_VBoxDispMp.cbEscapeCmd = 0;
     125                        hr = E_OUTOFMEMORY;
     126                        break;
     127                    }
    118128                }
    119129            }
     
    133143    return hr;
    134144}
     145
     146VBOXDISPMP_DECL(HRESULT) VBoxDispMpGetCallbacks(uint32_t u32Version, PVBOXDISPMP_CALLBACKS pCallbacks)
     147{
     148    Assert(u32Version == VBOXDISPMP_VERSION);
     149    if (u32Version != VBOXDISPMP_VERSION)
     150        return E_INVALIDARG;
     151
     152    pCallbacks->pfnEnableEvents = vboxDispMpEnableEvents;
     153    pCallbacks->pfnDisableEvents = vboxDispMpDisableEvents;
     154    pCallbacks->pfnGetRegions = vboxDispMpGetRegions;
     155    return S_OK;
     156}
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispMp.h

    r30464 r30483  
    2222#include "../../Miniport/wddm/VBoxVideoIf.h"
    2323
    24 HRESULT vboxDispMpEnable();
    25 HRESULT vboxDispMpDisable();
    26 
    2724typedef struct VBOXDISPMP_REGIONS
    2825{
     
    3128} VBOXDISPMP_REGIONS, *PVBOXDISPMP_REGIONS;
    3229
    33 /*
    34  * the VBOXDISPMP_REGIONS::pRegions returned is valid until the next vboxDispMpGetRegions call or vboxDispMpDisable call
     30typedef DECLCALLBACK(HRESULT) FNVBOXDISPMP_ENABLEEVENTS();
     31typedef FNVBOXDISPMP_ENABLEEVENTS *PFNVBOXDISPMP_ENABLEEVENTS;
     32
     33typedef DECLCALLBACK(HRESULT) FNVBOXDISPMP_DISABLEEVENTS();
     34typedef FNVBOXDISPMP_DISABLEEVENTS *PFNVBOXDISPMP_DISABLEEVENTS;
     35
     36typedef DECLCALLBACK(HRESULT) FNVBOXDISPMP_DISABLEEVENTS();
     37typedef FNVBOXDISPMP_DISABLEEVENTS *PFNVBOXDISPMP_DISABLEEVENTS;
     38
     39typedef DECLCALLBACK(HRESULT) FNVBOXDISPMP_GETREGIONS(PVBOXDISPMP_REGIONS pRegions, DWORD dwMilliseconds);
     40typedef FNVBOXDISPMP_GETREGIONS *PFNVBOXDISPMP_GETREGIONS;
     41
     42typedef struct VBOXDISPMP_CALLBACKS
     43{
     44    PFNVBOXDISPMP_ENABLEEVENTS pfnEnableEvents;
     45    PFNVBOXDISPMP_DISABLEEVENTS pfnDisableEvents;
     46    /**
     47     * if events are enabled - blocks until dirty region is available or timeout occurs
     48     * in the former case S_OK is returned on event, in the latter case WAIT_TIMEOUT is returned
     49     * if events are disabled - returns S_FALSE
     50     */
     51    PFNVBOXDISPMP_GETREGIONS pfnGetRegions;
     52} VBOXDISPMP_CALLBACKS, *PVBOXDISPMP_CALLBACKS;
     53
     54/** @def VBOXNETCFGWIN_DECL
     55 * The usual declaration wrapper.
    3556 */
    36 HRESULT vboxDispMpGetRegions(PVBOXDISPMP_REGIONS pRegions, DWORD dwMilliseconds);
     57
     58/* enable this in case we include this in a dll*/
     59# ifdef VBOXWDDMDISP
     60#  define VBOXDISPMP_DECL(_type) DECLEXPORT(_type)
     61# else
     62#  define VBOXDISPMP_DECL(_type) DECLIMPORT(_type)
     63# endif
     64
     65#define VBOXDISPMP_IFVERSION 1
     66#define VBOXDISPMP_VERSION (VBOXVIDEOIF_VERSION | (VBOXDISPMP_IFVERSION < 16))
     67/**
     68 *  VBoxDispMpGetCallbacks export
     69 *
     70 *  @param u32Version - must be set to VBOXDISPMP_VERSION
     71 *  @param pCallbacks - callbacks structure
     72 */
     73typedef VBOXDISPMP_DECL(HRESULT) FNVBOXDISPMP_GETCALLBACKS(uint32_t u32Version, PVBOXDISPMP_CALLBACKS pCallbacks);
     74typedef FNVBOXDISPMP_GETCALLBACKS *PFNVBOXDISPMP_GETCALLBACKS;
    3775
    3876#endif /* #ifndef ___VBoxDispMp_h___ */
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispMpTst.cpp

    r30464 r30483  
    2020
    2121static RTTHREAD g_VBoxDispMpTstThread;
     22static VBOXDISPMP_CALLBACKS g_VBoxDispMpTstCallbacks;
     23static HMODULE g_hVBoxDispMpModule;
     24static PFNVBOXDISPMP_GETCALLBACKS g_pfnVBoxDispMpGetCallbacks;
     25
    2226
    2327static void vboxDispMpTstLogRect(const char * pPrefix, RECT *pRect, const char * pSuffix)
    2428{
    25     vboxVDbgDoPrint("%s left(%d), top(%d), right(%d), bottom(%d) %s", pPrefix, pRect->left, pRect->top, pRect->right, pRect->bottom, pSuffix);
     29    vboxVDbgPrint(("%s left(%d), top(%d), right(%d), bottom(%d) %s", pPrefix, pRect->left, pRect->top, pRect->right, pRect->bottom, pSuffix));
    2630}
    2731
     
    3034    VBOXDISPMP_REGIONS Regions;
    3135
    32     HRESULT hr;
     36    HRESULT hr = g_VBoxDispMpTstCallbacks.pfnEnableEvents();
     37    Assert(hr == S_OK);
     38    if (hr != S_OK)
     39        return VERR_GENERAL_FAILURE;
     40
    3341    do
    3442    {
    35         hr = vboxDispMpGetRegions(&Regions, INFINITE);
     43        hr = g_VBoxDispMpTstCallbacks.pfnGetRegions(&Regions, INFINITE);
    3644        Assert(hr == S_OK);
    3745        if (hr == S_OK)
    3846        {
    39             vboxVDbgDoPrint("\n>>>\n");
     47            vboxVDbgPrint(("\n>>>\n"));
    4048            HWND hWnd = Regions.hWnd;
    4149            if (Regions.pRegions->fFlags.bAddVisibleRects)
     
    4856                    --cVidibleRects;
    4957
    50                     vboxVDbgDoPrint("hWnd (0x%p), position and/or size changed: ", hWnd);
     58                    vboxVDbgPrint(("hWnd (0x%p), position and/or size changed: ", hWnd));
    5159                    vboxDispMpTstLogRect("", Regions.pRegions->RectsInfo.aRects, "\n");
    5260                }
    5361
    54                 vboxVDbgDoPrint("hWnd (0x%p), visibleRects: \n", hWnd);
     62                vboxVDbgPrint(("hWnd (0x%p), visibleRects: \n", hWnd));
    5563                for (uint32_t i = iVisibleRects; i < cVidibleRects; ++i)
    5664                {
     
    6068            else if (Regions.pRegions->fFlags.bAddHiddenRects)
    6169            {
    62                 vboxVDbgDoPrint("hWnd (0x%p), hiddenRects: \n", hWnd);
     70                vboxVDbgPrint(("hWnd (0x%p), hiddenRects: \n", hWnd));
    6371                for (uint32_t i = 0; i < Regions.pRegions->RectsInfo.cRects; ++i)
    6472                {
     
    6775            }
    6876
    69             vboxVDbgDoPrint("\n<<<\n");
     77            vboxVDbgPrint(("\n<<<\n"));
    7078        }
    7179    } while (1);
     80
     81    hr = g_VBoxDispMpTstCallbacks.pfnDisableEvents();
     82    Assert(hr == S_OK);
     83
    7284    return VINF_SUCCESS;
    7385}
     
    7587HRESULT vboxDispMpTstStart()
    7688{
    77     HRESULT hr = vboxDispMpEnable();
    78     Assert(hr == S_OK);
    79     if (hr == S_OK)
     89    HRESULT hr = E_FAIL;
     90    g_hVBoxDispMpModule = GetModuleHandleW(L"VBoxDispD3D.dll");
     91    Assert(g_hVBoxDispMpModule);
     92
     93    if (g_hVBoxDispMpModule)
    8094    {
    81         int rc = RTThreadCreate(&g_VBoxDispMpTstThread, vboxDispMpTstThreadProc, NULL, 0,
    82                 RTTHREADTYPE_DEFAULT, RTTHREADFLAGS_WAITABLE, "VBoxDispMpTst");
    83         AssertRC(rc);
    84         if (RT_SUCCESS(rc))
    85             return S_OK;
     95        g_pfnVBoxDispMpGetCallbacks = (PFNVBOXDISPMP_GETCALLBACKS)GetProcAddress(g_hVBoxDispMpModule, "VBoxDispMpGetCallbacks");
     96        Assert(g_pfnVBoxDispMpGetCallbacks);
     97        if (g_pfnVBoxDispMpGetCallbacks)
     98        {
     99            hr = g_pfnVBoxDispMpGetCallbacks(VBOXDISPMP_VERSION, &g_VBoxDispMpTstCallbacks);
     100            Assert(hr == S_OK);
     101            if (hr == S_OK)
     102            {
     103                int rc = RTThreadCreate(&g_VBoxDispMpTstThread, vboxDispMpTstThreadProc, NULL, 0,
     104                                RTTHREADTYPE_DEFAULT, RTTHREADFLAGS_WAITABLE, "VBoxDispMpTst");
     105                AssertRC(rc);
     106                if (RT_SUCCESS(rc))
     107                    return S_OK;
    86108
    87         hr = vboxDispMpDisable();
    88         Assert(hr == S_OK);
    89         hr = E_FAIL;
     109                hr = E_FAIL;
     110            }
     111        }
     112        FreeLibrary(g_hVBoxDispMpModule);
    90113    }
     114
    91115    return hr;
    92116}
     
    94118HRESULT vboxDispMpTstStop()
    95119{
    96     HRESULT hr = vboxDispMpDisable();
     120    HRESULT hr = g_VBoxDispMpTstCallbacks.pfnDisableEvents();
    97121    Assert(hr == S_OK);
     122#if 0
    98123    if (hr == S_OK)
    99124    {
    100125        int rc = RTThreadWaitNoResume(g_VBoxDispMpTstThread, RT_INDEFINITE_WAIT, NULL);
    101126        AssertRC(rc);
     127        if (RT_SUCCESS(rc))
     128        {
     129            BOOL bResult = FreeLibrary(g_hVBoxDispMpModule);
     130            Assert(bResult);
     131#ifdef DEBUG
     132            if (!bResult)
     133            {
     134                DWORD winEr = GetLastError();
     135                hr = HRESULT_FROM_WIN32(winEr);
     136            }
     137#endif
     138        }
     139        else
     140            hr = E_FAIL;
    102141    }
     142#endif
    103143    return hr;
    104144}
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