VirtualBox

Ignore:
Timestamp:
May 14, 2010 5:05:43 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
61618
Message:

wddm: getcaps for d3d9, start impl 2D support

File:
1 edited

Legend:

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

    r29452 r29488  
    3030#include "VBoxDispD3D.h"
    3131#include "VBoxDispD3DCmn.h"
     32#include "../../Miniport/wddm/VBoxVideoIf.h"
    3233
    3334#ifdef VBOXWDDMDISP_DEBUG
     
    7374
    7475    HRESULT hr = S_OK;
     76    PVBOXWDDMDISP_ADAPTER pAdapter = (PVBOXWDDMDISP_ADAPTER)hAdapter;
    7577
    7678    switch (pData->Type)
    7779    {
    7880        case D3DDDICAPS_DDRAW:
     81        {
     82            AssertBreakpoint();
    7983            Assert(pData->DataSize >= sizeof (DDRAW_CAPS));
    8084            if (pData->DataSize >= sizeof (DDRAW_CAPS))
     85            {
    8186                memset(pData->pData, 0, sizeof (DDRAW_CAPS));
     87#ifdef VBOX_WITH_VIDEOHWACCEL
     88                VBOXWDDM_QI_2D_1 Query;
     89                Query.hdr.enmType = VBOXWDDM_QI_TYPE_2D_1;
     90                VBOXVHWA_VERSION_INIT(&Query.Info.u.in.guestVersion);
     91                D3DDDICB_QUERYADAPTERINFO DdiQuery;
     92                DdiQuery.PrivateDriverDataSize = sizeof(Query);
     93                DdiQuery.pPrivateDriverData = &Query;
     94                hr = pAdapter->RtCallbacks.pfnQueryAdapterInfoCb(pAdapter->hAdapter, &DdiQuery);
     95                Assert(hr == S_OK);
     96                if (hr == S_OK)
     97                {
     98                    if (Query.hdr.rc == VINF_SUCCESS)
     99                    {
     100                        /* query succeeded, check the results */
     101                        if (Query.Info.u.out.cfgFlags == VBOXVHWA_CFG_ENABLED)
     102                        {
     103                            /* 2D is enabled*/
     104                            DDRAW_CAPS *pCaps = (DDRAW_CAPS*)pData->pData;
     105                            /* overlay supported */
     106                            if (Query.Info.u.out.surfaceCaps & VBOXVHWA_SCAPS_OVERLAY)
     107                            {
     108                                if (Query.Info.u.out.caps & VBOXVHWA_CAPS_COLORKEY)
     109                                {
     110                                    pCaps->Caps = DDRAW_CAPS_COLORKEY;
     111                                }
     112                            }
     113
     114                            /* @todo: feel the caps from here */
     115                        }
     116                    }
     117                }
     118#endif
     119            }
    82120            else
    83121                hr = E_INVALIDARG;
    84122            break;
     123        }
    85124        case D3DDDICAPS_DDRAW_MODE_SPECIFIC:
     125        {
     126            AssertBreakpoint();
    86127            Assert(pData->DataSize >= sizeof (DDRAW_MODE_SPECIFIC_CAPS));
    87128            if (pData->DataSize >= sizeof (DDRAW_MODE_SPECIFIC_CAPS))
    88                 memset(pData->pData, 0, sizeof (DDRAW_MODE_SPECIFIC_CAPS));
     129            {
     130                DDRAW_MODE_SPECIFIC_CAPS * pCaps = (DDRAW_MODE_SPECIFIC_CAPS*)pData->pData;
     131                memset(&pCaps->Caps /* do not cleanup the first "Head" field,
     132                                    zero starting with the one following "Head", i.e. Caps */,
     133                        0, sizeof (DDRAW_MODE_SPECIFIC_CAPS) - RT_OFFSETOF(DDRAW_MODE_SPECIFIC_CAPS, Caps));
     134#ifdef VBOX_WITH_VIDEOHWACCEL
     135                VBOXWDDM_QI_2D_1 Query;
     136                Query.hdr.enmType = VBOXWDDM_QI_TYPE_2D_1;
     137                VBOXVHWA_VERSION_INIT(&Query.Info.u.in.guestVersion);
     138                D3DDDICB_QUERYADAPTERINFO DdiQuery;
     139                DdiQuery.PrivateDriverDataSize = sizeof(Query);
     140                DdiQuery.pPrivateDriverData = &Query;
     141                hr = pAdapter->RtCallbacks.pfnQueryAdapterInfoCb(pAdapter->hAdapter, &DdiQuery);
     142                Assert(hr == S_OK);
     143                if (hr == S_OK)
     144                {
     145                    if (Query.hdr.rc == VINF_SUCCESS)
     146                    {
     147                        /* query succeeded, check the results */
     148                        if (Query.Info.u.out.cfgFlags == VBOXVHWA_CFG_ENABLED)
     149                        {
     150                            /* 2D is enabled*/
     151                            if (Query.Info.u.out.surfaceCaps & VBOXVHWA_SCAPS_OVERLAY)
     152                            {
     153                                /* overlay supported */
     154                                pCaps->Caps = MODE_CAPS_OVERLAY | MODE_CAPS_OVERLAYSTRETCH;
     155                                if (Query.Info.u.out.caps & VBOXVHWA_CAPS_COLORKEY)
     156                                {
     157                                    if (Query.Info.u.out.colorKeyCaps & VBOXVHWA_CKEYCAPS_DESTOVERLAY)
     158                                    {
     159                                        pCaps->CKeyCaps |= MODE_CKEYCAPS_DESTOVERLAY
     160                                                | MODE_CKEYCAPS_DESTOVERLAYYUV /* ?? */;
     161                                    }
     162                                }
     163
     164                                pCaps->FxCaps = MODE_FXCAPS_OVERLAYSHRINKX
     165                                        | MODE_FXCAPS_OVERLAYSHRINKY
     166                                        | MODE_FXCAPS_OVERLAYSTRETCHX
     167                                        | MODE_FXCAPS_OVERLAYSTRETCHY;
     168
     169                                pCaps->MaxVisibleOverlays = Query.Info.u.out.numOverlays;
     170                                pCaps->MinOverlayStretch = 1;
     171                                pCaps->MaxOverlayStretch = 32000;
     172                            }
     173                        }
     174                    }
     175                }
     176#endif
     177            }
    89178            else
    90179                hr = E_INVALIDARG;
    91180            break;
     181        }
    92182        case D3DDDICAPS_GETFORMATCOUNT:
    93183            *((uint32_t*)pData->pData) = 0;
     
    114204            break;
    115205        case D3DDDICAPS_GETD3D9CAPS:
     206        {
    116207            Assert(pData->DataSize >= sizeof (D3DCAPS9));
    117208            if (pData->DataSize >= sizeof (D3DCAPS9))
     209            {
     210                if (pAdapter->pD3D9If)
     211                {
     212                    hr = pAdapter->pD3D9If->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, (D3DCAPS9*)pData->pData);
     213                    Assert(hr == S_OK);
     214                    if (hr == S_OK)
     215                        break;
     216
     217                    vboxVDbgPrintR((__FUNCTION__": GetDeviceCaps hr(%d)\n", hr));
     218                    /* let's fall back to the 3D disabled case */
     219                    hr = S_OK;
     220                }
     221
    118222                memset(pData->pData, 0, sizeof (D3DCAPS9));
     223            }
    119224            else
    120225                hr = E_INVALIDARG;
    121226            break;
     227        }
    122228        case D3DDDICAPS_GETGAMMARAMPCAPS:
    123229            *((uint32_t*)pData->pData) = 0;
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