Changeset 33146 in vbox for trunk/src/VBox/Devices/Graphics
- Timestamp:
- Oct 15, 2010 10:34:58 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 66679
- Location:
- trunk/src/VBox/Devices/Graphics
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Graphics/DevVGA.cpp
r33091 r33146 6357 6357 pThis->IPort.pfnSetRenderVRAM = vgaPortSetRenderVRAM; 6358 6358 6359 #if defined(VBOX_WITH_HGSMI) && defined(VBOX_WITH_VIDEOHWACCEL) 6359 #if defined(VBOX_WITH_HGSMI) 6360 # if defined(VBOX_WITH_VIDEOHWACCEL) 6360 6361 pThis->IVBVACallbacks.pfnVHWACommandCompleteAsynch = vbvaVHWACommandCompleteAsynch; 6362 # endif 6363 #if defined(VBOX_WITH_CRHGSMI) 6364 pThis->IVBVACallbacks.pfnCrHgsmiCommandCompleteAsync = vboxVDMACrHgsmiCommandCompleteAsync; 6365 pThis->IVBVACallbacks.pfnCrHgsmiControlCompleteAsync = vboxVDMACrHgsmiControlCompleteAsync; 6366 # endif 6361 6367 #endif 6362 6368 -
trunk/src/VBox/Devices/Graphics/DevVGA.h
r33089 r33146 492 492 # endif 493 493 494 #ifdef VBOX_WITH_HGSMI 495 #define PPDMIDISPLAYVBVACALLBACKS_2_PVGASTATE(_pcb) ( (PVGASTATE)((uint8_t *)(_pcb) - RT_OFFSETOF(VGASTATE, IVBVACallbacks)) ) 496 #endif 497 498 # ifdef VBOX_WITH_CRHGSMI 499 int vboxVDMACrHgsmiCommandCompleteAsync(PPDMIDISPLAYVBVACALLBACKS pInterface, PVBOXVDMACMD_CHROMIUM_CMD pCmd, int rc); 500 int vboxVDMACrHgsmiControlCompleteAsync(PPDMIDISPLAYVBVACALLBACKS pInterface, PVBOXVDMACMD_CHROMIUM_CTL pCmd, int rc); 501 # endif 502 494 503 int vboxVBVASaveStateExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSM); 495 504 int vboxVBVALoadStateExec (PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t u32Version); -
trunk/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp
r32877 r33146 1237 1237 } 1238 1238 1239 #define PPDMIDISPLAYVBVACALLBACKS_2_PVGASTATE(_pcb) ( (PVGASTATE)((uint8_t *)(_pcb) - RT_OFFSETOF(VGASTATE, IVBVACallbacks)) )1240 1241 1239 int vbvaVHWACommandCompleteAsynch(PPDMIDISPLAYVBVACALLBACKS pInterface, PVBOXVHWACMD pCmd) 1242 1240 { -
trunk/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp
r32904 r33146 20 20 #include <iprt/thread.h> 21 21 #include <iprt/mem.h> 22 #include <iprt/asm.h> 22 23 23 24 #include "DevVGA.h" … … 86 87 VBOXVDMAPIPE_CMD_POOL CmdPool; 87 88 } VBOXVDMAHOST, *PVBOXVDMAHOST; 89 90 91 #ifdef VBOX_WITH_CRHGSMI 92 93 typedef DECLCALLBACK(void) FNVBOXVDMACRCTL_CALLBACK(PVGASTATE pVGAState, PVBOXVDMACMD_CHROMIUM_CTL pCmd, void* pvContext); 94 typedef FNVBOXVDMACRCTL_CALLBACK *PFNVBOXVDMACRCTL_CALLBACK; 95 96 typedef struct VBOXVDMACMD_CHROMIUM_CTL_PRIVATE 97 { 98 uint32_t cRefs; 99 uint32_t rc; 100 PFNVBOXVDMACRCTL_CALLBACK pfnCompletion; 101 void *pvCompletion; 102 VBOXVDMACMD_CHROMIUM_CTL Cmd; 103 } VBOXVDMACMD_CHROMIUM_CTL_PRIVATE, *PVBOXVDMACMD_CHROMIUM_CTL_PRIVATE; 104 105 #define VBOXVDMACMD_CHROMIUM_CTL_PRIVATE_FROM_CTL(_p) ((PVBOXVDMACMD_CHROMIUM_CTL_PRIVATE)(((uint8_t*)(_p)) - RT_OFFSETOF(VBOXVDMACMD_CHROMIUM_CTL_PRIVATE, Cmd))) 106 107 static PVBOXVDMACMD_CHROMIUM_CTL vboxVDMACrCtlCreate(VBOXVDMACMD_CHROMIUM_CTL_TYPE enmCmd, uint32_t cbCmd) 108 { 109 PVBOXVDMACMD_CHROMIUM_CTL_PRIVATE pHdr = (PVBOXVDMACMD_CHROMIUM_CTL_PRIVATE)RTMemAllocZ(cbCmd + RT_OFFSETOF(VBOXVDMACMD_CHROMIUM_CTL_PRIVATE, Cmd)); 110 Assert(pHdr); 111 if (pHdr) 112 { 113 pHdr->cRefs = 1; 114 pHdr->rc = VERR_NOT_IMPLEMENTED; 115 pHdr->Cmd.enmType = enmCmd; 116 pHdr->Cmd.cbCmd = cbCmd; 117 return &pHdr->Cmd; 118 } 119 120 return NULL; 121 } 122 123 DECLINLINE(void) vboxVDMACrCtlRelease (PVBOXVDMACMD_CHROMIUM_CTL pCmd) 124 { 125 PVBOXVDMACMD_CHROMIUM_CTL_PRIVATE pHdr = VBOXVDMACMD_CHROMIUM_CTL_PRIVATE_FROM_CTL(pCmd); 126 uint32_t cRefs = ASMAtomicDecU32(&pHdr->cRefs); 127 if(!cRefs) 128 { 129 RTMemFree(pHdr); 130 } 131 } 132 133 DECLINLINE(void) vboxVDMACrCtlRetain (PVBOXVDMACMD_CHROMIUM_CTL pCmd) 134 { 135 PVBOXVDMACMD_CHROMIUM_CTL_PRIVATE pHdr = VBOXVDMACMD_CHROMIUM_CTL_PRIVATE_FROM_CTL(pCmd); 136 ASMAtomicIncU32(&pHdr->cRefs); 137 } 138 139 DECLINLINE(int) vboxVDMACrCtlGetRc (PVBOXVDMACMD_CHROMIUM_CTL pCmd) 140 { 141 PVBOXVDMACMD_CHROMIUM_CTL_PRIVATE pHdr = VBOXVDMACMD_CHROMIUM_CTL_PRIVATE_FROM_CTL(pCmd); 142 return pHdr->rc; 143 } 144 145 static DECLCALLBACK(void) vboxVDMACrCtlCbSetEvent(PVGASTATE pVGAState, PVBOXVDMACMD_CHROMIUM_CTL pCmd, void* pvContext) 146 { 147 RTSemEventSignal((RTSEMEVENT)pvContext); 148 } 149 150 static DECLCALLBACK(void) vboxVDMACrCtlCbReleaseCmd(PVGASTATE pVGAState, PVBOXVDMACMD_CHROMIUM_CTL pCmd, void* pvContext) 151 { 152 vboxVDMACrCtlRelease(pCmd); 153 } 154 155 156 static int vboxVDMACrCtlPostAsync (PVGASTATE pVGAState, PVBOXVDMACMD_CHROMIUM_CTL pCmd, PFNVBOXVDMACRCTL_CALLBACK pfnCompletion, void *pvCompletion) 157 { 158 if (pVGAState->pDrv->pfnCrHgsmiControlProcess) 159 { 160 PVBOXVDMACMD_CHROMIUM_CTL_PRIVATE pHdr = VBOXVDMACMD_CHROMIUM_CTL_PRIVATE_FROM_CTL(pCmd); 161 pHdr->pfnCompletion = pfnCompletion; 162 pHdr->pvCompletion = pvCompletion; 163 pVGAState->pDrv->pfnCrHgsmiControlProcess(pVGAState->pDrv, pCmd); 164 return VINF_SUCCESS; 165 } 166 #ifdef DEBUG_misha 167 Assert(0); 168 #endif 169 return VERR_NOT_SUPPORTED; 170 } 171 172 static int vboxVDMACrCtlPost(PVGASTATE pVGAState, PVBOXVDMACMD_CHROMIUM_CTL pCmd) 173 { 174 RTSEMEVENT hComplEvent; 175 int rc = RTSemEventCreate(&hComplEvent); 176 AssertRC(rc); 177 if(RT_SUCCESS(rc)) 178 { 179 rc = vboxVDMACrCtlPostAsync (pVGAState, pCmd, vboxVDMACrCtlCbSetEvent, (void*)hComplEvent); 180 #ifdef DEBUG_misha 181 AssertRC(rc); 182 #endif 183 if (RT_SUCCESS(rc)) 184 { 185 rc = RTSemEventWaitNoResume(hComplEvent, RT_INDEFINITE_WAIT); 186 AssertRC(rc); 187 if(RT_SUCCESS(rc)) 188 { 189 RTSemEventDestroy(hComplEvent); 190 } 191 } 192 else 193 { 194 /* the command is completed */ 195 RTSemEventDestroy(hComplEvent); 196 } 197 } 198 return rc; 199 } 200 201 static int vboxVDMACrCtlHgsmiSetupAsync(struct VBOXVDMAHOST *pVdma) 202 { 203 PVBOXVDMACMD_CHROMIUM_CTL_CRHGSMI_SETUP pCmd = (PVBOXVDMACMD_CHROMIUM_CTL_CRHGSMI_SETUP)vboxVDMACrCtlCreate( 204 VBOXVDMACMD_CHROMIUM_CTL_TYPE_CRHGSMI_SETUP, sizeof (*pCmd)); 205 if (pCmd) 206 { 207 PVGASTATE pVGAState = pVdma->pVGAState; 208 pCmd->pvRamBase = pVGAState->vram_ptrR3; 209 int rc = vboxVDMACrCtlPostAsync(pVGAState, &pCmd->Hdr, vboxVDMACrCtlCbReleaseCmd, NULL); 210 #ifdef DEBUG_misha 211 AssertRC(rc); 212 #endif 213 #if 0 214 if (RT_SUCCESS(rc)) 215 { 216 rc = vboxVDMACrCtlGetRc(&pCmd->Hdr); 217 } 218 vboxVDMACrCtlRelease(&pCmd->Hdr); 219 #endif 220 return rc; 221 } 222 return VERR_NO_MEMORY; 223 } 224 225 /* check if this is external cmd to be passed to chromium backend */ 226 static bool vboxVDMACmdCheckCrCmd(struct VBOXVDMAHOST *pVdma, PVBOXVDMACBUF_DR pCmd) 227 { 228 PVBOXVDMACMD pDmaCmd; 229 uint8_t * pvRam = pVdma->pVGAState->vram_ptrR3; 230 231 if (pCmd->fFlags & VBOXVDMACBUF_FLAG_BUF_FOLLOWS_DR) 232 pDmaCmd = VBOXVDMACBUF_DR_TAIL(pCmd, VBOXVDMACMD); 233 else 234 pDmaCmd = NULL; 235 236 if (pDmaCmd) 237 { 238 uint32_t cbCmd = pCmd->cbBuf; 239 Assert(cbCmd >= VBOXVDMACMD_HEADER_SIZE()); 240 241 if (cbCmd >= VBOXVDMACMD_HEADER_SIZE()) 242 { 243 if (pDmaCmd->enmType == VBOXVDMACMD_TYPE_CHROMIUM_CMD) 244 { 245 PVBOXVDMACMD_CHROMIUM_CMD pCrCmd = VBOXVDMACMD_BODY(pDmaCmd, VBOXVDMACMD_CHROMIUM_CMD); 246 PVGASTATE pVGAState = pVdma->pVGAState; 247 if (pVGAState->pDrv->pfnCrHgsmiCommandProcess) 248 { 249 pVGAState->pDrv->pfnCrHgsmiCommandProcess(pVGAState->pDrv, pCrCmd); 250 return true; 251 } 252 else 253 { 254 Assert(0); 255 } 256 257 int tmpRc = VBoxSHGSMICommandComplete (pVdma->pHgsmi, pCmd); 258 AssertRC(tmpRc); 259 // uint32_t cBufs = pCrCmd->cBuffers; 260 // for (uint32_t i = 0; i < cBufs; ++i) 261 // { 262 // PVBOXVDMACMD_CHROMIUM_BUFFER pBuf = &pCrCmd->aBuffers[i]; 263 // void *pvBuffer = pvRam + pBuf->offBuffer; 264 // uint32_t cbBuffer = pBuf->cbBuffer; 265 // } 266 } 267 } 268 } 269 return false; 270 } 271 272 int vboxVDMACrHgsmiCommandCompleteAsync(PPDMIDISPLAYVBVACALLBACKS pInterface, PVBOXVDMACMD_CHROMIUM_CMD pCmd, int rc) 273 { 274 PVGASTATE pVGAState = PPDMIDISPLAYVBVACALLBACKS_2_PVGASTATE(pInterface); 275 PHGSMIINSTANCE pIns = pVGAState->pHGSMI; 276 VBOXVDMACMD *pDmaHdr = VBOXVDMACMD_FROM_BODY(pCmd); 277 VBOXVDMACBUF_DR *pDr = VBOXVDMACBUF_DR_FROM_TAIL(pDmaHdr); 278 pDr->rc = rc; 279 280 Assert(pVGAState->fGuestCaps & VBVACAPS_COMPLETEGCMD_BY_IOREAD); 281 rc = HGSMICompleteGuestCommand(pIns, pDr, true /* do Irq */); 282 AssertRC(rc); 283 return rc; 284 } 285 286 int vboxVDMACrHgsmiControlCompleteAsync(PPDMIDISPLAYVBVACALLBACKS pInterface, PVBOXVDMACMD_CHROMIUM_CTL pCmd, int rc) 287 { 288 PVGASTATE pVGAState = PPDMIDISPLAYVBVACALLBACKS_2_PVGASTATE(pInterface); 289 PVBOXVDMACMD_CHROMIUM_CTL_PRIVATE pCmdPrivate = VBOXVDMACMD_CHROMIUM_CTL_PRIVATE_FROM_CTL(pCmd); 290 pCmdPrivate->rc = rc; 291 if (pCmdPrivate->pfnCompletion) 292 { 293 pCmdPrivate->pfnCompletion(pVGAState, pCmd, pCmdPrivate->pvCompletion); 294 } 295 return VINF_SUCCESS; 296 } 297 298 #endif 299 88 300 89 301 /* to simplify things and to avoid extra backend if modifications we assume the VBOXVDMA_RECTL is the same as VBVACMDHDR */ … … 739 951 hgsmiListAppend(&pVdma->CmdPool.List, &pVdma->CmdPool.aCmds[i].Entry); 740 952 } 953 #if 0 //def VBOX_WITH_CRHGSMI 954 int tmpRc = vboxVDMACrCtlHgsmiSetup(pVdma); 955 # ifdef DEBUG_misha 956 AssertRC(tmpRc); 957 # endif 958 #endif 741 959 *ppVdma = pVdma; 742 960 return VINF_SUCCESS; … … 797 1015 { 798 1016 case VBOXVDMA_CTL_TYPE_ENABLE: 1017 { 799 1018 pVdma->bEnabled = true; 800 1019 pCmd->i32Result = VINF_SUCCESS; 1020 #ifdef VBOX_WITH_CRHGSMI 1021 /* @todo: use async completion to ensure we notify a status to guest */ 1022 int tmpRc = vboxVDMACrCtlHgsmiSetupAsync(pVdma); 1023 AssertRC(tmpRc); 1024 #endif 1025 } 801 1026 break; 802 1027 case VBOXVDMA_CTL_TYPE_DISABLE: … … 846 1071 void vboxVDMACommand(struct VBOXVDMAHOST *pVdma, PVBOXVDMACBUF_DR pCmd) 847 1072 { 1073 #ifdef VBOX_WITH_CRHGSMI 1074 if (vboxVDMACmdCheckCrCmd(pVdma, pCmd)) 1075 return; 1076 #endif 1077 848 1078 VBOXVDMACMD_SUBMIT_CONTEXT Context; 849 1079 Context.pVdma = pVdma;
Note:
See TracChangeset
for help on using the changeset viewer.