VirtualBox

Changeset 46757 in vbox for trunk/src


Ignore:
Timestamp:
Jun 24, 2013 2:30:18 PM (12 years ago)
Author:
vboxsync
Message:

wddm/crOpenGL: r0-based visible regions handling, r0-based chromium commands submission debugged, more on new presentation mechanism, cleanup, etc.

Location:
trunk/src/VBox
Files:
1 deleted
44 edited

Legend:

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

    r46662 r46757  
    3535
    3636/* One would increase this whenever definitions in this file are changed */
    37 #define VBOXVIDEOIF_VERSION 16
     37#define VBOXVIDEOIF_VERSION 17
    3838
    3939#define VBOXWDDM_NODE_ID_SYSTEM           0
     
    424424    VBOXDISP_KMHANDLE hSwapchainKm; /* in, NULL if new is being created */
    425425    VBOXDISP_UMHANDLE hSwapchainUm; /* in, UMD private data */
     426    DWORD winHostID;
    426427    RECT Rect;
    427428    UINT u32Reserved;
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/Makefile.kmk

    r46236 r46757  
    116116        wddm/VBoxDispD3DIf.cpp \
    117117        wddm/VBoxDispCm.cpp \
    118         wddm/VBoxDispMp.cpp \
    119118        wddm/VBoxScreen.cpp \
    120         wddm/VBoxDispMpTst.cpp \
    121119        wddm/VBoxDispKmt.cpp \
    122120        wddm/VBoxDispDbg.cpp \
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp

    r46662 r46757  
    598598    Buf.SwapchainInfo.SwapchainInfo.hSwapchainKm = pSwapchain->hSwapchainKm;
    599599    Buf.SwapchainInfo.SwapchainInfo.hSwapchainUm = (VBOXDISP_UMHANDLE)pSwapchain;
     600    HRESULT hr = pDevice->pAdapter->D3D.D3D.pfnVBoxWineExD3DSwapchain9GetHostWinID(pSwapchain->pSwapChainIf, &Buf.SwapchainInfo.SwapchainInfo.winHostID);
     601    if (FAILED(hr))
     602    {
     603        WARN(("pfnVBoxWineExD3DSwapchain9GetHostWinID failed, hr 0x%x", hr));
     604        return hr;
     605    }
     606    Assert(Buf.SwapchainInfo.SwapchainInfo.winHostID);
    600607//    Buf.SwapchainInfo.SwapchainInfo.Rect;
    601608//    Buf.SwapchainInfo.SwapchainInfo.u32Reserved;
     
    611618
    612619    Assert(cAllocsKm == Buf.SwapchainInfo.SwapchainInfo.cAllocs || !cAllocsKm);
    613     HRESULT hr = S_OK;
    614620    if (cAllocsKm == Buf.SwapchainInfo.SwapchainInfo.cAllocs)
    615621    {
     
    680686    /* first do a Km destroy to ensure all km->um region submissions are completed */
    681687    vboxWddmSwapchainKmDestroy(pDevice, pSwapchain);
    682     vboxDispMpInternalCancel(&pDevice->DefaultContext, pSwapchain);
    683688    vboxWddmSwapchainDestroyIf(pDevice, pSwapchain);
    684689    vboxWddmSwapchainInit(pSwapchain);
     
    18121817                    if (hr == S_OK)
    18131818                    {
    1814                         hr = vboxDispMpInternalInit();
    1815                         Assert(hr == S_OK);
    1816                         if (hr == S_OK)
    1817                         {
    1818                             VBoxDispD3DGlobalInit();
    1819                             vboxVDbgPrint(("VBoxDispD3D: DLL loaded OK\n"));
    1820                             return TRUE;
    1821                         }
     1819                        VBoxDispD3DGlobalInit();
     1820                        vboxVDbgPrint(("VBoxDispD3D: DLL loaded OK\n"));
     1821                        return TRUE;
    18221822                    }
    18231823//                    VbglR3Term();
     
    18361836            vboxVDbgVEHandlerUnregister();
    18371837#endif
    1838             HRESULT hr = vboxDispMpInternalTerm();
     1838            HRESULT hr = vboxDispCmTerm();
    18391839            Assert(hr == S_OK);
    18401840            if (hr == S_OK)
    18411841            {
    1842                 hr = vboxDispCmTerm();
    1843                 Assert(hr == S_OK);
    1844                 if (hr == S_OK)
    1845                 {
    18461842//                    VbglR3Term();
    1847                     /// @todo RTR3Term();
    1848                     VBoxDispD3DGlobalTerm();
    1849                     return TRUE;
    1850                 }
     1843                /// @todo RTR3Term();
     1844                VBoxDispD3DGlobalTerm();
     1845                return TRUE;
    18511846            }
    18521847
     
    45094504        }
    45104505#endif
     4506        pDevice->pAdapter->D3D.D3D.pfnVBoxWineExD3DDev9FlushToHost((IDirect3DDevice9Ex*)pDevice->pDevice9If);
    45114507        PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hSrcResource;
    45124508        Assert(pRc);
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.def

    r44529 r46757  
    1717EXPORTS
    1818        OpenAdapter
    19         VBoxDispMpGetCallbacks
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D64.def

    r44529 r46757  
    1919EXPORTS
    2020        OpenAdapter
    21         VBoxDispMpGetCallbacks
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.cpp

    r46662 r46757  
    148148            break;
    149149        }
     150
     151        pD3D->pfnVBoxWineExD3DSwapchain9GetHostWinID = (PFNVBOXWINEEXD3DSWAPCHAIN9_GETHOSTWINID)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DSwapchain9GetHostWinID");
     152        if (!pD3D->pfnVBoxWineExD3DSwapchain9GetHostWinID)
     153        {
     154            WARN(("no VBoxWineExD3DSwapchain9GetHostWinID"));
     155            break;
     156        }
     157
    150158        return S_OK;
    151159
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.h

    r46662 r46757  
    8181    PFNVBOXWINEEXD3DSURF9_GETHOSTID pfnVBoxWineExD3DSurf9GetHostId;
    8282
     83    PFNVBOXWINEEXD3DSWAPCHAIN9_GETHOSTWINID pfnVBoxWineExD3DSwapchain9GetHostWinID;
     84
    8385    /* module handle */
    8486    HMODULE hD3DLib;
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispMp.cpp

    r44529 r46757  
    1919#include "VBoxDispD3DCmn.h"
    2020#include "VBoxDispMp.h"
    21 
     21#if 0
    2222#include <iprt/assert.h>
    2323
     
    294294    return hr;
    295295}
     296#endif /* 0 */
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispMp.h

    r44529 r46757  
    2626#include "../../common/wddm/VBoxMPIf.h"
    2727
     28#if 0
    2829typedef struct VBOXDISPMP_REGIONS
    2930{
     
    8182typedef VBOXDISPMP_DECL(HRESULT) FNVBOXDISPMP_GETCALLBACKS(uint32_t u32Version, PVBOXDISPMP_CALLBACKS pCallbacks);
    8283typedef FNVBOXDISPMP_GETCALLBACKS *PFNVBOXDISPMP_GETCALLBACKS;
    83 
     84#endif /* 0 */
    8485#endif /* #ifndef ___VBoxDispMp_h___ */
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispMpInternal.h

    r38114 r46757  
    2222#include <windows.h>
    2323
     24#if 0
    2425HRESULT vboxDispMpInternalInit();
    2526HRESULT vboxDispMpInternalTerm();
    2627HRESULT vboxDispMpInternalCancel(struct VBOXWDDMDISP_CONTEXT *pContext, struct VBOXWDDMDISP_SWAPCHAIN *pSwapchain);
     28#endif
    2729
    2830#endif /* #ifndef ___VBoxDispMpInternal_h__ */
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispProfile.h

    r44529 r46757  
    7878//                m_pName, m_cCalls,
    7979//                m_cTime, m_cTime/1000, m_cTime/1000000));
    80         VBOXDISPPROFILE_DUMP(("'%s' [0x%p]: \t%d\t%u\t%u\t%u\t%u\t%u", m_pName, pvObj,
     80
     81//        VBOXDISPPROFILE_DUMP(("'%s' [0x%p]: \t%d\t%u\t%u\t%u\t%f\t%f", m_pName, pvObj,
     82//                m_cCalls,
     83//                (uint32_t)m_cTime, (uint32_t)(m_cTime/1000), (uint32_t)(m_cTime/1000000),
     84//                (((double)m_cTime)/cTotalEntriesTime),
     85//                (((double)m_cTime)/cTotalTime)));
     86
     87        VBOXDISPPROFILE_DUMP(("'%s' [0x%p]: \t%d\t%u\t%f\t%f", m_pName, pvObj,
    8188                m_cCalls,
    82                 (uint32_t)m_cTime, (uint32_t)(m_cTime/1000), (uint32_t)(m_cTime/1000000),
    83                 (uint32_t)(((double)m_cTime)/cTotalEntriesTime),
    84                 (uint32_t)(((double)m_cTime)/cTotalTime)));
     89                (uint32_t)(m_cTime/1000000),
     90                (((double)m_cTime)/cTotalEntriesTime),
     91                (((double)m_cTime)/cTotalTime)));
     92
    8593    }
    8694private:
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/dbg/DumpD3DCaps9.cpp

    r46236 r46757  
    618618
    619619static DWORD g_aCaps1[] = {
    620           0x00000001, 0x00000000, 0x00000000, 0x60020000,
    621           0x00000320, 0x80000001, 0x00000003, 0x0059aff0,
    622           0x000a0ff2, 0x07322191, 0x000000ff, 0x00003fff,
    623           0x000023ff, 0x000000ff, 0x00084208, 0x0007ec85,
    624           0x07030700, 0x07030700, 0x03030300, 0x0000001f,
    625           0x0000001f, 0x0000001f, 0x00001000, 0x00001000,
    626           0x00000100, 0x00008000, 0x00001000, 0x00000010,
    627           0x3f800000, 0x00000000, 0x00000000, 0x00000000,
    628           0x00000000, 0x00000000, 0x000001ff, 0x00100008,
    629           0x03feffff, 0x00000008, 0x00000008, 0x0000003b,
    630           0x00000008, 0x00000006, 0x00000001, 0x00000000,
    631           0x437f0000, 0x000fffff, 0x000fffff, 0x00000010,
    632           0x00000400, 0xfffe0200, 0x00000080, 0xffff0200,
    633           0x41000000, 0x00000051, 0x00000000, 0x00000000,
    634           0x00000000, 0x00000000, 0x00000001, 0x0000000f,
    635           0x00000001, 0x03000300, 0x00000000, 0x00000000,
    636           0x0000001f, 0x00000001, 0x00000000, 0x00000000,
    637           0x00000100, 0x00000000, 0x00000060, 0x00000000,
    638           0x0000ffff, 0x00000200, 0x00000000, 0x00000000
     620        0x00000001, 0x00000000, 0x00020000, 0xe0000000,
     621        0x00000320, 0x80000001, 0x00000003, 0x0019aff0,
     622        0x000f4ff2, 0x07736191, 0x000000ff, 0x00003fff,
     623        0x000023ff, 0x000000ff, 0x00084208, 0x0001ecc5,
     624        0x07030700, 0x07030700, 0x03030300, 0x0000003f,
     625        0x0000003f, 0x0000001f, 0x00001000, 0x00001000,
     626        0x00000100, 0x00008000, 0x00001000, 0x00000010,
     627        0x3f800000, 0xc6000000, 0xc6000000, 0x46000000,
     628        0x46000000, 0x00000000, 0x000001ff, 0x00100008,
     629        0x03feffff, 0x00000008, 0x00000008, 0x0000013b,
     630        0x00000008, 0x00000006, 0x00000000, 0x00000000,
     631        0x437f0000, 0x000fffff, 0x000fffff, 0x00000010,
     632        0x00000400, 0xfffe0200, 0x00000080, 0xffff0200,
     633        0x41000000, 0x00000051, 0x00000000, 0x00000000,
     634        0x00000000, 0x00000000, 0x00000001, 0x0000030f,
     635        0x00000001, 0x03000300, 0x00000000, 0x00000018,
     636        0x00000020, 0x00000001, 0x00000000, 0x00000018,
     637        0x00000020, 0x00000000, 0x00000060, 0x01000100,
     638        0x0000ffff, 0x00000200, 0x00000000, 0x00000000
    639639};
    640640
    641641
    642642static DWORD g_aCaps2[] = {
    643           0x00000001, 0x00000000, 0x00000000, 0x60020000,
    644           0x00000320, 0x80000001, 0x00000003, 0x0019aff0,
    645           0x000a0ff2, 0x07322191, 0x000000ff, 0x00003fff,
    646           0x000023ff, 0x000000ff, 0x00084208, 0x0001ec85,
    647           0x07030700, 0x07030700, 0x03030300, 0x0000001f,
    648           0x0000001f, 0x0000001f, 0x00001000, 0x00001000,
    649           0x00000100, 0x00008000, 0x00001000, 0x00000010,
    650           0x3f800000, 0x00000000, 0x00000000, 0x00000000,
    651           0x00000000, 0x00000000, 0x000001ff, 0x00100008,
    652           0x03feffff, 0x00000008, 0x00000008, 0x0000003b,
    653           0x00000008, 0x00000006, 0x00000001, 0x00000000,
    654           0x437f0000, 0x000fffff, 0x000fffff, 0x00000010,
    655           0x00000400, 0xfffe0200, 0x00000080, 0xffff0200,
    656           0x41000000, 0x00000051, 0x00000000, 0x00000000,
    657           0x00000000, 0x00000000, 0x00000001, 0x0000000f,
    658           0x00000001, 0x03000300, 0x00000000, 0x00000000,
    659           0x0000001f, 0x00000001, 0x00000000, 0x00000000,
    660           0x00000100, 0x00000000, 0x00000060, 0x00000000,
    661           0x0000ffff, 0x00000200, 0x00000000, 0x00000000
     643        0x00000001, 0x00000000, 0x00000000, 0x60020000,
     644        0x00000320, 0x80000001, 0x00000003, 0x0019aff0,
     645        0x000a0ff2, 0x07332191, 0x000000ff, 0x00003fff,
     646        0x000023ff, 0x000000ff, 0x00084208, 0x0001ec85,
     647        0x07030700, 0x07030700, 0x03030300, 0x0000001f,
     648        0x0000001f, 0x0000001f, 0x00001000, 0x00001000,
     649        0x00000100, 0x00008000, 0x00001000, 0x00000010,
     650        0x3f800000, 0x00000000, 0x00000000, 0x00000000,
     651        0x00000000, 0x00000000, 0x000001ff, 0x00100008,
     652        0x03feffff, 0x00000008, 0x00000008, 0x0000013b,
     653        0x00000008, 0x00000006, 0x00000000, 0x00000000,
     654        0x437f0000, 0x000fffff, 0x000fffff, 0x00000010,
     655        0x00000400, 0xfffe0200, 0x00000080, 0xffff0200,
     656        0x41000000, 0x00000051, 0x00000000, 0x00000000,
     657        0x00000000, 0x00000000, 0x00000001, 0x0000000f,
     658        0x00000001, 0x03000300, 0x00000000, 0x00000000,
     659        0x0000001f, 0x00000001, 0x00000000, 0x00000000,
     660        0x00000100, 0x00000000, 0x00000060, 0x00000000,
     661        0x0000ffff, 0x00000200, 0x00000000, 0x00000000
    662662};
    663663
     
    934934    D3DCAPSSOURCE_TYPE_NULL,
    935935    D3DCAPSSOURCE_TYPE_LOCAL,
    936     D3DCAPSSOURCE_TYPE_FILE
     936    D3DCAPSSOURCE_TYPE_FILE,
     937    D3DCAPSSOURCE_TYPE_NONE
    937938} D3DCAPSSOURCE_TYPE;
    938939
     
    977978            return NULL;
    978979        }
     980        case D3DCAPSSOURCE_TYPE_NONE:
     981            return NULL;
    979982        default:
    980983        {
     
    988991}
    989992
     993static void vboxUmdDumpDword(DWORD *pvData, DWORD cData)
     994{
     995    char aBuf[16*4];
     996    DWORD dw1, dw2, dw3, dw4;
     997    for (UINT i = 0; i < (cData & (~3)); i+=4)
     998    {
     999        dw1 = *pvData++;
     1000        dw2 = *pvData++;
     1001        dw3 = *pvData++;
     1002        dw4 = *pvData++;
     1003        sprintf(aBuf, "0x%08x, 0x%08x, 0x%08x, 0x%08x,\n", dw1, dw2, dw3, dw4);
     1004        Log(("%s", aBuf));
     1005    }
     1006
     1007    cData = cData % 4;
     1008    switch (cData)
     1009    {
     1010        case 3:
     1011            dw1 = *pvData++;
     1012            dw2 = *pvData++;
     1013            dw3 = *pvData++;
     1014            sprintf(aBuf, "0x%08x, 0x%08x, 0x%08x\n", dw1, dw2, dw3);
     1015            Log(("%s", aBuf));
     1016            break;
     1017        case 2:
     1018            dw1 = *pvData++;
     1019            dw2 = *pvData++;
     1020            sprintf(aBuf, "0x%08x, 0x%08x\n", dw1, dw2);
     1021            Log(("%s", aBuf));
     1022            break;
     1023        case 1:
     1024            dw1 = *pvData++;
     1025            sprintf(aBuf, "0x%8x\n", dw1);
     1026            Log(("%s", aBuf));
     1027            break;
     1028        default:
     1029            break;
     1030    }
     1031}
     1032
    9901033int main()
    9911034{
     
    10061049    D3DCAPS9 Caps1, Caps2;
    10071050    D3DCAPS9 *pCaps1, *pCaps2;
    1008     D3DCAPSSOURCE_TYPE enmCaps1 = D3DCAPSSOURCE_TYPE_EMBEDDED2;
    1009     D3DCAPSSOURCE_TYPE enmCaps2 = D3DCAPSSOURCE_TYPE_EMBEDDED1;
     1051    D3DCAPSSOURCE_TYPE enmCaps1 = D3DCAPSSOURCE_TYPE_EMBEDDED1;
     1052    D3DCAPSSOURCE_TYPE enmCaps2 = D3DCAPSSOURCE_TYPE_EMBEDDED2;
    10101053
    10111054    pCaps1 = selectCaps(&Caps1, (D3DCAPS9*)g_aCaps1, (D3DCAPS9*)g_aCaps2, enmCaps1);
     
    10161059    }
    10171060
    1018     pCaps2 = selectCaps(&Caps2, (D3DCAPS9*)g_aCaps1, (D3DCAPS9*)g_aCaps2, enmCaps2);
    1019     if (!pCaps2)
    1020     {
    1021         Log(("Failed to select Caps2"));
    1022         return 1;
    1023     }
    1024 
    1025     diffCaps((D3DCAPS9*)g_aCaps2, (D3DCAPS9*)g_aCaps1);
     1061    if (D3DCAPSSOURCE_TYPE_NONE != enmCaps2)
     1062    {
     1063        pCaps2 = selectCaps(&Caps2, (D3DCAPS9*)g_aCaps1, (D3DCAPS9*)g_aCaps2, enmCaps2);
     1064        if (!pCaps2)
     1065        {
     1066            Log(("Failed to select Caps2"));
     1067            return 1;
     1068        }
     1069
     1070        diffCaps((D3DCAPS9*)pCaps1, (D3DCAPS9*)pCaps2);
     1071    }
     1072    else
     1073    {
     1074        vboxUmdDumpDword((DWORD*)pCaps1, sizeof (*pCaps1) / sizeof (DWORD));
     1075    }
    10261076    return 0;
    10271077}
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/Makefile.kmk

    r43489 r46757  
    8888 endif
    8989 VBoxVideoWddm_DEFS       += LOG_TO_BACKDOOR
    90  ifdef VBOX_WITH_CROGL
    91   VBoxVideoWddm_DEFS      += VBOX_WITH_CROGL
    92  endif
    9390 ifdef VBOX_VDMA_WITH_WATCHDOG
    9491  VBoxVideoWddm_DEFS      += VBOX_VDMA_WITH_WATCHDOG
    9592 endif
    96  
    9793 VBoxVideoWddm_INCS       += \
    9894        ../../../include \
     
    122118        common/VBoxMPVidModes.cpp \
    123119        $(PATH_ROOT)/src/VBox/Additions/common/VBoxVideo/HGSMIBase.cpp \
    124         $(PATH_ROOT)/src/VBox/Additions/common/VBoxVideo/Modesetting.cpp
    125  if defined(VBOX_WITH_CROGL) && defined(VBOX_WDDM_WITH_CRCMD)
     120        $(PATH_ROOT)/src/VBox/Additions/common/VBoxVideo/Modesetting.cpp \
     121        $(PATH_ROOT)/src/VBox/GuestHost/OpenGL/util/vreg.cpp
     122 if defined(VBOX_WITH_CROGL)
    126123   VBoxVideoWddm_SOURCES   += \
    127124        $(PATH_ROOT)/src/VBox/GuestHost/OpenGL/packer/pack_buffer.c \
    128125        $(PATH_ROOT)/src/VBox/GuestHost/OpenGL/packer/pack_bounds.c \
     126        $(PATH_ROOT)/src/VBox/GuestHost/OpenGL/packer/pack_visibleregion.c \
     127        $(PATH_ROOT)/src/VBox/GuestHost/OpenGL/packer/pack_misc.c \
    129128        $(VBOX_PATH_CROGL_GENFILES)/pack_bounds_swap.c \
    130129        wddm/VBoxMPCrUtil.cpp
    131    VBoxVideoWddm_DEFS      += VBOX_WDDM_WITH_CRCMD
     130   VBoxVideoWddm_DEFS      += VBOX_WITH_CROGL
    132131 endif
    133132 ifdef VBOXWDDM_WITH_VBVA
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPDevExt.h

    r45037 r46757  
    106106   LIST_ENTRY SwapchainList3D;
    107107   /* mutex for context list operations */
    108 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    109108   KSPIN_LOCK ContextLock;
    110 #else
    111    FAST_MUTEX ContextMutex;
    112 #endif
    113109   KSPIN_LOCK SynchLock;
    114110   volatile uint32_t cContexts3D;
     
    119115   volatile BOOLEAN fRenderToShadowDisabled;
    120116
     117   BOOLEAN fTexPresentEnabled;
     118
    121119   VBOXMP_CRCTLCON CrCtlCon;
    122 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    123120   VBOXMP_CRSHGSMITRANSPORT CrHgsmiTransport;
    124 #endif
    125121
    126122   VBOXWDDM_GLOBAL_POINTER_INFO PointerInfo;
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPCr.cpp

    r43489 r46757  
    2424#ifdef VBOX_WITH_CROGL
    2525#include <cr_protocol.h>
    26 
    27 # ifdef VBOX_WDDM_WITH_CRCMD
    2826
    2927static void* vboxMpCrShgsmiBufferAlloc(PVBOXMP_DEVEXT pDevExt, HGSMISIZE cbData)
     
    480478    VBOXVDMACMD_CHROMIUM_BUFFER *pBufCmd = &pBody->aBuffers[0];
    481479    Assert(pBufCmd->cbBuffer == sizeof (CRVBOXHGSMIWRITE));
    482     CRVBOXHGSMIWRITE * pWr = (CRVBOXHGSMIWRITE*)vboxMpCrShgsmiTransportBufFromOffset(pCon, pBufCmd->offBuffer);
    483480    PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEASYNC_COMPLETION pfnCompletion = (PFNVBOXMP_CRSHGSMITRANSPORT_SENDWRITEASYNC_COMPLETION)pBufCmd->u64GuestData;
    484481
     
    486483    if (RT_SUCCESS(rc))
    487484    {
    488         rc = pWr->hdr.result;
     485        rc = pCmd->hdr.result;
    489486        if (!RT_SUCCESS(rc))
    490487        {
     
    588585    CRVBOXHGSMIWRITE *pCmd = &pWrData->Cmd;
    589586
    590     pDr->fFlags = VBOXVDMACBUF_FLAG_BUF_VRAM_OFFSET;
     587    pDr->fFlags = VBOXVDMACBUF_FLAG_BUF_FOLLOWS_DR;
    591588    pDr->cbBuf = cbCmd;
    592589    pDr->rc = VERR_NOT_IMPLEMENTED;
    593     pDr->Location.offVramBuf = vboxMpCrShgsmiTransportBufOffset(pCon, pCmd);
     590//    pDr->Location.offVramBuf = vboxMpCrShgsmiTransportBufOffset(pCon, pCmd);
    594591
    595592    pHdr->enmType = VBOXVDMACMD_TYPE_CHROMIUM_CMD;
     
    600597    pCmd->hdr.result      = VERR_WRONG_ORDER;
    601598    pCmd->hdr.u32ClientID = u32ClientID;
    602     pCmd->hdr.u32Function = SHCRGL_GUEST_FN_WRITE_READ;
     599    pCmd->hdr.u32Function = SHCRGL_GUEST_FN_WRITE;
    603600    //    pCmd->hdr.u32Reserved = 0;
    604601    pCmd->iBuffer = 1;
    605602
    606603    VBOXVDMACMD_CHROMIUM_BUFFER *pBufCmd = &pBody->aBuffers[0];
    607     pBufCmd->offBuffer = vboxMpCrShgsmiTransportBufOffset(pCon, pCmd);
     604    pBufCmd->offBuffer = vboxVdmaCBufDrPtrOffset(&pDevExt->u.primary.Vdma, pCmd);
    608605    pBufCmd->cbBuffer = sizeof (*pCmd);
    609606    pBufCmd->u32GuestData = 0;
     
    643640}
    644641
    645 # endif
    646642#endif
    647643
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPCr.h

    r43489 r46757  
    3737int VBoxMpCrCtlConCallUserData(PVBOXMP_CRCTLCON pCrCtlCon, struct VBoxGuestHGCMCallInfo *pData, uint32_t cbData);
    3838
    39 #ifdef VBOX_WDDM_WITH_CRCMD
    4039# include <cr_pack.h>
    4140
     
    218217    }
    219218}
    220 
    221 #define VBOXMP_CRCMD_SIZE_WINDOWPOSITION 20
    222 #define VBOXMP_CRCMD_SIZE_WINDOWVISIBLEREGIONS(_cRects) (16 + _cRects * 4 * sizeof(GLint))
    223 
    224 #endif
     219#define VBOXMP_CRCMD_HEADER_SIZE sizeof (CRMessageOpcodes)
     220/* last +4 below is 4-aligned comand opcode size (i.e. ((1 + 3) & ~3)) */
     221#define VBOXMP_CRCMD_SIZE_WINDOWPOSITION (20 + 4)
     222#define VBOXMP_CRCMD_SIZE_WINDOWVISIBLEREGIONS(_cRects) (16 + (_cRects) * 4 * sizeof (GLint) + 4)
     223#define VBOXMP_CRCMD_SIZE_VBOXTEXPRESENT(_cRects) (28 + (_cRects) * 4 * sizeof (GLint) + 4)
     224#define VBOXMP_CRCMD_SIZE_WINDOWSHOW (16 + 4)
     225#define VBOXMP_CRCMD_SIZE_WINDOWSIZE (20 + 4)
     226
    225227#endif /* #ifndef ___VBoxMPCr_h__ */
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPCrUtil.cpp

    r42029 r46757  
    3232DECLEXPORT(int)  crMemcmp( const void *p1, const void *p2, unsigned int bytes );
    3333DECLEXPORT(void) crDebug(const char *format, ... );
     34#ifndef DEBUG_misha
    3435DECLEXPORT(void) crWarning(const char *format, ... );
     36#endif
     37
    3538DECLEXPORT(void) crInfo(const char *format, ... );
    3639DECLEXPORT(void) crError(const char *format, ... );
     
    7477}
    7578
     79#ifndef DEBUG_misha
    7680DECLEXPORT(void) crWarning(const char *format, ... )
    7781{
    7882
    7983}
     84#endif
    8085
    8186DECLEXPORT(void) crInfo(const char *format, ... )
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPMisc.cpp

    r45132 r46757  
    194194        pSwapchain->width = w;
    195195        pSwapchain->height = h;
    196         VBoxWddmVrListInit(&pSwapchain->VisibleRegions);
     196        VBoxVrListInit(&pSwapchain->VisibleRegions);
    197197    }
    198198    return pSwapchain;
     
    225225    if (!cRefs)
    226226    {
    227         VBoxWddmVrListClear(&pSwapchain->VisibleRegions);
     227        VBoxVrListClear(&pSwapchain->VisibleRegions);
    228228        vboxWddmMemFree(pSwapchain);
    229229    }
     
    313313    vboxWddmSwapchainAllocRemoveAllInternal(pDevExt, pSwapchain, TRUE);
    314314
    315 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    316     Assert(pSwapchain->pContext);
    317     if (pSwapchain->pContext)
    318     {
    319         NTSTATUS tmpStatus = vboxVdmaGgCmdCancel(pDevExt, pSwapchain->pContext, pSwapchain);
    320         if (tmpStatus != STATUS_SUCCESS)
    321         {
    322             WARN(("vboxVdmaGgCmdCancel returned Status (0x%x)", tmpStatus));
    323         }
    324     }
    325 #endif
    326 
    327315    vboxWddmSwapchainRelease(pSwapchain);
    328316}
     
    350338    RemoveEntryList(&pSwapchain->DevExtListEntry);
    351339    pSwapchain->hSwapchainKm = NULL;
    352     VBoxWddmVrListClear(&pSwapchain->VisibleRegions);
     340    VBoxVrListClear(&pSwapchain->VisibleRegions);
    353341    vboxWddmSwapchainRelease(pSwapchain);
    354342}
     
    412400    if (cbSize < RT_OFFSETOF(VBOXDISPIFESCAPE_SWAPCHAININFO, SwapchainInfo.ahAllocs[pSwapchainInfo->SwapchainInfo.cAllocs]))
    413401        return STATUS_INVALID_PARAMETER;
     402
     403    if (!pSwapchainInfo->SwapchainInfo.winHostID)
     404    {
     405        WARN(("Zero winHostID specified!"));
     406        return STATUS_INVALID_PARAMETER;
     407    }
    414408
    415409    PVBOXWDDM_SWAPCHAIN pSwapchain = NULL;
     
    499493//        memset(&pSwapchain->ViewRect, 0, sizeof (pSwapchain->ViewRect));
    500494        /* @todo: do we really need to zero this up here ? */
    501         VBoxWddmVrListClear(&pSwapchain->VisibleRegions);
     495        VBoxVrListClear(&pSwapchain->VisibleRegions);
    502496
    503497        vboxWddmSwapchainAllocRemoveAll(pDevExt, pSwapchain);
     
    510504            }
    511505            pSwapchain->hSwapchainUm = pSwapchainInfo->SwapchainInfo.hSwapchainUm;
     506            if (pSwapchain->winHostID != pSwapchainInfo->SwapchainInfo.winHostID)
     507            {
     508                pSwapchain->fExposed = FALSE;
     509                pSwapchain->winHostID = pSwapchainInfo->SwapchainInfo.winHostID;
     510            }
    512511        }
    513512        else
     
    14091408            break;
    14101409
     1410        Assert(0);
     1411
    14111412        Status = vboxVideoAMgrCtxAllocDestroy(pCtx, pRef->hSessionHandle);
    14121413        Assert(Status == STATUS_SUCCESS);
     
    16051606#endif
    16061607
    1607 
    1608 /* visible rects */
    1609 typedef struct VBOXWDDMVR_REG
    1610 {
    1611     LIST_ENTRY ListEntry;
    1612     RECT Rect;
    1613 } VBOXWDDMVR_REG, *PVBOXWDDMVR_REG;
    1614 
    1615 #define PVBOXWDDMVR_REG_FROM_ENTRY(_pEntry) ((PVBOXWDDMVR_REG)(((uint8_t*)(_pEntry)) - RT_OFFSETOF(VBOXWDDMVR_REG, ListEntry)))
    1616 
    1617 #ifdef DEBUG_misha
    1618 //# define VBOXVDBG_VR_LAL_DISABLE
    1619 #endif
    1620 
    1621 #ifndef VBOXVDBG_VR_LAL_DISABLE
    1622 static LOOKASIDE_LIST_EX g_VBoxWddmVrLookasideList;
    1623 #endif
    1624 
    1625 static PVBOXWDDMVR_REG vboxWddmVrRegCreate()
    1626 {
    1627 #ifndef VBOXVDBG_VR_LAL_DISABLE
    1628     PVBOXWDDMVR_REG pReg = (PVBOXWDDMVR_REG)ExAllocateFromLookasideListEx(&g_VBoxWddmVrLookasideList);
    1629     if (!pReg)
    1630     {
    1631         WARN(("ExAllocateFromLookasideListEx failed!"));
    1632     }
    1633     return pReg;
    1634 #else
    1635     return (PVBOXWDDMVR_REG)vboxWddmMemAlloc(sizeof (VBOXWDDMVR_REG));
    1636 #endif
    1637 }
    1638 
    1639 static void vboxWddmVrRegTerm(PVBOXWDDMVR_REG pReg)
    1640 {
    1641 #ifndef VBOXVDBG_VR_LAL_DISABLE
    1642     ExFreeToLookasideListEx(&g_VBoxWddmVrLookasideList, pReg);
    1643 #else
    1644     vboxWddmMemFree(pReg);
    1645 #endif
    1646 }
    1647 
    1648 void VBoxWddmVrListClear(PVBOXWDDMVR_LIST pList)
    1649 {
    1650     PLIST_ENTRY pNext;
    1651     for (PLIST_ENTRY pEntry = pList->ListHead.Flink; pEntry != &pList->ListHead; pEntry = pNext)
    1652     {
    1653         pNext = pEntry->Flink;
    1654         PVBOXWDDMVR_REG pReg = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry);
    1655         vboxWddmVrRegTerm(pReg);
    1656     }
    1657     VBoxWddmVrListInit(pList);
    1658 }
    1659 
    1660 #define VBOXWDDMVR_MEMTAG 'vDBV'
    1661 
    1662 NTSTATUS VBoxWddmVrInit()
    1663 {
    1664 #ifndef VBOXVDBG_VR_LAL_DISABLE
    1665     NTSTATUS Status = ExInitializeLookasideListEx(&g_VBoxWddmVrLookasideList,
    1666                             NULL, /* PALLOCATE_FUNCTION_EX Allocate */
    1667                             NULL, /* PFREE_FUNCTION_EX Free */
    1668                             NonPagedPool,
    1669                             0, /* ULONG Flags */
    1670                             sizeof (VBOXWDDMVR_REG),
    1671                             VBOXWDDMVR_MEMTAG,
    1672                             0 /* USHORT Depth - reserved, must be null */
    1673                             );
    1674     if (!NT_SUCCESS(Status))
    1675     {
    1676         WARN(("ExInitializeLookasideListEx failed, Status (0x%x)", Status));
    1677         return Status;
    1678     }
    1679 #endif
    1680 
    1681     return STATUS_SUCCESS;
    1682 }
    1683 
    1684 void VBoxWddmVrTerm()
    1685 {
    1686 #ifndef VBOXVDBG_VR_LAL_DISABLE
    1687     ExDeleteLookasideListEx(&g_VBoxWddmVrLookasideList);
    1688 #endif
    1689 }
    1690 
    1691 typedef DECLCALLBACK(int) FNVBOXWDDMVR_CB_COMPARATOR(const VBOXWDDMVR_REG *pReg1, const VBOXWDDMVR_REG *pReg2);
    1692 typedef FNVBOXWDDMVR_CB_COMPARATOR *PFNVBOXWDDMVR_CB_COMPARATOR;
    1693 
    1694 static DECLCALLBACK(int) vboxWddmVrRegNonintersectedComparator(const RECT* pRect1, const RECT* pRect2)
    1695 {
    1696     Assert(!vboxWddmRectIsIntersect(pRect1, pRect2));
    1697     if (pRect1->top != pRect2->top)
    1698         return pRect1->top - pRect2->top;
    1699     return pRect1->left - pRect2->left;
    1700 }
    1701 
    1702 #ifdef DEBUG_misha
    1703 static void vboxWddmVrDbgListDoVerify(PVBOXWDDMVR_LIST pList)
    1704 {
    1705     PLIST_ENTRY pEntry1 = pList->ListHead.Flink;
    1706 
    1707     for (PLIST_ENTRY pEntry1 = pList->ListHead.Flink; pEntry1 != &pList->ListHead; pEntry1 = pEntry1->Flink)
    1708     {
    1709         PVBOXWDDMVR_REG pReg1 = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry1);
    1710         for (PLIST_ENTRY pEntry2 = pEntry1->Flink; pEntry2 != &pList->ListHead; pEntry2 = pEntry2->Flink)
    1711         {
    1712             PVBOXWDDMVR_REG pReg2 = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry2);
    1713             Assert(vboxWddmVrRegNonintersectedComparator(&pReg1->Rect, &pReg2->Rect) < 0);
    1714         }
    1715     }
    1716 }
    1717 
    1718 #define vboxWddmVrDbgListVerify vboxWddmVrDbgListDoVerify
    1719 #else
    1720 #define vboxWddmVrDbgListVerify(_p) do {} while (0)
    1721 #endif
    1722 
    1723 static NTSTATUS vboxWddmVrListUniteIntersection(PVBOXWDDMVR_LIST pList, PVBOXWDDMVR_LIST pIntersection);
    1724 
    1725 #define VBOXWDDMVR_INVALID_COORD (~0UL)
    1726 
    1727 DECLINLINE(void) vboxWddmVrListRegAdd(PVBOXWDDMVR_LIST pList, PVBOXWDDMVR_REG pReg, PLIST_ENTRY pPlace, BOOLEAN fAfter)
    1728 {
    1729     if (fAfter)
    1730         InsertHeadList(pPlace, &pReg->ListEntry);
    1731     else
    1732         InsertTailList(pPlace, &pReg->ListEntry);
    1733     ++pList->cEntries;
    1734     vboxWddmVrDbgListVerify(pList);
    1735 }
    1736 
    1737 DECLINLINE(void) vboxWddmVrListRegRemove(PVBOXWDDMVR_LIST pList, PVBOXWDDMVR_REG pReg)
    1738 {
    1739     RemoveEntryList(&pReg->ListEntry);
    1740     --pList->cEntries;
    1741 }
    1742 
    1743 static void vboxWddmVrListRegAddOrder(PVBOXWDDMVR_LIST pList, PLIST_ENTRY pMemberEntry, PVBOXWDDMVR_REG pReg)
    1744 {
    1745     do
    1746     {
    1747         if (pMemberEntry != &pList->ListHead)
    1748         {
    1749             PVBOXWDDMVR_REG pMemberReg = PVBOXWDDMVR_REG_FROM_ENTRY(pMemberEntry);
    1750             if (vboxWddmVrRegNonintersectedComparator(&pMemberReg->Rect, &pReg->Rect) < 0)
    1751             {
    1752                 pMemberEntry = pMemberEntry->Flink;
    1753                 continue;
    1754             }
    1755         }
    1756         vboxWddmVrListRegAdd(pList, pReg, pMemberEntry, FALSE);
    1757         break;
    1758     } while (1);
    1759 }
    1760 
    1761 static void vboxWddmVrListAddNonintersected(PVBOXWDDMVR_LIST pList1, PVBOXWDDMVR_LIST pList2)
    1762 {
    1763     PLIST_ENTRY pEntry1 = pList1->ListHead.Flink;
    1764 
    1765     for (PLIST_ENTRY pEntry2 = pList2->ListHead.Flink; pEntry2 != &pList2->ListHead; pEntry2 = pList2->ListHead.Flink)
    1766     {
    1767         PVBOXWDDMVR_REG pReg2 = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry2);
    1768         do {
    1769             if (pEntry1 != &pList1->ListHead)
    1770             {
    1771                 PVBOXWDDMVR_REG pReg1 = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry1);
    1772                 if (vboxWddmVrRegNonintersectedComparator(&pReg1->Rect, &pReg2->Rect) < 0)
    1773                 {
    1774                     pEntry1 = pEntry1->Flink;
    1775                     continue;
    1776                 }
    1777             }
    1778             vboxWddmVrListRegRemove(pList2, pReg2);
    1779             vboxWddmVrListRegAdd(pList1, pReg2, pEntry1, FALSE);
    1780             break;
    1781         } while (1);
    1782     }
    1783 
    1784     Assert(VBoxWddmVrListIsEmpty(pList2));
    1785 }
    1786 
    1787 static NTSTATUS vboxWddmVrListRegIntersectSubstNoJoin(PVBOXWDDMVR_LIST pList1, PVBOXWDDMVR_REG pReg1, const RECT * pRect2)
    1788 {
    1789     UINT topLim = VBOXWDDMVR_INVALID_COORD;
    1790     UINT bottomLim = VBOXWDDMVR_INVALID_COORD;
    1791     LIST_ENTRY List;
    1792     PVBOXWDDMVR_REG pBottomReg = NULL;
    1793 #ifdef DEBUG_misha
    1794     RECT tmpRect = pReg1->Rect;
    1795     vboxWddmVrDbgListVerify(pList1);
    1796 #endif
    1797 
    1798     InitializeListHead(&List);
    1799 
    1800     Assert(vboxWddmRectIsIntersect(&pReg1->Rect, pRect2));
    1801 
    1802     if (pReg1->Rect.top < pRect2->top)
    1803     {
    1804         Assert(pRect2->top < pReg1->Rect.bottom);
    1805         PVBOXWDDMVR_REG pRegResult = vboxWddmVrRegCreate();
    1806         pRegResult->Rect.top = pReg1->Rect.top;
    1807         pRegResult->Rect.left = pReg1->Rect.left;
    1808         pRegResult->Rect.bottom = pRect2->top;
    1809         pRegResult->Rect.right = pReg1->Rect.right;
    1810         topLim = pRect2->top;
    1811         InsertTailList(&List, &pRegResult->ListEntry);
    1812     }
    1813 
    1814     if (pReg1->Rect.bottom > pRect2->bottom)
    1815     {
    1816         Assert(pRect2->bottom > pReg1->Rect.top);
    1817         PVBOXWDDMVR_REG pRegResult = vboxWddmVrRegCreate();
    1818         pRegResult->Rect.top = pRect2->bottom;
    1819         pRegResult->Rect.left = pReg1->Rect.left;
    1820         pRegResult->Rect.bottom = pReg1->Rect.bottom;
    1821         pRegResult->Rect.right = pReg1->Rect.right;
    1822         bottomLim = pRect2->bottom;
    1823         pBottomReg = pRegResult;
    1824     }
    1825 
    1826     if (pReg1->Rect.left < pRect2->left)
    1827     {
    1828         Assert(pRect2->left < pReg1->Rect.right);
    1829         PVBOXWDDMVR_REG pRegResult = vboxWddmVrRegCreate();
    1830         pRegResult->Rect.top = topLim == VBOXWDDMVR_INVALID_COORD ? pReg1->Rect.top : topLim;
    1831         pRegResult->Rect.left = pReg1->Rect.left;
    1832         pRegResult->Rect.bottom = bottomLim == VBOXWDDMVR_INVALID_COORD ? pReg1->Rect.bottom : bottomLim;
    1833         pRegResult->Rect.right = pRect2->left;
    1834         InsertTailList(&List, &pRegResult->ListEntry);
    1835     }
    1836 
    1837     if (pReg1->Rect.right > pRect2->right)
    1838     {
    1839         Assert(pRect2->right > pReg1->Rect.left);
    1840         PVBOXWDDMVR_REG pRegResult = vboxWddmVrRegCreate();
    1841         pRegResult->Rect.top = topLim == VBOXWDDMVR_INVALID_COORD ? pReg1->Rect.top : topLim;
    1842         pRegResult->Rect.left = pRect2->right;
    1843         pRegResult->Rect.bottom = bottomLim == VBOXWDDMVR_INVALID_COORD ? pReg1->Rect.bottom : bottomLim;
    1844         pRegResult->Rect.right = pReg1->Rect.right;
    1845         InsertTailList(&List, &pRegResult->ListEntry);
    1846     }
    1847 
    1848     if (pBottomReg)
    1849         InsertTailList(&List, &pBottomReg->ListEntry);
    1850 
    1851     PLIST_ENTRY pMemberEntry = pReg1->ListEntry.Flink;
    1852     vboxWddmVrListRegRemove(pList1, pReg1);
    1853     vboxWddmVrRegTerm(pReg1);
    1854 
    1855     if (IsListEmpty(&List))
    1856         return STATUS_SUCCESS; /* the region is covered by the pRect2 */
    1857 
    1858     PLIST_ENTRY pEntry = List.Flink, pNext;
    1859     for (; pEntry != &List; pEntry = pNext)
    1860     {
    1861         pNext = pEntry->Flink;
    1862         PVBOXWDDMVR_REG pReg = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry);
    1863 
    1864         vboxWddmVrListRegAddOrder(pList1, pMemberEntry, pReg);
    1865         pMemberEntry = pEntry->Flink; /* the following elements should go after the given pEntry since they are ordered already */
    1866     }
    1867     return STATUS_SUCCESS;
    1868 }
    1869 
    1870 typedef DECLCALLBACK(PLIST_ENTRY) FNVBOXWDDMVR_CB_INTERSECTED_VISITOR(PVBOXWDDMVR_LIST pList1, PVBOXWDDMVR_REG pReg1, const RECT * pRect2, void *pvContext, PLIST_ENTRY *ppNext);
    1871 typedef FNVBOXWDDMVR_CB_INTERSECTED_VISITOR *PFNVBOXWDDMVR_CB_INTERSECTED_VISITOR;
    1872 
    1873 static void vboxWddmVrListVisitIntersected(PVBOXWDDMVR_LIST pList1, UINT cRects, const RECT *aRects, PFNVBOXWDDMVR_CB_INTERSECTED_VISITOR pfnVisitor, void* pvVisitor)
    1874 {
    1875     PLIST_ENTRY pEntry1 = pList1->ListHead.Flink;
    1876     PLIST_ENTRY pNext1;
    1877     UINT iFirst2 = 0;
    1878 
    1879     for (; pEntry1 != &pList1->ListHead; pEntry1 = pNext1)
    1880     {
    1881         pNext1 = pEntry1->Flink;
    1882         PVBOXWDDMVR_REG pReg1 = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry1);
    1883         for (UINT i = iFirst2; i < cRects; ++i)
    1884         {
    1885             const RECT *pRect2 = &aRects[i];
    1886             if (pReg1->Rect.bottom <= pRect2->top)
    1887                 continue;
    1888             else if (pRect2->bottom <= pReg1->Rect.top)
    1889                 continue;
    1890             /* y coords intersect */
    1891             else if (pReg1->Rect.right <= pRect2->left)
    1892                 continue;
    1893             else if (pRect2->right <= pReg1->Rect.left)
    1894                 continue;
    1895             /* x coords intersect */
    1896 
    1897             /* the visitor can modify the list 1, apply necessary adjustments after it */
    1898             PLIST_ENTRY pEntry1 = pfnVisitor (pList1, pReg1, pRect2, pvVisitor, &pNext1);
    1899             if (pEntry1 == &pList1->ListHead)
    1900                 break;
    1901         }
    1902     }
    1903 }
    1904 
    1905 
    1906 static void vboxWddmVrListJoinRectsHV(PVBOXWDDMVR_LIST pList, BOOLEAN fHorizontal)
    1907 {
    1908     PLIST_ENTRY pNext1, pNext2;
    1909 
    1910     for (PLIST_ENTRY pEntry1 = pList->ListHead.Flink; pEntry1 != &pList->ListHead; pEntry1 = pNext1)
    1911     {
    1912         PVBOXWDDMVR_REG pReg1 = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry1);
    1913         pNext1 = pEntry1->Flink;
    1914         for (PLIST_ENTRY pEntry2 = pEntry1->Flink; pEntry2 != &pList->ListHead; pEntry2 = pNext2)
    1915         {
    1916             PVBOXWDDMVR_REG pReg2 = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry2);
    1917             pNext2 = pEntry2->Flink;
    1918             if (fHorizontal)
    1919             {
    1920                 if (pReg1->Rect.top == pReg2->Rect.top)
    1921                 {
    1922                     if (pReg1->Rect.right == pReg2->Rect.left)
    1923                     {
    1924                         /* join rectangles */
    1925                         vboxWddmVrListRegRemove(pList, pReg2);
    1926                         if (pReg1->Rect.bottom > pReg2->Rect.bottom)
    1927                         {
    1928                             LONG oldRight1 = pReg1->Rect.right;
    1929                             LONG oldBottom1 = pReg1->Rect.bottom;
    1930                             pReg1->Rect.right = pReg2->Rect.right;
    1931                             pReg1->Rect.bottom = pReg2->Rect.bottom;
    1932 
    1933                             vboxWddmVrDbgListVerify(pList);
    1934 
    1935                             pReg2->Rect.left = pReg1->Rect.left;
    1936                             pReg2->Rect.top = pReg1->Rect.bottom;
    1937                             pReg2->Rect.right = oldRight1;
    1938                             pReg2->Rect.bottom = oldBottom1;
    1939                             vboxWddmVrListRegAddOrder(pList, pReg1->ListEntry.Flink, pReg2);
    1940                             /* restart the pNext1 & pNext2 since regs are splitted into smaller ones in y dimension
    1941                              * and thus can match one of the previous rects */
    1942                             pNext1 = pList->ListHead.Flink;
    1943                             break;
    1944                         }
    1945                         else if (pReg1->Rect.bottom < pReg2->Rect.bottom)
    1946                         {
    1947                             pReg1->Rect.right = pReg2->Rect.right;
    1948                             vboxWddmVrDbgListVerify(pList);
    1949                             pReg2->Rect.top = pReg1->Rect.bottom;
    1950                             vboxWddmVrListRegAddOrder(pList, pReg1->ListEntry.Flink, pReg2);
    1951                             /* restart the pNext1 & pNext2 since regs are splitted into smaller ones in y dimension
    1952                              * and thus can match one of the previous rects */
    1953                             pNext1 = pList->ListHead.Flink;
    1954                             break;
    1955                         }
    1956                         else
    1957                         {
    1958                             pReg1->Rect.right = pReg2->Rect.right;
    1959                             vboxWddmVrDbgListVerify(pList);
    1960                             /* reset the pNext1 since it could be the pReg2 being destroyed */
    1961                             pNext1 = pEntry1->Flink;
    1962                             /* pNext2 stays the same since it is pReg2->ListEntry.pNext, which is kept intact */
    1963                             vboxWddmVrRegTerm(pReg2);
    1964                         }
    1965                     }
    1966                     continue;
    1967                 }
    1968                 else if (pReg1->Rect.bottom == pReg2->Rect.bottom)
    1969                 {
    1970                     Assert(pReg1->Rect.top < pReg2->Rect.top); /* <- since pReg1 > pReg2 && pReg1->Rect.top != pReg2->Rect.top*/
    1971                     if (pReg1->Rect.right == pReg2->Rect.left)
    1972                     {
    1973                         /* join rectangles */
    1974                         vboxWddmVrListRegRemove(pList, pReg2);
    1975 
    1976                         pReg1->Rect.bottom = pReg2->Rect.top;
    1977                         vboxWddmVrDbgListVerify(pList);
    1978                         pReg2->Rect.left = pReg1->Rect.left;
    1979 
    1980                         vboxWddmVrListRegAddOrder(pList, pReg2->ListEntry.Flink, pReg2);
    1981 
    1982                         /* restart the pNext1 & pNext2 since regs are splitted into smaller ones in y dimension
    1983                          * and thus can match one of the previous rects */
    1984                         pNext1 = pList->ListHead.Flink;
    1985                         break;
    1986                     }
    1987                     else if (pReg1->Rect.left == pReg2->Rect.right)
    1988                     {
    1989                         /* join rectangles */
    1990                         vboxWddmVrListRegRemove(pList, pReg2);
    1991 
    1992                         pReg1->Rect.bottom = pReg2->Rect.top;
    1993                         vboxWddmVrDbgListVerify(pList);
    1994                         pReg2->Rect.right = pReg1->Rect.right;
    1995 
    1996                         vboxWddmVrListRegAddOrder(pList, pReg2->ListEntry.Flink, pReg2);
    1997 
    1998                         /* restart the pNext1 & pNext2 since regs are splitted into smaller ones in y dimension
    1999                          * and thus can match one of the previous rects */
    2000                         pNext1 = pList->ListHead.Flink;
    2001                         break;
    2002                     }
    2003                     continue;
    2004                 }
    2005             }
    2006             else
    2007             {
    2008                 if (pReg1->Rect.bottom == pReg2->Rect.top)
    2009                 {
    2010                     if (pReg1->Rect.left == pReg2->Rect.left)
    2011                     {
    2012                         if (pReg1->Rect.right == pReg2->Rect.right)
    2013                         {
    2014                             /* join rects */
    2015                             vboxWddmVrListRegRemove(pList, pReg2);
    2016 
    2017                             pReg1->Rect.bottom = pReg2->Rect.bottom;
    2018                             vboxWddmVrDbgListVerify(pList);
    2019 
    2020                             /* reset the pNext1 since it could be the pReg2 being destroyed */
    2021                             pNext1 = pEntry1->Flink;
    2022                             /* pNext2 stays the same since it is pReg2->ListEntry.pNext, which is kept intact */
    2023                             vboxWddmVrRegTerm(pReg2);
    2024                             continue;
    2025                         }
    2026                         /* no more to be done for for pReg1 */
    2027                         break;
    2028                     }
    2029                     else if (pReg1->Rect.right > pReg2->Rect.left)
    2030                     {
    2031                         /* no more to be done for for pReg1 */
    2032                         break;
    2033                     }
    2034 
    2035                     continue;
    2036                 }
    2037                 else if (pReg1->Rect.bottom < pReg2->Rect.top)
    2038                 {
    2039                     /* no more to be done for for pReg1 */
    2040                     break;
    2041                 }
    2042             }
    2043         }
    2044     }
    2045 }
    2046 
    2047 static void vboxWddmVrListJoinRects(PVBOXWDDMVR_LIST pList)
    2048 {
    2049     vboxWddmVrListJoinRectsHV(pList, TRUE);
    2050     vboxWddmVrListJoinRectsHV(pList, FALSE);
    2051 }
    2052 
    2053 typedef struct VBOXWDDMVR_CBDATA_SUBST
    2054 {
    2055     NTSTATUS Status;
    2056     BOOLEAN fChanged;
    2057 } VBOXWDDMVR_CBDATA_SUBST, *PVBOXWDDMVR_CBDATA_SUBST;
    2058 
    2059 static DECLCALLBACK(PLIST_ENTRY) vboxWddmVrListSubstNoJoinCb(PVBOXWDDMVR_LIST pList, PVBOXWDDMVR_REG pReg1, const RECT *pRect2, void *pvContext, PLIST_ENTRY *ppNext)
    2060 {
    2061     PVBOXWDDMVR_CBDATA_SUBST pData = (PVBOXWDDMVR_CBDATA_SUBST)pvContext;
    2062     /* store the prev to get the new Flink out of it*/
    2063     PLIST_ENTRY pPrev = pReg1->ListEntry.Blink;
    2064     pData->fChanged = TRUE;
    2065 
    2066     Assert(vboxWddmRectIsIntersect(&pReg1->Rect, pRect2));
    2067 
    2068     /* NOTE: the pReg1 will be invalid after the vboxWddmVrListRegIntersectSubstNoJoin call!!! */
    2069     NTSTATUS Status = vboxWddmVrListRegIntersectSubstNoJoin(pList, pReg1, pRect2);
    2070     if (NT_SUCCESS(Status))
    2071     {
    2072         *ppNext = pPrev->Flink;
    2073         return &pList->ListHead;
    2074     }
    2075     WARN(("vboxWddmVrListRegIntersectSubstNoJoin failed!"));
    2076     Assert(!NT_SUCCESS(Status));
    2077     pData->Status = Status;
    2078     *ppNext = &pList->ListHead;
    2079     return &pList->ListHead;
    2080 }
    2081 
    2082 static NTSTATUS vboxWddmVrListSubstNoJoin(PVBOXWDDMVR_LIST pList, UINT cRects, const RECT *aRects, BOOLEAN *pfChanged)
    2083 {
    2084     if (VBoxWddmVrListIsEmpty(pList))
    2085         return STATUS_SUCCESS;
    2086 
    2087     VBOXWDDMVR_CBDATA_SUBST Data;
    2088     Data.Status = STATUS_SUCCESS;
    2089     Data.fChanged = FALSE;
    2090 
    2091     *pfChanged = FALSE;
    2092 
    2093     vboxWddmVrListVisitIntersected(pList, cRects, aRects, vboxWddmVrListSubstNoJoinCb, &Data);
    2094     if (!NT_SUCCESS(Data.Status))
    2095     {
    2096         WARN(("vboxWddmVrListVisitIntersected failed!"));
    2097         return Data.Status;
    2098     }
    2099 
    2100     *pfChanged = Data.fChanged;
    2101     return STATUS_SUCCESS;
    2102 }
    2103 
    2104 #if 0
    2105 static const RECT* vboxWddmVrRectsOrder(UINT cRects, const RECT *aRects)
    2106 {
    2107 #ifdef DEBUG
    2108     {
    2109         for (UINT i = 0; i < cRects; ++i)
    2110         {
    2111             RECT *pRectI = &aRects[i];
    2112             for (UINT j = i + 1; j < cRects; ++j)
    2113             {
    2114                 RECT *pRectJ = &aRects[j];
    2115                 Assert(!vboxWddmRectIsIntersect(pRectI, pRectJ));
    2116             }
    2117         }
    2118     }
    2119 #endif
    2120 
    2121     RECT * pRects = (RECT *)aRects;
    2122     /* check if rects are ordered already */
    2123     for (UINT i = 0; i < cRects - 1; ++i)
    2124     {
    2125         RECT *pRect1 = &pRects[i];
    2126         RECT *pRect2 = &pRects[i+1];
    2127         if (vboxWddmVrRegNonintersectedComparator(pRect1, pRect2) < 0)
    2128             continue;
    2129 
    2130         WARN(("rects are unoreded!"));
    2131 
    2132         if (pRects == aRects)
    2133         {
    2134             pRects = (RECT *)vboxWddmMemAlloc(sizeof (RECT) * cRects);
    2135             if (!pRects)
    2136             {
    2137                 WARN(("vboxWddmMemAlloc failed!"));
    2138                 return NULL;
    2139             }
    2140 
    2141             memcpy(pRects, aRects, sizeof (RECT) * cRects);
    2142         }
    2143 
    2144         Assert(pRects != aRects);
    2145 
    2146         int j = (int)i - 1;
    2147         do {
    2148             RECT Tmp = *pRect1;
    2149             *pRect1 = *pRect2;
    2150             *pRect2 = Tmp;
    2151 
    2152             if (j < 0)
    2153                 break;
    2154 
    2155             if (vboxWddmVrRegNonintersectedComparator(pRect1, pRect1-1) > 0)
    2156                 break;
    2157 
    2158             pRect2 = pRect1--;
    2159             --j;
    2160         } while (1);
    2161     }
    2162 
    2163     return pRects;
    2164 }
    2165 #endif
    2166 
    2167 void VBoxWddmVrListTranslate(PVBOXWDDMVR_LIST pList, LONG x, LONG y)
    2168 {
    2169     for (PLIST_ENTRY pEntry1 = pList->ListHead.Flink; pEntry1 != &pList->ListHead; pEntry1 = pEntry1->Flink)
    2170     {
    2171         PVBOXWDDMVR_REG pReg1 = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry1);
    2172         vboxWddmRectTranslate(&pReg1->Rect, x, y);
    2173     }
    2174 }
    2175 
    2176 NTSTATUS VBoxWddmVrListRectsSubst(PVBOXWDDMVR_LIST pList, UINT cRects, const RECT *aRects, BOOLEAN *pfChanged)
    2177 {
    2178 #if 0
    2179     const RECT *pRects = vboxWddmVrRectsOrder(cRects, aRects);
    2180     if (!pRects)
    2181     {
    2182         WARN(("vboxWddmVrRectsOrder failed!"));
    2183         return STATUS_NO_MEMORY;
    2184     }
    2185 #endif
    2186 
    2187     NTSTATUS Status = vboxWddmVrListSubstNoJoin(pList, cRects, aRects, pfChanged);
    2188     if (!NT_SUCCESS(Status))
    2189     {
    2190         WARN(("vboxWddmVrListSubstNoJoin failed!"));
    2191         goto done;
    2192     }
    2193 
    2194     if (!*pfChanged)
    2195         goto done;
    2196 
    2197     vboxWddmVrListJoinRects(pList);
    2198 
    2199 done:
    2200 #if 0
    2201     if (pRects != aRects)
    2202         vboxWddmMemFree(pRects);
    2203 #endif
    2204     return Status;
    2205 }
    2206 
    2207 NTSTATUS VBoxWddmVrListRectsAdd(PVBOXWDDMVR_LIST pList, UINT cRects, const RECT *aRects, BOOLEAN *pfChanged)
    2208 {
    2209     UINT cCovered = 0;
    2210 
    2211 #if 0
    2212 #ifdef DEBUG
    2213     {
    2214         for (UINT i = 0; i < cRects; ++i)
    2215         {
    2216             RECT *pRectI = &aRects[i];
    2217             for (UINT j = i + 1; j < cRects; ++j)
    2218             {
    2219                 RECT *pRectJ = &aRects[j];
    2220                 Assert(!vboxWddmRectIsIntersect(pRectI, pRectJ));
    2221             }
    2222         }
    2223     }
    2224 #endif
    2225 #endif
    2226 
    2227     /* early sort out the case when there are no new rects */
    2228     for (UINT i = 0; i < cRects; ++i)
    2229     {
    2230         for (PLIST_ENTRY pEntry1 = pList->ListHead.Flink; pEntry1 != &pList->ListHead; pEntry1 = pEntry1->Flink)
    2231         {
    2232             PVBOXWDDMVR_REG pReg1 = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry1);
    2233             if (vboxWddmRectIsCoveres(&pReg1->Rect, &aRects[i]))
    2234             {
    2235                 cCovered++;
    2236                 break;
    2237             }
    2238         }
    2239     }
    2240 
    2241     if (cCovered == cRects)
    2242     {
    2243         *pfChanged = FALSE;
    2244         return STATUS_SUCCESS;
    2245     }
    2246 
    2247     /* rects are not covered, need to go the slow way */
    2248 
    2249     VBOXWDDMVR_LIST DiffList;
    2250     VBoxWddmVrListInit(&DiffList);
    2251     PRECT pListRects = NULL;
    2252     UINT cAllocatedRects = 0;
    2253     BOOLEAN fNeedRectreate = TRUE;
    2254     BOOLEAN fChanged = FALSE;
    2255     NTSTATUS Status = STATUS_SUCCESS;
    2256 
    2257     for (UINT i = 0; i < cRects; ++i)
    2258     {
    2259         PVBOXWDDMVR_REG pReg = vboxWddmVrRegCreate();
    2260         if (!pReg)
    2261         {
    2262             WARN(("vboxWddmVrRegCreate failed!"));
    2263             Status = STATUS_NO_MEMORY;
    2264             break;
    2265         }
    2266         pReg->Rect = aRects[i];
    2267 
    2268         UINT cListRects = VBoxWddmVrListRectsCount(pList);
    2269         if (!cListRects)
    2270         {
    2271             vboxWddmVrListRegAdd(pList, pReg, &pList->ListHead, FALSE);
    2272             fChanged = TRUE;
    2273             continue;
    2274         }
    2275         else
    2276         {
    2277             Assert(VBoxWddmVrListIsEmpty(&DiffList));
    2278             vboxWddmVrListRegAdd(&DiffList, pReg, &DiffList.ListHead, FALSE);
    2279         }
    2280 
    2281         if (cAllocatedRects < cListRects)
    2282         {
    2283             cAllocatedRects = cListRects + cRects;
    2284             Assert(fNeedRectreate);
    2285             if (pListRects)
    2286                 vboxWddmMemFree(pListRects);
    2287             pListRects = (PRECT)vboxWddmMemAlloc(sizeof (RECT) * cAllocatedRects);
    2288             if (!pListRects)
    2289             {
    2290                 WARN(("vboxWddmMemAllocZero failed!"));
    2291                 Status = STATUS_NO_MEMORY;
    2292                 break;
    2293             }
    2294         }
    2295 
    2296 
    2297         if (fNeedRectreate)
    2298         {
    2299             Status = VBoxWddmVrListRectsGet(pList, cListRects, pListRects);
    2300             Assert(Status == STATUS_SUCCESS);
    2301             fNeedRectreate = FALSE;
    2302         }
    2303 
    2304         BOOLEAN fDummyChanged = FALSE;
    2305         Status = vboxWddmVrListSubstNoJoin(&DiffList, cListRects, pListRects, &fDummyChanged);
    2306         if (!NT_SUCCESS(Status))
    2307         {
    2308             WARN(("vboxWddmVrListSubstNoJoin failed!"));
    2309             Status = STATUS_NO_MEMORY;
    2310             break;
    2311         }
    2312 
    2313         if (!VBoxWddmVrListIsEmpty(&DiffList))
    2314         {
    2315             vboxWddmVrListAddNonintersected(pList, &DiffList);
    2316             fNeedRectreate = TRUE;
    2317             fChanged = TRUE;
    2318         }
    2319 
    2320         Assert(VBoxWddmVrListIsEmpty(&DiffList));
    2321     }
    2322 
    2323     if (pListRects)
    2324         vboxWddmMemFree(pListRects);
    2325 
    2326     Assert(VBoxWddmVrListIsEmpty(&DiffList) || Status != STATUS_SUCCESS);
    2327     VBoxWddmVrListClear(&DiffList);
    2328 
    2329     if (fChanged)
    2330         vboxWddmVrListJoinRects(pList);
    2331 
    2332     *pfChanged = fChanged;
    2333 
    2334     return STATUS_SUCCESS;
    2335 }
    2336 
    2337 NTSTATUS VBoxWddmVrListRectsGet(PVBOXWDDMVR_LIST pList, UINT cRects, PRECT aRects)
    2338 {
    2339     if (cRects < VBoxWddmVrListRectsCount(pList))
    2340         return STATUS_BUFFER_TOO_SMALL;
    2341 
    2342     UINT i = 0;
    2343     for (PLIST_ENTRY pEntry1 = pList->ListHead.Flink; pEntry1 != &pList->ListHead; pEntry1 = pEntry1->Flink, ++i)
    2344     {
    2345         PVBOXWDDMVR_REG pReg1 = PVBOXWDDMVR_REG_FROM_ENTRY(pEntry1);
    2346         aRects[i] = pReg1->Rect;
    2347     }
    2348     return STATUS_SUCCESS;
    2349 }
    2350 
    23511608NTSTATUS vboxWddmDrvCfgInit(PUNICODE_STRING pRegStr)
    23521609{
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPMisc.h

    r45132 r46757  
    164164#endif
    165165
    166 /* visible rects */
    167 typedef struct VBOXWDDMVR_LIST
    168 {
    169     LIST_ENTRY ListHead;
    170     UINT cEntries;
    171 } VBOXWDDMVR_LIST, *PVBOXWDDMVR_LIST;
    172 
    173 DECLINLINE(UINT) VBoxWddmVrListRectsCount(PVBOXWDDMVR_LIST pList)
    174 {
    175     return pList->cEntries;
    176 }
    177 
    178 DECLINLINE(BOOLEAN) VBoxWddmVrListIsEmpty(PVBOXWDDMVR_LIST pList)
    179 {
    180     return !VBoxWddmVrListRectsCount(pList);
    181 }
    182 
    183 DECLINLINE(void) VBoxWddmVrListInit(PVBOXWDDMVR_LIST pList)
    184 {
    185     InitializeListHead(&pList->ListHead);
    186     pList->cEntries = 0;
    187 }
    188 
    189 void VBoxWddmVrListClear(PVBOXWDDMVR_LIST pList);
    190 
    191 void VBoxWddmVrListTranslate(PVBOXWDDMVR_LIST pList, LONG x, LONG y);
    192 
    193 NTSTATUS VBoxWddmVrListRectsAdd(PVBOXWDDMVR_LIST pList, UINT cRects, const RECT *aRects, BOOLEAN *pfChanged);
    194 NTSTATUS VBoxWddmVrListRectsSubst(PVBOXWDDMVR_LIST pList, UINT cRects, const RECT *aRects, BOOLEAN *pfChanged);
    195 NTSTATUS VBoxWddmVrListRectsGet(PVBOXWDDMVR_LIST pList, UINT cRects, PRECT aRects);
    196 
    197 NTSTATUS VBoxWddmVrInit();
    198 void VBoxWddmVrTerm();
    199 
    200166NTSTATUS vboxWddmDrvCfgInit(PUNICODE_STRING pRegStr);
    201167
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPShgsmi.h

    r44529 r46757  
    4949void VBoxSHGSMICommandCancelSynch(PVBOXSHGSMI pHeap, const VBOXSHGSMIHEADER* pHeader);
    5050
    51 DECLINLINE(HGSMIOFFSET) VBoxSHGSMICommandOffset(PVBOXSHGSMI pHeap, const VBOXSHGSMIHEADER* pHeader)
     51DECLINLINE(HGSMIOFFSET) VBoxSHGSMICommandOffset(const PVBOXSHGSMI pHeap, const VBOXSHGSMIHEADER* pHeader)
    5252{
    5353    return HGSMIHeapBufferOffset(&pHeap->Heap, (void*)pHeader);
     54}
     55
     56/* allows getting VRAM offset of arbitrary pointer within the SHGSMI command
     57 * if invalid pointer is passed in, behavior is undefined */
     58DECLINLINE(HGSMIOFFSET) VBoxSHGSMICommandPtrOffset(const PVBOXSHGSMI pHeap, const void * pvPtr)
     59{
     60    return HGSMIPointerToOffset (&pHeap->Heap.area, (const HGSMIBUFFERHEADER *)pvPtr);
    5461}
    5562
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h

    r46662 r46757  
    3333#include "VBoxMPCr.h"
    3434
     35#include <cr_vreg.h>
     36
     37
    3538#if 0
    3639#include <iprt/avl.h>
     
    112115    BOOLEAN bVisible;
    113116    char fGhSynced;
     117    /* specifies whether the source has 3D overlay data visible */
     118    BOOLEAN fHas3DVrs;
     119    VBOXVR_LIST VrList;
    114120    VBOXVBVAINFO Vbva;
    115121#ifdef VBOX_WITH_VIDEOHWACCEL
     
    222228    VBOXDISP_UMHANDLE hSwapchainUm;
    223229    VBOXDISP_KMHANDLE hSwapchainKm;
     230    UINT winHostID;
     231    BOOLEAN fExposed;
    224232    POINT Pos;
    225233    UINT width;
    226234    UINT height;
    227     VBOXWDDMVR_LIST VisibleRegions;
     235    VBOXVR_LIST VisibleRegions;
    228236}VBOXWDDM_SWAPCHAIN, *PVBOXWDDM_SWAPCHAIN;
    229237
     
    237245    BOOLEAN fRenderFromShadowDisabled;
    238246    uint32_t u32CrConClientID;
    239 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    240247    VBOXMP_CRPACKER CrPacker;
    241 #endif
    242248    VBOXWDDM_HTABLE Swapchains;
    243249    VBOXVIDEOCM_CTX CmContext;
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.cpp

    r45132 r46757  
    2222#include "VBoxMPVhwa.h"
    2323#include <iprt/asm.h>
     24#include "VBoxMPCr.h"
     25
     26# include <packer.h>
    2427
    2528NTSTATUS vboxVdmaPipeConstruct(PVBOXVDMAPIPE pPipe)
     
    213216}
    214217
    215 PVBOXVDMAPIPE_CMD_DR vboxVdmaGgCmdCreate(PVBOXMP_DEVEXT pDevExt, VBOXVDMAPIPE_CMD_TYPE enmType, uint32_t cbCmd)
    216 {
    217     PVBOXVDMAPIPE_CMD_DR pHdr;
    218 #ifdef VBOX_WDDM_IRQ_COMPLETION
    219     if (enmType == VBOXVDMAPIPE_CMD_TYPE_DMACMD)
    220     {
    221         UINT cbAlloc = VBOXVDMACMD_SIZE_FROMBODYSIZE(cbCmd);
    222         VBOXVDMACBUF_DR* pDr = vboxVdmaCBufDrCreate(&pDevExt->u.primary.Vdma, cbAlloc);
    223         if (!pDr)
    224         {
    225             WARN(("dr allocation failed"));
    226             return NULL;
    227         }
    228         pDr->fFlags = VBOXVDMACBUF_FLAG_BUF_FOLLOWS_DR;
    229         pDr->cbBuf = VBOXVDMACMD_HEADER_SIZE();
    230         pDr->rc = VINF_SUCCESS;
    231 
    232 
    233         PVBOXVDMACMD pDmaHdr = VBOXVDMACBUF_DR_TAIL(pDr, VBOXVDMACMD);
    234         pDmaHdr->enmType = VBOXVDMACMD_TYPE_DMA_NOP;
    235         pDmaHdr->u32CmdSpecific = 0;
    236 
    237         pHdr = VBOXVDMACMD_BODY(pDmaHdr, VBOXVDMAPIPE_CMD_DR);
    238     }
    239     else
    240 #endif
    241     {
    242         pHdr = (PVBOXVDMAPIPE_CMD_DR)vboxWddmMemAllocZero(cbCmd);
    243         if (!pHdr)
    244         {
    245             WARN(("cmd allocation failed"));
    246             return NULL;
    247         }
    248     }
    249     pHdr->enmType = enmType;
    250     pHdr->cRefs = 1;
    251     return pHdr;
    252 }
    253 
    254 #ifdef VBOX_WDDM_IRQ_COMPLETION
    255 DECLINLINE(VBOXVDMACBUF_DR*) vboxVdmaGgCmdDmaGetDr(PVBOXVDMAPIPE_CMD_DMACMD pDr)
    256 {
    257     VBOXVDMACMD* pDmaCmd = VBOXVDMACMD_FROM_BODY(pDr);
    258     VBOXVDMACBUF_DR* pDmaDr = VBOXVDMACBUF_DR_FROM_TAIL(pDmaCmd);
    259     return pDmaDr;
    260 }
    261 
    262 DECLINLINE(PVBOXVDMADDI_CMD) vboxVdmaGgCmdDmaGetDdiCmd(PVBOXVDMAPIPE_CMD_DMACMD pDr)
    263 {
    264     VBOXVDMACBUF_DR* pDmaDr = vboxVdmaGgCmdDmaGetDr(pDr);
    265     return VBOXVDMADDI_CMD_FROM_BUF_DR(pDmaDr);
    266 }
    267 
    268 #endif
    269 
    270 void vboxVdmaGgCmdDestroy(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DR pDr)
    271 {
    272 #ifdef VBOX_WDDM_IRQ_COMPLETION
    273     if (pDr->enmType == VBOXVDMAPIPE_CMD_TYPE_DMACMD)
    274     {
    275         VBOXVDMACBUF_DR* pDmaDr = vboxVdmaGgCmdDmaGetDr((PVBOXVDMAPIPE_CMD_DMACMD)pDr);
    276         vboxVdmaCBufDrFree(&pDevExt->u.primary.Vdma, pDmaDr);
    277         return;
    278     }
    279 #endif
    280     vboxWddmMemFree(pDr);
    281 }
    282 
    283 DECLCALLBACK(VOID) vboxVdmaGgDdiCmdRelease(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext)
    284 {
    285     vboxVdmaGgCmdRelease(pDevExt, (PVBOXVDMAPIPE_CMD_DR)pvContext);
    286 }
    287 
    288 /**
    289  * helper function used for system thread creation
    290  */
    291 static NTSTATUS vboxVdmaGgThreadCreate(PKTHREAD * ppThread, PKSTART_ROUTINE  pStartRoutine, PVOID  pStartContext)
    292 {
    293     NTSTATUS fStatus;
    294     HANDLE hThread;
    295     OBJECT_ATTRIBUTES fObjectAttributes;
    296 
    297     Assert(KeGetCurrentIrql() == PASSIVE_LEVEL);
    298 
    299     InitializeObjectAttributes(&fObjectAttributes, NULL, OBJ_KERNEL_HANDLE,
    300                         NULL, NULL);
    301 
    302     fStatus = PsCreateSystemThread(&hThread, THREAD_ALL_ACCESS,
    303                         &fObjectAttributes, NULL, NULL,
    304                         (PKSTART_ROUTINE) pStartRoutine, pStartContext);
    305     if (!NT_SUCCESS(fStatus))
    306       return fStatus;
    307 
    308     ObReferenceObjectByHandle(hThread, THREAD_ALL_ACCESS, NULL,
    309                         KernelMode, (PVOID*) ppThread, NULL);
    310     ZwClose(hThread);
    311     return STATUS_SUCCESS;
    312 }
    313 
    314218DECLINLINE(void) vboxVdmaDirtyRectsCalcIntersection(const RECT *pArea, const VBOXWDDM_RECTS_INFO *pRects, PVBOXWDDM_RECTS_INFO pResult)
    315219{
     
    380284}
    381285
     286static VOID vboxWddmBltPipeRectsTranslate(VBOXVDMAPIPE_RECTS *pRects, int x, int y)
     287{
     288    vboxWddmRectTranslate(&pRects->ContextRect, x, y);
     289
     290    for (UINT i = 0; i < pRects->UpdateRects.cRects; ++i)
     291    {
     292        vboxWddmRectTranslate(&pRects->UpdateRects.aRects[i], x, y);
     293    }
     294}
     295
     296static VBOXVDMAPIPE_RECTS * vboxWddmBltPipeRectsDup(const VBOXVDMAPIPE_RECTS *pRects)
     297{
     298    const size_t cbDup = RT_OFFSETOF(VBOXVDMAPIPE_RECTS, UpdateRects.aRects[pRects->UpdateRects.cRects]);
     299    VBOXVDMAPIPE_RECTS *pDup = (VBOXVDMAPIPE_RECTS*)vboxWddmMemAllocZero(cbDup);
     300    if (!pDup)
     301    {
     302        WARN(("vboxWddmMemAllocZero failed"));
     303        return NULL;
     304    }
     305    memcpy(pDup, pRects, cbDup);
     306    return pDup;
     307}
     308
     309typedef struct VBOXMP_VDMACR_WRITECOMPLETION
     310{
     311    void *pvBufferToFree;
     312} VBOXMP_VDMACR_WRITECOMPLETION, *PVBOXMP_VDMACR_WRITECOMPLETION;
     313
     314static DECLCALLBACK(void) vboxVdmaCrWriteCompletion(PVBOXMP_CRSHGSMITRANSPORT pCon, int rc, void *pvCtx)
     315{
     316    PVBOXMP_VDMACR_WRITECOMPLETION pData = (PVBOXMP_VDMACR_WRITECOMPLETION)pvCtx;
     317    void* pvBufferToFree = pData->pvBufferToFree;
     318    if (pvBufferToFree)
     319        VBoxMpCrShgsmiTransportBufFree(pCon, pvBufferToFree);
     320
     321    VBoxMpCrShgsmiTransportCmdTermWriteAsync(pCon, pvCtx);
     322}
     323
     324NTSTATUS vboxVdmaCrSubmitWriteAsync(PVBOXMP_DEVEXT pDevExt, VBOXMP_CRPACKER *pCrPacker, uint32_t u32CrConClientID)
     325{
     326    Assert(u32CrConClientID);
     327    NTSTATUS Status = STATUS_SUCCESS;
     328    uint32_t cbBuffer;
     329    void * pvPackBuffer;
     330    void * pvBuffer = VBoxMpCrPackerTxBufferComplete(pCrPacker, &cbBuffer, &pvPackBuffer);
     331    if (pvBuffer)
     332    {
     333        PVBOXMP_VDMACR_WRITECOMPLETION pvCompletionData = (PVBOXMP_VDMACR_WRITECOMPLETION)VBoxMpCrShgsmiTransportCmdCreateWriteAsync(&pDevExt->CrHgsmiTransport, u32CrConClientID, pvBuffer, cbBuffer,
     334                vboxVdmaCrWriteCompletion, sizeof (*pvCompletionData));
     335        if (pvCompletionData)
     336        {
     337            pvCompletionData->pvBufferToFree = pvPackBuffer;
     338            int rc = VBoxMpCrShgsmiTransportCmdSubmitWriteAsync(&pDevExt->CrHgsmiTransport, pvCompletionData);
     339            if (!RT_SUCCESS(rc))
     340            {
     341                WARN(("VBoxMpCrShgsmiTransportCmdSubmitWriteAsync failed, rc %d", rc));
     342                Status = STATUS_UNSUCCESSFUL;
     343            }
     344        }
     345        else
     346        {
     347            WARN(("VBoxMpCrShgsmiTransportCmdCreateWriteAsync failed"));
     348            Status = STATUS_NO_MEMORY;
     349        }
     350    }
     351
     352    return Status;
     353}
     354
     355static NTSTATUS vboxVdmaVRegGet(PVBOXWDDM_SWAPCHAIN pSwapchain, const RTRECT *pCtxRect, uint32_t *pcVRects, RTRECT **ppVRectsBuff, uint32_t *pcVRectsBuff)
     356{
     357    RTRECT *pVRectsBuff = *ppVRectsBuff;
     358    uint32_t cVRectsBuff = *pcVRectsBuff;
     359    uint32_t cVRects = VBoxVrListRectsCount(&pSwapchain->VisibleRegions);
     360    if (cVRectsBuff < cVRects)
     361    {
     362        if (pVRectsBuff)
     363            vboxWddmMemFree(pVRectsBuff);
     364        pVRectsBuff = (RTRECT*)vboxWddmMemAlloc(cVRects * sizeof (pVRectsBuff[0]));
     365        if (!pVRectsBuff)
     366        {
     367            WARN(("vboxWddmMemAlloc failed"));
     368            *pcVRectsBuff = 0;
     369            *ppVRectsBuff = NULL;
     370            *pcVRects = NULL;
     371            return STATUS_NO_MEMORY;
     372        }
     373
     374        cVRectsBuff = cVRects;
     375        *pcVRectsBuff = cVRectsBuff;
     376        *ppVRectsBuff = pVRectsBuff;
     377    }
     378
     379    int rc = VBoxVrListRectsGet(&pSwapchain->VisibleRegions, cVRects, pVRectsBuff);
     380    AssertRC(rc);
     381    if (pCtxRect->xLeft || pCtxRect->yTop)
     382    {
     383        for (UINT i = 0; i < cVRects; ++i)
     384        {
     385            VBoxRectTranslate(&pVRectsBuff[i], -pCtxRect->xLeft, -pCtxRect->yTop);
     386        }
     387    }
     388
     389    *pcVRects = cVRects;
     390    return STATUS_SUCCESS;
     391}
     392
     393
    382394/**
    383395 * @param pDevExt
    384396 */
    385 static NTSTATUS vboxVdmaGgDirtyRectsProcess(PVBOXMP_DEVEXT pDevExt, PVBOXWDDM_CONTEXT pContext, PVBOXWDDM_SWAPCHAIN pSwapchain, RECT *pSrcRect, VBOXVDMAPIPE_RECTS *pContextRects
    386 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    387         , PVBOXMP_CRPACKER pPacker
    388 #endif
    389         )
    390 {
    391     PVBOXWDDM_RECTS_INFO pRects = &pContextRects->UpdateRects;
     397static NTSTATUS vboxVdmaProcessVRegCmdLegacy(PVBOXMP_DEVEXT pDevExt,
     398        PVBOXWDDM_CONTEXT pContext,
     399        PVBOXWDDM_SOURCE pSource,
     400        PVBOXWDDM_SWAPCHAIN pSwapchain,
     401        const RECT *pSrcRect,
     402        const VBOXVDMAPIPE_RECTS *pContextRects)
     403{
     404    VBOXVDMAPIPE_RECTS *pRectsToFree = NULL;
     405    POINT pos = pSource->VScreenPos;
     406    if (pos.x || pos.y)
     407    {
     408        pRectsToFree = vboxWddmBltPipeRectsDup(pContextRects);
     409        /* note: do NOT translate the src rect since it is used for screen pos calculation */
     410        vboxWddmBltPipeRectsTranslate(pRectsToFree, pos.x, pos.y);
     411        pContextRects = pRectsToFree;
     412    }
     413    const VBOXWDDM_RECTS_INFO *pRects = &pContextRects->UpdateRects;
    392414    NTSTATUS Status = STATUS_SUCCESS;
    393 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    394     PVBOXVIDEOCM_CMD_RECTS_INTERNAL pCmdInternal = NULL;
    395 #else
    396     void *pvCommandBuffer = NULL;
    397 #endif
    398     uint32_t cbCmdInternal = VBOXVIDEOCM_CMD_RECTS_INTERNAL_SIZE4CRECTS(pRects->cRects);
    399     BOOLEAN fCurChanged = FALSE, fCurRectChanged = FALSE;
     415    int rc;
     416    bool fCurChanged = FALSE, fCurRectChanged = FALSE;
    400417    POINT CurPos;
    401     Assert(KeGetCurrentIrql() < DISPATCH_LEVEL);
     418    RTRECT *pVRectsBuff = NULL;
     419    uint32_t cVRectsBuff = 0;
    402420    VBOXWDDM_CTXLOCK_DATA
    403421
     
    413431#if 0
    414432            if (pSwapchain->Pos.x != VBOXWDDM_INVALID_COORD)
    415                 VBoxWddmVrListTranslate(&pSwapchain->VisibleRegions, pSwapchain->Pos.x - CurPos.x, pSwapchain->Pos.y - CurPos.y);
     433                VBoxVrListTranslate(&pSwapchain->VisibleRegions, pSwapchain->Pos.x - CurPos.x, pSwapchain->Pos.y - CurPos.y);
    416434            else
    417435#endif
    418                 VBoxWddmVrListClear(&pSwapchain->VisibleRegions);
     436                VBoxVrListClear(&pSwapchain->VisibleRegions);
    419437            fCurRectChanged = TRUE;
    420438            pSwapchain->Pos = CurPos;
    421439        }
    422440
    423         Status = VBoxWddmVrListRectsAdd(&pSwapchain->VisibleRegions, pRects->cRects, pRects->aRects, &fCurChanged);
    424         if (!NT_SUCCESS(Status))
    425         {
    426             WARN(("VBoxWddmVrListRectsAdd failed!"));
     441        rc = VBoxVrListRectsAdd(&pSwapchain->VisibleRegions, pRects->cRects, (const RTRECT*)pRects->aRects, &fCurChanged);
     442        if (!RT_SUCCESS(rc))
     443        {
     444            WARN(("VBoxWddmVrListRectsAdd failed, rc %d!", rc));
     445            Status = STATUS_UNSUCCESSFUL;
    427446            goto done;
    428447        }
     
    435454    }
    436455
    437 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    438456    /* before posting the add visible rects diff, we need to first hide rects for other windows */
    439457
     
    443461        {
    444462            PVBOXWDDM_SWAPCHAIN pCurSwapchain = VBOXWDDMENTRY_2_SWAPCHAIN(pCur);
    445             BOOLEAN fChanged = FALSE;
    446 
    447             Status = VBoxWddmVrListRectsSubst(&pCurSwapchain->VisibleRegions, pRects->cRects, pRects->aRects, &fChanged);
     463            PVBOXWDDM_CONTEXT pCurContext = pCurSwapchain->pContext;
     464            PVBOXMP_CRPACKER pCurPacker = &pCurContext->CrPacker;
     465            bool fChanged = FALSE;
     466
     467            rc = VBoxVrListRectsSubst(&pCurSwapchain->VisibleRegions, pRects->cRects, (const RTRECT*)pRects->aRects, &fChanged);
     468            if (!RT_SUCCESS(rc))
     469            {
     470                WARN(("VBoxWddmVrListRectsAdd failed, rc %d!", rc));
     471                Status = STATUS_UNSUCCESSFUL;
     472                goto done;
     473            }
     474
     475            if (!fChanged)
     476                continue;
     477
     478            uint32_t cVRects;
     479            RTRECT CurCtxRect;
     480            CurCtxRect.xLeft = pCurSwapchain->Pos.x;
     481            CurCtxRect.yTop = pCurSwapchain->Pos.y;
     482            CurCtxRect.xRight = CurCtxRect.xLeft + pCurSwapchain->width;
     483            CurCtxRect.yBottom = CurCtxRect.yTop + pCurSwapchain->height;
     484            Status = vboxVdmaVRegGet(pCurSwapchain, &CurCtxRect, &cVRects, &pVRectsBuff, &cVRectsBuff);
    448485            if (!NT_SUCCESS(Status))
    449486            {
    450                 WARN(("vboxWddmVrListRectsAdd failed!"));
     487                WARN(("vboxVdmaVRegGet Status 0x%x", Status));
    451488                goto done;
    452489            }
    453490
    454             if (!fChanged)
    455                 continue;
    456 
    457             if (!pCmdInternal)
     491            void *pvCommandBuffer = NULL;
     492            uint32_t cbCommandBuffer = VBOXMP_CRCMD_HEADER_SIZE;
     493            cbCommandBuffer += VBOXMP_CRCMD_SIZE_WINDOWVISIBLEREGIONS(cVRects);
     494
     495            pvCommandBuffer = VBoxMpCrShgsmiTransportBufAlloc(&pDevExt->CrHgsmiTransport, cbCommandBuffer);
     496            if (!pvCommandBuffer)
    458497            {
    459                 pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)vboxVideoCmCmdCreate(&pCurSwapchain->pContext->CmContext, cbCmdInternal);
    460                 if (!pCmdInternal)
    461                 {
    462                     WARN(("vboxVideoCmCmdCreate failed!"));
    463                     Status = STATUS_NO_MEMORY;
    464                     goto done;
    465                 }
     498                WARN(("VBoxMpCrShgsmiTransportBufAlloc failed!"));
     499                Status = VERR_OUT_OF_RESOURCES;
     500                goto done;
    466501            }
    467             else
     502
     503            VBoxMpCrPackerTxBufferInit(pCurPacker, pvCommandBuffer, cbCommandBuffer, 1);
     504
     505            Assert(pCurSwapchain->winHostID);
     506            crPackWindowVisibleRegion(&pCurPacker->CrPacker, pCurSwapchain->winHostID, cVRects, (GLint*)pVRectsBuff);
     507
     508            Status = vboxVdmaCrSubmitWriteAsync(pDevExt, pCurPacker, pCurContext->u32CrConClientID);
     509            if (!NT_SUCCESS(Status))
    468510            {
    469                 pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)vboxVideoCmCmdReinitForContext(pCmdInternal, &pCurSwapchain->pContext->CmContext);
     511                WARN(("vboxVdmaCrSubmitWriteAsync failed Status 0x%x", Status));
     512                VBoxMpCrShgsmiTransportBufFree(&pDevExt->CrHgsmiTransport, pvCommandBuffer);
    470513            }
    471 
    472             pCmdInternal->Cmd.fFlags.Value = 0;
    473             pCmdInternal->Cmd.fFlags.bAddHiddenRects = 1;
    474             memcpy(&pCmdInternal->Cmd.RectsInfo, pRects, RT_OFFSETOF(VBOXWDDM_RECTS_INFO, aRects[pRects->cRects]));
    475 
    476             pCmdInternal->hSwapchainUm = pCurSwapchain->hSwapchainUm;
    477 
    478             vboxVideoCmCmdSubmit(pCmdInternal, VBOXVIDEOCM_CMD_RECTS_INTERNAL_SIZE4CRECTS(pCmdInternal->Cmd.RectsInfo.cRects));
    479             pCmdInternal = NULL;
    480         }
    481     }
    482 #endif
     514        }
     515    }
     516
    483517    if (!pSwapchain)
    484518        goto done;
    485519
    486     RECT *pVisRects;
    487 
    488 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    489     uint32_t cbCommandBuffer = 0, cCommands = 0;
    490     ++cCommand;
    491     cbCommandBuffer += VBOXMP_CRCMD_SIZE_WINDOWVISIBLEREGIONS(pRects->cRects);
    492 #endif
     520    PVBOXMP_CRPACKER pPacker = &pContext->CrPacker;
     521    uint32_t cbCommandBuffer = VBOXMP_CRCMD_HEADER_SIZE, cCommands = 0;
     522
     523    uint32_t cVRects;
     524    Status = vboxVdmaVRegGet(pSwapchain, (const RTRECT *)&pContextRects->ContextRect, &cVRects, &pVRectsBuff, &cVRectsBuff);
     525    if (!NT_SUCCESS(Status))
     526    {
     527        WARN(("vboxVdmaVRegGet Status 0x%x", Status));
     528        goto done;
     529    }
     530
     531    ++cCommands;
     532    cbCommandBuffer += VBOXMP_CRCMD_SIZE_WINDOWVISIBLEREGIONS(cVRects);
     533
    493534    if (fCurRectChanged && fCurChanged)
    494535    {
    495 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    496         ++cCommand;
     536        ++cCommands;
    497537        cbCommandBuffer += VBOXMP_CRCMD_SIZE_WINDOWPOSITION;
    498 
    499         pvCommandBuffer = VBoxMpCrShgsmiTransportBufAlloc(&pDevExt->CrHgsmiTransport, cbCommand);
    500         if (!pvCommandBuffer)
    501         {
    502             WARN(("VBoxMpCrShgsmiTransportBufAlloc failed!"));
    503             Status = STATUS_NO_MEMORY;
    504             goto done;
    505         }
    506         VBoxMpCrPackerTxBufferInit(pPacker,pvCommandBuffer, cbCommandBuffer, cCommands);
    507         crPackWindowPosition(&pPacker->CrPacker, window, CurPos.x, CurPos.y);
    508 #else
    509         cbCmdInternal = VBOXVIDEOCM_CMD_RECTS_INTERNAL_SIZE4CRECTS(pRects->cRects + 1);
    510         if (pCmdInternal)
    511             vboxVideoCmCmdRelease(pCmdInternal);
    512         pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)vboxVideoCmCmdCreate(&pContext->CmContext, cbCmdInternal);
    513         pCmdInternal->Cmd.fFlags.Value = 0;
    514         pCmdInternal->Cmd.fFlags.bSetViewRect = 1;
    515         pCmdInternal->Cmd.fFlags.bAddVisibleRects = 1;
    516         pCmdInternal->Cmd.RectsInfo.cRects = pRects->cRects + 1;
    517         pCmdInternal->Cmd.RectsInfo.aRects[0].left = CurPos.x;
    518         pCmdInternal->Cmd.RectsInfo.aRects[0].top = CurPos.y;
    519         pCmdInternal->Cmd.RectsInfo.aRects[0].right = CurPos.x + pSwapchain->width;
    520         pCmdInternal->Cmd.RectsInfo.aRects[0].bottom = CurPos.y + pSwapchain->height;
    521         pVisRects = &pCmdInternal->Cmd.RectsInfo.aRects[1];
    522 #endif
    523     }
    524 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    525     else
    526     {
    527         if (!pCmdInternal)
    528         {
    529             Assert(pContext == pSwapchain->pContext);
    530             pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)vboxVideoCmCmdCreate(&pContext->CmContext, cbCmdInternal);
    531             if (!pCmdInternal)
    532             {
    533                 WARN(("vboxVideoCmCmdCreate failed!"));
    534                 Status = STATUS_NO_MEMORY;
    535                 goto done;
    536             }
    537         }
    538         else
    539         {
    540             pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)vboxVideoCmCmdReinitForContext(pCmdInternal, &pContext->CmContext);
    541         }
    542 
    543         pCmdInternal->Cmd.fFlags.Value = 0;
    544         pCmdInternal->Cmd.fFlags.bAddVisibleRects = 1;
    545         pCmdInternal->Cmd.RectsInfo.cRects = pRects->cRects;
    546         pVisRects = &pCmdInternal->Cmd.RectsInfo.aRects[0];
    547     }
    548 
    549     pCmdInternal->hSwapchainUm = pSwapchain->hSwapchainUm;
    550 
    551     if (pRects->cRects)
    552         memcpy(pVisRects, pRects->aRects, sizeof (RECT) * pRects->cRects);
    553 
    554     vboxVideoCmCmdSubmit(pCmdInternal, VBOXVIDEOCM_CMD_RECTS_INTERNAL_SIZE4CRECTS(pCmdInternal->Cmd.RectsInfo.cRects));
    555     pCmdInternal = NULL;
    556 #else
     538    }
     539
     540    if (!pSwapchain->fExposed)
     541    {
     542        ++cCommands;
     543        cbCommandBuffer += VBOXMP_CRCMD_SIZE_WINDOWSHOW;
     544        ++cCommands;
     545        cbCommandBuffer += VBOXMP_CRCMD_SIZE_WINDOWSIZE;
     546    }
     547
     548    void *pvCommandBuffer = VBoxMpCrShgsmiTransportBufAlloc(&pDevExt->CrHgsmiTransport, cbCommandBuffer);
    557549    if (!pvCommandBuffer)
    558550    {
    559         pvCommandBuffer = VBoxMpCrShgsmiTransportBufAlloc(&pDevExt->CrHgsmiTransport, cbCommand);
    560         if (!pvCommandBuffer)
    561         {
    562             WARN(("VBoxMpCrShgsmiTransportBufAlloc failed!"));
    563             Status = STATUS_NO_MEMORY;
    564             goto done;
    565         }
    566         VBoxMpCrPackerTxBufferInit(pPacker,pvCommandBuffer, cbCommandBuffer, cCommands);
    567     }
    568     crPackWindowVisibleRegion(&pPacker->CrPacker, window, pRects->cRects, (GLint*)pRects->aRects);
    569 #endif
     551        WARN(("VBoxMpCrShgsmiTransportBufAlloc failed!"));
     552        Status = STATUS_NO_MEMORY;
     553        goto done;
     554    }
     555
     556    VBoxMpCrPackerTxBufferInit(pPacker,pvCommandBuffer, cbCommandBuffer, cCommands);
     557
     558    Assert(pSwapchain->winHostID);
     559
     560    if (fCurRectChanged && fCurChanged)
     561        crPackWindowPosition(&pPacker->CrPacker, pSwapchain->winHostID, CurPos.x, CurPos.y);
     562
     563    if (!pSwapchain->fExposed)
     564    {
     565        crPackWindowSize(&pPacker->CrPacker, pSwapchain->winHostID, pSwapchain->width, pSwapchain->height);
     566        crPackWindowShow(&pPacker->CrPacker, pSwapchain->winHostID, TRUE);
     567        pSwapchain->fExposed = TRUE;
     568    }
     569
     570    crPackWindowVisibleRegion(&pPacker->CrPacker, pSwapchain->winHostID, cVRects, (GLint*)pVRectsBuff);
     571
     572    Status = vboxVdmaCrSubmitWriteAsync(pDevExt, pPacker, pContext->u32CrConClientID);
     573    if (!NT_SUCCESS(Status))
     574    {
     575        WARN(("vboxVdmaCrSubmitWriteAsync failed Status 0x%x", Status));
     576        VBoxMpCrShgsmiTransportBufFree(&pDevExt->CrHgsmiTransport, pvCommandBuffer);
     577    }
    570578
    571579done:
    572580    VBOXWDDM_CTXLOCK_UNLOCK(pDevExt);
    573581
    574 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    575     if (pCmdInternal)
    576         vboxVideoCmCmdRelease(pCmdInternal);
    577 #endif
    578     return Status;
    579 }
    580 
    581 static NTSTATUS vboxVdmaGgDmaColorFill(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DMACMD_CLRFILL pCF)
     582    if (pRectsToFree)
     583        vboxWddmMemFree(pRectsToFree);
     584
     585    if (pVRectsBuff)
     586        vboxWddmMemFree(pVRectsBuff);
     587
     588    return Status;
     589}
     590
     591static NTSTATUS vboxVdmaGgDmaColorFill(PVBOXMP_DEVEXT pDevExt, VBOXVDMA_CLRFILL *pCF)
    582592{
    583593    NTSTATUS Status = STATUS_UNSUCCESSFUL;
     
    585595    if (pDevExt->pvVisibleVram)
    586596    {
    587         PVBOXWDDM_ALLOCATION pAlloc = pCF->ClrFill.Alloc.pAlloc;
     597        PVBOXWDDM_ALLOCATION pAlloc = pCF->Alloc.pAlloc;
    588598        Assert(pAlloc->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID);
    589599        if (pAlloc->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID)
     
    599609                {
    600610                    uint8_t bytestPP = bpp >> 3;
    601                     for (UINT i = 0; i < pCF->ClrFill.Rects.cRects; ++i)
     611                    for (UINT i = 0; i < pCF->Rects.cRects; ++i)
    602612                    {
    603                         RECT *pRect = &pCF->ClrFill.Rects.aRects[i];
     613                        RECT *pRect = &pCF->Rects.aRects[i];
    604614                        for (LONG ir = pRect->top; ir < pRect->bottom; ++ir)
    605615                        {
     
    612622                            for (UINT j = 0; j < cRaw; ++j)
    613623                            {
    614                                 *pvU32Mem = pCF->ClrFill.Color;
     624                                *pvU32Mem = pCF->Color;
    615625                                ++pvU32Mem;
    616626                            }
     
    637647                    if (!vboxWddmRectIsEmpty(&UnionRect))
    638648                    {
    639                         PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pCF->ClrFill.Alloc.pAlloc->AllocData.SurfDesc.VidPnSourceId];
     649                        PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pCF->Alloc.pAlloc->AllocData.SurfDesc.VidPnSourceId];
    640650                        uint32_t cUnlockedVBVADisabled = ASMAtomicReadU32(&pDevExt->cUnlockedVBVADisabled);
    641651                        if (!cUnlockedVBVADisabled)
     
    783793}
    784794
    785 static VOID vboxWddmBltPipeRectsTranslate(VBOXVDMAPIPE_RECTS *pRects, int x, int y)
    786 {
    787     vboxWddmRectTranslate(&pRects->ContextRect, x, y);
    788 
    789     for (UINT i = 0; i < pRects->UpdateRects.cRects; ++i)
    790     {
    791         vboxWddmRectTranslate(&pRects->UpdateRects.aRects[i], x, y);
    792     }
    793 }
    794 
    795 static NTSTATUS vboxVdmaGgDmaCmdProcessFast(PVBOXMP_DEVEXT pDevExt
    796 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    797         , VBOXVDMAPIPE_CMD_DMACMD *pDmaCmd
    798 #else
    799         , PVBOXWDDM_CONTEXT pContext
    800         , PVBOXWDDM_DMA_PRIVATEDATA_BASEHDR *pDmaCmd
    801         , VBOXVDMAPIPE_FLAGS_DMACMD fFlags
    802         , uint32_t u32FenceId
    803 #endif
    804         )
    805 {
     795static NTSTATUS vboxVdmaSubitVBoxTexPresent(PVBOXMP_DEVEXT pDevExt,
     796        VBOXMP_CRPACKER *pCrPacker,
     797        uint32_t u32CrConClientID,
     798        uint32_t hostID,
     799        uint32_t cfg,
     800        int32_t posX,
     801        int32_t posY,
     802        uint32_t cRects,
     803        const RTRECT*paRects)
     804{
     805    uint32_t cbCommandBuffer = VBOXMP_CRCMD_HEADER_SIZE + VBOXMP_CRCMD_SIZE_VBOXTEXPRESENT(cRects);
     806    uint32_t cCommands = 1;
     807    void *pvCommandBuffer = VBoxMpCrShgsmiTransportBufAlloc(&pDevExt->CrHgsmiTransport, cbCommandBuffer);
     808    if (!pvCommandBuffer)
     809    {
     810        WARN(("VBoxMpCrShgsmiTransportBufAlloc failed!"));
     811        return VERR_OUT_OF_RESOURCES;
     812    }
     813
     814    VBoxMpCrPackerTxBufferInit(pCrPacker, pvCommandBuffer, cbCommandBuffer, cCommands);
     815
     816    crPackVBoxTexPresent(&pCrPacker->CrPacker, hostID, cfg, posX, posY, cRects, (int32_t*)paRects);
     817
     818    NTSTATUS Status = vboxVdmaCrSubmitWriteAsync(pDevExt, pCrPacker, u32CrConClientID);
     819    if (!NT_SUCCESS(Status))
     820    {
     821        WARN(("vboxVdmaCrSubmitWriteAsync failed Status 0x%x", Status));
     822        VBoxMpCrShgsmiTransportBufFree(&pDevExt->CrHgsmiTransport, pvCommandBuffer);
     823    }
     824
     825    return Status;
     826}
     827
     828static NTSTATUS vboxVdmaProcessVRegCmd(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext,
     829        VBOXWDDM_DMA_ALLOCINFO *pSrcAllocInfo,
     830        VBOXWDDM_DMA_ALLOCINFO *pDstAllocInfo,
     831        const RECT *pSrcRect, const VBOXVDMAPIPE_RECTS *pDstRects)
     832{
     833    D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId = pDstAllocInfo->srcId;
     834    VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[srcId];
    806835    NTSTATUS Status = STATUS_SUCCESS;
    807     DXGK_INTERRUPT_TYPE enmComplType = DXGK_INTERRUPT_DMA_COMPLETED;
    808 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    809     PVBOXWDDM_CONTEXT pContext = pDmaCmd->pContext;
    810     VBOXVDMAPIPE_FLAGS_DMACMD fFlags = pDmaCmd->fFlags;
    811 #else
    812     BOOLEAN fCompleteCmd = TRUE;
    813 #endif
    814     switch (pDmaCmd->enmCmd)
    815     {
    816         case VBOXVDMACMD_TYPE_DMA_PRESENT_BLT:
    817         {
    818 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    819             PVBOXVDMAPIPE_CMD_DMACMD_BLT pBlt = (PVBOXVDMAPIPE_CMD_DMACMD_BLT)pDmaCmd;
    820 #else
    821             PVBOXWDDM_DMA_PRIVATEDATA_BLT pBlt = (PVBOXWDDM_DMA_PRIVATEDATA_BLT)pDmaCmd;
    822 #endif
    823             PVBOXWDDM_ALLOCATION pDstAlloc = pBlt->Blt.DstAlloc.pAlloc;
    824             PVBOXWDDM_ALLOCATION pSrcAlloc = pBlt->Blt.SrcAlloc.pAlloc;
    825 
    826             if (fFlags.fRealOp)
     836
     837    if (pDevExt->fTexPresentEnabled)
     838    {
     839        /* we care only about screen regions */
     840        PVBOXWDDM_ALLOCATION pDstAlloc = pDstAllocInfo->pAlloc;
     841        PVBOXWDDM_ALLOCATION pSrcAlloc = pSrcAllocInfo->pAlloc;
     842
     843        if (pDstAlloc != pSource->pPrimaryAllocation)
     844        {
     845            WARN(("non-primary allocation passed to vboxWddmSubmitBltCmd!"));
     846            return STATUS_NOT_SUPPORTED;
     847        }
     848
     849        uint32_t hostID = pSrcAlloc->hostID;
     850        int rc;
     851        if (hostID)
     852        {
     853            Assert(pContext->enmType == VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D);
     854            int32_t posX = pDstRects->ContextRect.left - pSrcRect->left;
     855            int32_t posY = pDstRects->ContextRect.top - pSrcRect->top;
     856
     857            Status = vboxVdmaSubitVBoxTexPresent(pDevExt, &pContext->CrPacker, pContext->u32CrConClientID, hostID, srcId, posX, posY, pDstRects->UpdateRects.cRects, (const RTRECT*)pDstRects->UpdateRects.aRects);
     858            if (NT_SUCCESS(Status))
    827859            {
    828                 vboxVdmaGgDmaBlt(pDevExt, &pBlt->Blt);
    829 
    830                 if (VBOXWDDM_IS_FB_ALLOCATION(pDevExt, pDstAlloc)
    831                         && pDstAlloc->bVisible)
     860                rc = VBoxVrListRectsSubst(&pSource->VrList, pDstRects->UpdateRects.cRects, (const RTRECT*)pDstRects->UpdateRects.aRects, NULL);
     861                if (RT_SUCCESS(rc))
     862                    pSource->fHas3DVrs = TRUE;
     863                else
     864                    WARN(("VBoxVrListRectsSubst failed rc %d, ignoring..", rc));
     865            }
     866            else
     867                WARN(("vboxVdmaSubitVBoxTexPresent failed Status 0x%x", Status));
     868        }
     869        else if (pSource->pPrimaryAllocation == pDstAlloc)
     870        {
     871            bool fChanged = false;
     872            Assert(pDstAlloc->bVisible);
     873            rc = VBoxVrListRectsAdd(&pSource->VrList, pDstRects->UpdateRects.cRects, (const RTRECT*)pDstRects->UpdateRects.aRects, &fChanged);
     874            if (RT_SUCCESS(rc))
     875            {
     876                if (fChanged)
    832877                {
    833                     VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pDstAlloc->AllocData.SurfDesc.VidPnSourceId];
    834                     Assert(pDstAlloc->AllocData.SurfDesc.VidPnSourceId < VBOX_VIDEO_MAX_SCREENS);
    835                     Assert(pSource->pPrimaryAllocation == pDstAlloc);
    836 
    837                     RECT UpdateRect;
    838                     UpdateRect = pBlt->Blt.DstRects.UpdateRects.aRects[0];
    839                     for (UINT i = 1; i < pBlt->Blt.DstRects.UpdateRects.cRects; ++i)
     878                    Status = vboxVdmaSubitVBoxTexPresent(pDevExt, &pContext->CrPacker, pContext->u32CrConClientID, hostID, srcId, 0, 0, pDstRects->UpdateRects.cRects, (const RTRECT*)pDstRects->UpdateRects.aRects);
     879                    if (NT_SUCCESS(Status))
    840880                    {
    841                         vboxWddmRectUnite(&UpdateRect, &pBlt->Blt.DstRects.UpdateRects.aRects[i]);
    842                     }
    843 
    844                     uint32_t cUnlockedVBVADisabled = ASMAtomicReadU32(&pDevExt->cUnlockedVBVADisabled);
    845                     if (!cUnlockedVBVADisabled)
    846                     {
    847                         VBOXVBVA_OP(ReportDirtyRect, pDevExt, pSource, &UpdateRect);
     881                        if (pSource->fHas3DVrs)
     882                        {
     883                            if (VBoxVrListRectsCount(&pSource->VrList) == 1)
     884                            {
     885                                RTRECT Rect;
     886                                VBoxVrListRectsGet(&pSource->VrList, 1, &Rect);
     887                                if (Rect.xLeft == 0
     888                                        && Rect.yTop == 0
     889                                        && Rect.xRight == pDstAlloc->AllocData.SurfDesc.width
     890                                        && Rect.yBottom == pDstAlloc->AllocData.SurfDesc.height)
     891                                {
     892                                    pSource->fHas3DVrs = FALSE;
     893                                }
     894                            }
     895                        }
    848896                    }
    849897                    else
    850                     {
    851                         VBOXVBVA_OP_WITHLOCK(ReportDirtyRect, pDevExt, pSource, &UpdateRect);
    852                     }
     898                        WARN(("vboxVdmaSubitVBoxTexPresent failed Status 0x%x", Status));
    853899                }
    854900            }
    855 
    856             if (fFlags.fVisibleRegions)
    857             {
    858 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    859                 Status = STATUS_MORE_PROCESSING_REQUIRED;
    860                 vboxWddmAllocationRetain(pDstAlloc);
    861                 vboxWddmAllocationRetain(pSrcAlloc);
    862 #else
    863                 Status = vboxVdmaGgDmaCmdProcessSlow(pDevExt, pContext, pDmaCmd, fFlags, u32FenceId);
    864                 fCompleteCmd = FALSE;
    865 #endif
    866             }
    867             break;
    868         }
    869 
    870         case VBOXVDMACMD_TYPE_DMA_PRESENT_FLIP:
    871         {
    872 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    873             PVBOXVDMAPIPE_CMD_DMACMD_FLIP pFlip = (PVBOXVDMAPIPE_CMD_DMACMD_FLIP)pDmaCmd;
    874 #else
    875             PVBOXVDMAPIPE_CMD_DMACMD_FLIP pFlip = (PVBOXVDMAPIPE_CMD_DMACMD_FLIP)pDmaCmd;
    876 #endif
    877             Assert(fFlags.fVisibleRegions);
    878             Assert(!fFlags.fRealOp);
    879             PVBOXWDDM_ALLOCATION pAlloc = pFlip->Flip.Alloc.pAlloc;
    880             VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pAlloc->AllocData.SurfDesc.VidPnSourceId];
    881             vboxWddmAssignPrimary(pDevExt, pSource, pAlloc, pAlloc->AllocData.SurfDesc.VidPnSourceId);
    882             if (fFlags.fVisibleRegions)
    883             {
    884 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    885                 Status = STATUS_MORE_PROCESSING_REQUIRED;
    886                 vboxWddmAllocationRetain(pFlip->Flip.Alloc.pAlloc);
    887 #else
    888                 Status = vboxVdmaGgDmaCmdProcessSlow(pDevExt, pContext, pDmaCmd, fFlags, u32FenceId);
    889                 fCompleteCmd = FALSE;
    890 #endif
    891             }
    892 
    893             break;
    894         }
    895         case VBOXVDMACMD_TYPE_DMA_PRESENT_CLRFILL:
    896         {
    897 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    898             PVBOXVDMAPIPE_CMD_DMACMD_CLRFILL pCF = (PVBOXVDMAPIPE_CMD_DMACMD_CLRFILL)pDmaCmd;
    899 #else
    900             PVBOXWDDM_DMA_PRIVATEDATA_CLRFILL pCF = (PVBOXWDDM_DMA_PRIVATEDATA_CLRFILL)pDmaCmd;
    901 #endif
    902             Assert(fFlags.fRealOp);
    903             Assert(!fFlags.fVisibleRegions);
    904             Status = vboxVdmaGgDmaColorFill(pDevExt, pCF);
    905             Assert(Status == STATUS_SUCCESS);
    906             break;
    907         }
    908 
    909         default:
    910             Assert(0);
    911             break;
    912     }
    913 
    914 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    915     /* Corresponding Release is done by dma command completion handler */
    916     vboxVdmaGgCmdAddRef(&pDmaCmd->Hdr);
    917 
    918     NTSTATUS tmpStatus = vboxVdmaGgCmdDmaNotifyCompleted(pDevExt, pDmaCmd, enmComplType);
    919     if (!NT_SUCCESS(tmpStatus))
    920     {
    921         WARN(("vboxVdmaGgCmdDmaNotifyCompleted failed, Status 0x%x", tmpStatus));
    922         /* the command was NOT submitted, and thus will not be released, release it here */
    923         vboxVdmaGgCmdRelease(pDevExt, &pDmaCmd->Hdr);
    924         Status = tmpStatus;
    925     }
    926 #else
    927     if (fCompleteCmd)
    928         Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, u32FenceId, enmComplType);
    929 #endif
    930     return Status;
    931 }
    932 
    933 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    934 typedef struct VBOXMP_VDMACR_WRITECOMPLETION
    935 {
    936     void *pvBufferToFree;
    937 } VBOXMP_VDMACR_WRITECOMPLETION, *PVBOXMP_VDMACR_WRITECOMPLETION;
    938 
    939 static DECLCALLBACK(void) vboxVdmaCrWriteCompletion(PVBOXMP_CRSHGSMITRANSPORT pCon, int rc, void *pvCtx)
    940 {
    941     PVBOXMP_VDMACR_WRITECOMPLETION pData = (PVBOXMP_VDMACR_WRITECOMPLETION)pvCtx;
    942     void* pvBufferToFree = pData->pvBufferToFree;
    943     if (pvBufferToFree)
    944         VBoxMpCrShgsmiTransportBufFree(pCon, pvBufferToFree);
    945 
    946     VBoxMpCrShgsmiTransportCmdTermWriteAsync(pCon, pvCtx);
    947 }
    948 #endif
    949 
    950 static NTSTATUS vboxVdmaGgDmaCmdProcessSlow(PVBOXMP_DEVEXT pDevExt
    951 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    952         , VBOXVDMAPIPE_CMD_DMACMD *pDmaCmd
    953 #else
    954         , PVBOXWDDM_CONTEXT pContext
    955         , PVBOXWDDM_DMA_PRIVATEDATA_BASEHDR *pDmaCmd
    956         , VBOXVDMAPIPE_FLAGS_DMACMD fFlags
    957         , uint32_t u32FenceId
    958 #endif
    959         )
     901            else
     902                WARN(("VBoxVrListRectsAdd failed rc %d, ignoring..", rc));
     903        }
     904        else
     905        {
     906            WARN(("unexpected"));
     907            Status = STATUS_INVALID_PARAMETER;
     908        }
     909    }
     910    else
     911    {
     912        PVBOXWDDM_ALLOCATION pSrcAlloc = pSrcAllocInfo->pAlloc;
     913        PVBOXWDDM_SWAPCHAIN pSwapchain = vboxWddmSwapchainRetainByAlloc(pDevExt, pSrcAlloc);
     914
     915        if (pSwapchain)
     916        {
     917            Assert(pSrcAlloc->AllocData.SurfDesc.width == pSwapchain->width);
     918            Assert(pSrcAlloc->AllocData.SurfDesc.height == pSwapchain->height);
     919        }
     920
     921        Status = vboxVdmaProcessVRegCmdLegacy(pDevExt, pContext, pSource, pSwapchain, pSrcRect, pDstRects);
     922        if (!NT_SUCCESS(Status))
     923            WARN(("vboxVdmaProcessVRegCmdLegacy failed Status 0x%x", Status));
     924
     925        if (pSwapchain)
     926            vboxWddmSwapchainRelease(pSwapchain);
     927    }
     928
     929    return Status;
     930}
     931
     932NTSTATUS vboxVdmaProcessBltCmd(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, VBOXWDDM_DMA_PRIVATEDATA_BLT *pBlt, VBOXVDMAPIPE_FLAGS_DMACMD fBltFlags)
    960933{
    961934    NTSTATUS Status = STATUS_SUCCESS;
    962 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    963     PVBOXWDDM_CONTEXT pContext = pDmaCmd->pContext;
    964     VBOXVDMAPIPE_FLAGS_DMACMD fFlags = pDmaCmd->fFlags;
    965 #else
    966     PVBOXMP_CRPACKER pPacker = &pContext->CrPacker;
    967 #endif
    968     DXGK_INTERRUPT_TYPE enmComplType = DXGK_INTERRUPT_DMA_COMPLETED;
    969 
    970     Assert(fFlags.Value);
    971     Assert(!fFlags.fRealOp);
    972 
    973     switch (pDmaCmd->enmCmd)
    974     {
    975         case VBOXVDMACMD_TYPE_DMA_PRESENT_BLT:
    976         {
    977             PVBOXVDMAPIPE_CMD_DMACMD_BLT pBlt = (PVBOXVDMAPIPE_CMD_DMACMD_BLT)pDmaCmd;
    978             PVBOXWDDM_ALLOCATION pDstAlloc = pBlt->Blt.DstAlloc.pAlloc;
    979             PVBOXWDDM_ALLOCATION pSrcAlloc = pBlt->Blt.SrcAlloc.pAlloc;
    980             BOOLEAN bComplete = TRUE;
     935
     936    if (fBltFlags.fRealOp)
     937    {
     938        PVBOXWDDM_ALLOCATION pDstAlloc = pBlt->Blt.DstAlloc.pAlloc;
     939        PVBOXWDDM_ALLOCATION pSrcAlloc = pBlt->Blt.SrcAlloc.pAlloc;
     940
     941        vboxVdmaGgDmaBlt(pDevExt, &pBlt->Blt);
     942
     943        if (VBOXWDDM_IS_FB_ALLOCATION(pDevExt, pDstAlloc)
     944                        && pDstAlloc->bVisible)
     945        {
    981946            VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pDstAlloc->AllocData.SurfDesc.VidPnSourceId];
    982947            Assert(pDstAlloc->AllocData.SurfDesc.VidPnSourceId < VBOX_VIDEO_MAX_SCREENS);
    983 
    984             if (fFlags.fVisibleRegions)
     948            Assert(pSource->pPrimaryAllocation == pDstAlloc);
     949
     950            RECT UpdateRect;
     951            UpdateRect = pBlt->Blt.DstRects.UpdateRects.aRects[0];
     952            for (UINT i = 1; i < pBlt->Blt.DstRects.UpdateRects.cRects; ++i)
    985953            {
    986                 PVBOXWDDM_SWAPCHAIN pSwapchain = vboxWddmSwapchainRetainByAlloc(pDevExt, pSrcAlloc);
    987                 POINT pos = pSource->VScreenPos;
    988                 if (pos.x || pos.y)
    989                 {
    990                     /* note: do NOT translate the src rect since it is used for screen pos calculation */
    991                     vboxWddmBltPipeRectsTranslate(&pBlt->Blt.DstRects, pos.x, pos.y);
    992                 }
    993 
    994                 Status = vboxVdmaGgDirtyRectsProcess(pDevExt, pContext, pSwapchain, &pBlt->Blt.SrcRect, &pBlt->Blt.DstRects
    995 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    996                         , pPacker
    997 #endif
    998                         );
    999                 Assert(Status == STATUS_SUCCESS);
    1000 
    1001                 if (pSwapchain)
    1002                     vboxWddmSwapchainRelease(pSwapchain);
     954                vboxWddmRectUnite(&UpdateRect, &pBlt->Blt.DstRects.UpdateRects.aRects[i]);
     955            }
     956
     957            uint32_t cUnlockedVBVADisabled = ASMAtomicReadU32(&pDevExt->cUnlockedVBVADisabled);
     958            if (!cUnlockedVBVADisabled)
     959            {
     960                VBOXVBVA_OP(ReportDirtyRect, pDevExt, pSource, &UpdateRect);
    1003961            }
    1004962            else
    1005963            {
    1006                 WARN(("not expected!"));
     964                VBOXVBVA_OP_WITHLOCK(ReportDirtyRect, pDevExt, pSource, &UpdateRect);
    1007965            }
    1008 
    1009 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    1010             vboxWddmAllocationRelease(pDstAlloc);
    1011             vboxWddmAllocationRelease(pSrcAlloc);
    1012 #endif
    1013 
    1014             break;
    1015         }
    1016 
    1017         case VBOXVDMACMD_TYPE_DMA_PRESENT_FLIP:
    1018         {
    1019             PVBOXVDMAPIPE_CMD_DMACMD_FLIP pFlip = (PVBOXVDMAPIPE_CMD_DMACMD_FLIP)pDmaCmd;
    1020             PVBOXWDDM_ALLOCATION pAlloc = pFlip->Flip.Alloc.pAlloc;
    1021             VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pAlloc->AllocData.SurfDesc.VidPnSourceId];
    1022             if (fFlags.fVisibleRegions)
    1023             {
    1024                 PVBOXWDDM_SWAPCHAIN pSwapchain;
    1025                 pSwapchain = vboxWddmSwapchainRetainByAlloc(pDevExt, pAlloc);
    1026                 if (pSwapchain)
    1027                 {
    1028                     POINT pos = pSource->VScreenPos;
    1029                     RECT SrcRect;
    1030                     VBOXVDMAPIPE_RECTS Rects;
    1031                     SrcRect.left = 0;
    1032                     SrcRect.top = 0;
    1033                     SrcRect.right = pAlloc->AllocData.SurfDesc.width;
    1034                     SrcRect.bottom = pAlloc->AllocData.SurfDesc.height;
    1035                     Rects.ContextRect.left = pos.x;
    1036                     Rects.ContextRect.top = pos.y;
    1037                     Rects.ContextRect.right = pAlloc->AllocData.SurfDesc.width + pos.x;
    1038                     Rects.ContextRect.bottom = pAlloc->AllocData.SurfDesc.height + pos.y;
    1039                     Rects.UpdateRects.cRects = 1;
    1040                     Rects.UpdateRects.aRects[0] = Rects.ContextRect;
    1041                     Status = vboxVdmaGgDirtyRectsProcess(pDevExt, pContext, pSwapchain, &SrcRect, &Rects
    1042 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    1043                         , pPacker
    1044 #endif
    1045                             );
    1046                     Assert(Status == STATUS_SUCCESS);
    1047                     vboxWddmSwapchainRelease(pSwapchain);
    1048                 }
    1049             }
    1050             else
    1051             {
    1052                 WARN(("not expected!"));
    1053             }
    1054 
    1055 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    1056             vboxWddmAllocationRelease(pAlloc);
    1057 #endif
    1058 
    1059             break;
    1060         }
    1061 
    1062         default:
    1063         {
    1064             WARN(("not expected!"));
    1065             break;
    1066         }
    1067     }
    1068 
    1069 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    1070     vboxVdmaGgCmdRelease(pDevExt, &pDmaCmd->Hdr);
    1071 #else
    1072     uint32_t cbBuffer
    1073     void * pvPackBuffer;
    1074     void * pvBuffer = VBoxMpCrPackerTxBufferComplete(pPacker, &cbBuffer, &pvPackBuffer);
    1075     if (pvBuffer)
    1076     {
    1077         PVBOXMP_VDMACR_WRITECOMPLETION pvCompletionData = VBoxMpCrShgsmiTransportCmdCreateWriteAsync(&pDevExt->CrHgsmiTransport, pContext->u32CrConClientID, pvBuffer, cbBuffer,
    1078                 vboxVdmaCrWriteCompletion, sizeof (*pvCompletionData));
    1079         if (pvCompletionData)
    1080         {
    1081             int rc = VBoxMpCrShgsmiTransportCmdSubmitWriteAsync(&pDevExt->CrHgsmiTransport, pvCompletionData);
    1082             if (!RT_SUCCESS(rc))
    1083             {
    1084                 WARN(("VBoxMpCrShgsmiTransportCmdSubmitWriteAsync failed, rc %d", rc));
    1085                 Status = STATUS_UNSUCCESSFUL;
    1086             }
    1087         }
    1088         else
    1089         {
    1090             WARN(("VBoxMpCrShgsmiTransportCmdCreateWriteAsync failed"));
    1091             Status = STATUS_NO_MEMORY;
    1092         }
    1093     }
    1094 
    1095     Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, u32FenceId, DXGK_INTERRUPT_DMA_COMPLETED);
    1096     if (!NT_SUCCESS(Status))
    1097     {
    1098         WARN(("vboxVdmaDdiCmdFenceComplete failed, Status 0x%x", Status));
    1099     }
    1100 #endif
    1101 
    1102     return Status;
    1103 }
    1104 
    1105 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    1106 static DECLCALLBACK(UINT) vboxVdmaGgCmdCancelVisitor(PVBOXVIDEOCM_CTX pContext, PVOID pvCmd, uint32_t cbCmd, PVOID pvVisitor)
    1107 {
    1108     PVBOXWDDM_SWAPCHAIN pSwapchain = (PVBOXWDDM_SWAPCHAIN)pvVisitor;
    1109     if (!pSwapchain)
    1110         return VBOXVIDEOCMCMDVISITOR_RETURN_RMCMD;
    1111     PVBOXVIDEOCM_CMD_RECTS_INTERNAL pCmdInternal = (PVBOXVIDEOCM_CMD_RECTS_INTERNAL)pvCmd;
    1112     if (pCmdInternal->hSwapchainUm == pSwapchain->hSwapchainUm)
    1113         return VBOXVIDEOCMCMDVISITOR_RETURN_RMCMD;
    1114     return 0;
    1115 }
    1116 
    1117 static VOID vboxVdmaGgWorkerThread(PVOID pvUser)
    1118 {
    1119     PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)pvUser;
    1120     PVBOXVDMAGG pVdma = &pDevExt->u.primary.Vdma.DmaGg;
    1121 
    1122     NTSTATUS Status = vboxVdmaPipeSvrOpen(&pVdma->CmdPipe);
    1123     Assert(Status == STATUS_SUCCESS);
    1124     if (Status == STATUS_SUCCESS)
    1125     {
    1126         do
    1127         {
    1128             LIST_ENTRY CmdList;
    1129             Status = vboxVdmaPipeSvrCmdGetList(&pVdma->CmdPipe, &CmdList);
    1130             Assert(Status == STATUS_SUCCESS || Status == STATUS_PIPE_CLOSING);
    1131             if (Status == STATUS_SUCCESS)
    1132             {
    1133                 for (PLIST_ENTRY pCur = CmdList.Blink; pCur != &CmdList;)
    1134                 {
    1135                     PVBOXVDMAPIPE_CMD_DR pDr = VBOXVDMAPIPE_CMD_DR_FROM_ENTRY(pCur);
    1136                     RemoveEntryList(pCur);
    1137                     pCur = CmdList.Blink;
    1138                     switch (pDr->enmType)
    1139                     {
    1140                         case VBOXVDMAPIPE_CMD_TYPE_DMACMD:
    1141                         {
    1142                             PVBOXVDMAPIPE_CMD_DMACMD pDmaCmd = (PVBOXVDMAPIPE_CMD_DMACMD)pDr;
    1143                             Status = vboxVdmaGgDmaCmdProcessSlow(pDevExt, pDmaCmd);
    1144                             Assert(Status == STATUS_SUCCESS);
    1145                         } break;
    1146 #if 0
    1147                         case VBOXVDMAPIPE_CMD_TYPE_RECTSINFO:
    1148                         {
    1149                             PVBOXVDMAPIPE_CMD_RECTSINFO pRects = (PVBOXVDMAPIPE_CMD_RECTSINFO)pDr;
    1150                             Status = vboxVdmaGgDirtyRectsProcess(pDevExt, pRects->pContext, pRects->pSwapchain, &pRects->ContextsRects);
    1151                             Assert(Status == STATUS_SUCCESS);
    1152                             vboxVdmaGgCmdRelease(pDevExt, pDr);
    1153                             break;
    1154                         }
    1155 #endif
    1156                         case VBOXVDMAPIPE_CMD_TYPE_FINISH:
    1157                         {
    1158                             PVBOXVDMAPIPE_CMD_FINISH pCmd = (PVBOXVDMAPIPE_CMD_FINISH)pDr;
    1159                             PVBOXWDDM_CONTEXT pContext = pCmd->pContext;
    1160                             Assert(pCmd->pEvent);
    1161                             Status = vboxVideoCmCmdSubmitCompleteEvent(&pContext->CmContext, pCmd->pEvent);
    1162                             if (Status != STATUS_SUCCESS)
    1163                             {
    1164                                 WARN(("vboxVideoCmCmdWaitCompleted failedm Status (0x%x)", Status));
    1165                             }
    1166                             vboxVdmaGgCmdRelease(pDevExt, &pCmd->Hdr);
    1167                             break;
    1168                         }
    1169                         case VBOXVDMAPIPE_CMD_TYPE_CANCEL:
    1170                         {
    1171                             PVBOXVDMAPIPE_CMD_CANCEL pCmd = (PVBOXVDMAPIPE_CMD_CANCEL)pDr;
    1172                             PVBOXWDDM_CONTEXT pContext = pCmd->pContext;
    1173                             Status = vboxVideoCmCmdVisit(&pContext->CmContext, FALSE, vboxVdmaGgCmdCancelVisitor, pCmd->pSwapchain);
    1174                             if (Status != STATUS_SUCCESS)
    1175                             {
    1176                                 WARN(("vboxVideoCmCmdWaitCompleted failedm Status (0x%x)", Status));
    1177                             }
    1178                             Assert(pCmd->pEvent);
    1179                             KeSetEvent(pCmd->pEvent, 0, FALSE);
    1180                             vboxVdmaGgCmdRelease(pDevExt, &pCmd->Hdr);
    1181                             break;
    1182                         }
    1183                         default:
    1184                             AssertBreakpoint();
    1185                     }
    1186                 }
    1187             }
    1188             else
    1189                 break;
    1190         } while (1);
    1191     }
    1192 
    1193     /* always try to close the pipe to make sure the client side is notified */
    1194     Status = vboxVdmaPipeSvrClose(&pVdma->CmdPipe);
    1195     Assert(Status == STATUS_SUCCESS);
    1196 }
    1197 
    1198 NTSTATUS vboxVdmaGgConstruct(PVBOXMP_DEVEXT pDevExt)
    1199 {
    1200     PVBOXVDMAGG pVdma = &pDevExt->u.primary.Vdma.DmaGg;
    1201     NTSTATUS Status = vboxVdmaPipeConstruct(&pVdma->CmdPipe);
    1202     Assert(Status == STATUS_SUCCESS);
    1203     if (Status == STATUS_SUCCESS)
    1204     {
    1205         Status = vboxVdmaGgThreadCreate(&pVdma->pThread, vboxVdmaGgWorkerThread, pDevExt);
    1206         Assert(Status == STATUS_SUCCESS);
    1207         if (Status == STATUS_SUCCESS)
    1208             return STATUS_SUCCESS;
    1209 
    1210         NTSTATUS tmpStatus = vboxVdmaPipeDestruct(&pVdma->CmdPipe);
    1211         Assert(tmpStatus == STATUS_SUCCESS);
    1212     }
    1213 
    1214     /* we're here ONLY in case of an error */
    1215     Assert(Status != STATUS_SUCCESS);
    1216     return Status;
    1217 }
    1218 
    1219 NTSTATUS vboxVdmaGgDestruct(PVBOXMP_DEVEXT pDevExt)
    1220 {
    1221     PVBOXVDMAGG pVdma = &pDevExt->u.primary.Vdma.DmaGg;
    1222     /* this informs the server thread that it should complete all current commands and exit */
    1223     NTSTATUS Status = vboxVdmaPipeCltClose(&pVdma->CmdPipe);
    1224     Assert(Status == STATUS_SUCCESS);
    1225     if (Status == STATUS_SUCCESS)
    1226     {
    1227         Status = KeWaitForSingleObject(pVdma->pThread, Executive, KernelMode, FALSE, NULL /* PLARGE_INTEGER Timeout */);
    1228         Assert(Status == STATUS_SUCCESS);
    1229         if (Status == STATUS_SUCCESS)
    1230         {
    1231             Status = vboxVdmaPipeDestruct(&pVdma->CmdPipe);
    1232             Assert(Status == STATUS_SUCCESS);
    1233         }
    1234     }
    1235 
    1236     return Status;
    1237 }
    1238 
    1239 NTSTATUS vboxVdmaGgCmdSubmit(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DR pCmd)
    1240 {
    1241     switch (pCmd->enmType)
    1242     {
    1243         case VBOXVDMAPIPE_CMD_TYPE_DMACMD:
    1244         {
    1245             PVBOXVDMAPIPE_CMD_DMACMD pDmaCmd = (PVBOXVDMAPIPE_CMD_DMACMD)pCmd;
    1246             NTSTATUS Status = vboxVdmaGgDmaCmdProcessFast(pDevExt, pDmaCmd);
    1247             if (Status == STATUS_MORE_PROCESSING_REQUIRED)
    1248                 break;
    1249             return Status;
    1250         }
    1251         default:
    1252             break;
    1253     }
    1254     /* corresponding Release is done by the pipe command handler */
    1255     vboxVdmaGgCmdAddRef(pCmd);
    1256     return vboxVdmaPipeCltCmdPut(&pDevExt->u.primary.Vdma.DmaGg.CmdPipe, &pCmd->PipeHdr);
    1257 }
    1258 
    1259 NTSTATUS vboxVdmaGgCmdDmaNotifySubmitted(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DMACMD pCmd)
    1260 {
    1261     PVBOXVDMADDI_CMD pDdiCmd;
    1262 #ifdef VBOX_WDDM_IRQ_COMPLETION
    1263     pDdiCmd = vboxVdmaGgCmdDmaGetDdiCmd(pCmd);
    1264 #else
    1265     pDdiCmd = &pCmd->DdiCmd;
    1266 #endif
    1267     NTSTATUS Status = vboxVdmaDdiCmdSubmitted(pDevExt, pDdiCmd);
    1268     Assert(Status == STATUS_SUCCESS);
    1269     return Status;
    1270 }
    1271 
    1272 NTSTATUS vboxVdmaGgCmdDmaNotifyCompleted(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DMACMD pCmd, DXGK_INTERRUPT_TYPE enmComplType)
    1273 {
    1274 #ifdef VBOX_WDDM_IRQ_COMPLETION
    1275     VBOXVDMACBUF_DR* pDr = vboxVdmaGgCmdDmaGetDr(pCmd);
    1276     int rc = vboxVdmaCBufDrSubmit(pDevExt, &pDevExt->u.primary.Vdma, pDr);
    1277     Assert(rc == VINF_SUCCESS);
    1278     if (RT_SUCCESS(rc))
    1279     {
    1280         return STATUS_SUCCESS;
    1281     }
    1282     return STATUS_UNSUCCESSFUL;
    1283 #else
    1284     return vboxVdmaDdiCmdCompleted(pDevExt, &pCmd->DdiCmd, enmComplType);
    1285 #endif
    1286 }
    1287 
    1288 VOID vboxVdmaGgCmdDmaNotifyInit(PVBOXVDMAPIPE_CMD_DMACMD pCmd,
    1289         uint32_t u32NodeOrdinal, uint32_t u32FenceId,
    1290         PFNVBOXVDMADDICMDCOMPLETE_DPC pfnComplete, PVOID pvComplete)
    1291 {
    1292     PVBOXVDMADDI_CMD pDdiCmd;
    1293 #ifdef VBOX_WDDM_IRQ_COMPLETION
    1294     pDdiCmd = vboxVdmaGgCmdDmaGetDdiCmd(pCmd);
    1295 #else
    1296     pDdiCmd = &pCmd->DdiCmd;
    1297 #endif
    1298     vboxVdmaDdiCmdInit(pDdiCmd, u32NodeOrdinal, u32FenceId, pfnComplete, pvComplete);
    1299 }
    1300 
    1301 NTSTATUS vboxVdmaGgCmdFinish(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, PKEVENT pEvent)
     966        }
     967    }
     968
     969    if (fBltFlags.fVisibleRegions)
     970    {
     971        Status = vboxVdmaProcessVRegCmd(pDevExt, pContext, &pBlt->Blt.SrcAlloc, &pBlt->Blt.DstAlloc, &pBlt->Blt.SrcRect, &pBlt->Blt.DstRects);
     972        if (!NT_SUCCESS(Status))
     973            WARN(("vboxVdmaProcessVRegCmd failed Status 0x%x", Status));
     974    }
     975
     976    return Status;
     977}
     978
     979NTSTATUS vboxVdmaProcessFlipCmd(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, VBOXWDDM_DMA_PRIVATEDATA_FLIP *pFlip, VBOXVDMAPIPE_FLAGS_DMACMD fFlags)
    1302980{
    1303981    NTSTATUS Status = STATUS_SUCCESS;
    1304 
    1305     PVBOXVDMAPIPE_CMD_FINISH pCmd = (PVBOXVDMAPIPE_CMD_FINISH)vboxVdmaGgCmdCreate(pDevExt, VBOXVDMAPIPE_CMD_TYPE_FINISH, sizeof (*pCmd));
    1306     if (pCmd)
    1307     {
    1308         pCmd->pContext = pContext;
    1309         pCmd->pEvent = pEvent;
    1310         Status = vboxVdmaGgCmdSubmit(pDevExt, &pCmd->Hdr);
     982    PVBOXWDDM_ALLOCATION pAlloc = pFlip->Flip.Alloc.pAlloc;
     983    VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pAlloc->AllocData.SurfDesc.VidPnSourceId];
     984    vboxWddmAssignPrimary(pDevExt, pSource, pAlloc, pAlloc->AllocData.SurfDesc.VidPnSourceId);
     985    Assert(!fFlags.fRealOp);
     986    if (fFlags.fVisibleRegions)
     987    {
     988        RECT SrcRect;
     989        VBOXVDMAPIPE_RECTS Rects;
     990        SrcRect.left = 0;
     991        SrcRect.top = 0;
     992        SrcRect.right = pAlloc->AllocData.SurfDesc.width;
     993        SrcRect.bottom = pAlloc->AllocData.SurfDesc.height;
     994        Rects.ContextRect.left = 0;
     995        Rects.ContextRect.top = 0;
     996        Rects.ContextRect.right = pAlloc->AllocData.SurfDesc.width;
     997        Rects.ContextRect.bottom = pAlloc->AllocData.SurfDesc.height;
     998        Rects.UpdateRects.cRects = 1;
     999        Rects.UpdateRects.aRects[0] = Rects.ContextRect;
     1000
     1001        Status = vboxVdmaProcessVRegCmd(pDevExt, pContext, &pFlip->Flip.Alloc, &pFlip->Flip.Alloc, &SrcRect, &Rects);
    13111002        if (!NT_SUCCESS(Status))
    1312         {
    1313             WARN(("vboxVdmaGgCmdSubmit returned 0x%x", Status));
    1314         }
    1315         vboxVdmaGgCmdRelease(pDevExt, &pCmd->Hdr);
     1003            WARN(("vboxVdmaProcessVRegCmd failed Status 0x%x", Status));
    13161004    }
    13171005    else
    1318     {
    1319         WARN(("vboxVdmaGgCmdCreate failed"));
    1320         Status = STATUS_NO_MEMORY;
    1321     }
    1322     return Status;
    1323 }
    1324 
    1325 NTSTATUS vboxVdmaGgCmdCancel(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, PVBOXWDDM_SWAPCHAIN pSwapchain)
     1006        WARN(("unexpected flip request"));
     1007
     1008    return Status;
     1009}
     1010
     1011NTSTATUS vboxVdmaProcessClrFillCmd(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, VBOXWDDM_DMA_PRIVATEDATA_CLRFILL *pCF, VBOXVDMAPIPE_FLAGS_DMACMD fFlags)
    13261012{
    13271013    NTSTATUS Status = STATUS_SUCCESS;
    1328 
    1329     PVBOXVDMAPIPE_CMD_CANCEL pCmd = (PVBOXVDMAPIPE_CMD_CANCEL)vboxVdmaGgCmdCreate(pDevExt, VBOXVDMAPIPE_CMD_TYPE_CANCEL, sizeof (*pCmd));
    1330     if (pCmd)
    1331     {
    1332         KEVENT Event;
    1333         KeInitializeEvent(&Event, NotificationEvent, FALSE);
    1334         pCmd->pContext = pContext;
    1335         pCmd->pSwapchain = pSwapchain;
    1336         pCmd->pEvent = &Event;
    1337         Status = vboxVdmaGgCmdSubmit(pDevExt, &pCmd->Hdr);
    1338         if (NT_SUCCESS(Status))
    1339         {
    1340             Status = KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
    1341             Assert(Status == STATUS_SUCCESS);
    1342         }
    1343         else
    1344         {
    1345             WARN(("vboxVdmaGgCmdSubmit returned 0x%x", Status));
    1346         }
    1347         vboxVdmaGgCmdRelease(pDevExt, &pCmd->Hdr);
     1014    Assert(!fFlags.fVisibleRegions);
     1015
     1016    if (fFlags.fRealOp)
     1017    {
     1018        Status = vboxVdmaGgDmaColorFill(pDevExt, &pCF->ClrFill);
     1019        if (!NT_SUCCESS(Status))
     1020            WARN(("vboxVdmaProcessVRegCmd failed Status 0x%x", Status));
    13481021    }
    13491022    else
    1350     {
    1351         WARN(("vboxVdmaGgCmdCreate failed"));
    1352         Status = STATUS_NO_MEMORY;
    1353     }
    1354     return Status;
    1355 }
    1356 #else /* if defined VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS */
    1357 NTSTATUS vboxVdmaGgCmdProcess(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DR pCmd)
    1358 {
    1359     switch (pCmd->enmType)
    1360     {
    1361         case VBOXVDMAPIPE_CMD_TYPE_DMACMD:
    1362         {
    1363             PVBOXVDMAPIPE_CMD_DMACMD pDmaCmd = (PVBOXVDMAPIPE_CMD_DMACMD)pCmd;
    1364             NTSTATUS Status = vboxVdmaGgDmaCmdProcessFast(pDevExt, pDmaCmd);
    1365             if (Status == STATUS_MORE_PROCESSING_REQUIRED)
    1366                 break;
    1367             return Status;
    1368         }
    1369         default:
    1370             break;
    1371     }
    1372     /* corresponding Release is done by the pipe command handler */
    1373     vboxVdmaGgCmdAddRef(pCmd);
    1374     return vboxVdmaPipeCltCmdPut(&pDevExt->u.primary.Vdma.DmaGg.CmdPipe, &pCmd->PipeHdr);
    1375 }
    1376 
    1377 #endif
    1378 
    1379 /* end */
     1023        WARN(("unexpected clrfill request"));
     1024
     1025    return Status;
     1026}
     1027
    13801028
    13811029#ifdef VBOX_WITH_VDMA
     
    15091157#endif
    15101158        {
    1511             NTSTATUS Status = vboxVdmaGgConstruct(pDevExt);
    1512             Assert(Status == STATUS_SUCCESS);
    1513             if (Status == STATUS_SUCCESS)
    1514                 return VINF_SUCCESS;
    1515             rc = VERR_GENERAL_FAILURE;
     1159            return VINF_SUCCESS;
    15161160        }
    15171161#ifdef VBOX_WITH_VDMA
     
    15781222{
    15791223    int rc = VINF_SUCCESS;
    1580     NTSTATUS Status = vboxVdmaGgDestruct(pDevExt);
    1581     Assert(Status == STATUS_SUCCESS);
    1582     if (Status == STATUS_SUCCESS)
    1583     {
    1584         Assert(!pInfo->fEnabled);
    1585         if (pInfo->fEnabled)
    1586             rc = vboxVdmaDisable (pDevExt, pInfo);
     1224    Assert(!pInfo->fEnabled);
     1225    if (pInfo->fEnabled)
     1226        rc = vboxVdmaDisable (pDevExt, pInfo);
    15871227#ifdef VBOX_WITH_VDMA
    1588         VBoxSHGSMITerm(&pInfo->CmdHeap);
    1589         VBoxMPCmnUnmapAdapterMemory(VBoxCommonFromDeviceExt(pDevExt), (void**)&pInfo->CmdHeap.Heap.area.pu8Base);
     1228    VBoxSHGSMITerm(&pInfo->CmdHeap);
     1229    VBoxMPCmnUnmapAdapterMemory(VBoxCommonFromDeviceExt(pDevExt), (void**)&pInfo->CmdHeap.Heap.area.pu8Base);
    15901230#endif
    1591     }
    1592     else
    1593         rc = VERR_GENERAL_FAILURE;
    15941231    return rc;
    15951232}
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.h

    r44529 r46757  
    220220            UINT fRealOp             : 1;
    221221            UINT fVisibleRegions     : 1;
    222             UINT Reserve             : 30;
     222            UINT Reserved            : 30;
    223223        };
    224224        UINT Value;
     
    295295    UINT      uLastCompletedPagingBufferCmdFenceId;
    296296    BOOL      fEnabled;
    297     /* dma-related commands list processed on the guest w/o host part involvement (guest-guest commands) */
    298     VBOXVDMAGG DmaGg;
    299297} VBOXVDMAINFO, *PVBOXVDMAINFO;
    300298
     
    313311#ifdef VBOX_WITH_VDMA
    314312int vboxVdmaFlush(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAINFO pInfo);
     313DECLINLINE(HGSMIOFFSET) vboxVdmaCBufDrPtrOffset(const PVBOXVDMAINFO pInfo, const void* pvPtr)
     314{
     315    return VBoxSHGSMICommandPtrOffset(&pInfo->CmdHeap, pvPtr);
     316}
    315317int vboxVdmaCBufDrSubmit(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAINFO pInfo, PVBOXVDMACBUF_DR pDr);
    316318int vboxVdmaCBufDrSubmitSynch(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAINFO pInfo, PVBOXVDMACBUF_DR pDr);
     
    326328#define VBOXVDMACBUF_DR_FROM_DDI_CMD(_pCmd) ((PVBOXVDMACBUF_DR)(((uint8_t*)(_pCmd)) - RT_OFFSETOF(VBOXVDMACBUF_DR, aGuestData)))
    327329
    328 #endif
    329 NTSTATUS vboxVdmaGgCmdSubmit(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DR pCmd);
    330 PVBOXVDMAPIPE_CMD_DR vboxVdmaGgCmdCreate(PVBOXMP_DEVEXT pDevExt, VBOXVDMAPIPE_CMD_TYPE enmType, uint32_t cbCmd);
    331 DECLINLINE(void) vboxVdmaGgCmdAddRef(PVBOXVDMAPIPE_CMD_DR pDr)
    332 {
    333     ASMAtomicIncU32(&pDr->cRefs);
    334 }
    335 void vboxVdmaGgCmdDestroy(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DR pDr);
    336 DECLINLINE(void) vboxVdmaGgCmdRelease(PVBOXMP_DEVEXT pDevExt, PVBOXVDMAPIPE_CMD_DR pDr)
    337 {
    338     uint32_t cRefs = ASMAtomicDecU32(&pDr->cRefs);
    339     Assert(cRefs < UINT32_MAX/2);
    340     if (!cRefs)
    341         vboxVdmaGgCmdDestroy(pDevExt, pDr);
    342 }
    343 #ifndef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    344 NTSTATUS vboxVdmaGgCmdFinish(PVBOXMP_DEVEXT pDevExt, struct VBOXWDDM_CONTEXT *pContext, PKEVENT pEvent);
    345 NTSTATUS vboxVdmaGgCmdCancel(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, PVBOXWDDM_SWAPCHAIN pSwapchain);
    346330#endif
    347331
     
    358342
    359343#define VBOXVDMAPIPE_CMD_DR_FROM_DDI_CMD(_pCmd) ((PVBOXVDMAPIPE_CMD_DR)(((uint8_t*)(_pCmd)) - RT_OFFSETOF(VBOXVDMAPIPE_CMD_DR, DdiCmd)))
    360 DECLCALLBACK(VOID) vboxVdmaGgDdiCmdRelease(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext);
     344
     345NTSTATUS vboxVdmaProcessBltCmd(PVBOXMP_DEVEXT pDevExt, struct VBOXWDDM_CONTEXT *pContext, struct VBOXWDDM_DMA_PRIVATEDATA_BLT *pBlt, struct VBOXVDMAPIPE_FLAGS_DMACMD fBltFlags);
     346NTSTATUS vboxVdmaProcessFlipCmd(PVBOXMP_DEVEXT pDevExt, struct VBOXWDDM_CONTEXT *pContext, struct VBOXWDDM_DMA_PRIVATEDATA_FLIP *pFlip, struct VBOXVDMAPIPE_FLAGS_DMACMD fFlags);
     347NTSTATUS vboxVdmaProcessClrFillCmd(PVBOXMP_DEVEXT pDevExt, struct VBOXWDDM_CONTEXT *pContext, struct VBOXWDDM_DMA_PRIVATEDATA_CLRFILL *pCF, struct VBOXVDMAPIPE_FLAGS_DMACMD fFlags);
     348
    361349#endif /* #ifndef ___VBoxMPVdma_h___ */
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp

    r46662 r46757  
    11651165                    VBoxWddmSlInit(pDevExt);
    11661166
    1167 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    11681167                    VBoxMpCrShgsmiTransportCreate(&pDevExt->CrHgsmiTransport, pDevExt);
    1169 #endif
     1168                    /* @todo: implement detection */
     1169                    pDevExt->fTexPresentEnabled = FALSE;
    11701170
    11711171                    for (UINT i = 0; i < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i)
     
    11731173                        PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[i];
    11741174                        KeInitializeSpinLock(&pSource->AllocationLock);
     1175                        VBoxVrListInit(&pSource->VrList);
    11751176                    }
    11761177
     
    12581259    NTSTATUS Status = STATUS_SUCCESS;
    12591260
    1260 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    12611261    VBoxMpCrShgsmiTransportTerm(&pDevExt->CrHgsmiTransport);
    1262 #endif
    12631262
    12641263    VBoxWddmSlTerm(pDevExt);
     
    17991798    VbglTerminate();
    18001799
    1801     VBoxWddmVrTerm();
     1800    VBoxVrTerm();
    18021801
    18031802    PRTLOGGER pLogger = RTLogRelSetDefaultInstance(NULL);
     
    28972896}
    28982897
    2899 static NTSTATUS vboxWddmSubmitCmd(PVBOXMP_DEVEXT pDevExt, VBOXVDMAPIPE_CMD_DMACMD *pCmd)
    2900 {
    2901     NTSTATUS Status = vboxVdmaGgCmdDmaNotifySubmitted(pDevExt, pCmd);
    2902     Assert(Status == STATUS_SUCCESS);
    2903     if (Status == STATUS_SUCCESS)
    2904     {
    2905         NTSTATUS submStatus = vboxVdmaGgCmdSubmit(pDevExt, &pCmd->Hdr);
    2906         Assert(submStatus == STATUS_SUCCESS);
    2907         if (submStatus != STATUS_SUCCESS)
    2908         {
    2909             vboxVdmaGgCmdDmaNotifyCompleted(pDevExt, pCmd, DXGK_INTERRUPT_DMA_FAULTED);
    2910         }
    2911     }
    2912     else
    2913     {
    2914         vboxVdmaGgCmdRelease(pDevExt, &pCmd->Hdr);
    2915     }
    2916     return Status;
    2917 }
    2918 
    2919 static NTSTATUS vboxWddmSubmitBltCmd(PVBOXMP_DEVEXT pDevExt, VBOXWDDM_CONTEXT *pContext, UINT u32FenceId, PVBOXWDDM_DMA_PRIVATEDATA_BLT pBlt, VBOXVDMAPIPE_FLAGS_DMACMD fBltFlags)
    2920 {
    2921     NTSTATUS Status = STATUS_SUCCESS;
    2922     PVBOXVDMAPIPE_CMD_DMACMD_BLT pBltCmd = (PVBOXVDMAPIPE_CMD_DMACMD_BLT)vboxVdmaGgCmdCreate(pDevExt, VBOXVDMAPIPE_CMD_TYPE_DMACMD, RT_OFFSETOF(VBOXVDMAPIPE_CMD_DMACMD_BLT, Blt.DstRects.UpdateRects.aRects[pBlt->Blt.DstRects.UpdateRects.cRects]));
    2923     Assert(pBltCmd);
    2924     if (pBltCmd)
    2925     {
    2926         VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pBlt->Blt.DstAlloc.srcId];
    2927         vboxVdmaGgCmdDmaNotifyInit(&pBltCmd->Hdr, pContext->NodeOrdinal, u32FenceId, vboxVdmaGgDdiCmdRelease, pBltCmd);
    2928         pBltCmd->Hdr.fFlags = fBltFlags;
    2929         pBltCmd->Hdr.pContext = pContext;
    2930         pBltCmd->Hdr.enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_BLT;
    2931         memcpy(&pBltCmd->Blt, &pBlt->Blt, RT_OFFSETOF(VBOXVDMA_BLT, DstRects.UpdateRects.aRects[pBlt->Blt.DstRects.UpdateRects.cRects]));
    2932         Status = vboxWddmSubmitCmd(pDevExt, &pBltCmd->Hdr);
    2933         if (Status != STATUS_SUCCESS)
    2934         {
    2935             WARN(("vboxWddmSubmitCmd failed, Status 0x%x", Status));
    2936             Status = STATUS_SUCCESS;
    2937         }
    2938         vboxVdmaGgCmdRelease(pDevExt, &pBltCmd->Hdr.Hdr);
    2939     }
    2940     else
    2941     {
    2942         Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, u32FenceId, DXGK_INTERRUPT_DMA_FAULTED);
    2943     }
    2944     return Status;
    2945 }
    2946 
    29472898#ifdef VBOX_WITH_CRHGSMI
    29482899DECLCALLBACK(VOID) vboxWddmDmaCompleteChromiumCmd(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext)
     
    31813132
    31823133            if (fBltFlags.Value)
    3183             {
    3184                 Status = vboxWddmSubmitBltCmd(pDevExt, pContext, pSubmitCommand->SubmissionFenceId, pBlt, fBltFlags);
    3185             }
    3186             else
    3187             {
    3188                 Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, DXGK_INTERRUPT_DMA_COMPLETED);
    3189             }
     3134                Status = vboxVdmaProcessBltCmd(pDevExt, pContext, pBlt, fBltFlags);
     3135
     3136            Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId,
     3137                    NT_SUCCESS(Status) ? DXGK_INTERRUPT_DMA_COMPLETED : DXGK_INTERRUPT_DMA_FAULTED);
    31903138            break;
    31913139        }
     
    32473195            VBOXWDDM_DMA_PRIVATEDATA_FLIP *pFlip = (VBOXWDDM_DMA_PRIVATEDATA_FLIP*)pPrivateDataBase;
    32483196            vboxWddmAddrSetVram(&pFlip->Flip.Alloc.pAlloc->AllocData.Addr, pFlip->Flip.Alloc.segmentIdAlloc, pFlip->Flip.Alloc.offAlloc);
    3249             PVBOXVDMAPIPE_CMD_DMACMD_FLIP pFlipCmd = (PVBOXVDMAPIPE_CMD_DMACMD_FLIP)vboxVdmaGgCmdCreate(pDevExt,
    3250                     VBOXVDMAPIPE_CMD_TYPE_DMACMD, sizeof (VBOXVDMAPIPE_CMD_DMACMD_FLIP));
    3251             Assert(pFlipCmd);
    3252             if (pFlipCmd)
    3253             {
    3254                 VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pFlip->Flip.Alloc.srcId];
    3255                 vboxVdmaGgCmdDmaNotifyInit(&pFlipCmd->Hdr, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, vboxVdmaGgDdiCmdRelease, pFlipCmd);
    3256                 pFlipCmd->Hdr.fFlags.Value = 0;
    3257                 pFlipCmd->Hdr.fFlags.fVisibleRegions = 1;
    3258                 pFlipCmd->Hdr.pContext = pContext;
    3259                 pFlipCmd->Hdr.enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_FLIP;
    3260                 memcpy(&pFlipCmd->Flip, &pFlip->Flip, sizeof (pFlipCmd->Flip));
    3261                 Status = vboxWddmSubmitCmd(pDevExt, &pFlipCmd->Hdr);
    3262                 if (Status != STATUS_SUCCESS)
    3263                     WARN(("vboxWddmSubmitCmd failed, Status 0x%x", Status));
    3264                 vboxVdmaGgCmdRelease(pDevExt, &pFlipCmd->Hdr.Hdr);
    3265             }
     3197            VBOXVDMAPIPE_FLAGS_DMACMD fFlags;
     3198            fFlags.Value = 0;
     3199
     3200            if (pContext->enmType == VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D)
     3201                fFlags.fVisibleRegions = 1;
    32663202            else
    3267             {
    3268                 Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, DXGK_INTERRUPT_DMA_FAULTED);
    3269                 Assert(Status == STATUS_SUCCESS);
    3270             }
     3203                WARN(("unexpected flip cmd"));
     3204
     3205            if (fFlags.Value)
     3206                Status = vboxVdmaProcessFlipCmd(pDevExt, pContext, pFlip, fFlags);
     3207
     3208            Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId,
     3209                    NT_SUCCESS(Status) ? DXGK_INTERRUPT_DMA_COMPLETED : DXGK_INTERRUPT_DMA_FAULTED);
    32713210            break;
    32723211        }
     
    32753214            PVBOXWDDM_DMA_PRIVATEDATA_CLRFILL pCF = (PVBOXWDDM_DMA_PRIVATEDATA_CLRFILL)pPrivateDataBase;
    32763215            vboxWddmAddrSetVram(&pCF->ClrFill.Alloc.pAlloc->AllocData.Addr, pCF->ClrFill.Alloc.segmentIdAlloc, pCF->ClrFill.Alloc.offAlloc);
    3277             PVBOXVDMAPIPE_CMD_DMACMD_CLRFILL pCFCmd = (PVBOXVDMAPIPE_CMD_DMACMD_CLRFILL)vboxVdmaGgCmdCreate(pDevExt,
    3278                     VBOXVDMAPIPE_CMD_TYPE_DMACMD, RT_OFFSETOF(VBOXVDMAPIPE_CMD_DMACMD_CLRFILL, ClrFill.Rects.aRects[pCF->ClrFill.Rects.cRects]));
    3279             Assert(pCFCmd);
    3280             if (pCFCmd)
    3281             {
    3282                 vboxVdmaGgCmdDmaNotifyInit(&pCFCmd->Hdr, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, vboxVdmaGgDdiCmdRelease, pCFCmd);
    3283                 pCFCmd->Hdr.fFlags.Value = 0;
    3284                 pCFCmd->Hdr.fFlags.fRealOp = 1;
    3285                 pCFCmd->Hdr.pContext = pContext;
    3286                 pCFCmd->Hdr.enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_CLRFILL;
    3287                 memcpy(&pCFCmd->ClrFill, &pCF->ClrFill, RT_OFFSETOF(VBOXVDMA_CLRFILL, Rects.aRects[pCF->ClrFill.Rects.cRects]));
    3288                 Status = vboxWddmSubmitCmd(pDevExt, &pCFCmd->Hdr);
    3289                 if (Status != STATUS_SUCCESS)
    3290                     WARN(("vboxWddmSubmitCmd failed, Status 0x%x", Status));
    3291                 vboxVdmaGgCmdRelease(pDevExt, &pCFCmd->Hdr.Hdr);
    3292 
    3293             }
    3294             else
    3295             {
    3296                 Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId, DXGK_INTERRUPT_DMA_FAULTED);
    3297                 Assert(Status == STATUS_SUCCESS);
    3298             }
    3299 
     3216            VBOXVDMAPIPE_FLAGS_DMACMD fFlags;
     3217            fFlags.Value = 0;
     3218            fFlags.fRealOp = 1;
     3219
     3220            if (fFlags.Value)
     3221                Status = vboxVdmaProcessClrFillCmd(pDevExt, pContext, pCF, fFlags);
     3222
     3223            Status = vboxVdmaDdiCmdFenceComplete(pDevExt, pContext->NodeOrdinal, pSubmitCommand->SubmissionFenceId,
     3224                    NT_SUCCESS(Status) ? DXGK_INTERRUPT_DMA_COMPLETED : DXGK_INTERRUPT_DMA_FAULTED);
    33003225            break;
    33013226        }
     
    57405665                    {
    57415666                        cbCmd -= cbRects;
    5742                         memcpy(&pBlt->Blt.DstRects.UpdateRects.aRects[pPresent->MultipassOffset], pPresent->pDstSubRects, cbRects);
     5667                        memcpy(&pBlt->Blt.DstRects.UpdateRects.aRects[pPresent->MultipassOffset], &pPresent->pDstSubRects[pPresent->MultipassOffset], cbRects);
    57435668                        pBlt->Blt.DstRects.UpdateRects.cRects += cbRects/sizeof (RECT);
    57445669                    }
     
    57475672                        UINT cbFitingRects = (cbCmd/sizeof (RECT)) * sizeof (RECT);
    57485673                        Assert(cbFitingRects);
    5749                         memcpy(&pBlt->Blt.DstRects.UpdateRects.aRects[pPresent->MultipassOffset], pPresent->pDstSubRects, cbFitingRects);
     5674                        memcpy(&pBlt->Blt.DstRects.UpdateRects.aRects[pPresent->MultipassOffset], &pPresent->pDstSubRects[pPresent->MultipassOffset], cbFitingRects);
    57505675                        cbCmd -= cbFitingRects;
    57515676                        pPresent->MultipassOffset += cbFitingRects/sizeof (RECT);
     
    61866111                                        if (RT_SUCCESS(rc))
    61876112                                        {
    6188 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    61896113                                            VBoxMpCrPackerInit(&pContext->CrPacker);
    6190 #endif
    61916114                                        }
    61926115                                        else
     
    68146737        if (NT_SUCCESS(Status))
    68156738        {
    6816             Status = VBoxWddmVrInit();
    6817             if (NT_SUCCESS(Status))
     6739            rc = VBoxVrInit();
     6740            if (RT_SUCCESS(rc))
    68186741            {
    68196742#ifdef VBOX_WDDM_WIN8
     
    68316754                    return Status;
    68326755
    6833                 VBoxWddmVrTerm();
     6756                VBoxVrTerm();
    68346757            }
    68356758            else
    6836                 WARN(("VBoxWddmVrInit failed, Status(0x%x)", Status));
     6759            {
     6760                WARN(("VBoxVrInit failed, rc(%d)", rc));
     6761                Status = STATUS_UNSUCCESSFUL;
     6762            }
    68376763        }
    68386764        else
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.h

    r44529 r46757  
    167167        vboxWddmAllocationRetain(pAllocation);
    168168    }
     169
     170    if (pAllocation && pAllocation->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE)
     171    {
     172        RTRECT Rect;
     173        Rect.xLeft = 0;
     174        Rect.yTop = 0;
     175        Rect.xRight = pAllocation->AllocData.SurfDesc.width;
     176        Rect.yBottom = pAllocation->AllocData.SurfDesc.height;
     177
     178        VBoxVrListRectsSet(&pSource->VrList, 1, &Rect, NULL);
     179    }
     180    else
     181        VBoxVrListClear(&pSource->VrList);
     182
     183    pSource->fHas3DVrs = FALSE;
    169184
    170185    KIRQL OldIrql;
     
    218233#endif
    219234
    220 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    221 # define VBOXWDDM_CTXLOCK_INIT(_p) do { \
     235#define VBOXWDDM_CTXLOCK_INIT(_p) do { \
    222236        KeInitializeSpinLock(&(_p)->ContextLock); \
    223237    } while (0)
    224 # define VBOXWDDM_CTXLOCK_DATA KIRQL _ctxLockOldIrql;
    225 # define VBOXWDDM_CTXLOCK_LOCK(_p) do { \
     238#define VBOXWDDM_CTXLOCK_DATA KIRQL _ctxLockOldIrql;
     239#define VBOXWDDM_CTXLOCK_LOCK(_p) do { \
    226240        KeAcquireSpinLock(&(_p)->ContextLock, &_ctxLockOldIrql); \
    227241    } while (0)
    228 # define VBOXWDDM_CTXLOCK_UNLOCK(_p) do { \
     242#define VBOXWDDM_CTXLOCK_UNLOCK(_p) do { \
    229243        KeReleaseSpinLock(&(_p)->ContextLock, _ctxLockOldIrql); \
    230244    } while (0)
    231 #else
    232 # define VBOXWDDM_CTXLOCK_INIT(_p) do { \
    233         ExInitializeFastMutex(&(_p)->ContextMutex); \
    234     } while (0)
    235 # define VBOXWDDM_CTXLOCK_LOCK(_p) do { \
    236         ExAcquireFastMutex(&(_p)->ContextMutex); \
    237     } while (0)
    238 # define VBOXWDDM_CTXLOCK_UNLOCK(_p) do { \
    239         ExReleaseFastMutex(&(_p)->ContextMutex); \
    240     } while (0)
    241 # define VBOXWDDM_CTXLOCK_DATA
    242 #endif
    243245
    244246#endif /* #ifndef ___VBoxMPWddm_h___ */
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/d3d9/d3d9wddm.def

    r46662 r46757  
    2323  VBoxWineExD3DDev9VolTexBlt
    2424  VBoxWineExD3DSurf9GetHostId
     25  VBoxWineExD3DSwapchain9GetHostWinID
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/d3d9/swapchain.c

    r46521 r46757  
    306306    return hr;
    307307}
     308
     309VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DSwapchain9GetHostWinID(IDirect3DSwapChain9 *iface, DWORD *pID)
     310{
     311    struct d3d9_swapchain *swapchain = impl_from_IDirect3DSwapChain9(iface);
     312    HRESULT hr;
     313    wined3d_mutex_lock();
     314    hr = wined3d_swapchain_get_host_win_id(swapchain->wined3d_swapchain, pID);
     315    wined3d_mutex_unlock();
     316    return hr;
     317}
    308318#endif
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/vbox/VBoxWineEx.h

    r46662 r46757  
    8484typedef FNVBOXWINEEXD3DSWAPCHAIN9_PRESENT *PFNVBOXWINEEXD3DSWAPCHAIN9_PRESENT;
    8585
     86typedef VBOXWINEEX_DECL(HRESULT) FNVBOXWINEEXD3DSWAPCHAIN9_GETHOSTWINID(IDirect3DSwapChain9 *iface, DWORD *pID);
     87typedef FNVBOXWINEEXD3DSWAPCHAIN9_GETHOSTWINID *PFNVBOXWINEEXD3DSWAPCHAIN9_GETHOSTWINID;
     88
    8689#ifdef __cplusplus
    8790extern "C"
     
    125128VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DSurf9GetHostId(IDirect3DSurface9 *iface, uint32_t *pu32Id);
    126129
     130/* used for backwards compatibility purposes only with older host versions not supportgin new present mechanism */
    127131VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DSwapchain9Present(IDirect3DSwapChain9 *iface,
    128132                                IDirect3DSurface9 *surf); /* use the given surface as a frontbuffer content source */
     133
     134VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DSwapchain9GetHostWinID(IDirect3DSwapChain9 *iface, DWORD *pID);
    129135
    130136typedef struct VBOXWINEEX_D3DPRESENT_PARAMETERS
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/wined3d/swapchain.c

    r46521 r46757  
    15351535    return S_OK;
    15361536}
    1537 #endif
     1537
     1538HRESULT CDECL wined3d_swapchain_get_host_win_id(struct wined3d_swapchain *swapchain, DWORD *pID)
     1539{
     1540    DWORD id = (DWORD)pVBoxGetWindowId(swapchain->hDC);
     1541    if (!id)
     1542    {
     1543        ERR("failed to get id for hdc 0x%x", swapchain->hDC);
     1544        return E_FAIL;
     1545    }
     1546    *pID = id;
     1547    return S_OK;
     1548}
     1549#endif
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/wined3d/wined3d_gl.h

    r46521 r46757  
    184184HGLRC (WINAPI *pVBoxCreateContext)(HDC, struct VBOXUHGSMI*) DECLSPEC_HIDDEN;
    185185void (WINAPI *pVBoxFlushToHost)(HGLRC) DECLSPEC_HIDDEN;
     186GLint (WINAPI *pVBoxGetWindowId)(HDC)  DECLSPEC_HIDDEN;
    186187
    187188
     
    190191# define VBOX_GL_FUNCS_GEN \
    191192        VBOX_USE_FUNC(VBoxCreateContext) \
    192         VBOX_USE_FUNC(VBoxFlushToHost)
     193        VBOX_USE_FUNC(VBoxFlushToHost) \
     194        VBOX_USE_FUNC(VBoxGetWindowId)
    193195
    194196# define VBOX_GL_EXT_FUNCS_GEN \
  • trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/wined3d/wined3dwddm.def

    r46662 r46757  
    259259  wined3d_swapchain_present_rt
    260260  wined3d_surface_get_host_id
     261  wined3d_swapchain_get_host_win_id
  • trunk/src/VBox/Additions/common/crOpenGL/load.c

    r46627 r46757  
    782782}
    783783
    784 typedef struct VBOXCR_UPDATEWNDCB
    785 {
    786     VBOXDISPMP_REGIONS Regions;
    787     bool fSendUpdateMsg;
    788 } VBOXCR_UPDATEWNDCB, *PVBOXCR_UPDATEWNDCB;
    789 
    790 static void stubSyncTrUpdateWindowCB(unsigned long key, void *data1, void *data2)
    791 {
    792     WindowInfo *pWindow = (WindowInfo *) data1;
    793     PVBOXCR_UPDATEWNDCB pCbData = (PVBOXCR_UPDATEWNDCB) data2;
    794     VBOXDISPMP_REGIONS *pRegions = &pCbData->Regions;
    795     bool bChanged = false, bDoMap = false;
    796     HRGN hNewRgn = INVALID_HANDLE_VALUE;
    797 
    798     if (pRegions->hWnd != pWindow->hWnd)
    799     {
    800         return;
    801     }
    802 
    803     stub.spu->dispatch_table.VBoxPackSetInjectID(pWindow->u32ClientID);
    804 
    805     if (!stubSystemWindowExist(pWindow))
    806     {
    807         stubDestroyWindow(0, (GLint)pWindow->hWnd);
    808         return;
    809     }
    810 
    811     if (pRegions->pRegions->fFlags.bAddVisibleRects || pRegions->pRegions->fFlags.bSetViewRect)
    812     {
    813         if (!pWindow->mapped)
    814         {
    815             bDoMap = true;
    816         }
    817 
    818         /* ensure data integrity */
    819         Assert(!pRegions->pRegions->fFlags.bAddHiddenRects);
    820 
    821         if (pRegions->pRegions->fFlags.bSetViewRect)
    822         {
    823             int winX, winY;
    824             unsigned int winW, winH;
    825             BOOL bRc;
    826 
    827             winX = pRegions->pRegions->RectsInfo.aRects[0].left;
    828             winY = pRegions->pRegions->RectsInfo.aRects[0].top;
    829             winW = pRegions->pRegions->RectsInfo.aRects[0].right - winX;
    830             winH = pRegions->pRegions->RectsInfo.aRects[0].bottom - winY;
    831 
    832             if (stub.trackWindowPos && (bDoMap || winX!=pWindow->x || winY!=pWindow->y))
    833             {
    834                 crDebug("Dispatched WindowPosition (%i)", pWindow->spuWindow);
    835                 stub.spuDispatch.WindowPosition(pWindow->spuWindow, winX, winY);
    836                 pWindow->x = winX;
    837                 pWindow->y = winY;
    838                 bChanged = true;
    839             }
    840 
    841             if (stub.trackWindowSize && (bDoMap || winW!=pWindow->width || winH!=pWindow->height))
    842             {
    843                 crDebug("Dispatched WindowSize (%i)", pWindow->spuWindow);
    844                 stub.spuDispatch.WindowSize(pWindow->spuWindow, winW, winH);
    845                 pWindow->width = winW;
    846                 pWindow->height = winH;
    847                 bChanged = true;
    848             }
    849 
    850             bRc = MoveWindow(pRegions->hWnd, winX, winY, winW, winH, FALSE /*BOOL bRepaint*/);
    851             if (!bRc)
    852             {
    853                 DWORD winEr = GetLastError();
    854                 crWarning("stubSyncTrUpdateWindowCB: MoveWindow failed winEr(%d)", winEr);
    855             }
    856         }
    857 
    858         if (pRegions->pRegions->fFlags.bAddVisibleRects)
    859         {
    860             hNewRgn = stubMakeRegionFromRects(pRegions->pRegions, pRegions->pRegions->fFlags.bSetViewRect ? 1 : 0);
    861         }
    862     }
    863     else if (!pRegions->pRegions->fFlags.bHide)
    864     {
    865         Assert(pRegions->pRegions->fFlags.bAddHiddenRects);
    866         hNewRgn = stubMakeRegionFromRects(pRegions->pRegions, 0);
    867     }
    868     else
    869     {
    870         Assert(pRegions->pRegions->fFlags.bAddHiddenRects);
    871         hNewRgn = CreateRectRgn(pWindow->x, pWindow->y, pWindow->x + pWindow->width, pWindow->y + pWindow->height);
    872     }
    873 
    874     if (hNewRgn!=INVALID_HANDLE_VALUE)
    875     {
    876         if (pRegions->pRegions->fFlags.bAddVisibleRects)
    877         {
    878             HRGN hEmptyRgn = CreateRectRgn(0, 0, 0, 0);
    879 
    880             if (hEmptyRgn!=INVALID_HANDLE_VALUE)
    881             {
    882                 if (pWindow->hVisibleRegion==INVALID_HANDLE_VALUE || EqualRgn(pWindow->hVisibleRegion, hEmptyRgn))
    883                 {
    884                     pCbData->fSendUpdateMsg = true;
    885                 }
    886 
    887                 DeleteObject(hEmptyRgn);
    888             }
    889             else
    890             {
    891                 crWarning("Failed to created empty region!");
    892             }
    893         }
    894 
    895         OffsetRgn(hNewRgn, -pWindow->x, -pWindow->y);
    896 
    897         if (pWindow->hVisibleRegion!=INVALID_HANDLE_VALUE)
    898         {
    899             CombineRgn(hNewRgn, pWindow->hVisibleRegion, hNewRgn,
    900                        pRegions->pRegions->fFlags.bAddHiddenRects ? RGN_DIFF:RGN_OR);
    901 
    902             if (!EqualRgn(pWindow->hVisibleRegion, hNewRgn))
    903             {
    904                 DeleteObject(pWindow->hVisibleRegion);
    905                 pWindow->hVisibleRegion = hNewRgn;
    906                 stubDispatchVisibleRegions(pWindow);
    907                 bChanged = true;
    908             }
    909             else
    910             {
    911                 DeleteObject(hNewRgn);
    912             }
    913         }
    914         else
    915         {
    916             if (pRegions->pRegions->fFlags.bAddVisibleRects)
    917             {
    918                 pWindow->hVisibleRegion = hNewRgn;
    919                 stubDispatchVisibleRegions(pWindow);
    920                 bChanged = true;
    921             }
    922         }
    923     }
    924 
    925     if (bDoMap)
    926     {
    927         pWindow->mapped = GL_TRUE;
    928         bChanged = true;
    929         crDebug("Dispatched: WindowShow(%i, %i)", pWindow->spuWindow, pWindow->mapped);
    930         stub.spu->dispatch_table.WindowShow(pWindow->spuWindow, pWindow->mapped);
    931     }
    932 
    933     if (bChanged)
    934     {
    935         stub.spu->dispatch_table.Flush();
    936     }
    937 }
    938784# endif /* VBOX_WITH_WDDM */
    939785
     
    973819    MSG msg;
    974820# ifdef VBOX_WITH_WDDM
    975     static VBOXDISPMP_CALLBACKS VBoxDispMpTstCallbacks = {NULL, NULL, NULL};
    976821    HMODULE hVBoxD3D = NULL;
    977     VBOXCR_UPDATEWNDCB RegionsData;
    978822    HRESULT hr;
    979823    GLint spuConnection = 0;
     
    996840    if (hVBoxD3D)
    997841    {
    998         PFNVBOXDISPMP_GETCALLBACKS pfnVBoxDispMpGetCallbacks;
    999         pfnVBoxDispMpGetCallbacks = (PFNVBOXDISPMP_GETCALLBACKS)GetProcAddress(hVBoxD3D, TEXT("VBoxDispMpGetCallbacks"));
    1000         if (pfnVBoxDispMpGetCallbacks)
    1001         {
    1002             hr = pfnVBoxDispMpGetCallbacks(VBOXDISPMP_VERSION, &VBoxDispMpTstCallbacks);
    1003             if (S_OK==hr)
    1004             {
    1005                 CRASSERT(VBoxDispMpTstCallbacks.pfnEnableEvents);
    1006                 CRASSERT(VBoxDispMpTstCallbacks.pfnDisableEvents);
    1007                 CRASSERT(VBoxDispMpTstCallbacks.pfnGetRegions);
    1008 
    1009                 hr = VBoxDispMpTstCallbacks.pfnEnableEvents();
    1010                 if (hr != S_OK)
    1011                 {
    1012                     crWarning("VBoxDispMpTstCallbacks.pfnEnableEvents failed");
    1013                 }
    1014                 else
    1015                 {
    1016842                    crDebug("running with " VBOX_MODNAME_DISPD3D);
    1017843                    stub.trackWindowVisibleRgn = 0;
    1018844                    stub.bRunningUnderWDDM = true;
    1019 #ifdef VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS
    1020                     crError("should not be here, visible rects should be processed in miniport!");
    1021 #endif
    1022                 }
    1023             }
    1024             else
    1025             {
    1026                 crWarning("VBoxDispMpGetCallbacks failed");
    1027             }
    1028         }
    1029845    }
    1030846# endif /* VBOX_WITH_WDDM */
     
    1052868        {
    1053869# ifdef VBOX_WITH_WDDM
    1054             if (VBoxDispMpTstCallbacks.pfnGetRegions)
     870            if (stub.bRunningUnderWDDM)
    1055871            {
    1056                 hr = VBoxDispMpTstCallbacks.pfnGetRegions(&RegionsData.Regions, 50);
    1057                 if (S_OK==hr)
    1058                 {
    1059                     RegionsData.fSendUpdateMsg = false;
    1060 #  if 0
    1061                     uint32_t i;
    1062                     crDebug(">>>Regions for HWND(0x%x)>>>", RegionsData.Regions.hWnd);
    1063                     crDebug("Flags(0x%x)", RegionsData.Regions.pRegions->fFlags.Value);
    1064                     for (i = 0; i < RegionsData.Regions.pRegions->RectsInfo.cRects; ++i)
    1065                     {
    1066                         RECT *pRect = &RegionsData.Regions.pRegions->RectsInfo.aRects[i];
    1067                         crDebug("Rect(%d): left(%d), top(%d), right(%d), bottom(%d)", i, pRect->left, pRect->top, pRect->right, pRect->bottom);
    1068                     }
    1069                     crDebug("<<<<<");
    1070 #  endif
    1071                     /*hacky way to make sure window wouldn't be deleted in another thread as we hold hashtable lock here*/
    1072                     crHashtableWalk(stub.windowTable, stubSyncTrUpdateWindowCB, &RegionsData);
    1073                     if (RegionsData.fSendUpdateMsg)
    1074                     {
    1075                         SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0, SMTO_NORMAL, 1000, NULL);
    1076                     }
    1077                 }
    1078                 else
    1079                 {
    1080                     if (WAIT_TIMEOUT!=hr)
    1081                     {
    1082                         crWarning("VBoxDispMpTstCallbacks.pfnGetRegions failed with 0x%x", hr);
    1083                     }
    1084                     crHashtableWalk(stub.windowTable, stubSyncTrCheckWindowsCB, NULL);
    1085                 }
     872
    1086873            }
    1087874            else
     
    1114901
    1115902#ifdef VBOX_WITH_WDDM
    1116     if (VBoxDispMpTstCallbacks.pfnDisableEvents)
    1117     {
    1118         VBoxDispMpTstCallbacks.pfnDisableEvents();
    1119     }
    1120903    if (spuConnection)
    1121904    {
     
    1170953        disable_sync = 1;
    1171954    }
    1172 #elif defined(WINDOWS) && defined(VBOX_WITH_WDDM) && defined(VBOX_WDDM_MINIPORT_WITH_VISIBLE_RECTS)
    1173     if (GetModuleHandle(VBOX_MODNAME_DISPD3D))
     955#elif defined(WINDOWS) && defined(VBOX_WITH_WDDM)
     956    if (stub.bNewPresent)
    1174957    {
    1175958        disable_sync = 1;
    1176         crDebug("running with " VBOX_MODNAME_DISPD3D);
     959        crDebug("running with %s", VBOX_MODNAME_DISPD3D);
    1177960        stub.trackWindowVisibleRgn = 0;
    1178961        stub.bRunningUnderWDDM = true;
     
    14231206        }
    14241207        else
     1208        {
     1209            /* @todo: impl proper detection */
     1210#ifndef DEBUG_misha
     1211            stub.bNewPresent = true;
     1212#endif
     1213
    14251214            crNetFreeConnection(ns.conn);
     1215        }
    14261216
    14271217        break;
  • trunk/src/VBox/Additions/common/crOpenGL/stub.h

    r46528 r46757  
    261261# ifdef VBOX_WITH_WDDM
    262262    bool            bRunningUnderWDDM;
     263    bool            bNewPresent;
    263264# endif
    264265#endif
  • trunk/src/VBox/GuestHost/OpenGL/include/cr_error.h

    r41928 r46757  
    2828
    2929DECLEXPORT(void) crDebug(const char *format, ... ) PRINTF;
     30#ifdef DEBUG_misha
     31typedef void FNCRDEBUG(const char *format, ... ) PRINTF;
     32typedef FNCRDEBUG *PFNCRDEBUG;
     33DECLINLINE(PFNCRDEBUG) crGetDebug() {return crDebug;}
     34# define crWarning (RT_BREAKPOINT(), crDebug)
     35#else
    3036DECLEXPORT(void) crWarning(const char *format, ... ) PRINTF;
     37#endif
    3138DECLEXPORT(void) crInfo(const char *format, ... ) PRINTF;
    3239
  • trunk/src/VBox/GuestHost/OpenGL/include/cr_pack.h

    r43487 r46757  
    145145#undef CR_UNALIGNED_ACCESS_OKAY
    146146#endif
     147#ifndef IN_RING0
    147148extern DECLEXPORT(void) crWriteUnalignedDouble( void *buffer, double d );
    148149extern DECLEXPORT(void) crWriteSwappedDouble( void *buffer, double d );
     150#endif
    149151
    150152extern DECLEXPORT(void) *crPackAlloc( CR_PACKER_CONTEXT_ARGDECL unsigned int len );
     
    309311  WRITE_DATA( offset, GLdouble, data )
    310312#else
    311 #define WRITE_DOUBLE( offset, data ) \
    312   crWriteUnalignedDouble( data_ptr + (offset), (data) )
    313 #endif
    314 
     313# ifndef IN_RING0
     314#  define WRITE_DOUBLE( offset, data ) \
     315        crWriteUnalignedDouble( data_ptr + (offset), (data) )
     316# else
     317#  define WRITE_DOUBLE( offset, data ) \
     318        AssertReleaseFailed()
     319# endif
     320#endif
     321
     322#ifndef IN_RING0
    315323#define WRITE_SWAPPED_DOUBLE( offset, data ) \
    316324    crWriteSwappedDouble( data_ptr + (offset), (data) )
     325#else
     326#define WRITE_SWAPPED_DOUBLE( offset, data ) \
     327        AssertReleaseFailed()
     328#endif
    317329
    318330#define WRITE_OPCODE( pc, opcode )  \
  • trunk/src/VBox/GuestHost/OpenGL/include/cr_vreg.h

    r45251 r46757  
    7272}
    7373
     74DECLINLINE(void) VBoxRectTranslated(const RTRECT * pRect, int32_t x, int32_t y, RTRECT *pResult)
     75{
     76    *pResult = *pRect;
     77    VBoxRectTranslate(pResult, x, y);
     78}
     79
    7480DECLINLINE(void) VBoxRectMove(RTRECT * pRect, int32_t x, int32_t y)
    7581{
     
    8086    pRect->xRight  = w + x;
    8187    pRect->yBottom = h + y;
     88}
     89
     90DECLINLINE(void) VBoxRectMoved(const RTRECT * pRect, int32_t x, int32_t y, RTRECT *pResult)
     91{
     92    *pResult = *pRect;
     93    VBoxRectMove(pResult, x, y);
    8294}
    8395
     
    281293{
    282294    VBOXVR_COMPOSITOR Compositor;
     295#ifndef IN_RING0
    283296    float StretchX;
    284297    float StretchY;
     298#endif
    285299    uint32_t cRects;
    286300    uint32_t cRectsBuffer;
    287301    PRTRECT paSrcRects;
    288302    PRTRECT paDstRects;
     303#ifndef IN_RING0
    289304    RTCRITSECT CritSect;
     305#endif
    290306} VBOXVR_SCR_COMPOSITOR, *PVBOXVR_SCR_COMPOSITOR;
    291307
     
    351367VBOXVREGDECL(int) CrVrScrCompositorInit(PVBOXVR_SCR_COMPOSITOR pCompositor);
    352368VBOXVREGDECL(void) CrVrScrCompositorTerm(PVBOXVR_SCR_COMPOSITOR pCompositor);
     369#ifndef IN_RING0
    353370VBOXVREGDECL(void) CrVrScrCompositorSetStretching(PVBOXVR_SCR_COMPOSITOR pCompositor, float StretchX, float StretchY);
     371#endif
    354372/* regions are valid until the next CrVrScrCompositor call */
    355373VBOXVREGDECL(int) CrVrScrCompositorRegionsGet(PVBOXVR_SCR_COMPOSITOR pCompositor, uint32_t *pcRegions, const RTRECT **ppaSrcRegions, const RTRECT **ppaDstRegions);
     
    378396}
    379397
     398#ifndef IN_RING0
    380399DECLINLINE(int) CrVrScrCompositorLock(PVBOXVR_SCR_COMPOSITOR pCompositor)
    381400{
     
    391410    return rc;
    392411}
    393 
     412#endif
    394413RT_C_DECLS_END
    395414
  • trunk/src/VBox/GuestHost/OpenGL/packer/pack_buffer.c

    r43487 r46757  
    243243
    244244#ifdef IN_RING0
    245         if(!num_opcodes)
     245        if(num_opcodes)
     246        {
     247            num_opcodes = (num_opcodes + 0x3) & (~0x3);
     248        }
     249        else
    246250#endif
    247251        {
  • trunk/src/VBox/GuestHost/OpenGL/packer/pack_misc.c

    r33475 r46757  
    88#include "cr_error.h"
    99
    10 void PACK_APIENTRY crPackChromiumParametervCR(GLenum target, GLenum type, GLsizei count, const GLvoid *values)
     10void PACK_APIENTRY crPackChromiumParametervCR(CR_PACKER_CONTEXT_ARGDECL GLenum target, GLenum type, GLsizei count, const GLvoid *values)
    1111{
    1212    CR_GET_PACKER_CONTEXT(pc);
     
    3030        params_length = sizeof(GLint) * count;
    3131        break;
     32#ifndef IN_RING0
    3233    case GL_FLOAT:
    3334        params_length = sizeof(GLfloat) * count;
    3435        break;
     36#endif
    3537#if 0
    3638    case GL_DOUBLE:
     
    7577        }
    7678        break;
     79#ifndef IN_RING0
    7780    case GL_FLOAT:
    7881        for (i = 0; i < count; i++, pos += sizeof(GLfloat)) {
     
    8083        }
    8184        break;
     85#endif
    8286#if 0
    8387    case GL_DOUBLE:
     
    96100}
    97101
    98 void PACK_APIENTRY crPackDeleteQueriesARB(GLsizei n, const GLuint * ids)
     102#ifndef IN_RING0
     103void PACK_APIENTRY crPackDeleteQueriesARB(CR_PACKER_CONTEXT_ARGDECL GLsizei n, const GLuint * ids)
    99104{
    100105    unsigned char *data_ptr;
     
    108113    crPackFree(data_ptr);
    109114}
     115#endif
     116
     117void PACK_APIENTRY crPackVBoxTexPresent( CR_PACKER_CONTEXT_ARGDECL GLuint texture, GLuint cfg, GLint xPos, GLint yPos, GLint cRects, const GLint * pRects )
     118{
     119    GLint i, size, cnt;
     120
     121    CR_GET_PACKER_CONTEXT(pc);
     122    unsigned char *data_ptr;
     123    (void) pc;
     124    size = 28 + cRects * 4 * sizeof(GLint);
     125    CR_GET_BUFFERED_POINTER( pc, size );
     126    WRITE_DATA( 0, GLint, size );
     127    WRITE_DATA( 4, GLenum, CR_VBOXTEXPRESENT_EXTEND_OPCODE );
     128    WRITE_DATA( 8, GLint, texture );
     129    WRITE_DATA( 12, GLint, cfg );
     130    WRITE_DATA( 16, GLint, xPos );
     131    WRITE_DATA( 20, GLint, yPos );
     132    WRITE_DATA( 24, GLint, cRects );
     133
     134    cnt = 28;
     135    for (i=0; i<cRects; ++i)
     136    {
     137        WRITE_DATA(cnt, GLint, (GLint) pRects[4*i+0]);
     138        WRITE_DATA(cnt+4, GLint, (GLint) pRects[4*i+1]);
     139        WRITE_DATA(cnt+8, GLint, (GLint) pRects[4*i+2]);
     140        WRITE_DATA(cnt+12, GLint, (GLint) pRects[4*i+3]);
     141        cnt += 16;
     142    }
     143    WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
     144    CR_UNLOCK_PACKER_CONTEXT(pc);
     145}
     146
     147void PACK_APIENTRY crPackWindowPosition( CR_PACKER_CONTEXT_ARGDECL GLint window, GLint x, GLint y )
     148{
     149    CR_GET_PACKER_CONTEXT(pc);
     150    unsigned char *data_ptr;
     151    (void) pc;
     152    CR_GET_BUFFERED_POINTER( pc, 20 );
     153    WRITE_DATA( 0, GLint, 20 );
     154    WRITE_DATA( 4, GLenum, CR_WINDOWPOSITION_EXTEND_OPCODE );
     155    WRITE_DATA( 8, GLint, window );
     156    WRITE_DATA( 12, GLint, x );
     157    WRITE_DATA( 16, GLint, y );
     158    WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
     159    CR_UNLOCK_PACKER_CONTEXT(pc);
     160}
     161
     162void PACK_APIENTRY crPackWindowShow( CR_PACKER_CONTEXT_ARGDECL GLint window, GLint flag )
     163{
     164    CR_GET_PACKER_CONTEXT(pc);
     165    unsigned char *data_ptr;
     166    (void) pc;
     167    CR_GET_BUFFERED_POINTER( pc, 16 );
     168    WRITE_DATA( 0, GLint, 16 );
     169    WRITE_DATA( 4, GLenum, CR_WINDOWSHOW_EXTEND_OPCODE );
     170    WRITE_DATA( 8, GLint, window );
     171    WRITE_DATA( 12, GLint, flag );
     172    WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
     173    CR_UNLOCK_PACKER_CONTEXT(pc);
     174}
     175
     176void PACK_APIENTRY crPackWindowSize( CR_PACKER_CONTEXT_ARGDECL GLint window, GLint w, GLint h )
     177{
     178    CR_GET_PACKER_CONTEXT(pc);
     179    unsigned char *data_ptr;
     180    (void) pc;
     181    CR_GET_BUFFERED_POINTER( pc, 20 );
     182    WRITE_DATA( 0, GLint, 20 );
     183    WRITE_DATA( 4, GLenum, CR_WINDOWSIZE_EXTEND_OPCODE );
     184    WRITE_DATA( 8, GLint, window );
     185    WRITE_DATA( 12, GLint, w );
     186    WRITE_DATA( 16, GLint, h );
     187    WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
     188    CR_UNLOCK_PACKER_CONTEXT(pc);
     189}
  • trunk/src/VBox/GuestHost/OpenGL/packer/packer.h

    r15532 r46757  
    1919#include "cr_mem.h"
    2020
     21#ifndef IN_RING0
    2122extern void __PackError( int line, const char *file, GLenum error, const char *info );
     23#else
     24# define __PackError( line, file, error, info) do { AssertReleaseFailed(); } while (0)
     25#endif
    2226
    2327#endif /* CR_PACKER_H */
  • trunk/src/VBox/GuestHost/OpenGL/packer/packer_special

    r27244 r46757  
    177177UniformMatrix3x4fv
    178178UniformMatrix4x3fv
     179VBoxTexPresent
     180WindowPosition
     181WindowShow
     182WindowSize
  • trunk/src/VBox/GuestHost/OpenGL/util/error.c

    r41635 r46757  
    246246}
    247247
     248#ifdef DEBUG_misha
     249# undef crWarning
     250#endif
    248251DECLEXPORT(void) crWarning(const char *format, ... )
    249252{
     
    496499#else
    497500    if (!output
    498 # ifndef DEBUG_misha
    499501            || output==stderr
    500 # endif
    501502            )
    502503    {
     
    505506    else
    506507    {
    507 # ifndef DEBUG_misha
    508508        LogRel(("%s\n", txt));
    509 # endif
    510509        outputChromiumMessage(output, txt);
    511510    }
  • trunk/src/VBox/GuestHost/OpenGL/util/vreg.cpp

    r45627 r46757  
    1717 */
    1818#include <cr_vreg.h>
    19 #include <iprt/memcache.h>
    2019#include <iprt/err.h>
    2120#include <iprt/assert.h>
    2221#include <iprt/asm.h>
    2322
    24 #ifndef IN_RING0
    2523#include <cr_error.h>
    2624#define WARN(_m) do { crWarning _m ; } while (0)
    27 #else
    28 # error port me!
    29 #endif
    30 
    31 #ifdef DEBUG_misha
    32 //# define VBOXVDBG_VR_LAL_DISABLE
    33 #endif
    34 
     25
     26#ifndef IN_RING0
     27#include <iprt/memcache.h>
    3528#ifndef VBOXVDBG_VR_LAL_DISABLE
    36 static volatile int32_t g_cVBoxVrInits = 0;
    3729static RTMEMCACHE g_VBoxVrLookasideList;
    38 #endif
    39 
    40 static PVBOXVR_REG vboxVrRegCreate()
    41 {
    42 #ifndef VBOXVDBG_VR_LAL_DISABLE
    43     PVBOXVR_REG pReg = (PVBOXVR_REG)RTMemCacheAlloc(g_VBoxVrLookasideList);
    44     if (!pReg)
    45     {
    46         WARN(("ExAllocateFromLookasideListEx failed!"));
    47     }
    48     return pReg;
    49 #else
    50     return (PVBOXVR_REG)RTMemAlloc(sizeof (VBOXVR_REG));
    51 #endif
    52 }
    53 
    54 static void vboxVrRegTerm(PVBOXVR_REG pReg)
    55 {
    56 #ifndef VBOXVDBG_VR_LAL_DISABLE
    57     RTMemCacheFree(g_VBoxVrLookasideList, pReg);
    58 #else
    59     RTMemFree(pReg);
    60 #endif
    61 }
    62 
    63 VBOXVREGDECL(void) VBoxVrListClear(PVBOXVR_LIST pList)
    64 {
    65     PVBOXVR_REG pReg, pRegNext;
    66 
    67     RTListForEachSafe(&pList->ListHead, pReg, pRegNext, VBOXVR_REG, ListEntry)
    68     {
    69         vboxVrRegTerm(pReg);
    70     }
    71     VBoxVrListInit(pList);
    72 }
    73 
    74 #define VBOXVR_MEMTAG 'vDBV'
    75 
    76 VBOXVREGDECL(int) VBoxVrInit()
    77 {
    78     int32_t cNewRefs = ASMAtomicIncS32(&g_cVBoxVrInits);
    79     Assert(cNewRefs >= 1);
    80     Assert(cNewRefs == 1); /* <- debugging */
    81     if (cNewRefs > 1)
    82         return VINF_SUCCESS;
    83 
    84 #ifndef VBOXVDBG_VR_LAL_DISABLE
    85     int rc = RTMemCacheCreate(&g_VBoxVrLookasideList, sizeof (VBOXVR_REG),
     30#define vboxVrRegLaAlloc(_c) RTMemCacheAlloc((_c))
     31#define vboxVrRegLaFree(_c, _e) RTMemCacheFree((_c), (_e))
     32DECLINLINE(int) vboxVrLaCreate(RTMEMCACHE *pCache, size_t cbElement)
     33{
     34    int rc = RTMemCacheCreate(pCache, cbElement,
    8635                            0, /* size_t cbAlignment */
    8736                            UINT32_MAX, /* uint32_t cMaxObjects */
     
    9342    if (!RT_SUCCESS(rc))
    9443    {
     44        WARN(("RTMemCacheCreate failed rc %d", rc));
     45        return rc;
     46    }
     47    return VINF_SUCCESS;
     48}
     49#define vboxVrLaDestroy(_c) RTMemCacheDestroy((_c))
     50#endif
     51#else
     52# ifdef RT_OS_WINDOWS
     53#  ifdef PAGE_SIZE
     54#    undef PAGE_SIZE
     55#  endif
     56#  ifdef PAGE_SHIFT
     57#    undef PAGE_SHIFT
     58#  endif
     59#  define VBOX_WITH_WORKAROUND_MISSING_PACK
     60#  if (_MSC_VER >= 1400) && !defined(VBOX_WITH_PATCHED_DDK)
     61#    define _InterlockedExchange           _InterlockedExchange_StupidDDKVsCompilerCrap
     62#    define _InterlockedExchangeAdd        _InterlockedExchangeAdd_StupidDDKVsCompilerCrap
     63#    define _InterlockedCompareExchange    _InterlockedCompareExchange_StupidDDKVsCompilerCrap
     64#    define _InterlockedAddLargeStatistic  _InterlockedAddLargeStatistic_StupidDDKVsCompilerCrap
     65#    define _interlockedbittestandset      _interlockedbittestandset_StupidDDKVsCompilerCrap
     66#    define _interlockedbittestandreset    _interlockedbittestandreset_StupidDDKVsCompilerCrap
     67#    define _interlockedbittestandset64    _interlockedbittestandset64_StupidDDKVsCompilerCrap
     68#    define _interlockedbittestandreset64  _interlockedbittestandreset64_StupidDDKVsCompilerCrap
     69#    pragma warning(disable : 4163)
     70#    ifdef VBOX_WITH_WORKAROUND_MISSING_PACK
     71#      pragma warning(disable : 4103)
     72#    endif
     73#    include <ntddk.h>
     74#    pragma warning(default : 4163)
     75#    ifdef VBOX_WITH_WORKAROUND_MISSING_PACK
     76#      pragma pack()
     77#      pragma warning(default : 4103)
     78#    endif
     79#    undef  _InterlockedExchange
     80#    undef  _InterlockedExchangeAdd
     81#    undef  _InterlockedCompareExchange
     82#    undef  _InterlockedAddLargeStatistic
     83#    undef  _interlockedbittestandset
     84#    undef  _interlockedbittestandreset
     85#    undef  _interlockedbittestandset64
     86#    undef  _interlockedbittestandreset64
     87#  else
     88#    include <ntddk.h>
     89#  endif
     90#ifndef VBOXVDBG_VR_LAL_DISABLE
     91static LOOKASIDE_LIST_EX g_VBoxVrLookasideList;
     92#define vboxVrRegLaAlloc(_c) ExAllocateFromLookasideListEx(&(_c))
     93#define vboxVrRegLaFree(_c, _e) ExFreeToLookasideListEx(&(_c), (_e))
     94#define VBOXWDDMVR_MEMTAG 'vDBV'
     95DECLINLINE(int) vboxVrLaCreate(LOOKASIDE_LIST_EX *pCache, size_t cbElement)
     96{
     97    NTSTATUS Status = ExInitializeLookasideListEx(pCache,
     98                                NULL, /* PALLOCATE_FUNCTION_EX Allocate */
     99                                NULL, /* PFREE_FUNCTION_EX Free */
     100                                NonPagedPool,
     101                                0, /* ULONG Flags */
     102                                cbElement,
     103                                VBOXWDDMVR_MEMTAG,
     104                                0 /* USHORT Depth - reserved, must be null */
     105                                );
     106    if (!NT_SUCCESS(Status))
     107    {
     108        WARN(("ExInitializeLookasideListEx failed, Status (0x%x)", Status));
     109        return VERR_GENERAL_FAILURE;
     110    }
     111
     112    return VINF_SUCCESS;
     113}
     114#define vboxVrLaDestroy(_c) ExDeleteLookasideListEx(&(_c))
     115#endif
     116# else
     117#  error "port me!"
     118# endif
     119#endif
     120
     121#ifdef DEBUG_misha
     122//# define VBOXVDBG_VR_LAL_DISABLE
     123#endif
     124
     125#ifndef VBOXVDBG_VR_LAL_DISABLE
     126static volatile int32_t g_cVBoxVrInits = 0;
     127#endif
     128
     129static PVBOXVR_REG vboxVrRegCreate()
     130{
     131#ifndef VBOXVDBG_VR_LAL_DISABLE
     132    PVBOXVR_REG pReg = (PVBOXVR_REG)vboxVrRegLaAlloc(g_VBoxVrLookasideList);
     133    if (!pReg)
     134    {
     135        WARN(("ExAllocateFromLookasideListEx failed!"));
     136    }
     137    return pReg;
     138#else
     139    return (PVBOXVR_REG)RTMemAlloc(sizeof (VBOXVR_REG));
     140#endif
     141}
     142
     143static void vboxVrRegTerm(PVBOXVR_REG pReg)
     144{
     145#ifndef VBOXVDBG_VR_LAL_DISABLE
     146    vboxVrRegLaFree(g_VBoxVrLookasideList, pReg);
     147#else
     148    RTMemFree(pReg);
     149#endif
     150}
     151
     152VBOXVREGDECL(void) VBoxVrListClear(PVBOXVR_LIST pList)
     153{
     154    PVBOXVR_REG pReg, pRegNext;
     155
     156    RTListForEachSafe(&pList->ListHead, pReg, pRegNext, VBOXVR_REG, ListEntry)
     157    {
     158        vboxVrRegTerm(pReg);
     159    }
     160    VBoxVrListInit(pList);
     161}
     162
     163#define VBOXVR_MEMTAG 'vDBV'
     164
     165VBOXVREGDECL(int) VBoxVrInit()
     166{
     167    int32_t cNewRefs = ASMAtomicIncS32(&g_cVBoxVrInits);
     168    Assert(cNewRefs >= 1);
     169    Assert(cNewRefs == 1); /* <- debugging */
     170    if (cNewRefs > 1)
     171        return VINF_SUCCESS;
     172
     173#ifndef VBOXVDBG_VR_LAL_DISABLE
     174    int rc = vboxVrLaCreate(&g_VBoxVrLookasideList, sizeof (VBOXVR_REG));
     175    if (!RT_SUCCESS(rc))
     176    {
    95177        WARN(("ExInitializeLookasideListEx failed, rc (%d)", rc));
    96178        return rc;
     
    109191
    110192#ifndef VBOXVDBG_VR_LAL_DISABLE
    111     RTMemCacheDestroy(g_VBoxVrLookasideList);
     193    vboxVrLaDestroy(g_VBoxVrLookasideList);
    112194#endif
    113195}
     
    15421624    int rc = VBoxVrListRectsGet(&pCEntry->Vr, cRects, pEntry->paDstRects);
    15431625    AssertRC(rc);
    1544     if (pCompositor->StretchX >= 1. && pCompositor->StretchY >= 1. /* <- stretching can not zero some rects */
    1545             && !pEntry->Pos.x && !pEntry->Pos.y)
     1626    if (
     1627#ifndef IN_RING0
     1628            pCompositor->StretchX >= 1. && pCompositor->StretchY >= 1. /* <- stretching can not zero some rects */
     1629            &&
     1630#endif
     1631            !pEntry->Pos.x && !pEntry->Pos.y
     1632            )
    15461633    {
    15471634        memcpy(pEntry->paSrcRects, pEntry->paDstRects, cRects * sizeof (*pEntry->paSrcRects));
     
    15511638        for (uint32_t i = 0; i < cRects; ++i)
    15521639        {
    1553             pEntry->paSrcRects[i].xLeft = (int32_t)((pEntry->paDstRects[i].xLeft - pEntry->Pos.x) * pCompositor->StretchX);
    1554             pEntry->paSrcRects[i].yTop = (int32_t)((pEntry->paDstRects[i].yTop - pEntry->Pos.y) * pCompositor->StretchY);
    1555             pEntry->paSrcRects[i].xRight = (int32_t)((pEntry->paDstRects[i].xRight - pEntry->Pos.x) * pCompositor->StretchX);
    1556             pEntry->paSrcRects[i].yBottom = (int32_t)((pEntry->paDstRects[i].yBottom - pEntry->Pos.y) * pCompositor->StretchY);
    1557         }
    1558 
    1559         bool canZeroX = (pCompositor->StretchX < 1);
    1560         bool canZeroY = (pCompositor->StretchY < 1);
     1640            pEntry->paSrcRects[i].xLeft = (int32_t)((pEntry->paDstRects[i].xLeft - pEntry->Pos.x));
     1641            pEntry->paSrcRects[i].yTop = (int32_t)((pEntry->paDstRects[i].yTop - pEntry->Pos.y));
     1642            pEntry->paSrcRects[i].xRight = (int32_t)((pEntry->paDstRects[i].xRight - pEntry->Pos.x));
     1643            pEntry->paSrcRects[i].yBottom = (int32_t)((pEntry->paDstRects[i].yBottom - pEntry->Pos.y));
     1644#ifndef IN_RING0
     1645            if (pCompositor->StretchX != 1.)
     1646            {
     1647                pEntry->paSrcRects[i].xLeft = (int32_t)(pEntry->paSrcRects[i].xLeft * pCompositor->StretchX);
     1648                pEntry->paSrcRects[i].xRight = (int32_t)(pEntry->paSrcRects[i].xRight * pCompositor->StretchX);
     1649            }
     1650            if (pCompositor->StretchY != 1.)
     1651            {
     1652                pEntry->paSrcRects[i].yTop = (int32_t)(pEntry->paSrcRects[i].yTop * pCompositor->StretchY);
     1653                pEntry->paSrcRects[i].yBottom = (int32_t)(pEntry->paSrcRects[i].yBottom * pCompositor->StretchY);
     1654            }
     1655#endif
     1656        }
     1657
     1658#ifndef IN_RING0
     1659        bool canZeroX = (pCompositor->StretchX < 1.);
     1660        bool canZeroY = (pCompositor->StretchY < 1.);
    15611661        if (canZeroX && canZeroY)
    15621662        {
     
    15891689            }
    15901690        }
    1591     }
    1592 
     1691#endif
     1692    }
    15931693    pEntry->cRects = cRects;
    15941694    pData->paDstRects += cRects;
     
    19802080{
    19812081    memset(pCompositor, 0, sizeof (*pCompositor));
     2082#ifndef IN_RING0
    19822083    int rc = RTCritSectInit(&pCompositor->CritSect);
    1983     if (RT_SUCCESS(rc))
    1984     {
    1985         VBoxVrCompositorInit(&pCompositor->Compositor, NULL);
    1986         pCompositor->StretchX = 1.0;
    1987         pCompositor->StretchY = 1.0;
    1988         return VINF_SUCCESS;
    1989     }
    1990     else
     2084    if (!RT_SUCCESS(rc))
    19912085    {
    19922086        WARN(("RTCritSectInit failed rc %d", rc));
    1993     }
    1994     return rc;
     2087        return rc;
     2088    }
     2089#endif
     2090    VBoxVrCompositorInit(&pCompositor->Compositor, NULL);
     2091#ifndef IN_RING0
     2092    pCompositor->StretchX = 1.0;
     2093    pCompositor->StretchY = 1.0;
     2094#endif
     2095    return VINF_SUCCESS;
    19952096}
    19962097
     
    20022103    if (pCompositor->paSrcRects)
    20032104        RTMemFree(pCompositor->paSrcRects);
    2004 
     2105#ifndef IN_RING0
    20052106    RTCritSectDelete(&pCompositor->CritSect);
     2107#endif
    20062108}
    20072109
     
    20182120    VBoxVrCompositorVisit(&pCompositor->Compositor, crVrScrCompositorEntrySetAllChangedCb, (void*)fChanged);
    20192121}
    2020 
     2122#ifndef IN_RING0
    20212123VBOXVREGDECL(void) CrVrScrCompositorSetStretching(PVBOXVR_SCR_COMPOSITOR pCompositor, float StretchX, float StretchY)
    20222124{
     
    20262128    CrVrScrCompositorEntrySetAllChanged(pCompositor, true);
    20272129}
    2028 
     2130#endif
    20292131/* regions are valid until the next CrVrScrCompositor call */
    20302132VBOXVREGDECL(int) CrVrScrCompositorRegionsGet(PVBOXVR_SCR_COMPOSITOR pCompositor, uint32_t *pcRegions, const RTRECT **ppaSrcRegions, const RTRECT **ppaDstRegions)
  • trunk/src/VBox/HostServices/SharedOpenGL/unpacker/unpack_misc.c

    r27091 r46757  
    7575    cr_unpackDispatch.GetPixelMapusv( map, values );
    7676}
     77
     78void crUnpackExtendVBoxTexPresent(void)
     79{
     80    GLuint texture = READ_DATA( 8, GLuint );
     81    GLuint cfg = READ_DATA( 12, GLuint );
     82    GLint xPos = READ_DATA( 16, GLint );
     83    GLint yPos = READ_DATA( 20, GLint );
     84    GLint cRects = READ_DATA( 24, GLint );
     85    GLint *pRects = (GLint *)DATA_POINTER( 28, GLvoid );
     86    cr_unpackDispatch.VBoxTexPresent( texture, cfg, xPos, yPos, cRects, pRects );
     87}
  • trunk/src/VBox/HostServices/SharedOpenGL/unpacker/unpacker_special

    r27244 r46757  
    181181UniformMatrix3x4fv
    182182UniformMatrix4x3fv
     183VBoxTexPresent
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