Changeset 53103 in vbox for trunk/src/VBox/HostServices/SharedOpenGL
- Timestamp:
- Oct 20, 2014 6:38:51 PM (10 years ago)
- svn:sync-xref-src-repo-rev:
- 96623
- Location:
- trunk/src/VBox/HostServices/SharedOpenGL
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp
r52978 r53103 73 73 } CRVBOXSVCPRESENTFBOCMD_t, *PCRVBOXSVCPRESENTFBOCMD_t; 74 74 75 typedef struct _CRVBOXSVCPRESENTFBO_t {76 PCRVBOXSVCPRESENTFBOCMD_t pQueueHead, pQueueTail; /* Head/Tail of FIFO cmds queue */77 RTCRITSECT hQueueLock; /* Queue lock */78 RTTHREAD hWorkerThread; /* Worker thread */79 bool volatile bShutdownWorker; /* Shutdown flag */80 RTSEMEVENT hEventProcess; /* Signalled when worker thread should process data or exit */81 } CRVBOXSVCPRESENTFBO_t;82 83 static CRVBOXSVCPRESENTFBO_t g_SvcPresentFBO;84 85 /* Schedule a call to a separate worker thread to avoid deadlock on EMT thread when the screen configuration changes86 and we're processing crServerPresentFBO caused by guest application command.87 To avoid unnecessary memcpy, worker thread frees the data passed.88 */89 static DECLCALLBACK(void) svcPresentFBO(void *data, int32_t screenId, int32_t x, int32_t y, uint32_t w, uint32_t h)90 {91 PCRVBOXSVCPRESENTFBOCMD_t pCmd;92 93 pCmd = (PCRVBOXSVCPRESENTFBOCMD_t) RTMemAlloc(sizeof(CRVBOXSVCPRESENTFBOCMD_t));94 if (!pCmd)95 {96 LogRel(("SHARED_CROPENGL svcPresentFBO: not enough memory (%d)\n", sizeof(CRVBOXSVCPRESENTFBOCMD_t)));97 return;98 }99 pCmd->pData = data;100 pCmd->screenId = screenId;101 pCmd->x = x;102 pCmd->y = y;103 pCmd->w = w;104 pCmd->h = h;105 pCmd->pNext = NULL;106 107 RTCritSectEnter(&g_SvcPresentFBO.hQueueLock);108 109 if (g_SvcPresentFBO.pQueueTail)110 {111 g_SvcPresentFBO.pQueueTail->pNext = pCmd;112 }113 else114 {115 Assert(!g_SvcPresentFBO.pQueueHead);116 g_SvcPresentFBO.pQueueHead = pCmd;117 }118 g_SvcPresentFBO.pQueueTail = pCmd;119 120 RTCritSectLeave(&g_SvcPresentFBO.hQueueLock);121 122 RTSemEventSignal(g_SvcPresentFBO.hEventProcess);123 }124 125 static DECLCALLBACK(int) svcPresentFBOWorkerThreadProc(RTTHREAD ThreadSelf, void *pvUser)126 {127 int rc = VINF_SUCCESS;128 PCRVBOXSVCPRESENTFBOCMD_t pCmd;129 130 Log(("SHARED_CROPENGL svcPresentFBOWorkerThreadProc started\n"));131 132 for (;;)133 {134 rc = RTSemEventWait(g_SvcPresentFBO.hEventProcess, RT_INDEFINITE_WAIT);135 AssertRCReturn(rc, rc);136 137 if (g_SvcPresentFBO.bShutdownWorker)138 {139 break;140 }141 142 // @todo use critsect only to fetch the list and update the g_SvcPresentFBO's pQueueHead and pQueueTail.143 rc = RTCritSectEnter(&g_SvcPresentFBO.hQueueLock);144 AssertRCReturn(rc, rc);145 146 pCmd = g_SvcPresentFBO.pQueueHead;147 while (pCmd)148 {149 ComPtr<IDisplay> pDisplay;150 151 /*remove from queue*/152 g_SvcPresentFBO.pQueueHead = pCmd->pNext;153 if (!g_SvcPresentFBO.pQueueHead)154 {155 g_SvcPresentFBO.pQueueTail = NULL;156 }157 158 CHECK_ERROR_RET(g_pConsole, COMGETTER(Display)(pDisplay.asOutParam()), rc);159 160 RTCritSectLeave(&g_SvcPresentFBO.hQueueLock);161 162 CHECK_ERROR_RET(pDisplay, DrawToScreen(pCmd->screenId, (BYTE*)pCmd->pData, pCmd->x, pCmd->y, pCmd->w, pCmd->h), rc);163 164 crFree(pCmd->pData);165 RTMemFree(pCmd);166 167 rc = RTCritSectEnter(&g_SvcPresentFBO.hQueueLock);168 AssertRCReturn(rc, rc);169 pCmd = g_SvcPresentFBO.pQueueHead;170 }171 172 RTCritSectLeave(&g_SvcPresentFBO.hQueueLock);173 }174 175 Log(("SHARED_CROPENGL svcPresentFBOWorkerThreadProc finished\n"));176 177 return rc;178 }179 180 static int svcPresentFBOInit(void)181 {182 int rc = VINF_SUCCESS;183 184 g_SvcPresentFBO.pQueueHead = NULL;185 g_SvcPresentFBO.pQueueTail = NULL;186 g_SvcPresentFBO.bShutdownWorker = false;187 188 rc = RTCritSectInit(&g_SvcPresentFBO.hQueueLock);189 AssertRCReturn(rc, rc);190 191 rc = RTSemEventCreate(&g_SvcPresentFBO.hEventProcess);192 AssertRCReturn(rc, rc);193 194 rc = RTThreadCreate(&g_SvcPresentFBO.hWorkerThread, svcPresentFBOWorkerThreadProc, NULL, 0,195 RTTHREADTYPE_IO, RTTHREADFLAGS_WAITABLE, "OpenGLWorker");196 AssertRCReturn(rc, rc);197 198 crVBoxServerSetPresentFBOCB(svcPresentFBO);199 200 return rc;201 }202 203 static int svcPresentFBOTearDown(void)204 {205 int rc = VINF_SUCCESS;206 PCRVBOXSVCPRESENTFBOCMD_t pQueue, pTmp;207 208 ASMAtomicWriteBool(&g_SvcPresentFBO.bShutdownWorker, true);209 RTSemEventSignal(g_SvcPresentFBO.hEventProcess);210 rc = RTThreadWait(g_SvcPresentFBO.hWorkerThread, 5000, NULL);211 AssertRCReturn(rc, rc);212 213 RTCritSectDelete(&g_SvcPresentFBO.hQueueLock);214 RTSemEventDestroy(g_SvcPresentFBO.hEventProcess);215 216 pQueue = g_SvcPresentFBO.pQueueHead;217 while (pQueue)218 {219 pTmp = pQueue->pNext;220 crFree(pQueue->pData);221 RTMemFree(pQueue);222 pQueue = pTmp;223 }224 g_SvcPresentFBO.pQueueHead = NULL;225 g_SvcPresentFBO.pQueueTail = NULL;226 227 return rc;228 }229 75 230 76 static DECLCALLBACK(void) svcNotifyEventCB(int32_t screenId, uint32_t uEvent, void* pvData, uint32_t cbData) … … 261 107 262 108 crVBoxServerTearDown(); 263 264 svcPresentFBOTearDown();265 109 266 110 return rc; … … 1663 1507 return VERR_NOT_SUPPORTED; 1664 1508 1665 rc = svcPresentFBOInit();1666 1667 1509 crServerVBoxSetNotifyEventCB(svcNotifyEventCB); 1668 1510 } -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c
r52429 r53103 2989 2989 } 2990 2990 2991 DECLEXPORT(void) crVBoxServerSetPresentFBOCB(PFNCRSERVERPRESENTFBO pfnPresentFBO)2992 {2993 cr_server.pfnPresentFBO = pfnPresentFBO;2994 }2995 2996 2991 DECLEXPORT(int32_t) crVBoxServerSetOffscreenRendering(GLboolean value) 2997 2992 {
Note:
See TracChangeset
for help on using the changeset viewer.