/* 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; }
int VBoxDispVHWAFromDDSURFACEDESC(VBOXVHWA_SURFACEDESC *pVHWADesc, DDSURFACEDESC *pDdDesc) { uint32_t unsupds = VBoxDispVHWAUnsupportedDSS(pDdDesc->dwFlags); Assert(!unsupds); if(unsupds) return VERR_GENERAL_FAILURE; pVHWADesc->flags = 0; if(pDdDesc->dwFlags & DDSD_BACKBUFFERCOUNT) { pVHWADesc->flags |= VBOXVHWA_SD_BACKBUFFERCOUNT; pVHWADesc->cBackBuffers = pDdDesc->dwBackBufferCount; } if(pDdDesc->dwFlags & DDSD_CAPS) { uint32_t unsup = VBoxDispVHWAUnsupportedDDSCAPS(pDdDesc->ddsCaps.dwCaps); Assert(!unsup); if(unsup) return VERR_GENERAL_FAILURE; pVHWADesc->flags |= VBOXVHWA_SD_CAPS; pVHWADesc->surfCaps = VBoxDispVHWAFromDDSCAPS(pDdDesc->ddsCaps.dwCaps); } if(pDdDesc->dwFlags & DDSD_CKDESTBLT) { pVHWADesc->flags |= VBOXVHWA_SD_CKDESTBLT; VBoxDispVHWAFromDDCOLORKEY(&pVHWADesc->DstBltCK, &pDdDesc->ddckCKDestBlt); } if(pDdDesc->dwFlags & DDSD_CKDESTOVERLAY) { pVHWADesc->flags |= VBOXVHWA_SD_CKDESTOVERLAY; VBoxDispVHWAFromDDCOLORKEY(&pVHWADesc->DstOverlayCK, &pDdDesc->ddckCKDestOverlay); } if(pDdDesc->dwFlags & DDSD_CKSRCBLT) { pVHWADesc->flags |= VBOXVHWA_SD_CKSRCBLT; VBoxDispVHWAFromDDCOLORKEY(&pVHWADesc->SrcBltCK, &pDdDesc->ddckCKSrcBlt); } if(pDdDesc->dwFlags & DDSD_CKSRCOVERLAY) { pVHWADesc->flags |= VBOXVHWA_SD_CKSRCOVERLAY; VBoxDispVHWAFromDDCOLORKEY(&pVHWADesc->SrcOverlayCK, &pDdDesc->ddckCKSrcOverlay); } if(pDdDesc->dwFlags & DDSD_HEIGHT) { pVHWADesc->flags |= VBOXVHWA_SD_HEIGHT; pVHWADesc->height = pDdDesc->dwHeight; } if(pDdDesc->dwFlags & DDSD_WIDTH) { pVHWADesc->flags |= VBOXVHWA_SD_WIDTH; pVHWADesc->width = pDdDesc->dwWidth; } if(pDdDesc->dwFlags & DDSD_PITCH) { pVHWADesc->flags |= VBOXVHWA_SD_PITCH; pVHWADesc->pitch = pDdDesc->lPitch; } if(pDdDesc->dwFlags & DDSD_PIXELFORMAT) { int rc = VBoxDispVHWAFromDDPIXELFORMAT(&pVHWADesc->PixelFormat, &pDdDesc->ddpfPixelFormat); if(RT_FAILURE(rc)) return rc; pVHWADesc->flags |= VBOXVHWA_SD_PIXELFORMAT; } return VINF_SUCCESS; }