VirtualBox

Changeset 84742 in vbox for trunk/src/VBox/Devices/Graphics


Ignore:
Timestamp:
Jun 9, 2020 5:49:09 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
138536
Message:

Devices/Graphics: experimental GLX graphics output

Location:
trunk/src/VBox/Devices/Graphics
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp

    r84737 r84742  
    1313 *  - LogRel2 for cursor.
    1414 *  - LogRel3 for 3D performance data.
     15 *  - LogRel4 for HW accelerated graphics output.
    1516 */
    1617
     
    169170#  include "DevVGA-SVGA3d-cocoa.h"
    170171# endif
     172# ifdef RT_OS_LINUX
     173#  ifdef IN_RING3
     174#include "DevVGA-SVGA3d-glLdr.h"
     175#  endif
     176# endif
    171177#endif
    172178
     
    582588    return NULL;
    583589}
     590
     591void vmsvgaR3ResetScreens(PVGASTATECC pThisCC)
     592{
     593    for (uint32_t idScreen = 0; idScreen < (uint32_t)RT_ELEMENTS(pThisCC->svga.pSvgaR3State->aScreens); ++idScreen)
     594    {
     595        VMSVGASCREENOBJECT *pScreen = vmsvgaR3GetScreenObject(pThisCC, idScreen);
     596        if (pScreen)
     597            vmsvga3dDestroyScreen(pThisCC, pScreen);
     598    }
     599}
    584600#endif /* IN_RING3 */
    585601
     
    30903106            {
    30913107                /* The 3d subsystem must be reset from the fifo thread. */
     3108                vmsvgaR3ResetScreens(pThisCC); /** @todo Also destroy screens on PowerOff. */
    30923109                vmsvga3dReset(pThisCC);
    30933110            }
     
    36373654    int             rc;
    36383655
     3656# ifdef RT_OS_LINUX
     3657    XInitThreads();
     3658# endif
     3659
    36393660    if (pThread->enmState == PDMTHREADSTATE_INITIALIZING)
    36403661        return VINF_SUCCESS;
     
    44174438                pThis->svga.fGFBRegisters = false;
    44184439                vmsvgaR3ChangeMode(pThis, pThisCC);
     4440
     4441# ifdef VBOX_WITH_VMSVGA3D
     4442                vmsvga3dDefineScreen(pThisCC, pScreen);
     4443# endif
    44194444                break;
    44204445            }
     
    44374462                pScreen->idScreen  = idScreen;
    44384463
     4464# ifdef VBOX_WITH_VMSVGA3D
     4465                vmsvga3dDestroyScreen(pThisCC, pScreen);
     4466# endif
    44394467                vmsvgaR3ChangeMode(pThis, pThisCC);
    44404468                break;
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.h

    r83278 r84742  
    126126    uint32_t        uAlignment;
    127127} VMSVGAVIEWPORT;
     128
     129#ifdef VBOX_WITH_VMSVGA3D
     130typedef struct VMSVGAHWSCREEN *PVMSVGAHWSCREEN;
     131#endif
    128132
    129133/**
     
    149153    bool        fDefined;
    150154    bool        fModified;
     155#ifdef VBOX_WITH_VMSVGA3D
     156    /** Pointer to the HW accelerated (3D) screen data. */
     157    R3PTRTYPE(PVMSVGAHWSCREEN) pHwScreen;
     158#endif
    151159} VMSVGASCREENOBJECT;
    152160
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-internal.h

    r83620 r84742  
    11681168#endif /* VMSVGA3D_INCL_STRUCTURE_DESCRIPTORS */
    11691169
     1170/**
     1171 * VMSVGA3d screen data.
     1172 *
     1173 * Allocated on the heap and pointed to by VMSVGASCREENOBJECT::pHwScreen.
     1174 */
     1175typedef struct VMSVGAHWSCREEN
     1176{
     1177    uint32_t u32Reserved0;
     1178#if defined(RT_OS_LINUX)
     1179    VisualID visualid;
     1180    Pixmap pixmap;
     1181    GLXPixmap glxpixmap;
     1182    GLXContext glxctx;
     1183    bool fYInverted;
     1184    bool fMipmap;
     1185#endif
     1186} VMSVGAHWSCREEN;
     1187
     1188int vmsvga3dBackDefineScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen);
     1189int vmsvga3dBackDestroyScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen);
     1190
     1191int vmsvga3dBackSurfaceBlitToScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen,
     1192                                    SVGASignedRect destRect, SVGA3dSurfaceImageId srcImage,
     1193                                    SVGASignedRect srcRect, uint32_t cRects, SVGASignedRect *paRects);
    11701194
    11711195#ifdef VMSVGA3D_DIRECT3D
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp

    r84136 r84742  
    4141
    4242#include <VBoxVideo.h> /* required by DevVGA.h */
     43#include <VBoxVideo3D.h>
    4344
    4445/* should go BEFORE any other DevVGA include to make all DevVGA.h config defines be visible */
     
    34613462}
    34623463
     3464#if defined(RT_OS_LINUX)
     3465/*
     3466 * HW accelerated graphics output.
     3467 */
     3468
     3469/* Send a notification to the UI. */
     3470static int vmsvga3dDrvNotifyHwScreen(PVGASTATECC pThisCC, VBOX3D_NOTIFY_TYPE enmNotification,
     3471                                     uint32_t idScreen, Pixmap pixmap, void *pvData, size_t cbData)
     3472{
     3473#if 0
     3474    /* Emulates no support from frontend. */
     3475    RT_NOREF(pThisCC, enmNotification, idScreen, pixmap, pvData, cbData);
     3476    return VERR_NOT_SUPPORTED;
     3477#else
     3478    uint8_t au8Buffer[128];
     3479    AssertLogRelMsgReturn(cbData <= sizeof(au8Buffer) - sizeof(VBOX3DNOTIFY),
     3480                          ("cbData %zu", cbData),
     3481                          VERR_INVALID_PARAMETER);
     3482
     3483    VBOX3DNOTIFY *p = (VBOX3DNOTIFY *)&au8Buffer[0];
     3484    p->enmNotification = enmNotification;
     3485    p->iDisplay = idScreen;
     3486    p->u32Reserved = 0;
     3487    p->cbData = cbData + sizeof(uint64_t);
     3488    /* au8Data consists of a 64 bit pixmap handle followed by notification specific data. */
     3489    AssertCompile(sizeof(pixmap) <= sizeof(uint64_t));
     3490    *(uint64_t *)&p->au8Data[0] = (uint64_t)pixmap;
     3491    memcpy(&p->au8Data[sizeof(uint64_t)], pvData, cbData);
     3492
     3493    int rc = pThisCC->pDrv->pfn3DNotifyProcess(pThisCC->pDrv, p);
     3494    return rc;
     3495#endif
     3496}
     3497
     3498static int ctxErrorHandler(Display *dpy, XErrorEvent *ev)
     3499{
     3500    RT_NOREF(dpy);
     3501    LogRel4(("VMSVGA: XError %d\n", (int)ev->error_code));
     3502    return 0;
     3503}
     3504
     3505/* Create a GLX pixmap as a HW accelerated screen. */
     3506static int vmsvga3dHwScreenCreate(PVMSVGA3DSTATE pState, unsigned int cWidth, unsigned int cHeight, VMSVGAHWSCREEN *p)
     3507{
     3508    int (*oldHandler)(Display*, XErrorEvent*) = XSetErrorHandler(&ctxErrorHandler);
     3509
     3510    int rc = VINF_SUCCESS;
     3511
     3512    /*
     3513     * Create a new GL context, which will be used for copying to the screen pixmap.
     3514     */
     3515
     3516    /* FBConfig attributes. */
     3517    static int const aConfigAttribList[] =
     3518    {
     3519        // GLX_RENDER_TYPE,                 GLX_RGBA_BIT,
     3520        // GLX_X_VISUAL_TYPE,               GLX_TRUE_COLOR,
     3521        // GLX_X_RENDERABLE,                True,                   // Render to GLX pixmaps
     3522        GLX_DRAWABLE_TYPE,               GLX_PIXMAP_BIT,         // Must support GLX pixmaps
     3523        GLX_BIND_TO_TEXTURE_RGBA_EXT,    True,                   // Must support GLX_EXT_texture_from_pixmap
     3524        GLX_BIND_TO_TEXTURE_TARGETS_EXT, GLX_TEXTURE_RECTANGLE_BIT_EXT, // Must support GL_TEXTURE_RECTANGLE for the frontend code
     3525        GLX_DOUBLEBUFFER,                False,                  // No need for double buffering for a pixmap.
     3526        GLX_RED_SIZE,                    8,                      // True color RGB with 8 bits per channel.
     3527        GLX_GREEN_SIZE,                  8,
     3528        GLX_BLUE_SIZE,                   8,
     3529        GLX_ALPHA_SIZE,                  8,
     3530        GLX_STENCIL_SIZE,                0,                      // No stencil buffer
     3531        GLX_DEPTH_SIZE,                  0,                      // No depth buffer
     3532        GLX_CONFIG_CAVEAT,               GLX_NONE,
     3533        None
     3534    };
     3535
     3536    /* Find a suitable FB config. */
     3537    int cConfigs = 0;
     3538    GLXFBConfig *paConfigs = glXChooseFBConfig(pState->display, 0, aConfigAttribList, &cConfigs);
     3539    LogRel4(("VMSVGA: vmsvga3dHwScreenCreate: paConfigs %p cConfigs %d\n", (void *)paConfigs, cConfigs));
     3540    if (paConfigs)
     3541    {
     3542        XVisualInfo *vi = NULL;
     3543        int i = 0;
     3544        for (; i < cConfigs; ++i)
     3545        {
     3546            /* Use XFree to free the data returned in the previous iteration of this loop. */
     3547            if (vi)
     3548                XFree(vi);
     3549
     3550            vi = glXGetVisualFromFBConfig(pState->display, paConfigs[i]);
     3551            if (!vi)
     3552                continue;
     3553
     3554            LogRel4(("VMSVGA: vmsvga3dHwScreenCreate: %p vid %lu screen %d depth %d r %lu g %lu b %lu clrmap %d bitsperrgb %d\n",
     3555                     (void *)vi->visual, vi->visualid, vi->screen, vi->depth,
     3556                     vi->red_mask, vi->green_mask, vi->blue_mask, vi->colormap_size, vi->bits_per_rgb));
     3557
     3558            /* Search for 32 bits per pixel. */
     3559            if (vi->depth != 32)
     3560                continue;
     3561
     3562            /* 8 bits per color component is enough. */
     3563            if (vi->bits_per_rgb != 8)
     3564                continue;
     3565
     3566            /* Render to pixmap. */
     3567            int value = 0;
     3568            glXGetFBConfigAttrib(pState->display, paConfigs[i], GLX_DRAWABLE_TYPE, &value);
     3569            if (!(value & GLX_PIXMAP_BIT))
     3570                continue;
     3571
     3572            /* Pixmap will be used as TEXTURE_RECTANGLE. */
     3573            glXGetFBConfigAttrib(pState->display, paConfigs[i], GLX_BIND_TO_TEXTURE_TARGETS_EXT, &value);
     3574            if (!(value & GLX_TEXTURE_RECTANGLE_BIT_EXT))
     3575                continue;
     3576
     3577            /* Need to bind to a texture using GLX_EXT_texture_from_pixmap. */
     3578            glXGetFBConfigAttrib(pState->display, paConfigs[i], GLX_BIND_TO_TEXTURE_RGBA_EXT, &value);
     3579            if (value == 0)
     3580            {
     3581                glXGetFBConfigAttrib(pState->display, paConfigs[i], GLX_BIND_TO_TEXTURE_RGB_EXT, &value);
     3582                if (value == 0)
     3583                    continue;
     3584            }
     3585
     3586            glXGetFBConfigAttrib(pState->display, paConfigs[i], GLX_Y_INVERTED_EXT, &value);
     3587            p->fYInverted = (value == 1);
     3588
     3589            glXGetFBConfigAttrib(pState->display, paConfigs[i], GLX_BIND_TO_MIPMAP_TEXTURE_EXT, &value);
     3590            p->fMipmap = (value > 0);
     3591
     3592            /* This FB config can be used. */
     3593            break;
     3594        }
     3595
     3596        if (i < cConfigs)
     3597        {
     3598            /* Found a suitable config with index i. */
     3599            p->visualid = vi->visualid;
     3600
     3601            Window const rootWindow = RootWindow(pState->display, vi->screen);
     3602            p->pixmap = XCreatePixmap(pState->display, rootWindow, cWidth, cHeight, vi->depth);
     3603            LogRel4(("VMSVGA: vmsvga3dHwScreenCreate: p->pixmap %ld\n", p->pixmap));
     3604
     3605            static int const aPixmapAttribList[] =
     3606            {
     3607                GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_RECTANGLE_EXT,
     3608                GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGBA_EXT,
     3609                GLX_MIPMAP_TEXTURE_EXT, p->fMipmap,
     3610                None
     3611            };
     3612            p->glxpixmap = glXCreatePixmap(pState->display, paConfigs[i], p->pixmap, aPixmapAttribList);
     3613            LogRel4(("VMSVGA: vmsvga3dHwScreenCreate: p->glxpixmap %ld\n", p->glxpixmap));
     3614
     3615            p->glxctx = glXCreateContext(pState->display, vi, pState->SharedCtx.glxContext, GL_TRUE);
     3616            LogRel4(("VMSVGA: vmsvga3dHwScreenCreate: p->glxctx %p\n", (void *)p->glxctx));
     3617
     3618            XSync(pState->display, False);
     3619        }
     3620        else
     3621        {
     3622            /* A suitable config is not found. */
     3623            LogRel4(("VMSVGA: vmsvga3dHwScreenCreate: no FBConfig\n"));
     3624            rc = VERR_NOT_SUPPORTED;
     3625        }
     3626
     3627        if (vi)
     3628            XFree(vi);
     3629
     3630        /* "Use XFree to free the memory returned by glXChooseFBConfig." */
     3631        XFree(paConfigs);
     3632    }
     3633    else
     3634    {
     3635        /* glXChooseFBConfig failed. */
     3636        rc = VERR_NOT_SUPPORTED;
     3637    }
     3638
     3639    XSetErrorHandler(oldHandler);
     3640    return rc;
     3641}
     3642
     3643/* Destroy a HW accelerated screen. */
     3644static void vmsvga3dHwScreenDestroy(PVMSVGA3DSTATE pState, VMSVGAHWSCREEN *p)
     3645{
     3646    if (p)
     3647    {
     3648        LogRel4(("VMSVGA: vmsvga3dHwScreenDestroy: p->glxpixmap %ld, ctx %p\n", p->glxpixmap, (void *)p->glxctx));
     3649        if (p->glxctx)
     3650        {
     3651            /* GLX context is changed here, so other code has to set the appropriate context again. */
     3652            VMSVGA3D_CLEAR_CURRENT_CONTEXT(pState);
     3653            glXMakeCurrent(pState->display, None, NULL);
     3654            glXDestroyContext(pState->display, p->glxctx);
     3655        }
     3656
     3657        if (p->glxpixmap)
     3658            glXDestroyPixmap(pState->display, p->glxpixmap);
     3659
     3660        if (p->pixmap)
     3661            XFreePixmap(pState->display, p->pixmap);
     3662
     3663        RT_ZERO(*p);
     3664    }
     3665}
     3666
     3667#define GLCHECK() \
     3668    do { \
     3669        int glErr = glGetError(); \
     3670        if (glErr != GL_NO_ERROR) LogRel4(("VMSVGA: GL error 0x%x @%d\n", glErr, __LINE__)); \
     3671    } while(0)
     3672
     3673int vmsvga3dBackDefineScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen)
     3674{
     3675    LogRel4(("VMSVGA: vmsvga3dBackDefineScreen: screen %u\n", pScreen->idScreen));
     3676
     3677    PVMSVGA3DSTATE pState = pThisCC->svga.p3dState;
     3678    AssertReturn(pState, VERR_NOT_SUPPORTED);
     3679
     3680    Assert(pScreen->pHwScreen == NULL);
     3681
     3682    VMSVGAHWSCREEN *p = (VMSVGAHWSCREEN *)RTMemAllocZ(sizeof(VMSVGAHWSCREEN));
     3683    AssertPtrReturn(p, VERR_NO_MEMORY);
     3684
     3685    int rc = vmsvga3dHwScreenCreate(pState, pScreen->cWidth, pScreen->cHeight, p);
     3686    if (RT_SUCCESS(rc))
     3687    {
     3688        /*
     3689         * Setup the OpenGL context of the screen.
     3690         */
     3691
     3692        /* GLX context is changed here, so other code has to set the appropriate context again. */
     3693        VMSVGA3D_CLEAR_CURRENT_CONTEXT(pState);
     3694
     3695        Bool const fSuccess = glXMakeCurrent(pState->display, p->glxpixmap, p->glxctx);
     3696        if (fSuccess)
     3697        {
     3698            /* Work in screen coordinates. */
     3699            glMatrixMode(GL_MODELVIEW);
     3700            glLoadIdentity();
     3701            glOrtho(0, pScreen->cWidth, 0, pScreen->cHeight, -1, 1);
     3702            glMatrixMode(GL_PROJECTION);
     3703            glLoadIdentity();
     3704
     3705            /* Set GL state. */
     3706            glClearColor(0, 0, 0, 1);
     3707            glEnable(GL_TEXTURE_2D);
     3708            glDisable(GL_DEPTH_TEST);
     3709            glDisable(GL_CULL_FACE);
     3710
     3711            /* Clear the pixmap. */
     3712            glClear(GL_COLOR_BUFFER_BIT);
     3713            glFinish();
     3714
     3715            glXMakeCurrent(pState->display, None, NULL);
     3716
     3717            rc = vmsvga3dDrvNotifyHwScreen(pThisCC, VBOX3D_NOTIFY_TYPE_HW_SCREEN_CREATED,
     3718                                           pScreen->idScreen, p->pixmap, &p->visualid, sizeof(p->visualid));
     3719        }
     3720        else
     3721        {
     3722            LogRel4(("VMSVGA: vmsvga3dBackDefineScreen: failed to set current context\n"));
     3723            rc = VERR_NOT_SUPPORTED;
     3724        }
     3725    }
     3726
     3727    if (RT_SUCCESS(rc))
     3728    {
     3729        pScreen->pHwScreen = p;
     3730    }
     3731    else
     3732    {
     3733        vmsvga3dHwScreenDestroy(pState, p);
     3734        RTMemFree(p);
     3735    }
     3736
     3737    return rc;
     3738}
     3739
     3740int vmsvga3dBackDestroyScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen)
     3741{
     3742    LogRel4(("VMSVGA: vmsvga3dBackDestroyScreen: screen %u\n", pScreen->idScreen));
     3743
     3744    PVMSVGA3DSTATE pState = pThisCC->svga.p3dState;
     3745    AssertReturn(pState, VERR_NOT_SUPPORTED);
     3746
     3747    int (*oldHandler)(Display*, XErrorEvent*) = XSetErrorHandler(&ctxErrorHandler);
     3748
     3749    VMSVGAHWSCREEN *p = pScreen->pHwScreen;
     3750    if (p)
     3751    {
     3752        pScreen->pHwScreen = NULL;
     3753
     3754        vmsvga3dDrvNotifyHwScreen(pThisCC, VBOX3D_NOTIFY_TYPE_HW_SCREEN_DESTROYED,
     3755                                  pScreen->idScreen, p->pixmap, NULL, 0);
     3756
     3757        vmsvga3dHwScreenDestroy(pState, p);
     3758        RTMemFree(p);
     3759    }
     3760
     3761    XSetErrorHandler(oldHandler);
     3762
     3763    return VINF_SUCCESS;
     3764}
     3765
     3766/* Blit a surface to the GLX pixmap. */
     3767int vmsvga3dBackSurfaceBlitToScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen,
     3768                                    SVGASignedRect destRect, SVGA3dSurfaceImageId srcImage,
     3769                                    SVGASignedRect srcRect, uint32_t cRects, SVGASignedRect *paRects)
     3770{
     3771    PVMSVGA3DSTATE pState = pThisCC->svga.p3dState;
     3772    AssertReturn(pState, VERR_NOT_SUPPORTED);
     3773
     3774    VMSVGAHWSCREEN *p = pScreen->pHwScreen;
     3775    AssertReturn(p, VERR_NOT_SUPPORTED);
     3776
     3777    PVMSVGA3DSURFACE pSurface;
     3778    int rc = vmsvga3dSurfaceFromSid(pState, srcImage.sid, &pSurface);
     3779    AssertRCReturn(rc, rc);
     3780
     3781    if (!VMSVGA3DSURFACE_HAS_HW_SURFACE(pSurface))
     3782    {
     3783        LogFunc(("src sid=%u flags=0x%x format=%d -> create texture\n", srcImage.sid, pSurface->surfaceFlags, pSurface->format));
     3784        rc = vmsvga3dBackCreateTexture(pState, &pState->SharedCtx, VMSVGA3D_SHARED_CTX_ID, pSurface);
     3785        AssertRCReturn(rc, rc);
     3786    }
     3787
     3788    AssertReturn(pSurface->enmOGLResType == VMSVGA3D_OGLRESTYPE_TEXTURE, VERR_NOT_SUPPORTED);
     3789
     3790    PVMSVGA3DMIPMAPLEVEL pMipLevel;
     3791    rc = vmsvga3dMipmapLevel(pSurface, srcImage.face, srcImage.mipmap, &pMipLevel);
     3792    AssertRCReturn(rc, rc);
     3793
     3794    /** @todo Implement. */
     3795    RT_NOREF(destRect, cRects, paRects);
     3796
     3797    /* GLX context is changed here, so other code has to set appropriate context again. */
     3798    VMSVGA3D_CLEAR_CURRENT_CONTEXT(pState);
     3799
     3800    int (*oldHandler)(Display*, XErrorEvent*) = XSetErrorHandler(&ctxErrorHandler);
     3801
     3802    vmsvga3dDrvNotifyHwScreen(pThisCC, VBOX3D_NOTIFY_TYPE_HW_SCREEN_UPDATE_BEGIN, pScreen->idScreen, p->pixmap, NULL, 0);
     3803
     3804    GLint const w = pScreen->cWidth;
     3805    GLint const h = pScreen->cHeight;
     3806
     3807    GLfloat const wSurf = (GLfloat)pMipLevel->mipmapSize.width;
     3808    GLfloat const hSurf = (GLfloat)pMipLevel->mipmapSize.height;
     3809    GLfloat const x1 = (GLfloat)srcRect.left / wSurf;
     3810    GLfloat const y1 = (GLfloat)srcRect.top / hSurf;
     3811    GLfloat const x2 = (GLfloat)srcRect.right / wSurf;
     3812    GLfloat const y2 = (GLfloat)srcRect.bottom / hSurf;
     3813
     3814    //printf("blit to screen src %fx%f %u,%u %u,%u (%f,%f %f,%f) dest %dx%d %u,%u %u,%u\n",
     3815    //       wSurf, hSurf, srcRect.left, srcRect.top, srcRect.right, srcRect.bottom, x1, y1, x2, y2,
     3816    //       w, h, destRect.left, destRect.top, destRect.right, destRect.bottom);
     3817
     3818    Bool fSuccess = glXMakeCurrent(pState->display, p->glxpixmap, p->glxctx);
     3819    if (fSuccess)
     3820    {
     3821        glClear(GL_COLOR_BUFFER_BIT);
     3822
     3823        glBindTexture(GL_TEXTURE_2D, pSurface->oglId.texture); GLCHECK();
     3824
     3825        glBegin(GL_QUADS);
     3826        /** @todo Y inversion. */
     3827        glTexCoord2f(x1, y1); glVertex2i(0, h);
     3828        glTexCoord2f(x1, y2); glVertex2i(0, 0);
     3829        glTexCoord2f(x2, y2); glVertex2i(w, 0);
     3830        glTexCoord2f(x2, y1); glVertex2i(w, h);
     3831        glEnd(); GLCHECK();
     3832
     3833        glBindTexture(GL_TEXTURE_2D, 0); GLCHECK();
     3834
     3835        glFinish(); GLCHECK();
     3836
     3837        glXMakeCurrent(pState->display, None, NULL);
     3838
     3839        vmsvga3dDrvNotifyHwScreen(pThisCC, VBOX3D_NOTIFY_TYPE_HW_SCREEN_UPDATE_END,
     3840                                  pScreen->idScreen, p->pixmap, &destRect, sizeof(destRect));
     3841    }
     3842
     3843    XSetErrorHandler(oldHandler);
     3844
     3845    return VINF_SUCCESS;
     3846}
     3847
     3848#else /* !RT_OS_LINUX */
     3849
     3850int vmsvga3dBackDefineScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen)
     3851{
     3852    RT_NOREF(pThisCC, pScreen);
     3853    return VERR_NOT_IMPLEMENTED;
     3854}
     3855
     3856int vmsvga3dBackDestroyScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen)
     3857{
     3858    RT_NOREF(pThisCC, pScreen);
     3859    return VERR_NOT_IMPLEMENTED;
     3860}
     3861
     3862int vmsvga3dBackSurfaceBlitToScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen,
     3863                                    SVGASignedRect destRect, SVGA3dSurfaceImageId srcImage,
     3864                                    SVGASignedRect srcRect, uint32_t cRects, SVGASignedRect *paRects)
     3865{
     3866    RT_NOREF(pThisCC, pScreen, destRect, srcImage, srcRect, cRects, paRects);
     3867    return VERR_NOT_IMPLEMENTED;
     3868}
     3869#endif
    34633870
    34643871/**
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp

    r84259 r84742  
    27932793}
    27942794
     2795int vmsvga3dBackDefineScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen)
     2796{
     2797    RT_NOREF(pThisCC, pScreen);
     2798    return VERR_NOT_IMPLEMENTED;
     2799}
     2800
     2801int vmsvga3dBackDestroyScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen)
     2802{
     2803    RT_NOREF(pThisCC, pScreen);
     2804    return VERR_NOT_IMPLEMENTED;
     2805}
     2806
     2807int vmsvga3dBackSurfaceBlitToScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen,
     2808                                    SVGASignedRect destRect, SVGA3dSurfaceImageId srcImage,
     2809                                    SVGASignedRect srcRect, uint32_t cRects, SVGASignedRect *paRects)
     2810{
     2811    RT_NOREF(pThisCC, pScreen, destRect, srcImage, srcRect, cRects, paRects);
     2812    return VERR_NOT_IMPLEMENTED;
     2813}
     2814
    27952815static int vmsvga3dContextTrackUsage(PVGASTATECC pThisCC, PVMSVGA3DCONTEXT pContext)
    27962816{
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.cpp

    r83559 r84742  
    837837    src.face = 0;
    838838
     839    if (pScreen->pHwScreen)
     840    {
     841        /* Use the backend accelerated method, if available. */
     842        int rc = vmsvga3dBackSurfaceBlitToScreen(pThisCC, pScreen,
     843                                                 destRect, src, srcRect, cRects, pRect);
     844        if (rc == VINF_SUCCESS)
     845        {
     846            return VINF_SUCCESS;
     847        }
     848    }
     849
    839850    /** @todo scaling */
    840851    AssertReturn(destRect.right - destRect.left == srcRect.right - srcRect.left && destRect.bottom - destRect.top == srcRect.bottom - srcRect.top, VERR_INVALID_PARAMETER);
     
    968979    return VINF_SUCCESS;
    969980}
     981
     982int vmsvga3dDefineScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen)
     983{
     984    if (pScreen->pHwScreen)
     985    {
     986        vmsvga3dBackDestroyScreen(pThisCC, pScreen);
     987    }
     988
     989    return vmsvga3dBackDefineScreen(pThisCC, pScreen);
     990}
     991
     992int vmsvga3dDestroyScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen)
     993{
     994    return vmsvga3dBackDestroyScreen(pThisCC, pScreen);
     995}
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h

    r82968 r84742  
    8181
    8282int vmsvga3dChangeMode(PVGASTATECC pThisCC);
     83
     84int vmsvga3dDefineScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen);
     85int vmsvga3dDestroyScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen);
    8386
    8487int vmsvga3dSetTransform(PVGASTATECC pThisCC, uint32_t cid, SVGA3dTransformType type, float matrix[16]);
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