VirtualBox

Ignore:
Timestamp:
Mar 25, 2010 2:36:56 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
59311
Message:

crOpenGL: some initial support for new multimonitor code

File:
1 edited

Legend:

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

    r27091 r27708  
    5454#define LOG_GROUP LOG_GROUP_SHARED_CROPENGL
    5555#include <VBox/log.h>
    56 #endif
    57 
    58 #include "render/renderspu.h"
     56#include <VBox/com/ErrorInfo.h>
     57#endif /* RT_OS_WINDOWS */
     58
     59#include <VBox/com/errorprint.h>
    5960
    6061PVBOXHGCMSVCHELPERS g_pHelpers;
    61 static IFramebuffer* g_pFrameBuffer;
     62static IConsole* g_pConsole = NULL;
    6263static PVM g_pVM = NULL;
    63 static ULONG64 g_winId = 0;
    6464
    6565#ifndef RT_OS_WINDOWS
     
    6868#endif
    6969
    70 #define CR_USE_HGCM
    71 
    7270static const char* gszVBoxOGLSSMMagic = "***OpenGL state data***";
    73 #define SHCROGL_SSM_VERSION 15
    74 
    75 typedef struct
    76 {
    77     DWORD dwThreadID;
    78 
    79 } VBOXOGLCTX, *PVBOXOGLCTX;
    80 
    81 /*@todo remove this workaround for crstate "unshareable" data*/
    82 static int crIsThreadWorking=0;
    83 
    84 static DWORD WINAPI crServerProc(void* pv)
    85 {
    86     uint64_t winId = *((uint64_t*)pv);
    87     renderspuSetWindowId(winId);
    88     CRServerMain(0, NULL);
    89     crIsThreadWorking = 0;
    90     return 0;
    91 }
    92 
     71#define SHCROGL_SSM_VERSION 16
    9372
    9473static DECLCALLBACK(int) svcUnload (void *)
     
    9877    Log(("SHARED_CROPENGL svcUnload\n"));
    9978
    100     //vboxglGlobalUnload();
    10179    crVBoxServerTearDown();
    10280
     
    10886    int rc = VINF_SUCCESS;
    10987
    110     NOREF(u32ClientID);
    111     VBOXOGLCTX *pClient = (VBOXOGLCTX *)pvClient;
    112     Assert(pClient);
     88    NOREF(pvClient);
    11389
    11490    Log(("SHARED_CROPENGL svcConnect: u32ClientID = %d\n", u32ClientID));
    11591
    116 #ifndef CR_USE_HGCM
    117     if (!crIsThreadWorking)
    118     {
    119         HANDLE h;
    120         Assert(g_pFrameBuffer);
    121 
    122         g_pFrameBuffer->COMGETTER(WinId)(&g_winId);
    123         //CHECK_ERROR_RET(g_piConsole, COMGETTER(Display)(display.asOutParam()), rc);
    124 
    125         //vboxglConnect((PVBOXOGLCTX)pvClient);
    126         crIsThreadWorking=1;
    127         h = CreateThread(NULL, 0, crServerProc, (void*)&g_winId, 0, &pClient->dwThreadID);
    128         if (!h) rc = VERR_MAX_THRDS_REACHED;
    129     }
    130     else
    131         rc = VERR_MAX_THRDS_REACHED;
    132 #else
    133     g_pFrameBuffer->COMGETTER(WinId)(&g_winId);
    134     renderspuSetWindowId(g_winId);
    13592    rc = crVBoxServerAddClient(u32ClientID);
    136 #endif
    13793
    13894    return rc;
     
    14298{
    14399    int rc = VINF_SUCCESS;
    144     VBOXOGLCTX *pClient = (VBOXOGLCTX *)pvClient;
    145     Assert(pClient);
     100
     101    NOREF(pvClient);
    146102
    147103    Log(("SHARED_CROPENGL svcDisconnect: u32ClientID = %d\n", u32ClientID));
    148104
    149 #ifndef CR_USE_HGCM
    150     if (crIsThreadWorking && pClient->dwThreadID)
    151         PostThreadMessage(pClient->dwThreadID, WM_QUIT, 0, 0);
    152 #else
    153105    crVBoxServerRemoveClient(u32ClientID);
    154 #endif
    155     //vboxglDisconnect((PVBOXOGLCTX)pvClient);
     106
    156107    return rc;
    157108}
     
    159110static DECLCALLBACK(int) svcSaveState(void *, uint32_t u32ClientID, void *pvClient, PSSMHANDLE pSSM)
    160111{
    161     VBOXOGLCTX *pClient = (VBOXOGLCTX *)pvClient;
    162 
    163     NOREF(pClient);
     112    int rc = VINF_SUCCESS;
     113
     114    NOREF(pvClient);
    164115
    165116    Log(("SHARED_CROPENGL svcSaveState: u32ClientID = %d\n", u32ClientID));
    166 
    167     int rc;
    168117
    169118    /* Start*/
     
    188137static DECLCALLBACK(int) svcLoadState(void *, uint32_t u32ClientID, void *pvClient, PSSMHANDLE pSSM)
    189138{
    190     VBOXOGLCTX *pClient = (VBOXOGLCTX *)pvClient;
    191 
    192     NOREF(pClient);
    193     NOREF(pSSM);
     139    int rc = VINF_SUCCESS;
     140
     141    NOREF(pvClient);
    194142
    195143    Log(("SHARED_CROPENGL svcLoadState: u32ClientID = %d\n", u32ClientID));
    196144
    197145    char psz[2000];
    198     int rc;
    199146    uint32_t ui32;
    200147
     
    253200    int rc = VINF_SUCCESS;
    254201
     202    NOREF(pvClient);
     203
    255204    Log(("SHARED_CROPENGL svcCall: u32ClientID = %d, fn = %d, cParms = %d, pparms = %d\n", u32ClientID, u32Function, cParms, paParms));
    256 
    257     VBOXOGLCTX *pClient = (VBOXOGLCTX *)pvClient;
    258205
    259206#ifdef DEBUG
     
    455402    switch (u32Function)
    456403    {
    457         case SHCRGL_HOST_FN_SET_FRAMEBUFFER:
    458         {
    459             Log(("svcCall: SHCRGL_HOST_FN_SET_FRAMEBUFFER\n"));
     404        case SHCRGL_HOST_FN_SET_CONSOLE:
     405        {
     406            Log(("svcCall: SHCRGL_HOST_FN_SET_DISPLAY\n"));
    460407
    461408            /* Verify parameter count and types. */
    462             if (cParms != SHCRGL_CPARMS_SET_FRAMEBUFFER)
     409            if (cParms != SHCRGL_CPARMS_SET_CONSOLE)
    463410            {
    464411                rc = VERR_INVALID_PARAMETER;
     
    471418            {
    472419                /* Fetch parameters. */
    473                 IFramebuffer* pFrameBuffer = (IFramebuffer*)paParms[0].u.pointer.addr;
     420                IConsole* pConsole = (IConsole*)paParms[0].u.pointer.addr;
    474421                uint32_t  cbData = paParms[0].u.pointer.size;
    475422
    476423                /* Verify parameters values. */
    477                 if (cbData != sizeof (IFramebuffer*))
     424                if (cbData != sizeof (IConsole*))
    478425                {
    479426                    rc = VERR_INVALID_PARAMETER;
    480427                }
    481                 else
    482                 {
    483                     /* Execute the function. */
    484                     g_pFrameBuffer = pFrameBuffer;
     428                else if (!pConsole)
     429                {
     430                    rc = VERR_INVALID_PARAMETER;
     431                }
     432                else /* Execute the function. */
     433                {
     434                    ComPtr<IMachine> pMachine;
     435                    ComPtr<IDisplay> pDisplay;
     436                    ComPtr<IFramebuffer> pFramebuffer;
     437                    LONG xo, yo;
     438                    ULONG64 winId = 0;
     439                    ULONG monitorCount, i, w, h;
     440
     441                    CHECK_ERROR_BREAK(pConsole, COMGETTER(Machine)(pMachine.asOutParam()));
     442                    CHECK_ERROR_BREAK(pMachine, COMGETTER(MonitorCount)(&monitorCount));
     443                    CHECK_ERROR_BREAK(pConsole, COMGETTER(Display)(pDisplay.asOutParam()));
     444
     445                    rc = crVBoxServerSetScreenCount(monitorCount);
     446                    AssertRCReturn(rc, rc);
     447
     448                    for (i=0; i<monitorCount; ++i)
     449                    {
     450                        CHECK_ERROR_RET(pDisplay, GetFramebuffer(i, pFramebuffer.asOutParam(), &xo, &yo), rc);
     451
     452                        if (!pDisplay)
     453                        {
     454                            rc = crVBoxServerUnmapScreen(i);
     455                            AssertRCReturn(rc, rc);
     456                        }
     457                        else
     458                        {
     459                            CHECK_ERROR_RET(pFramebuffer, COMGETTER(WinId)(&winId), rc);
     460                            CHECK_ERROR_RET(pFramebuffer, COMGETTER(Width)(&w), rc);
     461                            CHECK_ERROR_RET(pFramebuffer, COMGETTER(Height)(&h), rc);
     462
     463                            rc = crVBoxServerMapScreen(i, xo, yo, w, h, winId);
     464                            AssertRCReturn(rc, rc);
     465                        }
     466                    }
     467
     468                    g_pConsole = pConsole;
    485469                    rc = VINF_SUCCESS;
    486470                }
     
    541525            Assert(sizeof(RTRECT)==4*sizeof(GLint));
    542526
    543             renderspuSetRootVisibleRegion(paParms[1].u.uint32, (GLint*)paParms[0].u.pointer.addr);
     527            rc = crVBoxServerSetRootVisibleRegion(paParms[1].u.uint32, (GLint*)paParms[0].u.pointer.addr);
     528            break;
     529        }
     530        case SHCRGL_HOST_FN_SCREEN_CHANGED:
     531        {
     532            Log(("svcCall: SHCRGL_HOST_FN_SCREEN_CHANGED\n"));
     533
     534            /* Verify parameter count and types. */
     535            if (cParms != SHCRGL_CPARMS_SCREEN_CHANGED)
     536            {
     537                rc = VERR_INVALID_PARAMETER;
     538            }
     539            else if (paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT)
     540            {
     541                rc = VERR_INVALID_PARAMETER;
     542            }
     543            else
     544            {
     545                /* Fetch parameters. */
     546                uint32_t screenId = paParms[0].u.uint32;
     547
     548                /* Execute the function. */
     549                ComPtr<IDisplay> pDisplay;
     550                ComPtr<IFramebuffer> pFramebuffer;
     551                LONG xo, yo;
     552                ULONG64 winId = 0;
     553                ULONG w, h;
     554
     555                Assert(g_pConsole);
     556                CHECK_ERROR_RET(g_pConsole, COMGETTER(Display)(pDisplay.asOutParam()), rc);
     557                CHECK_ERROR_RET(pDisplay, GetFramebuffer(screenId, pFramebuffer.asOutParam(), &xo, &yo), rc);
     558
     559                if (!pFramebuffer)
     560                {
     561                    rc = crVBoxServerUnmapScreen(screenId);
     562                    AssertRCReturn(rc, rc);
     563                }
     564                else
     565                {
     566                    CHECK_ERROR_RET(pFramebuffer, COMGETTER(WinId)(&winId), rc);
     567                    CHECK_ERROR_RET(pFramebuffer, COMGETTER(Width)(&w), rc);
     568                    CHECK_ERROR_RET(pFramebuffer, COMGETTER(Height)(&h), rc);
     569
     570                    rc = crVBoxServerMapScreen(screenId, xo, yo, w, h, winId);
     571                    AssertRCReturn(rc, rc);
     572                }
     573
     574                rc = VINF_SUCCESS;
     575            }
    544576            break;
    545577        }
     
    576608            g_pHelpers = ptable->pHelpers;
    577609
    578             ptable->cbClient = sizeof (VBOXOGLCTX);
     610            ptable->cbClient = sizeof (void*);
    579611
    580612            ptable->pfnUnload     = svcUnload;
     
    586618            ptable->pfnLoadState  = svcLoadState;
    587619            ptable->pvService     = NULL;
    588 #ifdef CR_USE_HGCM
     620
    589621            if (!crVBoxServerInit())
    590622                return VERR_NOT_SUPPORTED;
    591 #endif
    592623        }
    593624    }
     
    595626    return rc;
    596627}
     628
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