VirtualBox

Changeset 30462 in vbox for trunk


Ignore:
Timestamp:
Jun 28, 2010 12:34:11 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
63142
Message:

wddm/3d: visible regions reporting API & impl (not tested enough yet)

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

Legend:

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

    r30405 r30462  
    8888    wddm/VBoxDispD3DIf.cpp \
    8989    wddm/VBoxDispCm.cpp \
     90    wddm/VBoxDispMp.cpp \
     91    wddm/VBoxDispMpTst.cpp \
    9092        wddm/VBoxDispD3D.def \
    9193        wddm/VBoxDispD3D.rc
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispCm.cpp

    r30405 r30462  
    106106{
    107107    VBOXWDDM_CREATECONTEXT_INFO Info;
     108    Info.u32IfVersion = pDevice->u32IfVersion;
     109    Info.u32IsD3D = VBOXDISPMODE_IS_3D(pDevice->pAdapter);
    108110    Info.hUmEvent = (uint64_t)g_pVBoxCmMgr.Session.hEvent;
    109111    Info.u64UmInfo = (uint64_t)pContext;
     
    127129    if (hr == S_OK)
    128130    {
     131        Assert(pContext->ContextInfo.hContext);
     132        pContext->ContextInfo.pPrivateDriverData = NULL;
     133        pContext->ContextInfo.PrivateDriverDataSize = 0;
    129134        vboxDispCmSessionCtxAdd(&g_pVBoxCmMgr.Session, pContext);
    130135        pContext->pDevice = pDevice;
     
    138143    Assert(pContext->ContextInfo.hContext);
    139144    D3DDDICB_DESTROYCONTEXT DestroyContext;
     145    Assert(pDevice->DefaultContext.ContextInfo.hContext);
    140146    DestroyContext.hContext = pDevice->DefaultContext.ContextInfo.hContext;
    141147    HRESULT hr = pDevice->RtCallbacks.pfnDestroyContextCb(pDevice->hDevice, &DestroyContext);
     
    154160}
    155161
    156 HRESULT vboxDispCmSessionCmdGet(PVBOXDISPCM_SESSION pSession, void *pvCmd, uint32_t cbCmd, DWORD dwMilliseconds)
    157 {
    158     Assert(cbCmd >= VBOXDISPIFESCAPE_SIZE(sizeof (VBOXWDDM_GETVBOXVIDEOCMCMD_HDR)));
    159     if (cbCmd < VBOXDISPIFESCAPE_SIZE(sizeof (VBOXWDDM_GETVBOXVIDEOCMCMD_HDR)))
     162HRESULT vboxDispCmSessionCmdGet(PVBOXDISPCM_SESSION pSession, PVBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD pCmd, uint32_t cbCmd, DWORD dwMilliseconds)
     163{
     164    Assert(cbCmd >= sizeof (VBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD));
     165    if (cbCmd < sizeof (VBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD))
    160166        return E_INVALIDARG;
    161167
     
    165171        case WAIT_OBJECT_0:
    166172        {
    167             PVBOXDISPIFESCAPE pEscape = (PVBOXDISPIFESCAPE)pvCmd;
    168173            HRESULT hr = S_OK;
    169174            D3DDDICB_ESCAPE DdiEscape;
    170175            DdiEscape.Flags.Value = 0;
    171             DdiEscape.pPrivateDriverData = pvCmd;
     176            DdiEscape.pPrivateDriverData = pCmd;
    172177            DdiEscape.PrivateDriverDataSize = cbCmd;
    173178
    174             pEscape->escapeCode = VBOXESC_GETVBOXVIDEOCMCMD;
     179            pCmd->EscapeHdr.escapeCode = VBOXESC_GETVBOXVIDEOCMCMD;
    175180            /* lock to ensure the context is not distructed */
    176181            EnterCriticalSection(&pSession->CritSect);
     
    191196            {
    192197                LeaveCriticalSection(&pSession->CritSect);
    193                 PVBOXWDDM_GETVBOXVIDEOCMCMD_HDR pHdr = VBOXDISPIFESCAPE_DATA(pEscape, VBOXWDDM_GETVBOXVIDEOCMCMD_HDR);
    194                 pHdr->cbCmdsReturned = 0;
    195                 pHdr->cbRemainingCmds = 0;
    196                 pHdr->cbRemainingFirstCmd = 0;
     198                pCmd->Hdr.cbCmdsReturned = 0;
     199                pCmd->Hdr.cbRemainingCmds = 0;
     200                pCmd->Hdr.cbRemainingFirstCmd = 0;
    197201            }
    198202
     
    201205        case WAIT_TIMEOUT:
    202206        {
    203             PVBOXDISPIFESCAPE pEscape = (PVBOXDISPIFESCAPE)pvCmd;
    204             PVBOXWDDM_GETVBOXVIDEOCMCMD_HDR pHdr = VBOXDISPIFESCAPE_DATA(pEscape, VBOXWDDM_GETVBOXVIDEOCMCMD_HDR);
    205             pHdr->cbCmdsReturned = 0;
    206             pHdr->cbRemainingCmds = 0;
    207             pHdr->cbRemainingFirstCmd = 0;
     207            pCmd->Hdr.cbCmdsReturned = 0;
     208            pCmd->Hdr.cbRemainingCmds = 0;
     209            pCmd->Hdr.cbRemainingFirstCmd = 0;
    208210            return S_OK;
    209211        }
     
    214216}
    215217
    216 HRESULT vboxDispCmCmdGet(void *pvCmd, uint32_t cbCmd, DWORD dwMilliseconds)
    217 {
    218     return vboxDispCmSessionCmdGet(&g_pVBoxCmMgr.Session, pvCmd, cbCmd, dwMilliseconds);
    219 }
     218HRESULT vboxDispCmCmdGet(PVBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD pCmd, uint32_t cbCmd, DWORD dwMilliseconds)
     219{
     220    return vboxDispCmSessionCmdGet(&g_pVBoxCmMgr.Session, pCmd, cbCmd, dwMilliseconds);
     221}
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp

    r30405 r30462  
    10851085                    LPVOID    lpReserved)
    10861086{
     1087    BOOL bOk = TRUE;
     1088
    10871089    switch (dwReason)
    10881090    {
     
    10911093            RTR3Init();
    10921094
    1093             vboxVDbgPrint(("VBoxDispD3D: DLL loaded.\n"));
     1095            HRESULT hr = vboxDispCmInit();
     1096            Assert(hr == S_OK);
     1097            if (hr == S_OK)
     1098                vboxVDbgPrint(("VBoxDispD3D: DLL loaded.\n"));
     1099            else
     1100                bOk = FALSE;
    10941101
    10951102//                VbglR3Init();
     
    10991106        case DLL_PROCESS_DETACH:
    11001107        {
    1101             vboxVDbgPrint(("VBoxDispD3D: DLL unloaded.\n"));
     1108            HRESULT hr = vboxDispCmTerm();
     1109            Assert(hr == S_OK);
     1110            if (hr == S_OK)
     1111                vboxVDbgPrint(("VBoxDispD3D: DLL unloaded.\n"));
     1112            else
     1113                bOk = FALSE;
    11021114//                VbglR3Term();
    11031115            /// @todo RTR3Term();
     
    11081120            break;
    11091121    }
    1110     return TRUE;
     1122    return bOk;
    11111123}
    11121124
     
    36213633
    36223634    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
    3623     if (pDevice->DefaultContext.ContextInfo.hContext)
    3624     {
    3625         D3DDDICB_DESTROYCONTEXT DestroyContext;
    3626         DestroyContext.hContext = pDevice->DefaultContext.ContextInfo.hContext;
    3627         HRESULT tmpHr = pDevice->RtCallbacks.pfnDestroyContextCb(pDevice->hDevice, &DestroyContext);
    3628         Assert(tmpHr == S_OK);
    3629     }
    3630     RTMemFree(hDevice);
    3631     vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p)\n", hDevice));
    3632     return S_OK;
     3635    HRESULT hr = vboxDispCmCtxDestroy(pDevice, &pDevice->DefaultContext);
     3636    Assert(hr == S_OK);
     3637    if (hr == S_OK)
     3638        RTMemFree(pDevice);
     3639    vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p)\n", hDevice));
     3640    return hr;
    36333641}
    36343642
     
    41064114                    && !pCreateData->PatchLocationListSize)
    41074115            {
    4108                 pDevice->DefaultContext.ContextInfo.NodeOrdinal = 0;
    4109                 pDevice->DefaultContext.ContextInfo.EngineAffinity = 0;
    4110                 pDevice->DefaultContext.ContextInfo.Flags.Value = 0;
    4111                 pDevice->DefaultContext.ContextInfo.pPrivateDriverData = NULL;
    4112                 pDevice->DefaultContext.ContextInfo.PrivateDriverDataSize = 0;
    4113                 pDevice->DefaultContext.ContextInfo.hContext = 0;
    4114                 pDevice->DefaultContext.ContextInfo.pCommandBuffer = NULL;
    4115                 pDevice->DefaultContext.ContextInfo.CommandBufferSize = 0;
    4116                 pDevice->DefaultContext.ContextInfo.pAllocationList = NULL;
    4117                 pDevice->DefaultContext.ContextInfo.AllocationListSize = 0;
    4118                 pDevice->DefaultContext.ContextInfo.pPatchLocationList = NULL;
    4119                 pDevice->DefaultContext.ContextInfo.PatchLocationListSize = 0;
    4120 
    4121                 hr = pDevice->RtCallbacks.pfnCreateContextCb(pDevice->hDevice, &pDevice->DefaultContext.ContextInfo);
     4116                hr = vboxDispCmCtxCreate(pDevice, &pDevice->DefaultContext);
    41224117                Assert(hr == S_OK);
    41234118                if (hr == S_OK)
    4124                 {
    4125                     if (VBOXDISPMODE_IS_3D(pAdapter))
    4126                     {
    4127                         /* we postpone IDirect3DDevice device creation to CreateResource,
    4128                          * where resource render target gets created,
    4129                          * which is actually done as part of d3dx.dll Direct3DDevice creation */
    4130                         vboxVDbgPrint((__FUNCTION__": D3D Device Created\n"));
    4131                         break;
    4132                     }
    4133                     else
    4134                     {
    4135                         /* DDraw */
    4136                         vboxVDbgPrint((__FUNCTION__": DirectDraw Device Created\n"));
    4137                         break;
    4138                     }
    4139 
    4140                     D3DDDICB_DESTROYCONTEXT DestroyContext;
    4141                     DestroyContext.hContext = pDevice->DefaultContext.ContextInfo.hContext;
    4142 
    4143                     HRESULT tmpHr = pDevice->RtCallbacks.pfnDestroyContextCb(pDevice->hDevice, &DestroyContext);
    4144                     Assert(tmpHr == S_OK);
    4145                 }
    4146                 else
    4147                     vboxVDbgPrintR((__FUNCTION__": pfnCreateContextCb failed, hr(%d)\n", hr));
     4119                    break;
    41484120            }
    41494121            else
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3DCmn.h

    r30405 r30462  
    3232#include "VBoxDispD3DIf.h"
    3333#include "../../Miniport/wddm/VBoxVideoIf.h"
     34#include "VBoxDispCm.h"
    3435#include "VBoxDispD3D.h"
    3536
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoCm.cpp

    r30441 r30462  
    357357}
    358358
    359 NTSTATUS vboxVideoCmEscape(PVBOXVIDEOCM_CTX pContext, PVBOXWDDM_GETVBOXVIDEOCMCMD_HDR pvCmd, uint32_t cbCmd)
    360 {
    361     Assert(cbCmd >= VBOXWDDM_GETVBOXVIDEOCMCMD_DATA_OFFSET());
    362     if (cbCmd < VBOXWDDM_GETVBOXVIDEOCMCMD_DATA_OFFSET())
     359NTSTATUS vboxVideoCmEscape(PVBOXVIDEOCM_CTX pContext, PVBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD pCmd, uint32_t cbCmd)
     360{
     361    Assert(cbCmd >= sizeof (VBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD));
     362    if (cbCmd < sizeof (VBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD))
    363363        return STATUS_BUFFER_TOO_SMALL;
    364364
     
    370370    uint32_t cbRemainingCmds = 0;
    371371    uint32_t cbRemainingFirstCmd = 0;
    372     uint8_t * pvData = VBOXWDDM_GETVBOXVIDEOCMCMD_DATA(pvCmd, uint8_t);
    373     uint32_t cbData = cbCmd - VBOXWDDM_GETVBOXVIDEOCMCMD_DATA_OFFSET();
     372    uint32_t cbData = cbCmd - sizeof (VBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD);
     373    uint8_t * pvData = ((uint8_t *)pCmd) + sizeof (VBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD);
    374374    bool bDetachMode = true;
    375375    InitializeListHead(&DetachedList);
     
    427427    ExReleaseFastMutex(&pSession->Mutex);
    428428
    429     pvCmd->cbCmdsReturned = 0;
     429    pCmd->Hdr.cbCmdsReturned = 0;
    430430    for (pCurEntry = DetachedList.Blink; DetachedList.Blink != &DetachedList; pCurEntry = pCurEntry->Blink)
    431431    {
    432432        memcpy(pvData, &pHdr->CmdHdr, pHdr->CmdHdr.cbCmd);
    433433        pvData += pHdr->CmdHdr.cbCmd;
    434         pvCmd->cbCmdsReturned += pHdr->CmdHdr.cbCmd;
     434        pCmd->Hdr.cbCmdsReturned += pHdr->CmdHdr.cbCmd;
    435435        vboxVideoCmCmdReleaseByHdr(pHdr);
    436436    }
    437437
    438     pvCmd->cbRemainingCmds = cbRemainingCmds;
    439     pvCmd->cbRemainingFirstCmd = cbRemainingFirstCmd;
    440     pvCmd->u32Reserved = 0;
     438    pCmd->Hdr.cbRemainingCmds = cbRemainingCmds;
     439    pCmd->Hdr.cbRemainingFirstCmd = cbRemainingFirstCmd;
     440    pCmd->Hdr.u32Reserved = 0;
    441441
    442442    return STATUS_SUCCESS;
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoCm.h

    r30405 r30462  
    4141void vboxVideoCmCmdSubmit(void *pvCmd, uint32_t cbSize);
    4242
    43 NTSTATUS vboxVideoCmEscape(PVBOXVIDEOCM_CTX pContext, PVBOXWDDM_GETVBOXVIDEOCMCMD_HDR pvCmd, uint32_t cbCmd);
     43NTSTATUS vboxVideoCmEscape(PVBOXVIDEOCM_CTX pContext, PVBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD pCmd, uint32_t cbCmd);
    4444
    4545#endif /* #ifndef ___VBoxVideoCm_h___ */
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoIf.h

    r30441 r30462  
    2323
    2424#include <VBox/VBoxVideo.h>
     25#include "../../../include/VBoxDisplay.h"
     26
     27#include <iprt/assert.h>
     28
    2529
    2630/* @todo: implement a check to ensure display & miniport versions match.
    2731 * One would increase this whenever definitions in this file are changed */
    28 #define VBOXVIDEOIF_VERSION 3
     32#define VBOXVIDEOIF_VERSION 4
    2933
    3034/* create allocation func */
     
    145149typedef struct VBOXWDDM_CREATECONTEXT_INFO
    146150{
     151    /* interface version, i.e. 9 for d3d9, 8 for d3d8, etc. */
     152    uint32_t u32IfVersion;
     153    /* true if d3d false if ddraw */
     154    uint32_t u32IsD3D;
    147155    /* we use uint64_t instead of HANDLE to ensure structure def is the same for both 32-bit and 64-bit
    148156     * since x64 kernel driver can be called by 32-bit UMD */
     
    184192}VBOXVIDEOCM_CMD_HDR, *PVBOXVIDEOCM_CMD_HDR;
    185193
     194AssertCompile((sizeof (VBOXVIDEOCM_CMD_HDR) & 7) == 0);
     195
    186196typedef struct VBOXVIDEOCM_CMD_RECTS
    187197{
     
    201211} VBOXWDDM_GETVBOXVIDEOCMCMD_HDR, *PVBOXWDDM_GETVBOXVIDEOCMCMD_HDR;
    202212
    203 #define VBOXWDDM_GETVBOXVIDEOCMCMD_DATA_OFFSET() ((sizeof (VBOXWDDM_GETVBOXVIDEOCMCMD_HDR) + 7) & ~7)
    204 #define VBOXWDDM_GETVBOXVIDEOCMCMD_DATA(_pHead, _t) ( (_t*)(((uint8_t*)(_pHead)) + VBOXWDDM_GETVBOXVIDEOCMCMD_DATA_OFFSET()))
    205 #define VBOXWDDM_GETVBOXVIDEOCMCMD_DATA_SIZE(_s) ( (_s) < VBOXWDDM_GETVBOXVIDEOCMCMD_DATA_OFFSET() ? 0 : (_s) - VBOXWDDM_GETVBOXVIDEOCMCMD_DATA_OFFSET() )
    206 #define VBOXWDDM_GETVBOXVIDEOCMCMD_SIZE(_cbData) ((_cbData) ? VBOXWDDM_GETVBOXVIDEOCMCMD_DATA_OFFSET() + (_cbData) : sizeof (VBOXWDDM_GETVBOXVIDEOCMCMD_HDR))
     213typedef struct VBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD
     214{
     215    VBOXDISPIFESCAPE EscapeHdr;
     216    VBOXWDDM_GETVBOXVIDEOCMCMD_HDR Hdr;
     217} VBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD, *PVBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD;
     218
     219AssertCompile((sizeof (VBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD) & 7) == 0);
     220AssertCompile(RT_OFFSETOF(VBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD, EscapeHdr) == 0);
    207221
    208222/* query info func */
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp

    r30441 r30462  
    20782078        case VBOXVDMACMD_TYPE_DMA_PRESENT_BLT:
    20792079        {
     2080            PVBOXWDDM_DMA_PRESENT_BLT pBlt = (PVBOXWDDM_DMA_PRESENT_BLT)pPrivateData;
    20802081            uint32_t cContexts3D = ASMAtomicReadU32(&pDevExt->cContexts3D);
    20812082            if (cContexts3D)
    20822083            {
    2083 
    2084             }
     2084                if (pPrivateData->fFlags.bShadow2PrimaryUpdate)
     2085                {
     2086                    RECT rect;
     2087                    Assert(pBlt->DstRects.cRects);
     2088                    if (pBlt->DstRects.cRects > 1)
     2089                    {
     2090                        rect = pBlt->DstRects.aRects[1];
     2091                        for (UINT i = 2; i < pBlt->DstRects.cRects; ++i)
     2092                        {
     2093                            vboxWddmRectUnited(&rect, &rect, &pBlt->DstRects.aRects[i]);
     2094                        }
     2095                    }
     2096                    else
     2097                        rect = pBlt->DstRects.aRects[0];
     2098
     2099                    VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pPrivateData->SrcAllocInfo.srcId];
     2100                    VBOXVBVA_OP(ReportDirtyRect, pDevExt, &pSource->Vbva, &rect);
     2101                }
     2102            }
     2103            else
     2104                Assert(!pPrivateData->fFlags.bShadow2PrimaryUpdate);
     2105
    20852106            VBOXWDDM_SHADOW_UPDATE_COMPLETION context;
    20862107            context.pDevExt = pDevExt;
     
    25722593            {
    25732594                PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext;
    2574                 Assert(pContext);
    2575                 PVBOXWDDM_GETVBOXVIDEOCMCMD_HDR pHdr = VBOXDISPIFESCAPE_DATA(pEscapeHdr, VBOXWDDM_GETVBOXVIDEOCMCMD_HDR);
    2576                 Status = vboxVideoCmEscape(&pContext->CmContext, pHdr, VBOXDISPIFESCAPE_DATA_SIZE(pEscape->PrivateDriverDataSize));
    2577                 Assert(Status == STATUS_SUCCESS);
     2595                PVBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD pRegions = (PVBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD)pEscapeHdr;
     2596                Assert(pEscape->PrivateDriverDataSize >= sizeof (VBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD));
     2597                if (pEscape->PrivateDriverDataSize >= sizeof (VBOXDISPIFESCAPE_GETVBOXVIDEOCMCMD))
     2598                {
     2599                    Status = vboxVideoCmEscape(&pContext->CmContext, pRegions, pEscape->PrivateDriverDataSize);
     2600                    Assert(Status == STATUS_SUCCESS);
     2601                }
     2602                else
     2603                    Status = STATUS_BUFFER_TOO_SMALL;
     2604
    25782605                break;
    25792606            }
     
    26532680    {
    26542681        drprintf((__FUNCTION__": pEscape->PrivateDriverDataSize(%d) < (%d)\n", pEscape->PrivateDriverDataSize, sizeof (VBOXDISPIFESCAPE)));
    2655         Status = STATUS_INVALID_PARAMETER;
    26562682        AssertBreakpoint();
     2683        Status = STATUS_BUFFER_TOO_SMALL;
    26572684    }
    26582685
     
    37383765                    Assert(cbCmd < UINT32_MAX/2);
    37393766                    Assert(cbCmd > sizeof (RECT));
    3740                     if (cbCmd < cbRects)
     3767                    if (cbCmd >= cbRects)
    37413768                    {
    37423769                        cbCmd -= cbRects;
     
    37563783                    }
    37573784
     3785                    pPresent->pDmaBufferPrivateData = (uint8_t*)pPresent->pDmaBufferPrivateData + cbHead + cbRects;
    37583786                    pPresent->pDmaBuffer = ((uint8_t*)pPresent->pDmaBuffer) + VBOXWDDM_DUMMY_DMABUFFER_SIZE;
    37593787                    Assert(pPresent->DmaSize >= VBOXWDDM_DUMMY_DMABUFFER_SIZE);
     
    40414069        pContext->NodeOrdinal = pCreateContext->NodeOrdinal;
    40424070        vboxVideoCmCtxInitEmpty(&pContext->CmContext);
    4043         if (pCreateContext->Flags.SystemContext)
     4071        if (pCreateContext->Flags.SystemContext || pCreateContext->PrivateDriverDataSize == 0)
     4072        {
     4073            Assert(pCreateContext->PrivateDriverDataSize == 0);
     4074            Assert(!pCreateContext->pPrivateDriverData);
     4075            Assert(pCreateContext->Flags.Value == 1 || pCreateContext->Flags.Value == 0);
    40444076            pContext->enmType = VBOXWDDM_CONTEXT_TYPE_SYSTEM;
    4045         else if (pCreateContext->Flags.Value == 0)
    4046         {
     4077        }
     4078        else
     4079        {
     4080            Assert(pCreateContext->Flags.Value == 0);
    40474081            Assert(pCreateContext->PrivateDriverDataSize == sizeof (VBOXWDDM_CREATECONTEXT_INFO));
    40484082            Assert(pCreateContext->pPrivateDriverData);
    40494083            if (pCreateContext->PrivateDriverDataSize == sizeof (VBOXWDDM_CREATECONTEXT_INFO))
    40504084            {
    4051                 pContext->enmType = VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D;
    40524085                PVBOXWDDM_CREATECONTEXT_INFO pInfo = (PVBOXWDDM_CREATECONTEXT_INFO)pCreateContext->pPrivateDriverData;
    4053                 Status = vboxVideoCmCtxAdd(&pDevice->pAdapter->CmMgr, &pContext->CmContext, (HANDLE)pInfo->hUmEvent, pInfo->u64UmInfo);
    4054                 Assert(Status == STATUS_SUCCESS);
    4055                 if (Status == STATUS_SUCCESS)
     4086                if (pInfo->u32IsD3D)
    40564087                {
    4057                     Assert(KeGetCurrentIrql() < DISPATCH_LEVEL);
    4058                     ExAcquireFastMutex(&pDevExt->ContextMutex);
    4059                     InsertHeadList(&pDevExt->ContextList3D, &pContext->ListEntry);
    4060                     ASMAtomicIncU32(&pDevExt->cContexts3D);
    4061                     ExReleaseFastMutex(&pDevExt->ContextMutex);
     4088                    pContext->enmType = VBOXWDDM_CONTEXT_TYPE_CUSTOM_3D;
     4089                    Status = vboxVideoCmCtxAdd(&pDevice->pAdapter->CmMgr, &pContext->CmContext, (HANDLE)pInfo->hUmEvent, pInfo->u64UmInfo);
     4090                    Assert(Status == STATUS_SUCCESS);
     4091                    if (Status == STATUS_SUCCESS)
     4092                    {
     4093                        Assert(KeGetCurrentIrql() < DISPATCH_LEVEL);
     4094                        ExAcquireFastMutex(&pDevExt->ContextMutex);
     4095                        InsertHeadList(&pDevExt->ContextList3D, &pContext->ListEntry);
     4096                        ASMAtomicIncU32(&pDevExt->cContexts3D);
     4097                        ExReleaseFastMutex(&pDevExt->ContextMutex);
     4098                    }
    40624099                }
    4063             }
    4064             else
    4065             {
    4066                 pContext->enmType = VBOXWDDM_CONTEXT_TYPE_CUSTOM_2D;
    4067             }
    4068         }
    4069         else
    4070         {
    4071             AssertBreakpoint(); /* we do not support custom contexts for now */
    4072             drprintf((__FUNCTION__ ", we do not support custom contexts for now, hDevice (0x%x)\n", hDevice));
     4100                else
     4101                {
     4102                    pContext->enmType = VBOXWDDM_CONTEXT_TYPE_CUSTOM_2D;
     4103                }
     4104            }
    40734105        }
    40744106
  • trunk/src/VBox/Additions/WINNT/include/VBoxDisplay.h

    r30405 r30462  
    2222# define VBOXESC_GETVBOXVIDEOCMCMD          0xABCD9004
    2323
     24#include <iprt/assert.h>
     25
    2426typedef struct
    2527{
     
    4244typedef struct VBOXDISPIFESCAPE
    4345{
    44     int escapeCode;
     46    int32_t escapeCode;
     47    uint32_t u32CmdSpecific;
    4548} VBOXDISPIFESCAPE, *PVBOXDISPIFESCAPE;
     49
     50/* ensure command body is always 8-byte-aligned*/
     51AssertCompile((sizeof (VBOXDISPIFESCAPE) & 7) == 0);
    4652
    4753#define VBOXDISPIFESCAPE_DATA_OFFSET() ((sizeof (VBOXDISPIFESCAPE) + 7) & ~7)
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