int VBoxDispVHWAFromDDPIXELFORMAT(VBOXVHWA_PIXELFORMAT *pVHWAFormat, DDPIXELFORMAT *pDdFormat) { uint32_t unsup = VBoxDispVHWAUnsupportedDDPFS(pDdFormat->dwFlags); Assert(!unsup); if(unsup) return VERR_GENERAL_FAILURE; pVHWAFormat->flags = VBoxDispVHWAFromDDPFS(pDdFormat->dwFlags); pVHWAFormat->fourCC = pDdFormat->dwFourCC; pVHWAFormat->c.rgbBitCount = pDdFormat->dwRGBBitCount; pVHWAFormat->m1.rgbRBitMask = pDdFormat->dwRBitMask; pVHWAFormat->m2.rgbGBitMask = pDdFormat->dwGBitMask; pVHWAFormat->m3.rgbBBitMask = pDdFormat->dwBBitMask; return VINF_SUCCESS; }
/* Called to check if our driver can create surface with requested attributes */ DWORD APIENTRY VBoxDispDDCanCreateSurface(PDD_CANCREATESURFACEDATA lpCanCreateSurface) { PVBOXDISPDEV pDev = (PVBOXDISPDEV) lpCanCreateSurface->lpDD->dhpdev; LOGF_ENTER(); PDD_SURFACEDESC lpDDS = lpCanCreateSurface->lpDDSurfaceDesc; #ifdef VBOX_WITH_VIDEOHWACCEL if(pDev->vhwa.bEnabled) { VBOXVHWACMD* pCmd; uint32_t unsupportedSCaps = VBoxDispVHWAUnsupportedDDSCAPS(lpDDS->ddsCaps.dwCaps); if(unsupportedSCaps) { WARN(("unsupported ddscaps: %#x", unsupportedSCaps)); lpCanCreateSurface->ddRVal = DDERR_INVALIDCAPS; return DDHAL_DRIVER_HANDLED; } unsupportedSCaps = VBoxDispVHWAUnsupportedDDPFS(lpDDS->ddpfPixelFormat.dwFlags); if(unsupportedSCaps) { WARN(("unsupported pixel format: %#x", unsupportedSCaps)); lpCanCreateSurface->ddRVal = DDERR_INVALIDPIXELFORMAT; return DDHAL_DRIVER_HANDLED; } pCmd = VBoxDispVHWACommandCreate(pDev, VBOXVHWACMD_TYPE_SURF_CANCREATE, sizeof(VBOXVHWACMD_SURF_CANCREATE)); if(pCmd) { int rc; VBOXVHWACMD_SURF_CANCREATE *pBody = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_SURF_CANCREATE); memset(pBody, 0, sizeof(VBOXVHWACMD_SURF_CANCREATE)); rc = VBoxDispVHWAFromDDSURFACEDESC(&pBody->SurfInfo, lpDDS); pBody->u.in.bIsDifferentPixelFormat = lpCanCreateSurface->bIsDifferentPixelFormat; VBoxDispVHWACommandSubmit(pDev, pCmd); if (RT_SUCCESS(pCmd->rc)) { if(pBody->u.out.ErrInfo) { lpCanCreateSurface->ddRVal = DDERR_GENERIC; } else { WARN(("pBody->u.out.ErrInfo = %#x", pBody->u.out.ErrInfo)); lpCanCreateSurface->ddRVal = DD_OK; } } else { WARN(("VBoxDispVHWACommandSubmit failed with rc=%#x", rc)); lpCanCreateSurface->ddRVal = DDERR_GENERIC; } VBoxDispVHWACommandRelease(pDev, pCmd); } else { WARN(("VBoxDispVHWACommandCreate failed!")); lpCanCreateSurface->ddRVal = DDERR_GENERIC; } return DDHAL_DRIVER_HANDLED; } #endif /*VBOX_WITH_VIDEOHWACCEL*/ if (lpDDS->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) { LOG(("No Z-Bufer support")); lpCanCreateSurface->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_HANDLED; } if (lpDDS->ddsCaps.dwCaps & DDSCAPS_TEXTURE) { LOG(("No texture support")); lpCanCreateSurface->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_HANDLED; } if (lpCanCreateSurface->bIsDifferentPixelFormat && (lpDDS->ddpfPixelFormat.dwFlags & DDPF_FOURCC)) { LOG(("FOURCC not supported")); lpCanCreateSurface->ddRVal = DDERR_UNSUPPORTED; return DDHAL_DRIVER_HANDLED; } lpCanCreateSurface->ddRVal = DD_OK; LOGF_LEAVE(); return DDHAL_DRIVER_HANDLED; }