VirtualBox

Ignore:
Timestamp:
Oct 20, 2014 6:38:51 PM (10 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
96623
Message:

Host 3D: remove obsolete code: drop OpenGLWorker thread.

Location:
trunk/src/VBox/HostServices/SharedOpenGL
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp

    r52978 r53103  
    7373} CRVBOXSVCPRESENTFBOCMD_t, *PCRVBOXSVCPRESENTFBOCMD_t;
    7474
    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 changes
    86    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     else
    114     {
    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 }
    22975
    23076static DECLCALLBACK(void) svcNotifyEventCB(int32_t screenId, uint32_t uEvent, void* pvData, uint32_t cbData)
     
    261107
    262108    crVBoxServerTearDown();
    263 
    264     svcPresentFBOTearDown();
    265109
    266110    return rc;
     
    16631507                return VERR_NOT_SUPPORTED;
    16641508
    1665             rc = svcPresentFBOInit();
    1666 
    16671509            crServerVBoxSetNotifyEventCB(svcNotifyEventCB);
    16681510        }
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c

    r52429 r53103  
    29892989}
    29902990
    2991 DECLEXPORT(void) crVBoxServerSetPresentFBOCB(PFNCRSERVERPRESENTFBO pfnPresentFBO)
    2992 {
    2993     cr_server.pfnPresentFBO = pfnPresentFBO;
    2994 }
    2995 
    29962991DECLEXPORT(int32_t) crVBoxServerSetOffscreenRendering(GLboolean value)
    29972992{
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette