Changeset 85368 in vbox for trunk/src/VBox/Devices/Graphics
- Timestamp:
- Jul 17, 2020 9:55:56 AM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 139379
- Location:
- trunk/src/VBox/Devices/Graphics
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp
r84919 r85368 4458 4458 # ifdef VBOX_WITH_VMSVGA3D 4459 4459 if (RT_LIKELY(pThis->svga.f3DEnabled)) 4460 vmsvga3dDefineScreen(pThis CC, pScreen);4460 vmsvga3dDefineScreen(pThis, pThisCC, pScreen); 4461 4461 # endif 4462 4462 break; -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.h
r84802 r85368 222 222 /** True when the guest modifies the GFB mode registers. */ 223 223 bool fGFBRegisters; 224 bool afPadding[6]; 224 /** SVGA 3D overlay enabled or not. */ 225 bool f3DOverlayEnabled; 226 bool afPadding[5]; 225 227 uint32_t uWidth; 226 228 uint32_t uHeight; -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-glLdr.cpp
r84725 r85368 203 203 pfn_XSetErrorHandler = 0; 204 204 pfn_XSync = 0; 205 pfn_XScreenNumberOfScreen = 0; 206 pfn_XMapWindow = 0; 207 pfn_XGetWindowAttributes = 0; 205 208 pfn_glXGetFBConfigAttrib = 0; 206 209 pfn_glXGetVisualFromFBConfig = 0; … … 310 313 X11GETPROC_(XSetErrorHandler); 311 314 X11GETPROC_(XSync); 315 X11GETPROC_(XScreenNumberOfScreen); 316 X11GETPROC_(XMapWindow); 317 X11GETPROC_(XGetWindowAttributes); 312 318 GLGETPROC_(glXGetFBConfigAttrib, ""); 313 319 GLGETPROC_(glXGetVisualFromFBConfig, ""); -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-glLdr.h
r84727 r85368 422 422 #define XSync pfn_XSync 423 423 424 GLPFN int (* pfn_XScreenNumberOfScreen)(Screen *screen); 425 #define XScreenNumberOfScreen pfn_XScreenNumberOfScreen 426 427 GLPFN int (* pfn_XMapWindow)(Display *display, Window w); 428 #define XMapWindow pfn_XMapWindow 429 430 GLPFN Status (* pfn_XGetWindowAttributes)(Display *display, Window w, XWindowAttributes *window_attributes_return); 431 #define XGetWindowAttributes pfn_XGetWindowAttributes 432 424 433 #endif 425 434 -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-internal.h
r84742 r85368 1177 1177 uint32_t u32Reserved0; 1178 1178 #if defined(RT_OS_LINUX) 1179 VisualID visualid; 1180 Pixmap pixmap; 1181 GLXPixmap glxpixmap; 1179 /* OpenGL context, which is used for the screen updates. */ 1182 1180 GLXContext glxctx; 1183 bool fYInverted; 1184 bool fMipmap; 1181 1182 /* The overlay window. */ 1183 Window xwindow; 1184 1185 /* The RGBA texture which hold the screen content. */ 1186 GLuint idScreenTexture; 1187 1188 /* Read and draw framebuffer objects for copying a surface to the screen texture. */ 1189 GLuint idReadFramebuffer; 1190 GLuint idDrawFramebuffer; 1185 1191 #endif 1186 1192 } VMSVGAHWSCREEN; 1187 1193 1188 int vmsvga3dBackDefineScreen(PVGASTATE CC pThisCC, VMSVGASCREENOBJECT *pScreen);1194 int vmsvga3dBackDefineScreen(PVGASTATE pThis, PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen); 1189 1195 int vmsvga3dBackDestroyScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen); 1190 1196 -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp
r84914 r85368 3468 3468 3469 3469 /* Send a notification to the UI. */ 3470 #if 0 /* Unused */ 3470 3471 static int vmsvga3dDrvNotifyHwScreen(PVGASTATECC pThisCC, VBOX3D_NOTIFY_TYPE enmNotification, 3471 3472 uint32_t idScreen, Pixmap pixmap, void *pvData, size_t cbData) 3472 3473 { 3473 #if 03474 /* Emulates no support from frontend. */3475 RT_NOREF(pThisCC, enmNotification, idScreen, pixmap, pvData, cbData);3476 return VERR_NOT_SUPPORTED;3477 #else3478 3474 uint8_t au8Buffer[128]; 3479 3475 AssertLogRelMsgReturn(cbData <= sizeof(au8Buffer) - sizeof(VBOX3DNOTIFY), … … 3493 3489 int rc = pThisCC->pDrv->pfn3DNotifyProcess(pThisCC->pDrv, p); 3494 3490 return rc; 3495 #endif 3491 } 3492 #endif /* Unused */ 3493 3494 static void vmsvga3dDrvNotifyHwOverlay(PVGASTATECC pThisCC, VBOX3D_NOTIFY_TYPE enmNotification, uint32_t idScreen) 3495 { 3496 uint8_t au8Buffer[128]; 3497 VBOX3DNOTIFY *p = (VBOX3DNOTIFY *)&au8Buffer[0]; 3498 p->enmNotification = enmNotification; 3499 p->iDisplay = idScreen; 3500 p->u32Reserved = 0; 3501 p->cbData = sizeof(uint64_t); 3502 *(uint64_t *)&p->au8Data[0] = 0; 3503 3504 pThisCC->pDrv->pfn3DNotifyProcess(pThisCC->pDrv, p); 3505 } 3506 3507 /* Get X Window handle of the UI Framebuffer window. */ 3508 static int vmsvga3dDrvQueryWindow(PVGASTATECC pThisCC, uint32_t idScreen, Window *pWindow) 3509 { 3510 uint8_t au8Buffer[128]; 3511 VBOX3DNOTIFY *p = (VBOX3DNOTIFY *)&au8Buffer[0]; 3512 p->enmNotification = VBOX3D_NOTIFY_TYPE_HW_OVERLAY_GET_ID; 3513 p->iDisplay = idScreen; 3514 p->u32Reserved = 0; 3515 p->cbData = sizeof(uint64_t); 3516 *(uint64_t *)&p->au8Data[0] = 0; 3517 3518 int rc = pThisCC->pDrv->pfn3DNotifyProcess(pThisCC->pDrv, p); 3519 if (RT_SUCCESS(rc)) 3520 { 3521 *pWindow = (Window)*(uint64_t *)&p->au8Data[0]; 3522 } 3523 return rc; 3496 3524 } 3497 3525 … … 3503 3531 } 3504 3532 3505 /* Create a GLX pixmap as aHW accelerated screen. */3506 static int vmsvga3dHwScreenCreate(PVMSVGA3DSTATE pState, unsigned int cWidth, unsigned int cHeight, VMSVGAHWSCREEN *p)3533 /* Create an overlay X window for the HW accelerated screen. */ 3534 static int vmsvga3dHwScreenCreate(PVMSVGA3DSTATE pState, Window parentWindow, unsigned int cWidth, unsigned int cHeight, VMSVGAHWSCREEN *p) 3507 3535 { 3508 3536 int (*oldHandler)(Display*, XErrorEvent*) = XSetErrorHandler(&ctxErrorHandler); … … 3510 3538 int rc = VINF_SUCCESS; 3511 3539 3540 XWindowAttributes parentAttr; 3541 if (XGetWindowAttributes(pState->display, parentWindow, &parentAttr) == 0) 3542 return VERR_INVALID_PARAMETER; 3543 3544 int const idxParentScreen = XScreenNumberOfScreen(parentAttr.screen); 3545 3512 3546 /* 3513 * Create a new GL context, which will be used for copying to the screen pixmap.3547 * Create a new GL context, which will be used for copying to the screen. 3514 3548 */ 3515 3549 3516 /* FBConfig attributes. 3517 * Using TEXTURE_2D because Intel Mesa driver does not seem to support TEXTURE_RECTANGLE for GLX pixmaps. 3518 */ 3550 /* FBConfig attributes for the overlay window. */ 3519 3551 static int const aConfigAttribList[] = 3520 3552 { 3521 // GLX_RENDER_TYPE, GLX_RGBA_BIT, 3522 // GLX_X_VISUAL_TYPE, GLX_TRUE_COLOR, 3523 // GLX_X_RENDERABLE, True, // Render to GLX pixmaps 3524 GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT, // Must support GLX pixmaps 3525 GLX_BIND_TO_TEXTURE_RGBA_EXT, True, // Must support GLX_EXT_texture_from_pixmap 3526 GLX_BIND_TO_TEXTURE_TARGETS_EXT, GLX_TEXTURE_2D_BIT_EXT, // Must support GL_TEXTURE_2D for the frontend code 3527 GLX_DOUBLEBUFFER, False, // No need for double buffering for a pixmap. 3553 GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT, // Must support GLX windows 3554 GLX_DOUBLEBUFFER, False, // Double buffering had a much lower performance. 3528 3555 GLX_RED_SIZE, 8, // True color RGB with 8 bits per channel. 3529 3556 GLX_GREEN_SIZE, 8, … … 3532 3559 GLX_STENCIL_SIZE, 0, // No stencil buffer 3533 3560 GLX_DEPTH_SIZE, 0, // No depth buffer 3534 GLX_CONFIG_CAVEAT, GLX_NONE,3535 3561 None 3536 3562 }; … … 3538 3564 /* Find a suitable FB config. */ 3539 3565 int cConfigs = 0; 3540 GLXFBConfig *paConfigs = glXChooseFBConfig(pState->display, 0, aConfigAttribList, &cConfigs);3566 GLXFBConfig *paConfigs = glXChooseFBConfig(pState->display, idxParentScreen, aConfigAttribList, &cConfigs); 3541 3567 LogRel4(("VMSVGA: vmsvga3dHwScreenCreate: paConfigs %p cConfigs %d\n", (void *)paConfigs, cConfigs)); 3542 3568 if (paConfigs) … … 3558 3584 vi->red_mask, vi->green_mask, vi->blue_mask, vi->colormap_size, vi->bits_per_rgb)); 3559 3585 3586 /* Same screen as the parent window. */ 3587 if (vi->screen != idxParentScreen) 3588 continue; 3589 3560 3590 /* Search for 32 bits per pixel. */ 3561 3591 if (vi->depth != 32) … … 3569 3599 int value = 0; 3570 3600 glXGetFBConfigAttrib(pState->display, paConfigs[i], GLX_DRAWABLE_TYPE, &value); 3571 if (!(value & GLX_ PIXMAP_BIT))3601 if (!(value & GLX_WINDOW_BIT)) 3572 3602 continue; 3573 3603 3574 /* Pixmap will be used as TEXTURE_2D. */ 3575 glXGetFBConfigAttrib(pState->display, paConfigs[i], GLX_BIND_TO_TEXTURE_TARGETS_EXT, &value); 3576 if (!(value & GLX_TEXTURE_2D_BIT_EXT)) 3577 continue; 3578 3579 /* Need to bind to a texture using GLX_EXT_texture_from_pixmap. */ 3580 glXGetFBConfigAttrib(pState->display, paConfigs[i], GLX_BIND_TO_TEXTURE_RGBA_EXT, &value); 3581 if (value == 0) 3604 /* This FB config can be used. */ 3605 break; 3606 } 3607 3608 if (i < cConfigs) 3609 { 3610 /* Found a suitable config with index i. */ 3611 3612 /* Create an overlay window. */ 3613 XSetWindowAttributes swa; 3614 RT_ZERO(swa); 3615 3616 swa.colormap = XCreateColormap(pState->display, parentWindow, vi->visual, AllocNone); 3617 AssertLogRelMsg(swa.colormap, ("XCreateColormap failed")); 3618 swa.border_pixel = 0; 3619 swa.background_pixel = 0; 3620 swa.event_mask = StructureNotifyMask; 3621 swa.override_redirect = 1; 3622 unsigned long const swaAttrs = CWBorderPixel | CWBackPixel | CWColormap | CWEventMask | CWOverrideRedirect; 3623 p->xwindow = XCreateWindow(pState->display, parentWindow, 3624 0, 0, cWidth, cHeight, 0, vi->depth, InputOutput, 3625 vi->visual, swaAttrs, &swa); 3626 LogRel4(("VMSVGA: vmsvga3dHwScreenCreate: p->xwindow %ld\n", p->xwindow)); 3627 if (p->xwindow) 3582 3628 { 3583 glXGetFBConfigAttrib(pState->display, paConfigs[i], GLX_BIND_TO_TEXTURE_RGB_EXT, &value); 3584 if (value == 0) 3585 continue; 3629 3630 p->glxctx = glXCreateContext(pState->display, vi, pState->SharedCtx.glxContext, GL_TRUE); 3631 LogRel4(("VMSVGA: vmsvga3dHwScreenCreate: p->glxctx %p\n", (void *)p->glxctx)); 3632 if (p->glxctx) 3633 { 3634 XMapWindow(pState->display, p->xwindow); 3635 } 3636 else 3637 { 3638 LogRel4(("VMSVGA: vmsvga3dHwScreenCreate: glXCreateContext failed\n")); 3639 rc = VERR_NOT_SUPPORTED; 3640 } 3586 3641 } 3587 3588 glXGetFBConfigAttrib(pState->display, paConfigs[i], GLX_Y_INVERTED_EXT, &value); 3589 p->fYInverted = (value == 1); 3590 3591 glXGetFBConfigAttrib(pState->display, paConfigs[i], GLX_BIND_TO_MIPMAP_TEXTURE_EXT, &value); 3592 p->fMipmap = (value > 0); 3593 3594 /* This FB config can be used. */ 3595 break; 3596 } 3597 3598 if (i < cConfigs) 3599 { 3600 /* Found a suitable config with index i. */ 3601 p->visualid = vi->visualid; 3602 3603 Window const rootWindow = RootWindow(pState->display, vi->screen); 3604 p->pixmap = XCreatePixmap(pState->display, rootWindow, cWidth, cHeight, vi->depth); 3605 LogRel4(("VMSVGA: vmsvga3dHwScreenCreate: p->pixmap %ld\n", p->pixmap)); 3606 3607 static int const aPixmapAttribList[] = 3642 else 3608 3643 { 3609 GLX_TEXTURE_TARGET_EXT, GLX_TEXTURE_2D_EXT, 3610 GLX_TEXTURE_FORMAT_EXT, GLX_TEXTURE_FORMAT_RGBA_EXT, 3611 GLX_MIPMAP_TEXTURE_EXT, p->fMipmap, 3612 None 3613 }; 3614 p->glxpixmap = glXCreatePixmap(pState->display, paConfigs[i], p->pixmap, aPixmapAttribList); 3615 LogRel4(("VMSVGA: vmsvga3dHwScreenCreate: p->glxpixmap %ld\n", p->glxpixmap)); 3616 3617 p->glxctx = glXCreateContext(pState->display, vi, pState->SharedCtx.glxContext, GL_TRUE); 3618 LogRel4(("VMSVGA: vmsvga3dHwScreenCreate: p->glxctx %p\n", (void *)p->glxctx)); 3644 LogRel4(("VMSVGA: vmsvga3dHwScreenCreate: XCreateWindow failed\n")); 3645 rc = VERR_NOT_SUPPORTED; 3646 } 3619 3647 3620 3648 XSync(pState->display, False); … … 3648 3676 if (p) 3649 3677 { 3650 LogRel4(("VMSVGA: vmsvga3dHwScreenDestroy: p-> glxpixmap %ld, ctx %p\n", p->glxpixmap, (void *)p->glxctx));3678 LogRel4(("VMSVGA: vmsvga3dHwScreenDestroy: p->xwindow %ld, ctx %p\n", p->xwindow, (void *)p->glxctx)); 3651 3679 if (p->glxctx) 3652 3680 { 3653 3681 /* GLX context is changed here, so other code has to set the appropriate context again. */ 3654 3682 VMSVGA3D_CLEAR_CURRENT_CONTEXT(pState); 3683 3684 glXMakeCurrent(pState->display, p->xwindow, p->glxctx); 3685 3686 /* Clean up OpenGL. */ 3687 if (p->idReadFramebuffer != OPENGL_INVALID_ID) 3688 pState->ext.glDeleteFramebuffers(1, &p->idReadFramebuffer); 3689 if (p->idDrawFramebuffer != OPENGL_INVALID_ID) 3690 pState->ext.glDeleteFramebuffers(1, &p->idDrawFramebuffer); 3691 if (p->idScreenTexture != OPENGL_INVALID_ID) 3692 glDeleteTextures(1, &p->idScreenTexture); 3693 3655 3694 glXMakeCurrent(pState->display, None, NULL); 3695 3656 3696 glXDestroyContext(pState->display, p->glxctx); 3657 3697 } 3658 3698 3659 if (p->glxpixmap) 3660 glXDestroyPixmap(pState->display, p->glxpixmap); 3661 3662 if (p->pixmap) 3663 XFreePixmap(pState->display, p->pixmap); 3699 if (p->xwindow) 3700 XDestroyWindow(pState->display, p->xwindow); 3664 3701 3665 3702 RT_ZERO(*p); … … 3673 3710 } while(0) 3674 3711 3675 int vmsvga3dBackDefineScreen(PVGASTATE CC pThisCC, VMSVGASCREENOBJECT *pScreen)3712 int vmsvga3dBackDefineScreen(PVGASTATE pThis, PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen) 3676 3713 { 3677 3714 LogRel4(("VMSVGA: vmsvga3dBackDefineScreen: screen %u\n", pScreen->idScreen)); … … 3680 3717 AssertReturn(pState, VERR_NOT_SUPPORTED); 3681 3718 3719 if (!pThis->svga.f3DOverlayEnabled) 3720 return VERR_NOT_SUPPORTED; 3721 3682 3722 Assert(pScreen->pHwScreen == NULL); 3683 3723 … … 3685 3725 AssertPtrReturn(p, VERR_NO_MEMORY); 3686 3726 3687 int rc = vmsvga3dHwScreenCreate(pState, pScreen->cWidth, pScreen->cHeight, p); 3727 /* Query the parent window ID from the UI framebuffer. 3728 * If it is there then 3729 * the device will create a texture for the screen content and an overlay window to present the screen content. 3730 * otherwise 3731 * the device will use the guest VRAM system memory for the screen content. 3732 */ 3733 Window parentWindow; 3734 int rc = vmsvga3dDrvQueryWindow(pThisCC, pScreen->idScreen, &parentWindow); 3688 3735 if (RT_SUCCESS(rc)) 3689 3736 { 3690 /* 3691 * Setup the OpenGL context of the screen. 3692 */ 3693 3694 /* GLX context is changed here, so other code has to set the appropriate context again. */ 3695 VMSVGA3D_CLEAR_CURRENT_CONTEXT(pState); 3696 3697 Bool const fSuccess = glXMakeCurrent(pState->display, p->glxpixmap, p->glxctx); 3698 if (fSuccess) 3699 { 3700 /* Work in screen coordinates. */ 3701 glMatrixMode(GL_MODELVIEW); 3702 glLoadIdentity(); 3703 glOrtho(0, pScreen->cWidth, 0, pScreen->cHeight, -1, 1); 3704 glMatrixMode(GL_PROJECTION); 3705 glLoadIdentity(); 3706 3707 /* Set GL state. */ 3708 glClearColor(0, 0, 0, 1); 3709 glEnable(GL_TEXTURE_2D); 3710 glDisable(GL_DEPTH_TEST); 3711 glDisable(GL_CULL_FACE); 3712 3713 /* Clear the pixmap. */ 3714 glClear(GL_COLOR_BUFFER_BIT); 3715 glFinish(); 3716 3717 glXMakeCurrent(pState->display, None, NULL); 3718 3719 rc = vmsvga3dDrvNotifyHwScreen(pThisCC, VBOX3D_NOTIFY_TYPE_HW_SCREEN_CREATED, 3720 pScreen->idScreen, p->pixmap, &p->visualid, sizeof(p->visualid)); 3721 } 3722 else 3723 { 3724 LogRel4(("VMSVGA: vmsvga3dBackDefineScreen: failed to set current context\n")); 3725 rc = VERR_NOT_SUPPORTED; 3726 } 3737 /* Create the hardware accelerated screen. */ 3738 rc = vmsvga3dHwScreenCreate(pState, parentWindow, pScreen->cWidth, pScreen->cHeight, p); 3739 if (RT_SUCCESS(rc)) 3740 { 3741 /* 3742 * Setup the OpenGL context of the screen. The context will be used to draw on the screen. 3743 */ 3744 3745 /* GLX context is changed here, so other code has to set the appropriate context again. */ 3746 VMSVGA3D_CLEAR_CURRENT_CONTEXT(pState); 3747 3748 Bool const fSuccess = glXMakeCurrent(pState->display, p->xwindow, p->glxctx); 3749 if (fSuccess) 3750 { 3751 /* Set GL state. */ 3752 glClearColor(0, 0, 0, 1); 3753 glEnable(GL_TEXTURE_2D); 3754 glDisable(GL_DEPTH_TEST); 3755 glDisable(GL_CULL_FACE); 3756 3757 /* The RGBA texture which hold the screen content. */ 3758 glGenTextures(1, &p->idScreenTexture); GLCHECK(); 3759 glBindTexture(GL_TEXTURE_2D, p->idScreenTexture); GLCHECK(); 3760 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); GLCHECK(); 3761 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); GLCHECK(); 3762 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, pScreen->cWidth, pScreen->cHeight, 0, 3763 GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL); GLCHECK(); 3764 3765 /* Create read and draw framebuffer objects for this screen. */ 3766 pState->ext.glGenFramebuffers(1, &p->idReadFramebuffer); GLCHECK(); 3767 pState->ext.glGenFramebuffers(1, &p->idDrawFramebuffer); GLCHECK(); 3768 3769 /* Work in screen coordinates. */ 3770 glMatrixMode(GL_MODELVIEW); 3771 glLoadIdentity(); 3772 glOrtho(0, pScreen->cWidth, 0, pScreen->cHeight, -1, 1); 3773 glMatrixMode(GL_PROJECTION); 3774 glLoadIdentity(); 3775 3776 /* Clear the texture. */ 3777 pState->ext.glBindFramebuffer(GL_DRAW_FRAMEBUFFER, p->idDrawFramebuffer); GLCHECK(); 3778 pState->ext.glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 3779 p->idScreenTexture, 0); GLCHECK(); 3780 3781 glClear(GL_COLOR_BUFFER_BIT); 3782 3783 pState->ext.glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); GLCHECK(); 3784 3785 glXMakeCurrent(pState->display, None, NULL); 3786 3787 XSync(pState->display, False); 3788 3789 vmsvga3dDrvNotifyHwOverlay(pThisCC, VBOX3D_NOTIFY_TYPE_HW_OVERLAY_CREATED, pScreen->idScreen); 3790 } 3791 else 3792 { 3793 LogRel4(("VMSVGA: vmsvga3dBackDefineScreen: failed to set current context\n")); 3794 rc = VERR_NOT_SUPPORTED; 3795 } 3796 } 3797 } 3798 else 3799 { 3800 LogRel4(("VMSVGA: vmsvga3dBackDefineScreen: no framebuffer\n")); 3727 3801 } 3728 3802 3729 3803 if (RT_SUCCESS(rc)) 3730 3804 { 3805 LogRel(("VMSVGA: Using HW accelerated screen %u\n", pScreen->idScreen)); 3731 3806 pScreen->pHwScreen = p; 3732 3807 } … … 3755 3830 pScreen->pHwScreen = NULL; 3756 3831 3757 vmsvga3dDrvNotifyHwScreen(pThisCC, VBOX3D_NOTIFY_TYPE_HW_SCREEN_DESTROYED, 3758 pScreen->idScreen, p->pixmap, NULL, 0); 3832 vmsvga3dDrvNotifyHwOverlay(pThisCC, VBOX3D_NOTIFY_TYPE_HW_OVERLAY_DESTROYED, pScreen->idScreen); 3759 3833 3760 3834 vmsvga3dHwScreenDestroy(pState, p); … … 3796 3870 3797 3871 /** @todo Implement. */ 3798 RT_NOREF( destRect,cRects, paRects);3872 RT_NOREF(cRects, paRects); 3799 3873 3800 3874 /* GLX context is changed here, so other code has to set appropriate context again. */ … … 3803 3877 int (*oldHandler)(Display*, XErrorEvent*) = XSetErrorHandler(&ctxErrorHandler); 3804 3878 3805 vmsvga3dDrvNotifyHwScreen(pThisCC, VBOX3D_NOTIFY_TYPE_HW_SCREEN_UPDATE_BEGIN, pScreen->idScreen, p->pixmap, NULL, 0); 3806 3807 GLint const w = pScreen->cWidth; 3808 GLint const h = pScreen->cHeight; 3809 3810 GLfloat const wSurf = (GLfloat)pMipLevel->mipmapSize.width; 3811 GLfloat const hSurf = (GLfloat)pMipLevel->mipmapSize.height; 3812 GLfloat const x1 = (GLfloat)srcRect.left / wSurf; 3813 GLfloat const y1 = (GLfloat)srcRect.top / hSurf; 3814 GLfloat const x2 = (GLfloat)srcRect.right / wSurf; 3815 GLfloat const y2 = (GLfloat)srcRect.bottom / hSurf; 3816 3817 //printf("blit to screen src %fx%f %u,%u %u,%u (%f,%f %f,%f) dest %dx%d %u,%u %u,%u\n", 3818 // wSurf, hSurf, srcRect.left, srcRect.top, srcRect.right, srcRect.bottom, x1, y1, x2, y2, 3819 // w, h, destRect.left, destRect.top, destRect.right, destRect.bottom); 3820 3821 Bool fSuccess = glXMakeCurrent(pState->display, p->glxpixmap, p->glxctx); 3879 Bool fSuccess = glXMakeCurrent(pState->display, p->xwindow, p->glxctx); 3822 3880 if (fSuccess) 3823 3881 { 3882 /* Activate the read and draw framebuffer objects. */ 3883 pState->ext.glBindFramebuffer(GL_READ_FRAMEBUFFER, p->idReadFramebuffer); GLCHECK(); 3884 pState->ext.glBindFramebuffer(GL_DRAW_FRAMEBUFFER, p->idDrawFramebuffer); GLCHECK(); 3885 3886 /* Bind the source and destination objects to the right place. */ 3887 pState->ext.glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 3888 pSurface->oglId.texture, 0); GLCHECK(); 3889 pState->ext.glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 3890 p->idScreenTexture, 0); GLCHECK(); 3891 3892 pState->ext.glBlitFramebuffer(srcRect.left, 3893 srcRect.top, 3894 srcRect.right, 3895 srcRect.bottom, 3896 destRect.left, 3897 destRect.top, 3898 destRect.right, 3899 destRect.bottom, 3900 GL_COLOR_BUFFER_BIT, 3901 GL_NEAREST); GLCHECK(); 3902 3903 /* Reset the frame buffer association */ 3904 pState->ext.glBindFramebuffer(GL_FRAMEBUFFER, 0); GLCHECK(); 3905 3906 /* Update the overlay window. */ 3824 3907 glClear(GL_COLOR_BUFFER_BIT); 3825 3908 3826 glBindTexture(GL_TEXTURE_2D, pSurface->oglId.texture); GLCHECK(); 3909 glBindTexture(GL_TEXTURE_2D, p->idScreenTexture); GLCHECK(); 3910 3911 GLint const w = pScreen->cWidth; 3912 GLint const h = pScreen->cHeight; 3827 3913 3828 3914 glBegin(GL_QUADS); 3829 /** @todo Y inversion. */ 3830 glTexCoord2f(x1, y1); glVertex2i(0, h); 3831 glTexCoord2f(x1, y2); glVertex2i(0, 0); 3832 glTexCoord2f(x2, y2); glVertex2i(w, 0); 3833 glTexCoord2f(x2, y1); glVertex2i(w, h); 3915 glTexCoord2f(0.0f, 0.0f); glVertex2i(0, h); 3916 glTexCoord2f(0.0f, 1.0f); glVertex2i(0, 0); 3917 glTexCoord2f(1.0f, 1.0f); glVertex2i(w, 0); 3918 glTexCoord2f(1.0f, 0.0f); glVertex2i(w, h); 3834 3919 glEnd(); GLCHECK(); 3835 3920 3836 3921 glBindTexture(GL_TEXTURE_2D, 0); GLCHECK(); 3837 3922 3838 glFinish(); GLCHECK();3839 3840 3923 glXMakeCurrent(pState->display, None, NULL); 3841 3842 vmsvga3dDrvNotifyHwScreen(pThisCC, VBOX3D_NOTIFY_TYPE_HW_SCREEN_UPDATE_END, 3843 pScreen->idScreen, p->pixmap, &destRect, sizeof(destRect)); 3924 } 3925 else 3926 { 3927 LogRel4(("VMSVGA: vmsvga3dBackSurfaceBlitToScreen: screen %u, glXMakeCurrent for pixmap failed\n", pScreen->idScreen)); 3844 3928 } 3845 3929 … … 3851 3935 #else /* !RT_OS_LINUX */ 3852 3936 3853 int vmsvga3dBackDefineScreen(PVGASTATE CC pThisCC, VMSVGASCREENOBJECT *pScreen)3937 int vmsvga3dBackDefineScreen(PVGASTATE pThis, PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen) 3854 3938 { 3855 3939 RT_NOREF(pThisCC, pScreen); -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp
r85156 r85368 2816 2816 } 2817 2817 2818 int vmsvga3dBackDefineScreen(PVGASTATE CC pThisCC, VMSVGASCREENOBJECT *pScreen)2818 int vmsvga3dBackDefineScreen(PVGASTATE pThis, PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen) 2819 2819 { 2820 2820 RT_NOREF(pThisCC, pScreen); -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.cpp
r84747 r85368 980 980 } 981 981 982 int vmsvga3dDefineScreen(PVGASTATE CC pThisCC, VMSVGASCREENOBJECT *pScreen)982 int vmsvga3dDefineScreen(PVGASTATE pThis, PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen) 983 983 { 984 984 if (pScreen->pHwScreen) … … 987 987 } 988 988 989 int rc = vmsvga3dBackDefineScreen(pThis CC, pScreen);989 int rc = vmsvga3dBackDefineScreen(pThis, pThisCC, pScreen); 990 990 if (RT_SUCCESS(rc)) 991 991 { -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h
r85121 r85368 82 82 int vmsvga3dChangeMode(PVGASTATECC pThisCC); 83 83 84 int vmsvga3dDefineScreen(PVGASTATE CC pThisCC, VMSVGASCREENOBJECT *pScreen);84 int vmsvga3dDefineScreen(PVGASTATE pThis, PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen); 85 85 int vmsvga3dDestroyScreen(PVGASTATECC pThisCC, VMSVGASCREENOBJECT *pScreen); 86 86 -
trunk/src/VBox/Devices/Graphics/DevVGA.cpp
r84834 r85368 6476 6476 # ifdef VBOX_WITH_VMSVGA3D 6477 6477 "|VMSVGA3dEnabled" 6478 "|VMSVGA3dOverlayEnabled" 6478 6479 # endif 6479 6480 "|SuppressNewYearSplash" … … 6531 6532 AssertLogRelRCReturn(rc, rc); 6532 6533 Log(("VMSVGA: VMSVGA3dEnabled = %d\n", pThis->svga.f3DEnabled)); 6534 6535 rc = pHlp->pfnCFGMQueryBoolDef(pCfg, "VMSVGA3dOverlayEnabled", &pThis->svga.f3DOverlayEnabled, false); 6536 AssertLogRelRCReturn(rc, rc); 6537 Log(("VMSVGA: VMSVGA3dOverlayEnabled = %d\n", pThis->svga.f3DOverlayEnabled)); 6533 6538 # endif 6534 6539
Note:
See TracChangeset
for help on using the changeset viewer.