VirtualBox

Changeset 69904 in vbox


Ignore:
Timestamp:
Dec 1, 2017 8:29:24 PM (7 years ago)
Author:
vboxsync
Message:

Devices/Graphics: VMSVGA: take screen offset into account; saved state for occlusion query; increase saved state version.

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

Legend:

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

    r69624 r69904  
    487487    SSMFIELD_ENTRY(                 VMSVGAState, uBpp),
    488488    SSMFIELD_ENTRY(                 VMSVGAState, cbScanline),
     489    SSMFIELD_ENTRY_VER(             VMSVGAState, uScreenOffset, VGA_SAVEDSTATE_VERSION_VMSVGA),
     490    SSMFIELD_ENTRY_IGNORE(          VMSVGAState, uLastScreenOffset), /* VGA_SAVEDSTATE_VERSION_VMSVGA */
    489491    SSMFIELD_ENTRY(                 VMSVGAState, u32MaxWidth),
    490492    SSMFIELD_ENTRY(                 VMSVGAState, u32MaxHeight),
     
    12331235        &&  pThis->last_width       == (unsigned)pThis->svga.uWidth
    12341236        &&  pThis->last_height      == (unsigned)pThis->svga.uHeight
     1237        &&  pThis->svga.uLastScreenOffset == pThis->svga.uScreenOffset
    12351238        )
    12361239    {
     
    12401243    }
    12411244
    1242     Log(("vmsvgaChangeMode: sEnable LFB mode and resize to (%d,%d) bpp=%d\n", pThis->svga.uWidth, pThis->svga.uHeight, pThis->svga.uBpp));
     1245    LogFunc(("Enable LFB mode and resize to (%d,%d) bpp=%d uScreenOffset 0x%x\n", pThis->svga.uWidth, pThis->svga.uHeight, pThis->svga.uBpp, pThis->svga.uScreenOffset));
    12431246    pThis->svga.cbScanline = ((pThis->svga.uWidth * pThis->svga.uBpp + 7) & ~7) / 8;
    12441247
    12451248    pThis->pDrv->pfnLFBModeChange(pThis->pDrv, true);
    1246     rc = pThis->pDrv->pfnResize(pThis->pDrv, pThis->svga.uBpp, pThis->CTX_SUFF(vram_ptr), pThis->svga.cbScanline, pThis->svga.uWidth, pThis->svga.uHeight);
     1249
     1250    VBVAINFOVIEW view;
     1251    view.u32ViewIndex     = 0;
     1252    view.u32ViewOffset    = 0;
     1253    view.u32ViewSize      = pThis->vram_size;
     1254    view.u32MaxScreenSize = pThis->vram_size;
     1255
     1256    VBVAINFOSCREEN screen;
     1257    screen.u32ViewIndex    = 0;
     1258    screen.i32OriginX      = 0;
     1259    screen.i32OriginY      = 0;
     1260    screen.u32StartOffset  = pThis->svga.uScreenOffset;
     1261    screen.u32LineSize     = pThis->svga.cbScanline;
     1262    screen.u32Width        = pThis->svga.uWidth;
     1263    screen.u32Height       = pThis->svga.uHeight;
     1264    screen.u16BitsPerPixel = pThis->svga.uBpp;
     1265    screen.u16Flags        = VBVA_SCREEN_F_ACTIVE;
     1266
     1267    rc = pThis->pDrv->pfnVBVAResize(pThis->pDrv, &view, &screen, pThis->CTX_SUFF(vram_ptr), /*fResetInputMapping=*/ true);
    12471268    AssertRC(rc);
    12481269    AssertReturn(rc == VINF_SUCCESS || rc == VINF_VGA_RESIZE_IN_PROGRESS, rc);
     
    12541275    pThis->last_width       = pThis->svga.uWidth;
    12551276    pThis->last_height      = pThis->svga.uHeight;
     1277    pThis->svga.uLastScreenOffset = pThis->svga.uScreenOffset;
    12561278
    12571279    ASMAtomicOrU32(&pThis->svga.u32ActionFlags, VMSVGA_ACTION_CHANGEMODE);
     
    36093631                SVGAFifoCmdDefineScreen *pCmd;
    36103632                VMSVGAFIFO_GET_CMD_BUFFER_BREAK(pCmd, SVGAFifoCmdDefineScreen, sizeof(pCmd->screen.structSize));
    3611                 RT_BZERO(&pCmd->screen.id, sizeof(*pCmd) - RT_OFFSETOF(SVGAFifoCmdDefineScreen, screen.structSize));
     3633                RT_BZERO(&pCmd->screen.id, sizeof(*pCmd) - RT_OFFSETOF(SVGAFifoCmdDefineScreen, screen.id));
    36123634                VMSVGAFIFO_GET_MORE_CMD_BUFFER_BREAK(pCmd, SVGAFifoCmdDefineScreen, RT_MAX(sizeof(pCmd->screen.structSize), pCmd->screen.structSize));
    36133635                STAM_REL_COUNTER_INC(&pSVGAState->StatR3CmdDefineScreen);
     
    36253647                    Log(("vmsvgaFIFOLoop: SVGA_CMD_DEFINE_SCREEN flags SVGA_SCREEN_BLANKING\n"));
    36263648
     3649                const uint32_t uWidth = pCmd->screen.size.width;
     3650                AssertBreak(0 < uWidth && uWidth <= pThis->svga.u32MaxWidth);
     3651
     3652                const uint32_t uHeight = pCmd->screen.size.height;
     3653                AssertBreak(0 < uHeight && uHeight <= pThis->svga.u32MaxHeight);
     3654
     3655                const uint32_t cbWidth = uWidth * ((pThis->svga.uBpp + 7) / 8);
     3656                const uint32_t cbPitch = pCmd->screen.backingStore.pitch ? pCmd->screen.backingStore.pitch : cbWidth;
     3657                AssertBreak(0 < cbWidth && cbWidth <= cbPitch);
     3658
     3659                const uint32_t uScreenOffset = pCmd->screen.backingStore.ptr.offset;
     3660                AssertBreak(uScreenOffset < pThis->vram_size);
     3661
     3662                const uint32_t cbVram = pThis->vram_size - uScreenOffset;
     3663                AssertBreak(uHeight <= cbVram / cbPitch);
     3664
    36273665                /** @todo multi monitor support and screen object capabilities.   */
    3628                 pThis->svga.uWidth  = pCmd->screen.size.width;
    3629                 pThis->svga.uHeight = pCmd->screen.size.height;
     3666                pThis->svga.uWidth        = uWidth;
     3667                pThis->svga.uHeight       = uHeight;
     3668                pThis->svga.uScreenOffset = uScreenOffset;
    36303669                vmsvgaChangeMode(pThis);
    36313670                break;
     
    36943733                AssertBreak(pSVGAState->GMRFB.format.s.bitsPerPixel != 0);
    36953734
    3696                 const uint32_t cScanlines = pThis->vram_size / pSVGAState->GMRFB.bytesPerLine;
     3735                AssertBreak(pThis->svga.uScreenOffset < pThis->vram_size); /* Paranoia. Ensured by SVGA_CMD_DEFINE_SCREEN. */
     3736                const uint32_t cbVram = pThis->vram_size - pThis->svga.uScreenOffset;
     3737
     3738                const uint32_t cScanlines = cbVram / pSVGAState->GMRFB.bytesPerLine;
    36973739                AssertBreak(pCmd->srcOrigin.y < (int32_t)cScanlines);
    36983740
     
    37033745                unsigned cbCopyWidth  = (width * RT_ALIGN(pThis->svga.uBpp, 8)) / 8;
    37043746
    3705                 AssertBreak(offsetDest < pThis->vram_size);
     3747                AssertBreak(offsetDest < cbVram);
     3748                offsetDest += pThis->svga.uScreenOffset;
    37063749
    37073750                rc = vmsvgaGMRTransfer(pThis, SVGA3D_WRITE_HOST_VRAM, pThis->CTX_SUFF(vram_ptr) + offsetDest, pThis->svga.cbScanline, pSVGAState->GMRFB.ptr, offsetSource, pSVGAState->GMRFB.bytesPerLine, cbCopyWidth, height);
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.h

    r69500 r69904  
    210210    uint32_t                    uBpp;
    211211    uint32_t                    cbScanline;
     212    uint32_t                    uScreenOffset;
     213    uint32_t                    uLastScreenOffset;
    212214    /** Maximum width supported. */
    213215    uint32_t                    u32MaxWidth;
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp

    r69859 r69904  
    13631363    case SVGA3D_DEVCAP_MAX_VOLUME_EXTENT:
    13641364        //*pu32Val = pCaps->MaxVolumeExtent;
     1365        *pu32Val = 256;
    13651366        break;
    13661367
     
    25972598
    25982599        dst.ptr.gmrId  = SVGA_GMR_FRAMEBUFFER;
    2599         dst.ptr.offset = 0;
     2600        dst.ptr.offset = pThis->svga.uScreenOffset;
    26002601        dst.pitch      = pThis->svga.cbScanline;
    26012602
     
    26162617
    26172618        dst.ptr.gmrId  = SVGA_GMR_FRAMEBUFFER;
    2618         dst.ptr.offset = 0;
     2619        dst.ptr.offset = pThis->svga.uScreenOffset;
    26192620        dst.pitch      = pThis->svga.cbScanline;
    26202621
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-savedstate.cpp

    r69415 r69904  
    345345            }
    346346
    347 #if 0 /** @todo */
    348             if (uVersion >= VGA_SAVEDSTATE_VERSION_VMSVGA_TEX_STAGES) /** @todo VGA_SAVEDSTATE_VERSION_VMSVGA_3D */
     347            if (uVersion >= VGA_SAVEDSTATE_VERSION_VMSVGA)
    349348            {
    350349                VMSVGA3DQUERY query;
     
    384383                }
    385384            }
    386 #endif
    387385        }
    388386    }
     
    504502static int vmsvga3dSaveContext(PVGASTATE pThis, PSSMHANDLE pSSM, PVMSVGA3DCONTEXT pContext)
    505503{
    506     RT_NOREF(pThis);
     504    PVMSVGA3DSTATE pState = pThis->svga.p3dState;
    507505    uint32_t cid = pContext->id;
    508506
     
    601599        }
    602600
    603 #if 0 /** @todo Enable later. */
    604         PVMSVGA3DSTATE pState = pThis->svga.p3dState;
    605601        /* Occlusion query. */
    606602        if (!VMSVGA3DQUERY_EXISTS(&pContext->occlusion))
     
    635631        rc = SSMR3PutStructEx(pSSM, &pContext->occlusion, sizeof(pContext->occlusion), 0, g_aVMSVGA3DQUERYFields, NULL);
    636632        AssertRCReturn(rc, rc);
    637 #endif
    638633    }
    639634
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp

    r69869 r69904  
    23972397
    23982398        dest.ptr.gmrId  = SVGA_GMR_FRAMEBUFFER;
    2399         dest.ptr.offset = 0;
     2399        dest.ptr.offset = pThis->svga.uScreenOffset;
    24002400        dest.pitch      = pThis->svga.cbScanline;
    24012401
     
    24162416
    24172417        dest.ptr.gmrId  = SVGA_GMR_FRAMEBUFFER;
    2418         dest.ptr.offset = 0;
     2418        dest.ptr.offset = pThis->svga.uScreenOffset;
    24192419        dest.pitch      = pThis->svga.cbScanline;
    24202420
  • trunk/src/VBox/Devices/Graphics/DevVGASavedState.h

    r69500 r69904  
    4545    } while (0)
    4646
    47 #define VGA_SAVEDSTATE_VERSION              19
     47#define VGA_SAVEDSTATE_VERSION              20
     48#define VGA_SAVEDSTATE_VERSION_VMSVGA       20 /* Multiple updates and fixes for VMSVGA saved state. */
    4849#define VGA_SAVEDSTATE_VERSION_VMSVGA_TEX_STAGES 19
    4950#define VGA_SAVEDSTATE_VERSION_VMSVGA_GMR_COUNT  18
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette