VirtualBox

Changeset 54582 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Mar 2, 2015 3:42:16 PM (10 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
98721
Message:

Host 3D unscaled HiDPI output: privide notifyHiDPIOutputPolicyChange() IDisplay interface to GUI in ouder to notify 3D about corresponding user option value change.

Location:
trunk/src/VBox
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/GuestHost/OpenGL/include/cr_server.h

    r53103 r54582  
    561561extern DECLEXPORT(void) crVBoxServerCalloutEnable(VBOXCRCMDCTL *pCtl);
    562562extern DECLEXPORT(void) crVBoxServerCalloutDisable();
     563extern DECLEXPORT(void) crServerSetUnscaledHiDPI(bool fEnable);
    563564
    564565#ifdef VBOX_WITH_CRHGSMI
  • trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp

    r53894 r54582  
    13951395            break;
    13961396        }
     1397
     1398        case SHCRGL_HOST_FN_SET_UNSCALED_HIDPI:
     1399        {
     1400            /* Verify parameter count and types. */
     1401            if (cParms != 1
     1402             || paParms[0].type != VBOX_HGCM_SVC_PARM_PTR
     1403             || paParms[0].u.pointer.size != sizeof(CRVBOXHGCMSETUNSCALEDHIDPIOUTPUT)
     1404             || !paParms[0].u.pointer.addr)
     1405            {
     1406                WARN(("invalid parameter"));
     1407                rc = VERR_INVALID_PARAMETER;
     1408                break;
     1409            }
     1410
     1411            CRVBOXHGCMSETUNSCALEDHIDPIOUTPUT *pData = (CRVBOXHGCMSETUNSCALEDHIDPIOUTPUT *)paParms[0].u.pointer.addr;
     1412            crServerSetUnscaledHiDPI(pData->fUnscaledHiDPI);
     1413            LogRel(("OpenGL: Set OpenGL scale policy on HiDPI displays (fUnscaledHiDPI=%d).\n", pData->fUnscaledHiDPI));
     1414            break;
     1415        }
     1416
    13971417        default:
    13981418            WARN(("svcHostCallPerform: unexpected u32Function %d", u32Function));
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c

    r53550 r54582  
    25412541}
    25422542
     2543DECLEXPORT(void) crServerSetUnscaledHiDPI(bool fEnable)
     2544{
     2545    renderspuSetUnscaledHiDPI(fEnable);
     2546}
     2547
    25432548static void crVBoxServerReparentMuralCB(unsigned long key, void *data1, void *data2)
    25442549{
  • trunk/src/VBox/HostServices/SharedOpenGL/render/renderspu.c

    r52641 r54582  
    18681868}
    18691869
     1870DECLEXPORT(void) renderspuSetUnscaledHiDPI(bool fEnable)
     1871{
     1872    render_spu.fUnscaledHiDPI = fEnable;
     1873}
     1874
    18701875#define FILLIN( NAME, FUNC ) \
    18711876  table[i].name = crStrdup(NAME); \
  • trunk/src/VBox/HostServices/SharedOpenGL/render/renderspu.h

    r52560 r54582  
    348348# endif
    349349#endif /* RT_OS_DARWIN */
     350    /* If TRUE, render should tell window server to prevent artificial content
     351     * up-scaling when displayed on HiDPI monitor. */
     352    bool fUnscaledHiDPI;
    350353} RenderSPU;
    351354
     
    495498DECLEXPORT(void) renderspuSetWindowId(uint64_t winId);
    496499DECLEXPORT(void) renderspuReparentWindow(GLint window);
     500DECLEXPORT(void) renderspuSetUnscaledHiDPI(bool fEnable);
    497501#ifdef __cplusplus
    498502}
  • trunk/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa_helper.m

    r54466 r54582  
    14291429   
    14301430    self = [super initWithFrame:frame];
    1431 #ifdef VBOX_WITH_CONFIGURABLE_HIDPI_SCALING
    1432     [self performSelector:@selector(setWantsBestResolutionOpenGLSurface:) withObject: (id)YES];
     1431#if defined(VBOX_WITH_CONFIGURABLE_HIDPI_SCALING) && !defined(IN_VMSVGA3D)
     1432    crDebug("HiDPI: up-scaling is %s on NSView init.", render_spu.fUnscaledHiDPI ? "OFF" : "ON");
     1433    if (render_spu.fUnscaledHiDPI)
     1434        [self performSelector:@selector(setWantsBestResolutionOpenGLSurface:) withObject: (id)YES];
    14331435#endif
    14341436
     
    23662368
    23672369    float backingStretchFactor = 1.;
    2368 #ifdef VBOX_WITH_CONFIGURABLE_HIDPI_SCALING
     2370#if defined(VBOX_WITH_CONFIGURABLE_HIDPI_SCALING) && !defined(IN_VMSVGA3D)
    23692371    /* Adjust viewport according to current NSView's backing store parameters. */
    2370     NSRect regularBounds = [self bounds];
    2371     NSRect backingBounds = [self safeConvertRectToBacking:&regularBounds];
    2372     glViewport(0, 0, backingBounds.size.width, backingBounds.size.height);
    2373 
    2374     /* Update strech factor in order to satisfy current NSView's backing store parameters. */
    2375     backingStretchFactor = [self safeGetBackingScaleFactor];
     2372    crDebug("HiDPI: vboxPresentToViewCS: up-scaling is %s.", render_spu.fUnscaledHiDPI ? "OFF" : "ON");
     2373    if (render_spu.fUnscaledHiDPI)
     2374    {
     2375        NSRect regularBounds = [self bounds];
     2376        NSRect backingBounds = [self safeConvertRectToBacking:&regularBounds];
     2377        glViewport(0, 0, backingBounds.size.width, backingBounds.size.height);
     2378
     2379        /* Update stretch factor in order to satisfy current NSView's backing store parameters. */
     2380        backingStretchFactor = [self safeGetBackingScaleFactor];
     2381    }
     2382    else
     2383        backingStretchFactor = 1.;
    23762384#endif
    23772385
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r54486 r54582  
    1579515795  <interface
    1579615796    name="IDisplay" extends="$unknown"
    15797     uuid="772FBD91-65B5-4CFB-814C-E40E61AC7070"
     15797    uuid="04AA5E91-3816-4990-8C52-59939307E5EF"
    1579815798    wsmap="managed"
    1579915799    wrap-hint-server-addinterfaces="IEventListener"
     
    1610416104      <param name="u32ScaleFactorWMultiplied" type="unsigned long" dir="in"/>
    1610516105      <param name="u32ScaleFactorHMultiplied" type="unsigned long" dir="in"/>
     16106    </method>
     16107
     16108    <method name="notifyHiDPIOutputPolicyChange">
     16109      <desc>
     16110         Notify OpenGL HGCM host service about HiDPI monitor scaling policy change.
     16111      </desc>
     16112      <param name="fUnscaledHiDPI" type="boolean" dir="in"/>
    1610616113    </method>
    1610716114
  • trunk/src/VBox/Main/include/DisplayImpl.h

    r54495 r54582  
    267267                                            ULONG aScaleFactorWMultiplied,
    268268                                            ULONG aScaleFactorHMultiplied);
     269    virtual HRESULT notifyHiDPIOutputPolicyChange(BOOL fUnscaledHiDPI);
    269270
    270271    // Wrapped IEventListener properties
  • trunk/src/VBox/Main/src-client/DisplayImpl.cpp

    r54567 r54582  
    35653565#else
    35663566    AssertMsgFailed(("Attempt to specify OpenGL content scale factor while corresponding functionality is disabled."));
     3567    return E_UNEXPECTED;
     3568#endif /* VBOX_WITH_HGCM && VBOX_WITH_CROGL */
     3569}
     3570
     3571HRESULT Display::notifyHiDPIOutputPolicyChange(BOOL fUnscaledHiDPI)
     3572{
     3573#if defined(VBOX_WITH_HGCM) && defined(VBOX_WITH_CROGL)
     3574    HRESULT hr = E_UNEXPECTED;
     3575
     3576    /* 3D acceleration enabled in VM config. */
     3577    if (mfIsCr3DEnabled)
     3578    {
     3579        /* VBoxSharedCrOpenGL HGCM host service is running. */
     3580        if (mhCrOglSvc)
     3581        {
     3582            VMMDev *pVMMDev = mParent->i_getVMMDev();
     3583            if (pVMMDev)
     3584            {
     3585                VBOXCRCMDCTL_HGCM *pCtl;
     3586                pCtl = (VBOXCRCMDCTL_HGCM *)RTMemAlloc(sizeof(CRVBOXHGCMSETUNSCALEDHIDPIOUTPUT) + sizeof(VBOXCRCMDCTL_HGCM));
     3587                if (pCtl)
     3588                {
     3589                    CRVBOXHGCMSETUNSCALEDHIDPIOUTPUT *pData = (CRVBOXHGCMSETUNSCALEDHIDPIOUTPUT *)(pCtl + 1);
     3590                    int rc;
     3591
     3592                    pData->fUnscaledHiDPI          = fUnscaledHiDPI;
     3593
     3594                    pCtl->Hdr.enmType              = VBOXCRCMDCTL_TYPE_HGCM;
     3595                    pCtl->Hdr.u32Function          = SHCRGL_HOST_FN_SET_UNSCALED_HIDPI;
     3596                    pCtl->aParms[0].type           = VBOX_HGCM_SVC_PARM_PTR;
     3597                    pCtl->aParms[0].u.pointer.addr = pData;
     3598                    pCtl->aParms[0].u.pointer.size = sizeof(*pData);
     3599
     3600                    rc = i_crCtlSubmitSync(&pCtl->Hdr, sizeof(*pCtl));
     3601                    if (RT_FAILURE(rc))
     3602                        AssertMsgFailed(("crCtlSubmitSync failed (rc=%Rrc)\n", rc));
     3603                    else
     3604                        hr = S_OK;
     3605
     3606                    RTMemFree(pCtl);
     3607                }
     3608                else
     3609                {
     3610                    LogRel(("Running out of memory on attempt to notify OpenGL about HiDPI output scaling policy change. Ignored.\n"));
     3611                    hr = E_OUTOFMEMORY;
     3612                }
     3613            }
     3614            else
     3615                LogRel(("Internal error occurred on attempt to notify OpenGL about HiDPI output scaling policy change. Ignored.\n"));
     3616        }
     3617        else
     3618            LogRel(("Attempt to notify OpenGL about HiDPI output scaling policy change while corresponding HGCM host service not yet runing. Ignored.\n"));
     3619    }
     3620    else
     3621    {
     3622        hr = S_OK;
     3623        /* Need an interface like this here (and the #ifdefs needs adjusting):
     3624        PPDMIDISPLAYPORT pUpPort = mpDrv ? mpDrv->pUpPort : NULL;
     3625        if (pUpPort && pUpPort->pfnSetScaleFactor)
     3626            pUpPort->pfnSetScaleFactor(pUpPort, aScreeId, aScaleFactorWMultiplied, aScaleFactorHMultiplied); */
     3627    }
     3628
     3629    return hr;
     3630#else
     3631    AssertMsgFailed(("Attempt to notify OpenGL about HiDPI output scaling policy change while corresponding functionality is disabled."));
    35673632    return E_UNEXPECTED;
    35683633#endif /* VBOX_WITH_HGCM && VBOX_WITH_CROGL */
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