VirtualBox

Ignore:
Timestamp:
Apr 28, 2014 5:21:49 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
93492
Message:

crCmd/wddm/crOpenGL: some optimization & cleanup

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp

    r51152 r51157  
    52585258}
    52595259
     5260static int8_t crVBoxServerCrCmdBltSameDimOrId(const VBOXCMDVBVA_BLT_SAMEDIM_A8R8G8B8 *pCmd, uint32_t cbCmd)
     5261{
     5262    uint32_t cRects;
     5263    const VBOXCMDVBVA_RECT *pPRects = pCmd->aRects;
     5264    if ((cbCmd - RT_OFFSETOF(VBOXCMDVBVA_BLT_SAMEDIM_A8R8G8B8, aRects)) % sizeof (VBOXCMDVBVA_RECT))
     5265    {
     5266        WARN(("invalid argument size"));
     5267        return -1;
     5268    }
     5269
     5270    cRects = (cbCmd - RT_OFFSETOF(VBOXCMDVBVA_BLT_SAMEDIM_A8R8G8B8, aRects)) / sizeof (VBOXCMDVBVA_RECT);
     5271
     5272    RTRECT *pRects = crVBoxServerCrCmdBltRecsUnpack(pPRects, cRects);
     5273    if (!pRects)
     5274    {
     5275        WARN(("crVBoxServerCrCmdBltRecsUnpack failed"));
     5276        return -1;
     5277    }
     5278
     5279    uint8_t u8Flags = pCmd->Hdr.Hdr.u8Flags;
     5280    VBOXCMDVBVAOFFSET offVRAM = pCmd->alloc1.Info.u.offVRAM;
     5281    uint32_t width = pCmd->alloc1.u16Width;
     5282    uint32_t height = pCmd->alloc1.u16Height;
     5283    RTPOINT Pos = {pCmd->Hdr.Pos.x, pCmd->Hdr.Pos.y};
     5284
     5285    if (u8Flags & VBOXCMDVBVA_OPF_OPERAND2_ISID)
     5286    {
     5287        uint32_t hostId = pCmd->info2.u.id;
     5288
     5289        if (!hostId)
     5290        {
     5291            WARN(("zero host id"));
     5292            return -1;
     5293        }
     5294
     5295        if (u8Flags & VBOXCMDVBVA_OPF_OPERAND1_ISID)
     5296        {
     5297            WARN(("blit from texture to texture not implemented"));
     5298            return -1;
     5299        }
     5300
     5301        if (u8Flags & VBOXCMDVBVA_OPF_BLT_DIR_IN_2)
     5302        {
     5303            WARN(("blit to texture not implemented"));
     5304            return -1;
     5305        }
     5306
     5307        return crVBoxServerCrCmdBltIdToVram(hostId, offVRAM, width, height, &Pos, cRects, pRects);
     5308    }
     5309
     5310    if (u8Flags & VBOXCMDVBVA_OPF_OPERAND1_ISID)
     5311    {
     5312        if (!(u8Flags & VBOXCMDVBVA_OPF_BLT_DIR_IN_2))
     5313        {
     5314            WARN(("blit to texture not implemented"));
     5315            return -1;
     5316        }
     5317
     5318        return crVBoxServerCrCmdBltIdToVram(pCmd->alloc1.Info.u.id, pCmd->info2.u.offVRAM, width, height, &Pos, cRects, pRects);
     5319    }
     5320
     5321    if (u8Flags & VBOXCMDVBVA_OPF_BLT_DIR_IN_2)
     5322        crVBoxServerCrCmdBltVramToVram(offVRAM, width, height, pCmd->info2.u.offVRAM, width, height, &Pos, cRects, pRects);
     5323    else
     5324        crVBoxServerCrCmdBltVramToVram(pCmd->info2.u.offVRAM, width, height, offVRAM, width, height, &Pos, cRects, pRects);
     5325
     5326    return 0;
     5327}
     5328
    52605329static int8_t crVBoxServerCrCmdBltPrimaryGenericBGRAProcess(const VBOXCMDVBVA_BLT_PRIMARY_GENERIC_A8R8G8B8 *pCmd, uint32_t cbCmd)
    52615330{
     
    53625431
    53635432    uint8_t u8Flags = pCmd->Hdr.Hdr.u8Flags;
     5433    RTPOINT Pos = {pCmd->Hdr.Pos.x, pCmd->Hdr.Pos.y};
    53645434
    53655435    if (u8Flags & VBOXCMDVBVA_OPF_OPERAND2_ISID)
     
    53775447        }
    53785448
    5379         RTPOINT Pos = {pCmd->Hdr.Pos.x, pCmd->Hdr.Pos.y};
    53805449        return crVBoxServerCrCmdBltIdToVram(pCmd->alloc2.Info.u.id, pCmd->alloc1.Info.u.offVRAM, pCmd->alloc1.u16Width, pCmd->alloc1.u16Height, &Pos, cRects, pRects);
    53815450    }
     
    53945463        }
    53955464
    5396         RTPOINT Pos = {pCmd->Hdr.Pos.x, pCmd->Hdr.Pos.y};
    5397 
    53985465        if (u8Flags & VBOXCMDVBVA_OPF_BLT_DIR_IN_2)
    53995466            crVBoxServerCrCmdBltVramToVram(pCmd->alloc1.Info.u.offVRAM, pCmd->alloc1.u16Width, pCmd->alloc1.u16Height, pCmd->alloc2.Info.u.offVRAM, pCmd->alloc2.u16Width, pCmd->alloc2.u16Height, &Pos, cRects, pRects);
     
    55495616    switch (u8Cmd)
    55505617    {
    5551         case VBOXCMDVBVA_OPF_CLRFILL_TYPE_PRIMARY:
    5552         {
    5553             if (cbCmd < sizeof (VBOXCMDVBVA_CLRFILL_PRIMARY))
    5554             {
    5555                 WARN(("VBOXCMDVBVA_CLRFILL_PRIMARY: invalid command size"));
    5556                 return -1;
    5557             }
    5558 
    5559             return crVBoxServerCrCmdClrFillPrimaryProcess((const VBOXCMDVBVA_CLRFILL_PRIMARY*)pCmd, cbCmd);
    5560         }
    55615618        case VBOXCMDVBVA_OPF_CLRFILL_TYPE_GENERIC_A8R8G8B8:
    55625619        {
     
    55835640    switch (u8Cmd)
    55845641    {
    5585         case VBOXCMDVBVA_OPF_BLT_TYPE_PRIMARY:
    5586         {
    5587             if (cbCmd < sizeof (VBOXCMDVBVA_BLT_PRIMARY))
     5642        case VBOXCMDVBVA_OPF_BLT_TYPE_SAMEDIM_A8R8G8B8:
     5643        {
     5644            if (cbCmd < sizeof (VBOXCMDVBVA_BLT_SAMEDIM_A8R8G8B8))
    55885645            {
    5589                 WARN(("VBOXCMDVBVA_OPF_BLT_TYPE_PRIMARY: invalid command size"));
     5646                WARN(("VBOXCMDVBVA_BLT_SAMEDIM_A8R8G8B8: invalid command size"));
    55905647                return -1;
    55915648            }
    55925649
    5593             return crVBoxServerCrCmdBltPrimaryProcess((const VBOXCMDVBVA_BLT_PRIMARY*)pCmd, cbCmd);
     5650            return crVBoxServerCrCmdBltSameDimOrId((const VBOXCMDVBVA_BLT_SAMEDIM_A8R8G8B8 *)pCmd, cbCmd);
    55945651        }
    55955652        case VBOXCMDVBVA_OPF_BLT_TYPE_OFFPRIMSZFMT_OR_ID:
     
    56035660            return crVBoxServerCrCmdBltOffIdProcess((const VBOXCMDVBVA_BLT_OFFPRIMSZFMT_OR_ID *)pCmd, cbCmd);
    56045661        }
    5605         case VBOXCMDVBVA_OPF_BLT_TYPE_PRIMARY_GENERIC_A8R8G8B8:
    5606         {
    5607             if (cbCmd < sizeof (VBOXCMDVBVA_BLT_PRIMARY_GENERIC_A8R8G8B8))
    5608             {
    5609                 WARN(("VBOXCMDVBVA_OPF_BLT_TYPE_PRIMARY_GENERIC_A8R8G8B8: invalid command size"));
    5610                 return -1;
    5611             }
    5612 
    5613             return crVBoxServerCrCmdBltPrimaryGenericBGRAProcess((const VBOXCMDVBVA_BLT_PRIMARY_GENERIC_A8R8G8B8 *)pCmd, cbCmd);
    5614         }
    56155662        case VBOXCMDVBVA_OPF_BLT_TYPE_GENERIC_A8R8G8B8:
    56165663        {
     
    56235670            return crVBoxServerCrCmdBltGenericBGRAProcess((const VBOXCMDVBVA_BLT_GENERIC_A8R8G8B8 *)pCmd, cbCmd);
    56245671        }
    5625         case VBOXCMDVBVA_OPF_BLT_TYPE_PRIMARY_PRIMARY:
    5626         {
    5627             if (cbCmd < sizeof (VBOXCMDVBVA_BLT_PRIMARY))
    5628             {
    5629                 WARN(("VBOXCMDVBVA_OPF_BLT_TYPE_PRIMARY_PRIMARY: invalid command size"));
    5630                 return -1;
    5631             }
    5632 
    5633             return crVBoxServerCrCmdBltPrimaryPrimaryProcess((const VBOXCMDVBVA_BLT_PRIMARY *)pCmd, cbCmd);
    5634         }
    56355672        default:
    56365673            WARN(("unsupported command"));
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