Changeset 84742 in vbox for trunk/src/VBox/Devices/Graphics
- Timestamp:
- Jun 9, 2020 5:49:09 PM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 138536
- Location:
- trunk/src/VBox/Devices/Graphics
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp
r84737 r84742 13 13 * - LogRel2 for cursor. 14 14 * - LogRel3 for 3D performance data. 15 * - LogRel4 for HW accelerated graphics output. 15 16 */ 16 17 … … 169 170 # include "DevVGA-SVGA3d-cocoa.h" 170 171 # endif 172 # ifdef RT_OS_LINUX 173 # ifdef IN_RING3 174 #include "DevVGA-SVGA3d-glLdr.h" 175 # endif 176 # endif 171 177 #endif 172 178 … … 582 588 return NULL; 583 589 } 590 591 void 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 } 584 600 #endif /* IN_RING3 */ 585 601 … … 3090 3106 { 3091 3107 /* The 3d subsystem must be reset from the fifo thread. */ 3108 vmsvgaR3ResetScreens(pThisCC); /** @todo Also destroy screens on PowerOff. */ 3092 3109 vmsvga3dReset(pThisCC); 3093 3110 } … … 3637 3654 int rc; 3638 3655 3656 # ifdef RT_OS_LINUX 3657 XInitThreads(); 3658 # endif 3659 3639 3660 if (pThread->enmState == PDMTHREADSTATE_INITIALIZING) 3640 3661 return VINF_SUCCESS; … … 4417 4438 pThis->svga.fGFBRegisters = false; 4418 4439 vmsvgaR3ChangeMode(pThis, pThisCC); 4440 4441 # ifdef VBOX_WITH_VMSVGA3D 4442 vmsvga3dDefineScreen(pThisCC, pScreen); 4443 # endif 4419 4444 break; 4420 4445 } … … 4437 4462 pScreen->idScreen = idScreen; 4438 4463 4464 # ifdef VBOX_WITH_VMSVGA3D 4465 vmsvga3dDestroyScreen(pThisCC, pScreen); 4466 # endif 4439 4467 vmsvgaR3ChangeMode(pThis, pThisCC); 4440 4468 break; -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.h
r83278 r84742 126 126 uint32_t uAlignment; 127 127 } VMSVGAVIEWPORT; 128 129 #ifdef VBOX_WITH_VMSVGA3D 130 typedef struct VMSVGAHWSCREEN *PVMSVGAHWSCREEN; 131 #endif 128 132 129 133 /** … … 149 153 bool fDefined; 150 154 bool fModified; 155 #ifdef VBOX_WITH_VMSVGA3D 156 /** Pointer to the HW accelerated (3D) screen data. */ 157 R3PTRTYPE(PVMSVGAHWSCREEN) pHwScreen; 158 #endif 151 159 } VMSVGASCREENOBJECT; 152 160 -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-internal.h
r83620 r84742 1168 1168 #endif /* VMSVGA3D_INCL_STRUCTURE_DESCRIPTORS */ 1169 1169 1170 /** 1171 * VMSVGA3d screen data. 1172 * 1173 * Allocated on the heap and pointed to by VMSVGASCREENOBJECT::pHwScreen. 1174 */ 1175 typedef 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 1188 int vmsvga3dBackDefineScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen); 1189 int vmsvga3dBackDestroyScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen); 1190 1191 int vmsvga3dBackSurfaceBlitToScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen, 1192 SVGASignedRect destRect, SVGA3dSurfaceImageId srcImage, 1193 SVGASignedRect srcRect, uint32_t cRects, SVGASignedRect *paRects); 1170 1194 1171 1195 #ifdef VMSVGA3D_DIRECT3D -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp
r84136 r84742 41 41 42 42 #include <VBoxVideo.h> /* required by DevVGA.h */ 43 #include <VBoxVideo3D.h> 43 44 44 45 /* should go BEFORE any other DevVGA include to make all DevVGA.h config defines be visible */ … … 3461 3462 } 3462 3463 3464 #if defined(RT_OS_LINUX) 3465 /* 3466 * HW accelerated graphics output. 3467 */ 3468 3469 /* Send a notification to the UI. */ 3470 static 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 3498 static 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. */ 3506 static 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. */ 3644 static 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 3673 int 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 3740 int 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. */ 3767 int 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 3850 int vmsvga3dBackDefineScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen) 3851 { 3852 RT_NOREF(pThisCC, pScreen); 3853 return VERR_NOT_IMPLEMENTED; 3854 } 3855 3856 int vmsvga3dBackDestroyScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen) 3857 { 3858 RT_NOREF(pThisCC, pScreen); 3859 return VERR_NOT_IMPLEMENTED; 3860 } 3861 3862 int 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 3463 3870 3464 3871 /** -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp
r84259 r84742 2793 2793 } 2794 2794 2795 int vmsvga3dBackDefineScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen) 2796 { 2797 RT_NOREF(pThisCC, pScreen); 2798 return VERR_NOT_IMPLEMENTED; 2799 } 2800 2801 int vmsvga3dBackDestroyScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen) 2802 { 2803 RT_NOREF(pThisCC, pScreen); 2804 return VERR_NOT_IMPLEMENTED; 2805 } 2806 2807 int 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 2795 2815 static int vmsvga3dContextTrackUsage(PVGASTATECC pThisCC, PVMSVGA3DCONTEXT pContext) 2796 2816 { -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.cpp
r83559 r84742 837 837 src.face = 0; 838 838 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 839 850 /** @todo scaling */ 840 851 AssertReturn(destRect.right - destRect.left == srcRect.right - srcRect.left && destRect.bottom - destRect.top == srcRect.bottom - srcRect.top, VERR_INVALID_PARAMETER); … … 968 979 return VINF_SUCCESS; 969 980 } 981 982 int vmsvga3dDefineScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen) 983 { 984 if (pScreen->pHwScreen) 985 { 986 vmsvga3dBackDestroyScreen(pThisCC, pScreen); 987 } 988 989 return vmsvga3dBackDefineScreen(pThisCC, pScreen); 990 } 991 992 int vmsvga3dDestroyScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen) 993 { 994 return vmsvga3dBackDestroyScreen(pThisCC, pScreen); 995 } -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h
r82968 r84742 81 81 82 82 int vmsvga3dChangeMode(PVGASTATECC pThisCC); 83 84 int vmsvga3dDefineScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen); 85 int vmsvga3dDestroyScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen); 83 86 84 87 int vmsvga3dSetTransform(PVGASTATECC pThisCC, uint32_t cid, SVGA3dTransformType type, float matrix[16]);
Note:
See TracChangeset
for help on using the changeset viewer.