VirtualBox

Changeset 29710 in vbox for trunk


Ignore:
Timestamp:
May 20, 2010 7:57:47 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
61885
Message:

wddm/2D: more impl & fixes

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp

    r29677 r29710  
    3030#include "VBoxDispD3D.h"
    3131#include "VBoxDispD3DCmn.h"
    32 #include "../../Miniport/wddm/VBoxVideoIf.h"
    3332
    3433#ifdef VBOXWDDMDISP_DEBUG
     
    297296
    298297#define VBOX_FORMATOP_COUNT() (sizeof(gVBoxFormatOps)/sizeof(gVBoxFormatOps[0]))
     298
     299#ifdef VBOX_WITH_VIDEOHWACCEL
     300
     301static bool vboxVhwaIsEnabled(PVBOXWDDMDISP_ADAPTER pAdapter)
     302{
     303    for (uint32_t i = 0; i < pAdapter->cHeads; ++i)
     304    {
     305        if (pAdapter->aHeads[i].Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED)
     306            return true;
     307    }
     308    return false;
     309}
     310
     311static bool vboxVhwaHasCKeying(PVBOXWDDMDISP_ADAPTER pAdapter)
     312{
     313    for (uint32_t i = 0; i < pAdapter->cHeads; ++i)
     314    {
     315        VBOXVHWA_INFO* pSettings = &pAdapter->aHeads[i].Vhwa.Settings;
     316        if ((pSettings->fFlags & VBOXVHWA_F_ENABLED)
     317                && ((pSettings->fFlags & VBOXVHWA_F_CKEY_DST)
     318                        || (pSettings->fFlags & VBOXVHWA_F_CKEY_SRC))
     319               )
     320            return true;
     321    }
     322    return false;
     323}
     324
     325#endif
    299326
    300327/**
     
    348375                memset(pData->pData, 0, sizeof (DDRAW_CAPS));
    349376#ifdef VBOX_WITH_VIDEOHWACCEL
    350                 VBOXWDDM_QI_2D_1 Query;
    351                 Query.hdr.enmType = VBOXWDDM_QI_TYPE_2D_1;
    352                 VBOXVHWA_VERSION_INIT(&Query.Info.u.in.guestVersion);
    353                 D3DDDICB_QUERYADAPTERINFO DdiQuery;
    354                 DdiQuery.PrivateDriverDataSize = sizeof(Query);
    355                 DdiQuery.pPrivateDriverData = &Query;
    356                 hr = pAdapter->RtCallbacks.pfnQueryAdapterInfoCb(pAdapter->hAdapter, &DdiQuery);
    357                 Assert(hr == S_OK);
    358                 if (hr == S_OK)
     377                if (vboxVhwaHasCKeying(pAdapter))
    359378                {
    360                     if (Query.hdr.rc == VINF_SUCCESS)
    361                     {
    362                         /* query succeeded, check the results */
    363                         if (Query.Info.u.out.cfgFlags == VBOXVHWA_CFG_ENABLED)
    364                         {
    365                             /* 2D is enabled*/
    366                             DDRAW_CAPS *pCaps = (DDRAW_CAPS*)pData->pData;
    367                             /* overlay supported */
    368                             if (Query.Info.u.out.surfaceCaps & VBOXVHWA_SCAPS_OVERLAY)
    369                             {
    370                                 if (Query.Info.u.out.caps & VBOXVHWA_CAPS_COLORKEY)
    371                                 {
    372                                     pCaps->Caps = DDRAW_CAPS_COLORKEY;
    373                                 }
    374                             }
    375 
    376                             /* @todo: feel the caps from here */
    377                         }
    378                     }
     379                    DDRAW_CAPS *pCaps = (DDRAW_CAPS*)pData->pData;
     380                    pCaps->Caps |= DDRAW_CAPS_COLORKEY;
    379381                }
    380382#endif
     
    395397                        0, sizeof (DDRAW_MODE_SPECIFIC_CAPS) - RT_OFFSETOF(DDRAW_MODE_SPECIFIC_CAPS, Caps));
    396398#ifdef VBOX_WITH_VIDEOHWACCEL
    397                 VBOXWDDM_QI_2D_1 Query;
    398                 Query.hdr.enmType = VBOXWDDM_QI_TYPE_2D_1;
    399                 VBOXVHWA_VERSION_INIT(&Query.Info.u.in.guestVersion);
    400                 D3DDDICB_QUERYADAPTERINFO DdiQuery;
    401                 DdiQuery.PrivateDriverDataSize = sizeof(Query);
    402                 DdiQuery.pPrivateDriverData = &Query;
    403                 hr = pAdapter->RtCallbacks.pfnQueryAdapterInfoCb(pAdapter->hAdapter, &DdiQuery);
    404                 Assert(hr == S_OK);
    405                 if (hr == S_OK)
     399                VBOXVHWA_INFO *pSettings = &pAdapter->aHeads[pCaps->Head].Vhwa.Settings;
     400                if (pSettings->fFlags & VBOXVHWA_F_ENABLED)
    406401                {
    407                     if (Query.hdr.rc == VINF_SUCCESS)
     402                    pCaps->Caps |= MODE_CAPS_OVERLAY | MODE_CAPS_OVERLAYSTRETCH;
     403
     404                    if (pSettings->fFlags & VBOXVHWA_F_CKEY_DST)
    408405                    {
    409                         /* query succeeded, check the results */
    410                         if (Query.Info.u.out.cfgFlags == VBOXVHWA_CFG_ENABLED)
    411                         {
    412                             /* 2D is enabled*/
    413                             if (Query.Info.u.out.surfaceCaps & VBOXVHWA_SCAPS_OVERLAY)
    414                             {
    415                                 /* overlay supported */
    416                                 pCaps->Caps = MODE_CAPS_OVERLAY | MODE_CAPS_OVERLAYSTRETCH;
    417                                 if (Query.Info.u.out.caps & VBOXVHWA_CAPS_COLORKEY)
    418                                 {
    419                                     if (Query.Info.u.out.colorKeyCaps & VBOXVHWA_CKEYCAPS_DESTOVERLAY)
    420                                     {
    421                                         pCaps->CKeyCaps |= MODE_CKEYCAPS_DESTOVERLAY
    422                                                 | MODE_CKEYCAPS_DESTOVERLAYYUV /* ?? */;
    423                                     }
    424                                 }
    425 
    426                                 pCaps->FxCaps = MODE_FXCAPS_OVERLAYSHRINKX
    427                                         | MODE_FXCAPS_OVERLAYSHRINKY
    428                                         | MODE_FXCAPS_OVERLAYSTRETCHX
    429                                         | MODE_FXCAPS_OVERLAYSTRETCHY;
    430 
    431                                 pCaps->MaxVisibleOverlays = Query.Info.u.out.numOverlays;
    432                                 pCaps->MinOverlayStretch = 1;
    433                                 pCaps->MaxOverlayStretch = 32000;
    434                             }
    435                         }
     406                        pCaps->CKeyCaps |= MODE_CKEYCAPS_DESTOVERLAY
     407                                | MODE_CKEYCAPS_DESTOVERLAYYUV /* ?? */
     408                                ;
    436409                    }
     410
     411                    if (pSettings->fFlags & VBOXVHWA_F_CKEY_SRC)
     412                    {
     413                        pCaps->CKeyCaps |= MODE_CKEYCAPS_SRCOVERLAY
     414                                | MODE_CKEYCAPS_SRCOVERLAYCLRSPACE /* ?? */
     415                                | MODE_CKEYCAPS_SRCOVERLAYCLRSPACEYUV /* ?? */
     416                                | MODE_CKEYCAPS_SRCOVERLAYYUV /* ?? */
     417                                ;
     418                    }
     419
     420                    pCaps->FxCaps = MODE_FXCAPS_OVERLAYSHRINKX
     421                            | MODE_FXCAPS_OVERLAYSHRINKY
     422                            | MODE_FXCAPS_OVERLAYSTRETCHX
     423                            | MODE_FXCAPS_OVERLAYSTRETCHY;
     424
     425
     426                    pCaps->MaxVisibleOverlays = pSettings->cOverlaysSupported;
     427                    pCaps->MinOverlayStretch = 1;
     428                    pCaps->MaxOverlayStretch = 32000;
    437429                }
    438430#endif
     
    14211413    vboxVDbgPrint(("==> "__FUNCTION__"\n"));
    14221414
    1423 //    AssertBreakpoint();
    1424 
    1425     HRESULT hr = S_OK;
     1415    VBOXWDDM_QI Query;
     1416    D3DDDICB_QUERYADAPTERINFO DdiQuery;
     1417    DdiQuery.PrivateDriverDataSize = sizeof(Query);
     1418    DdiQuery.pPrivateDriverData = &Query;
     1419    HRESULT hr = pOpenData->pAdapterCallbacks->pfnQueryAdapterInfoCb(pOpenData->hAdapter, &DdiQuery);
     1420    Assert(hr == S_OK);
     1421    if (hr != S_OK)
     1422    {
     1423        vboxVDbgPrintR((__FUNCTION__": pfnQueryAdapterInfoCb failed, hr (%d)\n", hr));
     1424        return E_FAIL;
     1425    }
     1426
     1427    /* check the miniport version match display version */
     1428    if (Query.u32Version != VBOXVIDEOIF_VERSION)
     1429    {
     1430        vboxVDbgPrintR((__FUNCTION__": miniport version mismatch, expected (%d), but was (%d)\n",
     1431                VBOXVIDEOIF_VERSION,
     1432                Query.u32Version));
     1433        return E_FAIL;
     1434    }
     1435
     1436#ifdef VBOX_WITH_VIDEOHWACCEL
     1437    Assert(Query.cInfos >= 1);
     1438    PVBOXWDDMDISP_ADAPTER pAdapter = (PVBOXWDDMDISP_ADAPTER)RTMemAllocZ(RT_OFFSETOF(VBOXWDDMDISP_ADAPTER, aHeads[Query.cInfos]));
     1439#else
    14261440    PVBOXWDDMDISP_ADAPTER pAdapter = (PVBOXWDDMDISP_ADAPTER)RTMemAllocZ(sizeof (VBOXWDDMDISP_ADAPTER));
     1441#endif
    14271442    Assert(pAdapter);
    14281443    if (pAdapter)
     
    14321447        pAdapter->uRtVersion= pOpenData->Version;
    14331448        pAdapter->RtCallbacks = *pOpenData->pAdapterCallbacks;
     1449
     1450#ifdef VBOX_WITH_VIDEOHWACCEL
     1451        pAdapter->cHeads = Query.cInfos;
     1452        for (uint32_t i = 0; i < pAdapter->cHeads; ++i)
     1453        {
     1454            pAdapter->aHeads[i].Vhwa.Settings = Query.aInfos[i];
     1455        }
     1456#endif
    14341457
    14351458        pOpenData->hAdapter = pAdapter;
  • trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.h

    r29434 r29710  
    1717
    1818#include "VBoxDispD3DIf.h"
     19#include "../../Miniport/wddm/VBoxVideoIf.h"
    1920
    2021#include <iprt/cdefs.h>
     22
     23#ifdef VBOX_WITH_VIDEOHWACCEL
     24typedef struct VBOXDISPVHWA_INFO
     25{
     26    VBOXVHWA_INFO Settings;
     27}VBOXDISPVHWA_INFO;
     28
     29/* represents settings secific to
     30 * display device (head) on the multiple-head graphics card
     31 * currently used for 2D (overlay) only since in theory its settings
     32 * can differ per each frontend's framebuffer. */
     33typedef struct VBOXWDDMDISP_HEAD
     34{
     35    VBOXDISPVHWA_INFO Vhwa;
     36} VBOXWDDMDISP_HEAD;
     37#endif
    2138
    2239typedef struct VBOXWDDMDISP_ADAPTER
     
    2845    IDirect3D9Ex * pD3D9If;
    2946    D3DDDI_ADAPTERCALLBACKS RtCallbacks;
     47#ifdef VBOX_WITH_VIDEOHWACCEL
     48    uint32_t cHeads;
     49    VBOXWDDMDISP_HEAD aHeads[1];
     50#endif
    3051} VBOXWDDMDISP_ADAPTER, *PVBOXWDDMDISP_ADAPTER;
    3152
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.h

    r29670 r29710  
    153153} VBOXWDDM_POINTER_INFO, *PVBOXWDDM_POINTER_INFO;
    154154
     155#ifdef VBOX_WITH_VIDEOHWACCEL
     156typedef struct VBOXWDDM_VHWA
     157{
     158    VBOXVHWA_INFO Settings;
     159} VBOXWDDM_VHWA;
     160#endif
     161
    155162typedef struct VBOXWDDM_SOURCE
    156163{
     
    161168    VBOXWDDM_SURFACE_DESC SurfInfo;
    162169    VBOXVBVAINFO Vbva;
     170#endif
     171#ifdef VBOX_WITH_VIDEOHWACCEL
     172    /* @todo: in our case this seems more like a target property,
     173     * but keep it here for now */
     174    VBOXWDDM_VHWA Vhwa;
    163175#endif
    164176    VBOXWDDM_POINTER_INFO PointerInfo;
     
    214226# ifdef VBOXVDMA_WITH_VBVA
    215227           VBOXVBVAINFO Vbva;
    216 # endif
    217 # ifdef VBOX_WITH_VIDEOHWACCEL
    218            VBOXVHWA_INFO Vhwa;
    219228# endif
    220229#endif
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoIf.h

    r29488 r29710  
    2323
    2424#include <VBox/VBoxVideo.h>
     25
     26/* @todo: implement a check to ensure display & miniport versions match
     27 * one would increase this whenever defines in this file change */
     28#define VBOXVIDEOIF_VERSION 1
    2529
    2630/* create allocation func */
     
    6064#define VBOXWDDM_ALLOCINFO_HEAD(_pb) ((VBOXWDDM_ALLOCINFO*)((uint8_t *)(_pb) - VBOXWDDM_ALLOCATION_HEADSIZE()))
    6165
     66
     67#define VBOXVHWA_F_ENABLED  0x00000001
     68#define VBOXVHWA_F_CKEY_DST 0x00000002
     69#define VBOXVHWA_F_CKEY_SRC 0x00000004
     70
     71#define VBOXVHWA_MAX_FORMATS 8
     72
     73typedef struct VBOXVHWA_INFO
     74{
     75    uint32_t fFlags;
     76    uint32_t cOverlaysSupported;
     77    uint32_t cFormats;
     78    D3DDDIFORMAT aFormats[VBOXVHWA_MAX_FORMATS];
     79} VBOXVHWA_INFO;
     80
    6281/* query info func */
    63 typedef enum
    64 {
    65     VBOXWDDM_QI_TYPE_UNEFINED = 0,
    66 #ifdef VBOX_WITH_VIDEOHWACCEL
    67     /* VBOXVHWACMD_QUERYINFO1 */
    68     VBOXWDDM_QI_TYPE_2D_1,
    69     /* VBOXVHWACMD_QUERYINFO2 */
    70     VBOXWDDM_QI_TYPE_2D_2
    71 #endif
    72 } VBOXWDDM_QI_TYPE;
    73 
    7482typedef struct VBOXWDDM_QI
    7583{
    76     VBOXWDDM_QI_TYPE enmType;
    77     int rc;
     84    uint32_t u32Version;
     85    uint32_t cInfos;
     86    VBOXVHWA_INFO aInfos[VBOX_VIDEO_MAX_SCREENS];
    7887} VBOXWDDM_QI;
    79 
    80 typedef struct VBOXWDDM_QI_2D_1
    81 {
    82     VBOXWDDM_QI hdr;
    83     VBOXVHWACMD_QUERYINFO1 Info;
    84 } VBOXWDDM_QI_2D_1;
    85 
    86 typedef struct VBOXWDDM_QI_2D_2
    87 {
    88     VBOXWDDM_QI hdr;
    89     VBOXVHWACMD_QUERYINFO2 Info;
    90 } VBOXWDDM_QI_2D_2;
    9188
    9289/* submit cmd func */
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.cpp

    r29671 r29710  
    1313#include "../Helper.h"
    1414
    15 VBOXVHWACMD* vboxVhwaCtlCommandCreate(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, VBOXVHWACMD_TYPE enmCmd, VBOXVHWACMD_LENGTH cbCmd)
    16 {
     15#ifndef VBOXVHWA_WITH_SHGSMI
     16# include <iprt/semaphore.h>
     17# include <iprt/asm.h>
     18#endif
     19
     20
     21
     22DECLINLINE(void) vboxVhwaHdrInit(VBOXVHWACMD* pHdr, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, VBOXVHWACMD_TYPE enmCmd)
     23{
     24    memset(pHdr, 0, sizeof(VBOXVHWACMD));
     25    pHdr->iDisplay = srcId;
     26    pHdr->rc = VERR_GENERAL_FAILURE;
     27    pHdr->enmCmd = enmCmd;
     28#ifndef VBOXVHWA_WITH_SHGSMI
     29    pHdr->cRefs = 1;
     30#endif
     31}
     32
     33#ifdef VBOXVHWA_WITH_SHGSMI
     34static int vboxVhwaCommandSubmitHgsmi(struct _DEVICE_EXTENSION* pDevExt, HGSMIOFFSET offDr)
     35{
     36    VBoxHGSMIGuestWrite(pDevExt, offDr);
     37    return VINF_SUCCESS;
     38}
     39#else
     40DECLINLINE(void) vbvaVhwaCommandRelease(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd)
     41{
     42    uint32_t cRefs = ASMAtomicDecU32(&pCmd->cRefs);
     43    Assert(cRefs < UINT32_MAX / 2);
     44    if(!cRefs)
     45    {
     46        vboxHGSMIBufferFree(pDevExt, pCmd);
     47    }
     48}
     49
     50DECLINLINE(void) vbvaVhwaCommandRetain(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd)
     51{
     52    ASMAtomicIncU32(&pCmd->cRefs);
     53}
     54
     55/* do not wait for completion */
     56void vboxVhwaCommandSubmitAsynch(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd, PFNVBOXVHWACMDCOMPLETION pfnCompletion, void * pContext)
     57{
     58    pCmd->GuestVBVAReserved1 = (uintptr_t)pfnCompletion;
     59    pCmd->GuestVBVAReserved2 = (uintptr_t)pContext;
     60    vbvaVhwaCommandRetain(pDevExt, pCmd);
     61
     62    vboxHGSMIBufferSubmit(pDevExt, pCmd);
     63
     64    if(!(pCmd->Flags & VBOXVHWACMD_FLAG_HG_ASYNCH)
     65            || ((pCmd->Flags & VBOXVHWACMD_FLAG_GH_ASYNCH_NOCOMPLETION)
     66                    && (pCmd->Flags & VBOXVHWACMD_FLAG_HG_ASYNCH_RETURNED)))
     67    {
     68        /* the command is completed */
     69        pfnCompletion(pDevExt, pCmd, pContext);
     70    }
     71
     72    vbvaVhwaCommandRelease(pDevExt, pCmd);
     73}
     74
     75static DECLCALLBACK(void) vboxVhwaCompletionSetEvent(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD * pCmd, void * pvContext)
     76{
     77    RTSemEventSignal((RTSEMEVENT)pvContext);
     78}
     79
     80void vboxVhwaCommandSubmitAsynchByEvent(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd, RTSEMEVENT hEvent)
     81{
     82    vboxVhwaCommandSubmitAsynch(pDevExt, pCmd, vboxVhwaCompletionSetEvent, hEvent);
     83}
     84#endif
     85
     86VBOXVHWACMD* vboxVhwaCommandCreate(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, VBOXVHWACMD_TYPE enmCmd, VBOXVHWACMD_LENGTH cbCmd)
     87{
     88#ifdef VBOXVHWA_WITH_SHGSMI
    1789    VBOXVHWACMD* pHdr = (VBOXVHWACMD*)VBoxSHGSMICommandAlloc(&pDevExt->u.primary.hgsmiAdapterHeap,
    1890                              cbCmd + VBOXVHWACMD_HEADSIZE(),
    1991                              HGSMI_CH_VBVA,
    2092                              VBVA_VHWA_CMD);
     93#else
     94    VBOXVHWACMD* pHdr = (VBOXVHWACMD*)vboxHGSMIBufferAlloc(pDevExt,
     95                              cbCmd + VBOXVHWACMD_HEADSIZE(),
     96                              HGSMI_CH_VBVA,
     97                              VBVA_VHWA_CMD);
     98#endif
    2199    Assert(pHdr);
    22100    if (!pHdr)
     
    26104    else
    27105    {
    28         vboxVhwaInitHdr(pHdr, srcId, enmCmd);
     106        vboxVhwaHdrInit(pHdr, srcId, enmCmd);
    29107    }
    30108
     
    32110}
    33111
    34 void vboxVhwaCtlCommandFree(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd)
    35 {
     112void vboxVhwaCommandFree(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd)
     113{
     114#ifdef VBOXVHWA_WITH_SHGSMI
    36115    VBoxSHGSMICommandFree(&pDevExt->u.primary.hgsmiAdapterHeap, pCmd);
    37 }
    38 
    39 static int vboxVhwaCtlCommandSubmitHgsmi(struct _DEVICE_EXTENSION* pDevExt, HGSMIOFFSET offDr)
    40 {
    41     VBoxHGSMIGuestWrite(pDevExt, offDr);
    42     return VINF_SUCCESS;
    43 }
    44 
    45 int vboxVhwaCtlCommandSubmit(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd)
    46 {
     116#else
     117    vbvaVhwaCommandRelease(pDevExt, pCmd);
     118#endif
     119}
     120
     121int vboxVhwaCommandSubmit(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd)
     122{
     123#ifdef VBOXVHWA_WITH_SHGSMI
    47124    const VBOXSHGSMIHEADER* pHdr = VBoxSHGSMICommandPrepSynch(&pDevExt->u.primary.hgsmiAdapterHeap, pCmd);
    48125    Assert(pHdr);
     
    56133            if (offCmd != HGSMIOFFSET_VOID)
    57134            {
    58                 rc = vboxVhwaCtlCommandSubmitHgsmi(pDevExt, offCmd);
     135                rc = vboxVhwaCommandSubmitHgsmi(pDevExt, offCmd);
    59136                AssertRC(rc);
    60137                if (RT_SUCCESS(rc))
     
    74151        rc = VERR_INVALID_PARAMETER;
    75152    return rc;
     153#else
     154    RTSEMEVENT hEvent;
     155    int rc = RTSemEventCreate(&hEvent);
     156    AssertRC(rc);
     157    if (RT_SUCCESS(rc))
     158    {
     159        pCmd->Flags |= VBOXVHWACMD_FLAG_GH_ASYNCH_IRQ;
     160        vboxVhwaCommandSubmitAsynchByEvent(pDevExt, pCmd, hEvent);
     161        rc = RTSemEventWait(hEvent, RT_INDEFINITE_WAIT);
     162        AssertRC(rc);
     163        if (RT_SUCCESS(rc))
     164            RTSemEventDestroy(hEvent);
     165    }
     166    return rc;
     167#endif
     168}
     169
     170#ifndef VBOXVHWA_WITH_SHGSMI
     171static DECLCALLBACK(void) vboxVhwaCompletionFreeCmd(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD * pCmd, void * pContext)
     172{
     173    vboxVhwaCommandFree(pDevExt, pCmd);
     174}
     175#endif
     176
     177void vboxVhwaCommandSubmitAsynchAndComplete(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd)
     178{
     179#ifdef VBOXVHWA_WITH_SHGSMI
     180# error "port me"
     181#else
     182    pCmd->Flags |= VBOXVHWACMD_FLAG_GH_ASYNCH_NOCOMPLETION;
     183
     184    vboxVhwaCommandSubmitAsynch(pDevExt, pCmd, vboxVhwaCompletionFreeCmd, NULL);
     185#endif
    76186}
    77187
     
    79189{
    80190    VBOXVHWACMD* pCmd = VBOXVHWACMD_HEAD(pInfo);
    81     vboxVhwaCtlCommandFree(pDevExt, pCmd);
     191    vboxVhwaCommandFree(pDevExt, pCmd);
    82192}
    83193
     
    85195{
    86196    VBOXVHWACMD* pCmd = VBOXVHWACMD_HEAD(pInfo);
    87     vboxVhwaCtlCommandFree(pDevExt, pCmd);
     197    vboxVhwaCommandFree(pDevExt, pCmd);
    88198}
    89199
    90200VBOXVHWACMD_QUERYINFO1* vboxVHWAQueryHostInfo1(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
    91201{
    92     VBOXVHWACMD* pCmd = vboxVhwaCtlCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_QUERY_INFO1, sizeof(VBOXVHWACMD_QUERYINFO1));
     202    VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_QUERY_INFO1, sizeof(VBOXVHWACMD_QUERYINFO1));
    93203    VBOXVHWACMD_QUERYINFO1 *pInfo1;
    94204
     
    106216    pInfo1->u.in.guestVersion.reserved = VBOXVHWA_VERSION_RSV;
    107217
    108     if(vboxVhwaCtlCommandSubmit(pDevExt, pCmd))
     218    if(vboxVhwaCommandSubmit(pDevExt, pCmd))
    109219    {
    110220        if(RT_SUCCESS(pCmd->rc))
     
    114224    }
    115225
    116     vboxVhwaCtlCommandFree(pDevExt, pCmd);
     226    vboxVhwaCommandFree(pDevExt, pCmd);
    117227    return NULL;
    118228}
     
    120230VBOXVHWACMD_QUERYINFO2* vboxVHWAQueryHostInfo2(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, uint32_t numFourCC)
    121231{
    122     VBOXVHWACMD* pCmd = vboxVhwaCtlCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_QUERY_INFO2, VBOXVHWAINFO2_SIZE(numFourCC));
     232    VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_QUERY_INFO2, VBOXVHWAINFO2_SIZE(numFourCC));
    123233    VBOXVHWACMD_QUERYINFO2 *pInfo2;
    124234    Assert(pCmd);
     
    132242    pInfo2->numFourCC = numFourCC;
    133243
    134     if(vboxVhwaCtlCommandSubmit(pDevExt, pCmd))
     244    if(vboxVhwaCommandSubmit(pDevExt, pCmd))
    135245    {
    136246        if(RT_SUCCESS(pCmd->rc))
     
    143253    }
    144254
    145     vboxVhwaCtlCommandFree(pDevExt, pCmd);
     255    vboxVhwaCommandFree(pDevExt, pCmd);
    146256    return NULL;
    147257}
     
    152262    VBOXVHWACMD* pCmd;
    153263
    154     pCmd = vboxVhwaCtlCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_ENABLE, 0);
     264    pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_ENABLE, 0);
    155265    Assert(pCmd);
    156266    if (!pCmd)
     
    160270    }
    161271
    162     if(vboxVhwaCtlCommandSubmit(pDevExt, pCmd))
     272    if(vboxVhwaCommandSubmit(pDevExt, pCmd))
    163273    {
    164274        if(RT_SUCCESS(pCmd->rc))
     
    168278    }
    169279
    170     vboxVhwaCtlCommandFree(pDevExt, pCmd);
     280    vboxVhwaCommandFree(pDevExt, pCmd);
    171281    return rc;
    172282}
     
    177287    VBOXVHWACMD* pCmd;
    178288
    179     pCmd = vboxVhwaCtlCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_DISABLE, 0);
     289    pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_DISABLE, 0);
    180290    Assert(pCmd);
    181291    if (!pCmd)
     
    185295    }
    186296
    187     if(vboxVhwaCtlCommandSubmit(pDevExt, pCmd))
     297    if(vboxVhwaCommandSubmit(pDevExt, pCmd))
    188298    {
    189299        if(RT_SUCCESS(pCmd->rc))
     
    193303    }
    194304
    195     vboxVhwaCtlCommandFree(pDevExt, pCmd);
     305    vboxVhwaCommandFree(pDevExt, pCmd);
    196306    return rc;
    197307}
    198308
    199 void vboxVHWAInit(PDEVICE_EXTENSION pDevExt)
    200 {
    201     VBOXVHWA_INFO *pSettings = &pDevExt->u.primary.Vhwa;
     309static void vboxVHWAInitSrc(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
     310{
     311    Assert(srcId < pDevExt->cSources);
     312    VBOXVHWA_INFO *pSettings = &pDevExt->aSources[srcId].Vhwa.Settings;
    202313    memset (pSettings, 0, sizeof (VBOXVHWA_INFO));
    203314
    204     VBOXVHWACMD_QUERYINFO1* pInfo1 = vboxVHWAQueryHostInfo1(pDevExt,
    205             0 /*D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId*/);
     315    VBOXVHWACMD_QUERYINFO1* pInfo1 = vboxVHWAQueryHostInfo1(pDevExt, srcId);
    206316    if (pInfo1)
    207317    {
    208318        if (pInfo1->u.out.cfgFlags & VBOXVHWA_CFG_ENABLED)
    209319        {
    210             if (pInfo1->u.out.numOverlays)
     320            if ((pInfo1->u.out.caps & VBOXVHWA_CAPS_OVERLAY)
     321                    && (pInfo1->u.out.caps & VBOXVHWA_CAPS_OVERLAYSTRETCH)
     322                    && (pInfo1->u.out.surfaceCaps & VBOXVHWA_SCAPS_OVERLAY)
     323                    && (pInfo1->u.out.surfaceCaps & VBOXVHWA_SCAPS_FLIP)
     324                    && (pInfo1->u.out.surfaceCaps & VBOXVHWA_SCAPS_LOCALVIDMEM)
     325                    && pInfo1->u.out.numOverlays)
    211326            {
    212                 pSettings->bEnabled = true;
     327                pSettings->fFlags |= VBOXVHWA_F_ENABLED;
     328
     329                if (pInfo1->u.out.caps & VBOXVHWA_CAPS_COLORKEY)
     330                {
     331                    if (pInfo1->u.out.colorKeyCaps & VBOXVHWA_CKEYCAPS_SRCOVERLAY)
     332                    {
     333                        pSettings->fFlags |= VBOXVHWA_F_CKEY_SRC;
     334                        /* todo: VBOXVHWA_CKEYCAPS_SRCOVERLAYONEACTIVE ? */
     335                    }
     336
     337                    if (pInfo1->u.out.colorKeyCaps & VBOXVHWA_CKEYCAPS_DESTOVERLAY)
     338                    {
     339                        pSettings->fFlags |= VBOXVHWA_F_CKEY_DST;
     340                        /* todo: VBOXVHWA_CKEYCAPS_DESTOVERLAYONEACTIVE ? */
     341                    }
     342                }
     343
    213344                pSettings->cFormats = 0;
    214345
     
    218349                ++pSettings->cFormats;
    219350
    220                 if (pInfo1->u.out.numFourCC)
     351                if (pInfo1->u.out.numFourCC
     352                        && (pInfo1->u.out.caps & VBOXVHWA_CAPS_OVERLAYFOURCC))
    221353                {
    222                     VBOXVHWACMD_QUERYINFO2* pInfo2 = vboxVHWAQueryHostInfo2(pDevExt,
    223                             0 /*D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId*/,
    224                             pInfo1->u.out.numFourCC);
     354                    VBOXVHWACMD_QUERYINFO2* pInfo2 = vboxVHWAQueryHostInfo2(pDevExt, srcId, pInfo1->u.out.numFourCC);
    225355                    if (pInfo2)
    226356                    {
     
    238368    }
    239369}
     370
     371void vboxVHWAInit(PDEVICE_EXTENSION pDevExt)
     372{
     373    for (uint32_t i = 0; i < pDevExt->cSources; ++i)
     374    {
     375        vboxVHWAInitSrc(pDevExt, i);
     376    }
     377}
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.h

    r29670 r29710  
    1515#include <iprt/cdefs.h>
    1616
    17 /*
    18  * with wddm 2D commands are split into two categories:
    19  * 1. control commands: those that are not (and actually can not be)
    20  * handled.trasfered as DMA commands in terms of WDDM model
    21  * these are:
    22  *  VBOXVHWACMD_TYPE_QUERY_INFO1,
    23  *  VBOXVHWACMD_TYPE_QUERY_INFO2,
    24  *  VBOXVHWACMD_TYPE_ENABLE,
    25  *  VBOXVHWACMD_TYPE_DISABLE,
    26  * 2. DMA commands: all the rest are handled as DMA commands
    27  * (i.e. using vboxVdmaXxx API)
    28  * This is opaque to the host 2D frontend
    29  * */
    30 #define VBOXVHWA_MAX_FORMATS 64
    31 typedef struct VBOXVHWA_INFO
    32 {
    33     bool bEnabled;
    34     uint32_t cOverlaysSupported;
    35     uint32_t cFormats;
    36     D3DDDIFORMAT aFormats[VBOXVHWA_MAX_FORMATS];
    37 } VBOXVHWA_INFO;
    38 DECLINLINE(void) vboxVhwaInitHdr(VBOXVHWACMD* pHdr, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, VBOXVHWACMD_TYPE enmCmd)
    39 {
    40     memset(pHdr, 0, sizeof(VBOXVHWACMD));
    41     pHdr->iDisplay = srcId;
    42     pHdr->rc = VERR_GENERAL_FAILURE;
    43     pHdr->enmCmd = enmCmd;
    44     /* no need for the cRefs since we're using SHGSMI that has its own ref counting */
    45 //    pHdr->cRefs = 1;
    46 }
    47 
    48 VBOXVHWACMD* vboxVhwaCtlCommandCreate(PDEVICE_EXTENSION pDevExt,
     17VBOXVHWACMD* vboxVhwaCommandCreate(PDEVICE_EXTENSION pDevExt,
    4918        D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId,
    5019        VBOXVHWACMD_TYPE enmCmd,
    5120        VBOXVHWACMD_LENGTH cbCmd);
    5221
    53 void vboxVhwaCtlCommandFree(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd);
    54 int vboxVhwaCtlCommandSubmit(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd);
    55 int vboxVhwaCtlCommandSubmit(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd);
     22void vboxVhwaCommandFree(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd);
     23int vboxVhwaCommandSubmit(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd);
     24int vboxVhwaCommandSubmit(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd);
     25void vboxVhwaCommandSubmitAsynchAndComplete(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd);
     26
     27#ifndef VBOXVHWA_WITH_SHGSMI
     28typedef DECLCALLBACK(void) FNVBOXVHWACMDCOMPLETION(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD * pCmd, void * pContext);
     29typedef FNVBOXVHWACMDCOMPLETION *PFNVBOXVHWACMDCOMPLETION;
     30
     31void vboxVhwaCommandSubmitAsynch(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd, PFNVBOXVHWACMDCOMPLETION pfnCompletion, void * pContext);
     32void vboxVhwaCommandSubmitAsynchByEvent(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd, RTSEMEVENT hEvent);
     33#endif
     34
    5635void vboxVHWAFreeHostInfo1(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD_QUERYINFO1* pInfo);
    5736void vboxVHWAFreeHostInfo2(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD_QUERYINFO2* pInfo);
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp

    r29670 r29710  
    11831183    PAGED_CODE();
    11841184
    1185     dfprintf(("==> "__FUNCTION__ ", context(0x%x)\n", hAdapter));
     1185    dfprintf(("==> "__FUNCTION__ ", context(0x%x), Query type (%d)\n", hAdapter, pQueryAdapterInfo->Type));
    11861186    NTSTATUS Status = STATUS_SUCCESS;
    11871187    PDEVICE_EXTENSION pContext = (PDEVICE_EXTENSION)hAdapter;
     
    12041204            pCaps->InterruptMessageNumber = 0;
    12051205            pCaps->NumberOfSwizzlingRanges = 0;
    1206             /* @todo: need to adjust this for proper 2D Accel support */
    1207             pCaps->MaxOverlays = 0; /* ?? how much should we support? 32 */
     1206            pCaps->MaxOverlays = 0;
     1207#ifdef VBOX_WITH_VIDEOHWACCEL
     1208            for (uint32_t i = 0; i < pContext->cSources; ++i)
     1209            {
     1210                if ( pContext->aSources[i].Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED)
     1211                    pCaps->MaxOverlays += pContext->aSources[i].Vhwa.Settings.cOverlaysSupported;
     1212            }
     1213#endif
    12081214            pCaps->GammaRampCaps.Value = 0;
    12091215            pCaps->PresentationCaps.Value = 0;
     
    12831289        }
    12841290        case DXGKQAITYPE_UMDRIVERPRIVATE:
    1285             AssertBreakpoint();
    1286             Assert(pQueryAdapterInfo->InputDataSize > sizeof (VBOXWDDM_QI));
    1287             if (pQueryAdapterInfo->InputDataSize > sizeof (VBOXWDDM_QI)
    1288                     && pQueryAdapterInfo->OutputDataSize > sizeof (VBOXWDDM_QI))
    1289             {
    1290                 VBOXWDDM_QI * pQi = (VBOXWDDM_QI*)pQueryAdapterInfo->pInputData;
    1291                 switch (pQi->enmType)
     1291            Assert (pQueryAdapterInfo->OutputDataSize >= sizeof (VBOXWDDM_QI));
     1292            if (pQueryAdapterInfo->OutputDataSize >= sizeof (VBOXWDDM_QI))
     1293            {
     1294                VBOXWDDM_QI * pQi = (VBOXWDDM_QI*)pQueryAdapterInfo->pOutputData;
     1295                memset (pQi, 0, sizeof (VBOXWDDM_QI));
     1296                pQi->u32Version = VBOXVIDEOIF_VERSION;
     1297                pQi->cInfos = pContext->cSources;
     1298#ifdef VBOX_WITH_VIDEOHWACCEL
     1299                for (uint32_t i = 0; i < pContext->cSources; ++i)
    12921300                {
    1293 #ifdef VBOX_WITH_VIDEOHWACCEL
    1294                     case VBOXWDDM_QI_TYPE_2D_1:
    1295                     {
    1296                         if (pQueryAdapterInfo->InputDataSize >= sizeof (VBOXWDDM_QI_2D_1)
    1297                                 && pQueryAdapterInfo->OutputDataSize >= sizeof (VBOXWDDM_QI_2D_1))
    1298                         {
    1299                             VBOXWDDM_QI_2D_1 * pQueryIn = (VBOXWDDM_QI_2D_1*)pQueryAdapterInfo->pInputData;
    1300                             VBOXWDDM_QI_2D_1 * pQueryOut = (VBOXWDDM_QI_2D_1*)pQueryAdapterInfo->pOutputData;
    1301                             /* @todo: submit to the host */
    1302 #if 0
    1303                             VBOXVHWACMD *pCmd = create-cmd;
    1304                             VBOXVHWACMD_QUERYINFO1 *pQueryCmd = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_QUERYINFO1);
    1305                             pQueryCmd->u.in.guestVersion = pQueryIn->Info.in.guestVersion;
    1306                             int rc = submit-cmd;
    1307                             pQueryOut->hdr.rc = rc;
    1308                             if (RT_SUCCESS(rc))
    1309                             {
    1310                                 memcpy(&pQueryOut->Info, pQueryCmd, sizeof(VBOXVHWACMD_QUERYINFO1));
    1311                             }
    1312 #else
    1313                             pQueryOut->hdr.rc = VERR_NOT_SUPPORTED;
     1301                    pQi->aInfos[i] = pContext->aSources[i].Vhwa.Settings;
     1302                }
    13141303#endif
    1315                         }
    1316                         else
    1317                         {
    1318                             drprintf((__FUNCTION__ ": in or out buffer for VBOXWDDM_QI_TYPE_2D_1 too small\n"));
    1319                             Status = STATUS_BUFFER_TOO_SMALL;
    1320                         }
    1321                         break;
    1322                     }
    1323                     case VBOXWDDM_QI_TYPE_2D_2:
    1324                     {
    1325                         /* @todo: submit to the host */
    1326                         break;
    1327                     }
    1328 #endif
    1329                     default:
    1330                         drprintf((__FUNCTION__ ": unsupported qi (%d)\n", pQi->enmType));
    1331                         AssertBreakpoint();
    1332                         Status = STATUS_INVALID_PARAMETER;
    1333                 }
    13341304            }
    13351305            else
    13361306            {
    1337                 drprintf((__FUNCTION__ ": in or out buffer too small\n"));
     1307                drprintf((__FUNCTION__ ": buffer too small\n"));
    13381308                Status = STATUS_BUFFER_TOO_SMALL;
    13391309            }
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.h

    r29536 r29710  
    7575
    7676
    77 
    78 
    79 
    8077typedef struct VBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE
    8178{
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette