VirtualBox

Changeset 27429 in vbox


Ignore:
Timestamp:
Mar 16, 2010 9:49:51 PM (15 years ago)
Author:
vboxsync
Message:

wddm: graphics dev update only necessary portion of framebuffer

Location:
trunk/src/VBox
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp

    r27426 r27429  
    13101310                        {
    13111311                            pAllocation->enmType = VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE;
     1312                            pAllocation->offVram = VBOXVIDEOOFFSET_VOID;
    13121313                            pAllocation->u.SurfInfo = pAllocInfo->u.SurfInfo;
    13131314                            PVBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE pAlloc = VBOXWDDM_ALLOCATION_BODY(pAllocation, VBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE);
     
    13651366                    {
    13661367                        pAllocation->enmType = pAllocInfo->enmType;
     1368                        pAllocation->offVram = VBOXVIDEOOFFSET_VOID;
    13671369                        pAllocation->u.SurfInfo = pAllocInfo->u.SurfInfo;
    13681370
  • trunk/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp

    r27426 r27429  
    170170}
    171171
     172static void vboxVDMARectlUnite(VBOXVDMA_RECTL * pRectl1, const VBOXVDMA_RECTL * pRectl2)
     173{
     174    if (!pRectl1->width)
     175        *pRectl1 = *pRectl2;
     176    else
     177    {
     178        int16_t x21 = pRectl1->left + pRectl1->width;
     179        int16_t x22 = pRectl2->left + pRectl2->width;
     180        if (pRectl1->left > pRectl2->left)
     181        {
     182            pRectl1->left = pRectl2->left;
     183            pRectl1->width = x21 < x22 ? x22 - pRectl1->left : x21 - pRectl1->left;
     184        }
     185        else if (x21 < x22)
     186            pRectl1->width = x22 - pRectl1->left;
     187
     188        x21 = pRectl1->top + pRectl1->height;
     189        x22 = pRectl2->top + pRectl2->height;
     190        if (pRectl1->top > pRectl2->top)
     191        {
     192            pRectl1->top = pRectl2->top;
     193            pRectl1->height = x21 < x22 ? x22 - pRectl1->top : x21 - pRectl1->top;
     194        }
     195        else if (x21 < x22)
     196            pRectl1->height = x22 - pRectl1->top;
     197    }
     198}
     199
    172200/*
    173201 * @return on success the number of bytes the command contained, otherwise - VERR_xxx error code
     
    190218
    191219    uint8_t * pvRam = pVdma->pVGAState->vram_ptrR3;
     220    VBOXVDMA_RECTL updateRectl = {0};
    192221
    193222    if (pBlt->cDstSubRects)
     
    224253            if (!RT_SUCCESS(rc))
    225254                return rc;
     255
     256            vboxVDMARectlUnite(&updateRectl, pDstRectl);
    226257        }
    227258    }
     
    235266        if (!RT_SUCCESS(rc))
    236267            return rc;
     268
     269        vboxVDMARectlUnite(&updateRectl, &pBlt->dstRectl);
    237270    }
    238271
    239272    int iView = 0;
    240273    /* @todo: fixme: check if update is needed and get iView */
    241     vboxVDMANotifyPrimaryUpdate (pVdma->pVGAState, iView, &pBlt->dstRectl);
     274    vboxVDMANotifyPrimaryUpdate (pVdma->pVGAState, iView, &updateRectl);
    242275
    243276    return cbBlt;
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