static bool haveHGSMIModeHintAndCursorReportingInterface(VBOXPtr pVBox) { uint32_t fModeHintReporting, fCursorReporting; return RT_SUCCESS(VBoxQueryConfHGSMI(&pVBox->guestCtx, VBOX_VBVA_CONF32_MODE_HINT_REPORTING, &fModeHintReporting)) && RT_SUCCESS(VBoxQueryConfHGSMI(&pVBox->guestCtx, VBOX_VBVA_CONF32_GUEST_CURSOR_REPORTING, &fCursorReporting)) && fModeHintReporting == VINF_SUCCESS && fCursorReporting == VINF_SUCCESS; }
static bool hostHasScreenBlankingFlag(VBOXPtr pVBox) { uint32_t fScreenFlags; return RT_SUCCESS(VBoxQueryConfHGSMI(&pVBox->guestCtx, VBOX_VBVA_CONF32_SCREEN_FLAGS, &fScreenFlags)) && fScreenFlags & VBVA_SCREEN_F_BLANK; }
/** * Get the information needed to map the area used by the host to send back * requests. * * @param pCtx the context containing the heap to use * @param cbVRAM how much video RAM is allocated to the device * @param offVRAMBaseMapping the offset of the basic communication structures * into the guest's VRAM * @param poffVRAMHostArea where to store the offset into VRAM of the host * heap area * @param pcbHostArea where to store the size of the host heap area */ RTDECL(void) VBoxHGSMIGetHostAreaMapping(PHGSMIGUESTCOMMANDCONTEXT pCtx, uint32_t cbVRAM, uint32_t offVRAMBaseMapping, uint32_t *poffVRAMHostArea, uint32_t *pcbHostArea) { uint32_t offVRAMHostArea = offVRAMBaseMapping, cbHostArea = 0; AssertPtrReturnVoid(poffVRAMHostArea); AssertPtrReturnVoid(pcbHostArea); VBoxQueryConfHGSMI(pCtx, VBOX_VBVA_CONF32_HOST_HEAP_SIZE, &cbHostArea); if (cbHostArea != 0) { uint32_t cbHostAreaMaxSize = cbVRAM / 4; /** @todo what is the idea of this? */ if (cbHostAreaMaxSize >= VBVA_ADAPTER_INFORMATION_SIZE) { cbHostAreaMaxSize -= VBVA_ADAPTER_INFORMATION_SIZE; } if (cbHostArea > cbHostAreaMaxSize) { cbHostArea = cbHostAreaMaxSize; } /* Round up to 4096 bytes. */ cbHostArea = (cbHostArea + 0xFFF) & ~0xFFF; offVRAMHostArea = offVRAMBaseMapping - cbHostArea; } *pcbHostArea = cbHostArea; *poffVRAMHostArea = offVRAMHostArea; LogFunc(("offVRAMHostArea = 0x%08X, cbHostArea = 0x%08X\n", offVRAMHostArea, cbHostArea)); }
/** * Gets the count of virtual monitors attached to the guest via an HGSMI * command * * @returns the right count on success or 1 on failure. * @param pCtx the context containing the heap to use */ RTDECL(uint32_t) VBoxHGSMIGetMonitorCount(PHGSMIGUESTCOMMANDCONTEXT pCtx) { /* Query the configured number of displays. */ uint32_t cDisplays = 0; VBoxQueryConfHGSMI(pCtx, VBOX_VBVA_CONF32_MONITOR_COUNT, &cDisplays); LogFunc(("cDisplays = %d\n", cDisplays)); if (cDisplays == 0 || cDisplays > VBOX_VIDEO_MAX_SCREENS) /* Host reported some bad value. Continue in the 1 screen mode. */ cDisplays = 1; return cDisplays; }
/** Sanity test on first call. We do not worry about concurrency issues. */ static int testQueryConf(PHGSMIGUESTCOMMANDCONTEXT pCtx) { static bool cOnce = false; uint32_t ulValue = 0; int rc; if (cOnce) return VINF_SUCCESS; cOnce = true; rc = VBoxQueryConfHGSMI(pCtx, UINT32_MAX, &ulValue); if (RT_SUCCESS(rc) && ulValue == UINT32_MAX) return VINF_SUCCESS; cOnce = false; if (RT_FAILURE(rc)) return rc; return VERR_INTERNAL_ERROR; }