VBoxMPCr.cpp revision 612ab06c3d17ed10137724a3745004d09566f53a
/* $Id$ */
/** @file
* VBox WDDM Miniport driver
*/
/*
* Copyright (C) 2012 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
#include "VBoxMPWddm.h"
#include "VBoxMPCr.h"
#ifdef VBOX_WITH_CROGL
#include <cr_protocol.h>
# ifdef VBOX_WDDM_WITH_CRCMD
# include <cr_pack.h>
typedef struct VBOXMP_CRSHGSMICON_BUFDR
{
void *pvBuf;
typedef struct VBOXMP_CRSHGSMICON_BUFDR_CACHE
{
volatile PVBOXMP_CRSHGSMICON_BUFDR pBufDr;
typedef struct VBOXMP_CRSHGSMICON
{
typedef struct VBOXMP_CRSHGSMIPACKER
{
{
}
{
return HGSMIPointerToOffset(&VBoxCommonFromDeviceExt(pDevExt)->guestCtx.heapCtx.Heap.area, (const HGSMIBUFFERHEADER *)pvBuffer);
}
{
}
{
}
{
}
{
}
#define VBOXMP_CRSHGSMICON_DR_CMDBUF_OFFSET(_cBuffers) VBOXWDDM_ROUNDBOUND((VBOXVDMACMD_SIZE_FROMBODYSIZE(RT_OFFSETOF(VBOXVDMACMD_CHROMIUM_CMD, aBuffers[_cBuffers]))), 8)
#define VBOXMP_CRSHGSMICON_DR_GET_CMDBUF(_pDr, _cBuffers, _type) ((_type*)(((uint8_t*)(_pDr)) + VBOXMP_CRSHGSMICON_DR_CMDBUF_OFFSET(_cBuffers)))
#define VBOXMP_CRSHGSMICON_DR_SIZE(_cBuffers, _cbCmdBuf) ( VBOXMP_CRSHGSMICON_DR_CMDBUF_OFFSET(_cBuffers) + _cbCmdBuf)
static int vboxMpCrShgsmiBufCacheBufReinit(PVBOXMP_CRSHGSMICON pCon, PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache, PVBOXMP_CRSHGSMICON_BUFDR pDr, uint32_t cbRequested)
{
return VINF_SUCCESS;
{
WARN(("vboxMpCrShgsmiConAlloc failed"));
return VERR_NO_MEMORY;
}
return VINF_SUCCESS;
}
static void vboxMpCrShgsmiBufCacheFree(PVBOXMP_CRSHGSMICON pCon, PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache, PVBOXMP_CRSHGSMICON_BUFDR pDr)
{
return;
/* the value is already cached, free the current one */
}
static PVBOXMP_CRSHGSMICON_BUFDR vboxMpCrShgsmiBufCacheGetAllocDr(PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache)
{
PVBOXMP_CRSHGSMICON_BUFDR pBufDr = (PVBOXMP_CRSHGSMICON_BUFDR)ASMAtomicXchgPtr((void * volatile *)&pCache->pBufDr, NULL);
if (!pBufDr)
{
if (!pBufDr)
{
WARN(("vboxWddmMemAllocZero failed!"));
return NULL;
}
}
return pBufDr;
}
static PVBOXMP_CRSHGSMICON_BUFDR vboxMpCrShgsmiBufCacheAlloc(PVBOXMP_CRSHGSMICON pCon, PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache, uint32_t cbBuffer)
{
if (RT_SUCCESS(rc))
return pBufDr;
return NULL;
}
static PVBOXMP_CRSHGSMICON_BUFDR vboxMpCrShgsmiBufCacheAllocAny(PVBOXMP_CRSHGSMICON pCon, PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache, uint32_t cbBuffer)
{
return pBufDr;
if (RT_SUCCESS(rc))
return pBufDr;
return NULL;
}
static int vboxMpCrShgsmiBufCacheInit(PVBOXMP_CRSHGSMICON pCon, PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache)
{
return VINF_SUCCESS;
}
static void vboxMpCrShgsmiBufCacheTerm(PVBOXMP_CRSHGSMICON pCon, PVBOXMP_CRSHGSMICON_BUFDR_CACHE pCache)
{
}
static int vboxMpCrShgsmiConConnect(PVBOXMP_CRSHGSMICON pCon, PVBOXMP_DEVEXT pDevExt, PVBOXMP_CRCTLCON pCrCtlCon)
{
if (RT_SUCCESS(rc))
{
if (RT_SUCCESS(rc))
{
rc = VBoxMpCrCtlConConnect(pCrCtlCon, CR_PROTOCOL_VERSION_MAJOR, CR_PROTOCOL_VERSION_MINOR, &pCon->u32ClientID);
if (RT_SUCCESS(rc))
{
return VINF_SUCCESS;
}
else
{
}
}
else
{
}
}
else
{
}
return rc;
}
{
if (RT_FAILURE(rc))
{
return rc;
}
return VINF_SUCCESS;
}
typedef DECLCALLBACK(void) FNVBOXMP_CRSHGSMICON_SEND_COMPLETION(PVBOXMP_CRSHGSMICON pCon, void *pvRx, uint32_t cbRx, void *pvCtx);
typedef struct VBOXMP_CRSHGSMICON_SEND_COMPLETION
{
void *pvCompletion;
static DECLCALLBACK(VOID) vboxMpCrShgsmiConSendAsyncCompletion(PVBOXMP_DEVEXT pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext)
{
/* we should be called from our DPC routine */
/* the first one is a command buffer: obtain it and get the result */
/* if write back buffer is too small, issue read command.
* we can use exactly the same command buffer for it */
/* impl */
Assert(0);
}
static int vboxMpCrShgsmiConSendAsync(PVBOXMP_CRSHGSMICON pCon, void *pvTx, uint32_t cbTx, PFNVBOXMP_CRSHGSMICON_SEND_COMPLETION pfnCompletion, void *pvCompletion)
{
if (!pCmdDr)
{
WARN(("vboxMpCrShgsmiBufCacheAlloc for cmd dr failed"));
return VERR_NO_MEMORY;
}
if (!pWbDr)
{
WARN(("vboxMpCrShgsmiBufCacheAlloc for wb dr failed"));
return VERR_NO_MEMORY;
}
pHdr->u32CmdSpecific = 0;
// pCmd->hdr.u32Reserved = 0;
pCmd->cbWriteback = 0;
pBufCmd->u32GuestData = 0;
pBufCmd->u32GuestData = 0;
pBufCmd->u64GuestData = 0;
pBufCmd->u32GuestData = 0;
/* mark command as submitted & invisible for the dx runtime since dx did not originate it */
if (RT_SUCCESS(rc))
{
return STATUS_SUCCESS;
}
/* impl failure branch */
Assert(0);
return rc;
}
static CRMessageOpcodes *
{
hdr = (CRMessageOpcodes *)
return hdr;
}
static void vboxMpCrShgsmiPackerCbFlush(void *pvFlush)
{
{
unsigned int len;
/*Send*/
}
}
{
if (!pvBuffer)
{
WARN(("vboxMpCrShgsmiConAlloc failed"));
return VERR_NO_MEMORY;
}
// crPackSendHugeFunc( thread->packer, packspuHuge );
return VINF_SUCCESS;
}
# endif
#endif
{
if (pCrCtlCon->cCrCtlRefs++)
return VINF_ALREADY_INITIALIZED;
if (RT_SUCCESS(rc))
{
return VINF_SUCCESS;
}
--pCrCtlCon->cCrCtlRefs;
return rc;
}
{
if (--pCrCtlCon->cCrCtlRefs)
{
return VINF_SUCCESS;
}
if (RT_SUCCESS(rc))
{
return VINF_SUCCESS;
}
++pCrCtlCon->cCrCtlRefs;
return rc;
}
static int vboxMpCrCtlConSetVersion(PVBOXMP_CRCTLCON pCrCtlCon, uint32_t u32ClientID, uint32_t vMajor, uint32_t vMinor)
{
int rc;
if (RT_FAILURE(rc))
{
return rc;
}
{
}
return VINF_SUCCESS;
}
{
int rc;
if (RT_FAILURE(rc))
{
return rc;
}
{
}
return VINF_SUCCESS;
}
{
if (RT_SUCCESS(rc))
{
if (RT_SUCCESS(rc))
{
if (RT_SUCCESS(rc))
{
if (RT_SUCCESS(rc))
{
return VINF_SUCCESS;
}
else
{
}
}
else
{
}
}
else
{
}
}
else
{
}
*pu32ClientID = 0;
return rc;
}
{
if (RT_SUCCESS(rc))
{
return VINF_SUCCESS;
}
else
{
}
return rc;
}
{
if (RT_SUCCESS(rc))
return VINF_SUCCESS;
return rc;
}
int VBoxMpCrCtlConCallUserData(PVBOXMP_CRCTLCON pCrCtlCon, VBoxGuestHGCMCallInfo *pData, uint32_t cbData)
{
if (RT_SUCCESS(rc))
return VINF_SUCCESS;
return rc;
}
bool VBoxMpCrCtlConIs3DSupported()
{
#ifdef VBOX_WITH_CROGL
VBOXMP_CRCTLCON CrCtlCon = {0};
uint32_t u32ClientID = 0;
int rc = VBoxMpCrCtlConConnect(&CrCtlCon, CR_PROTOCOL_VERSION_MAJOR, CR_PROTOCOL_VERSION_MINOR, &u32ClientID);
if (RT_FAILURE(rc))
{
LOGREL(("VBoxMpCrCtlConConnect failed with rc(%d), 3D not supported!"));
return false;
}
if (RT_FAILURE(rc))
WARN(("VBoxMpCrCtlConDisconnect failed, ignoring.."));
return true;
#else
return false;
#endif
}