VirtualBox

Changeset 94232 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Mar 15, 2022 8:47:10 AM (3 years ago)
Author:
vboxsync
Message:

Devices/Graphics: texture arrays: bugref:9830

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

Legend:

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

    r94223 r94232  
    12911291    vmsvga3dSurfaceDefine(pThisCC, pCmd->sid, pCmd->surfaceFlags, pCmd->format,
    12921292                          pCmd->multisampleCount, pCmd->autogenFilter,
    1293                           pCmd->face[0].numMipLevels, &paMipLevelSizes[0], /* fAllocMipLevels = */ true);
     1293                          pCmd->face[0].numMipLevels, &paMipLevelSizes[0], /* arraySize = */ 0, /* fAllocMipLevels = */ true);
    12941294}
    12951295
     
    13631363        vmsvga3dSurfaceDefine(pThisCC, pCmd->sid, pCmd->surfaceFlags, pCmd->format,
    13641364                              pCmd->multisampleCount, pCmd->autogenFilter,
    1365                               pCmd->numMipLevels, &pCmd->size, /* fAllocMipLevels = */ false);
     1365                              pCmd->numMipLevels, &pCmd->size, /* arraySize = */ 0, /* fAllocMipLevels = */ false);
    13661366    }
    13671367}
     
    16601660        if (pMob)
    16611661        {
    1662             uint32 const arraySize = (entrySurface.surface1Flags & SVGA3D_SURFACE_CUBEMAP)
    1663                                    ? SVGA3D_MAX_SURFACE_FACES
    1664                                    : RT_MAX(entrySurface.arraySize, 1);
     1662            uint32 const arraySize = vmsvga3dGetArrayElements(pThisCC, pCmd->sid);
    16651663            for (uint32_t iArray = 0; iArray < arraySize; ++iArray)
    16661664            {
     
    17241722        if (pMob)
    17251723        {
    1726             uint32 const arraySize = (entrySurface.surface1Flags & SVGA3D_SURFACE_CUBEMAP)
    1727                                    ? SVGA3D_MAX_SURFACE_FACES
    1728                                    : RT_MAX(entrySurface.arraySize, 1);
     1724            uint32 const arraySize = vmsvga3dGetArrayElements(pThisCC, pCmd->sid);
    17291725            for (uint32_t iArray = 0; iArray < arraySize; ++iArray)
    17301726            {
     
    20152011    // entry.mobPitch = 0;
    20162012    // ...
    2017 Assert(   pCmd->arraySize == 0
    2018        || pCmd->arraySize == 1
    2019        || (pCmd->arraySize == 6 && (pCmd->surfaceFlags & SVGA3D_SURFACE_CUBEMAP)));
     2013
    20202014    int rc = vmsvgaR3OTableWrite(pSvgaR3State, &pSvgaR3State->aGboOTables[SVGA_OTABLE_SURFACE],
    20212015                                 pCmd->sid, SVGA3D_OTABLE_SURFACE_ENTRY_SIZE, &entry, sizeof(entry));
     
    20262020        vmsvga3dSurfaceDefine(pThisCC, pCmd->sid, pCmd->surfaceFlags, pCmd->format,
    20272021                              pCmd->multisampleCount, pCmd->autogenFilter,
    2028                               pCmd->numMipLevels, &pCmd->size, /* fAllocMipLevels = */ false);
     2022                              pCmd->numMipLevels, &pCmd->size, pCmd->arraySize, /* fAllocMipLevels = */ false);
    20292023    }
    20302024}
     
    27642758        if (pMob)
    27652759        {
    2766             uint32 const arraySize = (entrySurface.surface1Flags & SVGA3D_SURFACE_CUBEMAP)
    2767                                    ? SVGA3D_MAX_SURFACE_FACES
    2768                                    : RT_MAX(entrySurface.arraySize, 1);
    2769             ASSERT_GUEST_RETURN(pCmd->subResource < arraySize * entrySurface.numMipLevels, VERR_INVALID_PARAMETER);
     2760            uint32 const cSubresource = vmsvga3dGetSubresourceCount(pThisCC, pCmd->sid);
     2761            ASSERT_GUEST_RETURN(pCmd->subResource < cSubresource, VERR_INVALID_PARAMETER);
    27702762            /* pCmd->box will be verified by the mapping function. */
    27712763            RT_UNTRUSTED_VALIDATED_FENCE();
     
    28092801        if (pMob)
    28102802        {
    2811             uint32 const arraySize = (entrySurface.surface1Flags & SVGA3D_SURFACE_CUBEMAP)
    2812                                    ? SVGA3D_MAX_SURFACE_FACES
    2813                                    : RT_MAX(entrySurface.arraySize, 1);
    2814             ASSERT_GUEST_RETURN(pCmd->subResource < arraySize * entrySurface.numMipLevels, VERR_INVALID_PARAMETER);
     2803            uint32 const cSubresource = vmsvga3dGetSubresourceCount(pThisCC, pCmd->sid);
     2804            ASSERT_GUEST_RETURN(pCmd->subResource < cSubresource, VERR_INVALID_PARAMETER);
    28152805            RT_UNTRUSTED_VALIDATED_FENCE();
    28162806
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx-savedstate.cpp

    r94215 r94232  
    6464                               entrySurface.multisampleCount, entrySurface.autogenFilter,
    6565                               entrySurface.numMipLevels, &entrySurface.size,
     66                               entrySurface.arraySize,
    6667                               /* fAllocMipLevels = */ true);
    6768    AssertRCReturn(rc, rc);
     
    7475
    7576    /* Load miplevels data to the surface buffers. */
    76     for (uint32_t j = 0; j < pSurface->cLevels * pSurface->cFaces; j++)
     77    for (uint32_t j = 0; j < pSurface->cLevels * pSurface->surfaceDesc.numArrayElements; j++)
    7778    {
    7879        PVMSVGA3DMIPMAPLEVEL pMipmapLevel = &pSurface->paMipmapLevels[j];
     
    268269    pHlp->pfnSSMPutU32(pSSM, pSurface->idAssociatedContext);
    269270
    270     for (uint32_t iArray = 0; iArray < pSurface->cFaces; ++iArray) /* Texture array index or face for cube textures */
     271    for (uint32_t iArray = 0; iArray < pSurface->surfaceDesc.numArrayElements; ++iArray)
    271272    {
    272273        for (uint32_t iMipmap = 0; iMipmap < pSurface->cLevels; ++iMipmap)
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx-shader.cpp

    r94146 r94232  
    23652365}
    23662366
    2367 int DXShaderUpdateResourceTypes(DXShaderInfo const *pInfo, SVGA3dResourceType *paResourceType, uint32_t cResourceType)
     2367int DXShaderUpdateResourceTypes(DXShaderInfo const *pInfo, VGPU10_RESOURCE_DIMENSION *paResourceType, uint32_t cResourceType)
    23682368{
    23692369    for (uint32_t i = 0; i < pInfo->cDclResource; ++i)
    23702370    {
    2371         SVGA3dResourceType const resourceType = i < cResourceType ? paResourceType[i] : SVGA3D_RESOURCE_TEXTURE2D;
    2372         AssertContinue(resourceType < SVGA3D_RESOURCE_TYPE_MAX);
     2371        VGPU10_RESOURCE_DIMENSION const resourceType = i < cResourceType ? paResourceType[i] : VGPU10_RESOURCE_DIMENSION_TEXTURE2D;
     2372        AssertContinue(resourceType <= VGPU10_RESOURCE_DIMENSION_TEXTURECUBEARRAY);
    23732373
    23742374        uint32_t const offToken = pInfo->aOffDclResource[i];
     
    23762376        uint32_t *paToken = (uint32_t *)((uintptr_t)pInfo->pvBytecode + offToken);
    23772377
    2378         uint8_t resourceDimension;
    2379         uint32_t returnType;
    2380         switch (resourceType)
    2381         {
    2382             case SVGA3D_RESOURCE_BUFFER:
    2383                 resourceDimension = VGPU10_RESOURCE_DIMENSION_BUFFER;
    2384                 returnType = 0x5555; /* float */
    2385                 break;
    2386             case SVGA3D_RESOURCE_TEXTURE1D:
    2387                 resourceDimension = VGPU10_RESOURCE_DIMENSION_TEXTURE1D;
    2388                 returnType = 0x5555; /* float */
    2389                 break;
    2390             default:
    2391             case SVGA3D_RESOURCE_TEXTURE2D:
    2392                 resourceDimension = VGPU10_RESOURCE_DIMENSION_TEXTURE2D;
    2393                 returnType = 0x5555; /* float */
    2394                 break;
    2395             case SVGA3D_RESOURCE_TEXTURE3D:
    2396                 resourceDimension = VGPU10_RESOURCE_DIMENSION_TEXTURE3D;
    2397                 returnType = 0x5555; /* float */
    2398                 break;
    2399             case SVGA3D_RESOURCE_TEXTURECUBE:
    2400                 resourceDimension = VGPU10_RESOURCE_DIMENSION_TEXTURECUBE;
    2401                 returnType = 0x5555; /* float */
    2402                 break;
    2403             case SVGA3D_RESOURCE_BUFFEREX:
    2404                 resourceDimension = VGPU10_RESOURCE_DIMENSION_BUFFER;
    2405                 returnType = 0x5555; /* float */
    2406                 break;
    2407         }
    2408 
    24092378        VGPU10OpcodeToken0 *pOpcode = (VGPU10OpcodeToken0 *)&paToken[0];
    2410         pOpcode->resourceDimension = resourceDimension;
     2379        pOpcode->resourceDimension = resourceType;
    24112380        // paToken[1] unmodified
    24122381        // paToken[2] unmodified
    2413         paToken[3] = returnType;
     2382        paToken[3] = 0x5555; /* float */;
    24142383    }
    24152384
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-dx-shader.h

    r94146 r94232  
    5252int DXShaderParse(void const *pvCode, uint32_t cbCode, DXShaderInfo *pInfo);
    5353void DXShaderFree(DXShaderInfo *pInfo);
    54 int DXShaderUpdateResourceTypes(DXShaderInfo const *pInfo, SVGA3dResourceType *paResourceType, uint32_t cResourceType);
     54int DXShaderUpdateResourceTypes(DXShaderInfo const *pInfo, VGPU10_RESOURCE_DIMENSION *paResourceType, uint32_t cResourceType);
    5555int DXShaderCreateDXBC(DXShaderInfo const *pInfo, void **ppvDXBC, uint32_t *pcbDXBC);
    5656char const *DXShaderGetOutputSemanticName(DXShaderInfo const *pInfo, uint32_t idxRegister);
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-internal.h

    r94146 r94232  
    553553    uint32_t                idAssociatedContext;
    554554
     555    /** @todo Only numArrayElements field is used currently. The code uses old fields cLevels, etc for anything else. */
     556    VMSVGA3D_SURFACE_DESC   surfaceDesc;
     557
    555558    SVGA3dSurface1Flags     surfaceFlags; /** @todo SVGA3dSurfaceAllFlags as an union. */
    556559    SVGA3dSurfaceFormat     format;
     
    574577    uint32_t                cFaces; /* Number of faces: 6 for cubemaps, 1 for everything else. */
    575578    uint32_t                cLevels; /* Number of mipmap levels per face. */
    576     PVMSVGA3DMIPMAPLEVEL    paMipmapLevels; /* cFaces * cLevels elements. */
     579    PVMSVGA3DMIPMAPLEVEL    paMipmapLevels; /* surfaceDesc.numArrayElements * cLevels elements. */
    577580    uint32_t                multiSampleCount;
    578581    SVGA3dTextureFilter     autogenFilter;
     
    13331336}
    13341337
    1335 DECLINLINE(int) vmsvga3dMipmapLevel(PVMSVGA3DSURFACE pSurface, uint32_t face, uint32_t mipmap,
     1338DECLINLINE(int) vmsvga3dMipmapLevel(PVMSVGA3DSURFACE pSurface, uint32_t iArrayElement, uint32_t mipmap,
    13361339                                    PVMSVGA3DMIPMAPLEVEL *ppMipmapLevel)
    13371340{
    1338     AssertMsgReturn(face < pSurface->cFaces,
    1339                     ("cFaces %d, face %d\n", pSurface->cFaces, face),
     1341    AssertMsgReturn(iArrayElement < pSurface->surfaceDesc.numArrayElements,
     1342                    ("numArrayElements %d, iArrayElement %d\n", pSurface->surfaceDesc.numArrayElements, iArrayElement),
    13401343                    VERR_INVALID_PARAMETER);
    13411344    AssertMsgReturn(mipmap < pSurface->cLevels,
     
    13431346                    VERR_INVALID_PARAMETER);
    13441347
    1345     *ppMipmapLevel = &pSurface->paMipmapLevels[face * pSurface->cLevels + mipmap];
     1348    *ppMipmapLevel = &pSurface->paMipmapLevels[iArrayElement * pSurface->cLevels + mipmap];
    13461349    return VINF_SUCCESS;
    13471350}
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-savedstate.cpp

    r93115 r94232  
    497497
    498498                rc = vmsvga3dSurfaceDefine(pThisCC, sid, surface.surfaceFlags, surface.format, surface.multiSampleCount,
    499                                            surface.autogenFilter, surface.cLevels, &pMipmapLevelSize[0], /* fAllocMipLevels = */ true);
     499                                           surface.autogenFilter, surface.cLevels, &pMipmapLevelSize[0], /* arraySize = */ 0, /* fAllocMipLevels = */ true);
    500500                AssertRCReturn(rc, rc);
    501501
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win-dx.cpp

    r94227 r94232  
    14161416            break;
    14171417        case SVGA3D_RESOURCE_TEXTURE1D:
    1418             if (pEntry->desc.tex.arraySize <= 1)
     1418            if (pSurface->surfaceDesc.numArrayElements <= 1)
    14191419            {
    14201420                desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE1D;
     
    14301430            break;
    14311431        case SVGA3D_RESOURCE_TEXTURE2D:
    1432             if (pEntry->desc.tex.arraySize <= 1)
     1432            if (pSurface->surfaceDesc.numArrayElements <= 1)
    14331433            {
    14341434                desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
     
    14911491            break;
    14921492        case SVGA3D_RESOURCE_TEXTURE1D:
    1493             if (pEntry->desc.tex.arraySize <= 1)
     1493            if (pSurface->surfaceDesc.numArrayElements <= 1)
    14941494            {
    14951495                desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1D;
     
    15071507            break;
    15081508        case SVGA3D_RESOURCE_TEXTURE2D:
    1509             if (pEntry->desc.tex.arraySize <= 1)
     1509            if (pSurface->surfaceDesc.numArrayElements <= 1)
    15101510            {
    15111511                desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
     
    15281528            break;
    15291529        case SVGA3D_RESOURCE_TEXTURECUBE:
    1530             desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
    1531             desc.TextureCube.MostDetailedMip = pEntry->desc.tex.mostDetailedMip;
    1532             desc.TextureCube.MipLevels = pEntry->desc.tex.mipLevels;
     1530            if (pSurface->surfaceDesc.numArrayElements <= 6)
     1531            {
     1532                desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
     1533                desc.TextureCube.MostDetailedMip = pEntry->desc.tex.mostDetailedMip;
     1534                desc.TextureCube.MipLevels = pEntry->desc.tex.mipLevels;
     1535            }
     1536            else
     1537            {
     1538                desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBEARRAY;
     1539                desc.TextureCubeArray.MostDetailedMip = pEntry->desc.tex.mostDetailedMip;
     1540                desc.TextureCubeArray.MipLevels = pEntry->desc.tex.mipLevels;
     1541                desc.TextureCubeArray.First2DArrayFace = pEntry->desc.tex.firstArraySlice;
     1542                desc.TextureCubeArray.NumCubes = pEntry->desc.tex.arraySize / 6;
     1543            }
    15331544            break;
    15341545        case SVGA3D_RESOURCE_BUFFEREX:
     
    15631574    {
    15641575        case SVGA3D_RESOURCE_TEXTURE1D:
    1565             if (pEntry->arraySize <= 1)
     1576            if (pSurface->surfaceDesc.numArrayElements <= 1)
    15661577            {
    15671578                desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE1D;
     
    15771588            break;
    15781589        case SVGA3D_RESOURCE_TEXTURE2D:
    1579             if (pEntry->arraySize <= 1)
     1590            if (pSurface->surfaceDesc.numArrayElements <= 1)
    15801591            {
    15811592                desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
     
    20192030            /** @todo Can happen for a non GBO surface or if GBO texture was updated prior to creation if the hardware resource. Test this. */
    20202031            /** @todo for (i = 0; i < pSurface->cFaces * numMipLevels; ++i) */
    2021             for (uint32_t iFace = 0; iFace < 6; ++iFace)
     2032            for (uint32_t iArray = 0; iArray < pSurface->surfaceDesc.numArrayElements; ++iArray)
    20222033            {
    20232034                for (uint32_t i = 0; i < numMipLevels; ++i)
    20242035                {
    2025                     uint32_t const iSubresource = vmsvga3dCalcSubresource(i, iFace, numMipLevels);
     2036                    uint32_t const iSubresource = vmsvga3dCalcSubresource(i, iArray, numMipLevels);
    20262037
    20272038                    PVMSVGA3DMIPMAPLEVEL pMipmapLevel = &pSurface->paMipmapLevels[iSubresource];
     
    20402051        td.Height             = cHeight;
    20412052        td.MipLevels          = numMipLevels;
    2042         td.ArraySize          = 6;
     2053        td.ArraySize          = pSurface->surfaceDesc.numArrayElements; /* This is 6 * numCubes */
    20432054        td.Format             = dxgiFormat;
    20442055        td.SampleDesc.Count   = 1;
     
    22162227            td.Height             = cHeight;
    22172228            td.MipLevels          = numMipLevels;
    2218             td.ArraySize          = 1; /** @todo */
     2229            td.ArraySize          = pSurface->surfaceDesc.numArrayElements;
    22192230            td.Format             = dxgiFormat;
    22202231            td.SampleDesc.Count   = 1;
     
    22342245                /* Map-able texture. */
    22352246                td.MipLevels      = 1; /* Must be for D3D11_USAGE_DYNAMIC. */
     2247                td.ArraySize      = 1; /* Must be for D3D11_USAGE_DYNAMIC. */
    22362248                td.Usage          = D3D11_USAGE_DYNAMIC;
    22372249                td.BindFlags      = D3D11_BIND_SHADER_RESOURCE; /* Have to specify a supported flag, otherwise E_INVALIDARG will be returned. */
     
    23492361            /** @todo Can happen for a non GBO surface or if GBO texture was updated prior to creation if the hardware resource. Test this. */
    23502362            /** @todo for (i = 0; i < pSurface->cFaces * numMipLevels; ++i) */
    2351             for (uint32_t iFace = 0; iFace < 6; ++iFace)
     2363            for (uint32_t iArray = 0; iArray < pSurface->surfaceDesc.numArrayElements; ++iArray)
    23522364            {
    23532365                for (uint32_t i = 0; i < numMipLevels; ++i)
    23542366                {
    2355                     uint32_t const iSubresource = vmsvga3dCalcSubresource(i, iFace, numMipLevels);
     2367                    uint32_t const iSubresource = vmsvga3dCalcSubresource(i, iArray, numMipLevels);
    23562368
    23572369                    PVMSVGA3DMIPMAPLEVEL pMipmapLevel = &pSurface->paMipmapLevels[iSubresource];
     
    23702382        td.Height             = cHeight;
    23712383        td.MipLevels          = 1;
    2372         td.ArraySize          = 6;
     2384        td.ArraySize          = pSurface->surfaceDesc.numArrayElements;
    23732385        td.Format             = dxgiFormat;
    23742386        td.SampleDesc.Count   = 1;
     
    24512463            td.Height             = cHeight;
    24522464            td.MipLevels          = 1;
    2453             td.ArraySize          = 1;
     2465            td.ArraySize          = pSurface->surfaceDesc.numArrayElements;
    24542466            td.Format             = dxgiFormat;
    24552467            td.SampleDesc.Count   = 1;
     
    24662478                /* Map-able texture. */
    24672479                td.MipLevels      = 1; /* Must be for D3D11_USAGE_DYNAMIC. */
     2480                td.ArraySize      = 1; /* Must be for D3D11_USAGE_DYNAMIC. */
    24682481                td.Usage          = D3D11_USAGE_DYNAMIC;
    24692482                td.BindFlags      = D3D11_BIND_SHADER_RESOURCE; /* Have to specify a supported flag, otherwise E_INVALIDARG will be returned. */
     
    52395252
    52405253        pInitialData = &initialData;
     5254
     5255        // Log(("%.*Rhxd\n", sizeInBytes, initialData.pSysMem));
    52415256    }
    52425257
     
    55045519                if (shaderType == SVGA3D_SHADERTYPE_PS)
    55055520                {
    5506                     SVGA3dResourceType aResourceType[SVGA3D_DX_MAX_SRVIEWS];
     5521                    VGPU10_RESOURCE_DIMENSION aResourceType[SVGA3D_DX_MAX_SRVIEWS];
    55075522                    RT_ZERO(aResourceType);
    55085523                    uint32_t cResourceType = 0;
     
    55165531                            AssertContinue(pSRViewEntry != NULL);
    55175532
    5518                             aResourceType[idxSR] = pSRViewEntry->resourceDimension;
     5533                            PVMSVGA3DSURFACE pSurface;
     5534                            rc = vmsvga3dSurfaceFromSid(pThisCC->svga.p3dState, pSRViewEntry->sid, &pSurface);
     5535                            AssertRCReturnVoid(rc);
     5536
     5537                            switch (pSRViewEntry->resourceDimension)
     5538                            {
     5539                                case SVGA3D_RESOURCE_BUFFEREX:
     5540                                case SVGA3D_RESOURCE_BUFFER:
     5541                                    aResourceType[idxSR] = VGPU10_RESOURCE_DIMENSION_BUFFER;
     5542                                    break;
     5543                                case SVGA3D_RESOURCE_TEXTURE1D:
     5544                                    if (pSurface->surfaceDesc.numArrayElements <= 1)
     5545                                        aResourceType[idxSR] = VGPU10_RESOURCE_DIMENSION_TEXTURE1D;
     5546                                    else
     5547                                        aResourceType[idxSR] = VGPU10_RESOURCE_DIMENSION_TEXTURE1DARRAY;
     5548                                    break;
     5549                                case SVGA3D_RESOURCE_TEXTURE2D:
     5550                                    if (pSurface->surfaceDesc.numArrayElements <= 1)
     5551                                        aResourceType[idxSR] = VGPU10_RESOURCE_DIMENSION_TEXTURE2D;
     5552                                    else
     5553                                        aResourceType[idxSR] = VGPU10_RESOURCE_DIMENSION_TEXTURE2DARRAY;
     5554                                    break;
     5555                                case SVGA3D_RESOURCE_TEXTURE3D:
     5556                                    aResourceType[idxSR] = VGPU10_RESOURCE_DIMENSION_TEXTURE3D;
     5557                                    break;
     5558                                case SVGA3D_RESOURCE_TEXTURECUBE:
     5559                                    if (pSurface->surfaceDesc.numArrayElements <= 6)
     5560                                        aResourceType[idxSR] = VGPU10_RESOURCE_DIMENSION_TEXTURECUBE;
     5561                                    else
     5562                                        aResourceType[idxSR] = VGPU10_RESOURCE_DIMENSION_TEXTURECUBEARRAY;
     5563                                    break;
     5564                                default:
     5565                                    ASSERT_GUEST_FAILED();
     5566                                    aResourceType[idxSR] = VGPU10_RESOURCE_DIMENSION_TEXTURE2D;
     5567                            }
     5568
    55195569                            cResourceType = idxSR + 1;
    55205570                        }
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp

    r94063 r94232  
    27492749
    27502750                rc = vmsvga3dSurfaceDefine(pThisCC, sid, surfaceFlags, format, multisampleCount, autogenFilter,
    2751                                            cMipLevels, &pMipLevelSize[0], /* fAllocMipLevels = */ true);
     2751                                           cMipLevels, &pMipLevelSize[0], /* arraySize = */ 0, /* fAllocMipLevels = */ true);
    27522752                AssertRC(rc);
    27532753
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.cpp

    r94223 r94232  
    4545{
    4646    /* Allocate buffer to hold the surface data until we can move it into a D3D object */
    47     for (uint32_t i = 0; i < pSurface->cLevels * pSurface->cFaces; ++i)
     47    for (uint32_t i = 0; i < pSurface->cLevels * pSurface->surfaceDesc.numArrayElements; ++i)
    4848    {
    4949        PVMSVGA3DMIPMAPLEVEL pMipmapLevel = &pSurface->paMipmapLevels[i];
     
    5858static void vmsvga3dSurfaceFreeMipLevels(PVMSVGA3DSURFACE pSurface)
    5959{
    60     for (uint32_t i = 0; i < pSurface->cLevels * pSurface->cFaces; ++i)
     60    for (uint32_t i = 0; i < pSurface->cLevels * pSurface->surfaceDesc.numArrayElements; ++i)
    6161    {
    6262        PVMSVGA3DMIPMAPLEVEL pMipmapLevel = &pSurface->paMipmapLevels[i];
     
    8484int vmsvga3dSurfaceDefine(PVGASTATECC pThisCC, uint32_t sid, SVGA3dSurface1Flags surfaceFlags, SVGA3dSurfaceFormat format,
    8585                          uint32_t multisampleCount, SVGA3dTextureFilter autogenFilter,
    86                           uint32_t numMipLevels, SVGA3dSize const *pMipLevel0Size, bool fAllocMipLevels)
     86                          uint32_t numMipLevels, SVGA3dSize const *pMipLevel0Size, uint32_t arraySize, bool fAllocMipLevels)
    8787{
    8888    PVMSVGA3DSURFACE pSurface;
     
    9595
    9696    ASSERT_GUEST_RETURN(sid < SVGA3D_MAX_SURFACE_IDS, VERR_INVALID_PARAMETER);
    97     ASSERT_GUEST_RETURN(numMipLevels >= 1 && numMipLevels < SVGA3D_MAX_MIP_LEVELS, VERR_INVALID_PARAMETER);
     97    ASSERT_GUEST_RETURN(numMipLevels >= 1 && numMipLevels <= SVGA3D_MAX_MIP_LEVELS, VERR_INVALID_PARAMETER);
     98    ASSERT_GUEST_RETURN(arraySize <= SVGA3D_MAX_SURFACE_ARRAYSIZE, VERR_INVALID_PARAMETER);
    9899
    99100    if (sid >= pState->cSurfaces)
     
    122123    pSurface->id                    = SVGA3D_INVALID_ID; /* Keep this value until the surface init completes */
    123124    pSurface->idAssociatedContext   = SVGA3D_INVALID_ID;
     125
     126    if (arraySize)
     127        pSurface->surfaceDesc.numArrayElements = arraySize; /* Also for an array of cubemaps where arraySize = 6 * numCubes. */
     128    else if (surfaceFlags & SVGA3D_SURFACE_CUBEMAP)
     129        pSurface->surfaceDesc.numArrayElements = SVGA3D_MAX_SURFACE_FACES;
     130    else
     131        pSurface->surfaceDesc.numArrayElements = 1;
    124132
    125133    /** @todo This 'switch' and the surfaceFlags tweaks should not be necessary.
     
    214222    Assert(autogenFilter != SVGA3D_TEX_FILTER_FLATCUBIC);
    215223    Assert(autogenFilter != SVGA3D_TEX_FILTER_GAUSSIANCUBIC);
    216     pSurface->paMipmapLevels    = (PVMSVGA3DMIPMAPLEVEL)RTMemAllocZ(numMipLevels * pSurface->cFaces * sizeof(VMSVGA3DMIPMAPLEVEL));
     224    pSurface->paMipmapLevels    = (PVMSVGA3DMIPMAPLEVEL)RTMemAllocZ(numMipLevels * pSurface->surfaceDesc.numArrayElements * sizeof(VMSVGA3DMIPMAPLEVEL));
    217225    AssertReturn(pSurface->paMipmapLevels, VERR_NO_MEMORY);
    218226
     
    227235    for (uint32_t i = 0; i < numMipLevels; ++i)
    228236    {
    229         for (uint32_t iFace = 0; iFace < pSurface->cFaces; ++iFace)
    230         {
    231             uint32_t const iMipmap = iFace * numMipLevels + i;
    232             LogFunc(("[%d] face %d mip level %d (%d,%d,%d) cbBlock=%#x block %dx%d\n",
    233                      iMipmap, iFace, i, mipmapSize.width, mipmapSize.height, mipmapSize.depth,
     237        for (uint32_t iArray = 0; iArray < pSurface->surfaceDesc.numArrayElements; ++iArray)
     238        {
     239            uint32_t const iMipmap = vmsvga3dCalcSubresource(i, iArray, numMipLevels);
     240            LogFunc(("[%d] array %d mip level %d (%d,%d,%d) cbBlock=%#x block %dx%d\n",
     241                     iMipmap, iArray, i, mipmapSize.width, mipmapSize.height, mipmapSize.depth,
    234242                     pSurface->cbBlock, pSurface->cxBlock, pSurface->cyBlock));
    235243
     
    11361144            pSvgaR3State->pFuncs3D->pfnSurfaceDestroy(pThisCC, pSurface);
    11371145
    1138         for (uint32_t i = 0; i < pSurface->cLevels * pSurface->cFaces; ++i)
     1146        for (uint32_t i = 0; i < pSurface->cLevels * pSurface->surfaceDesc.numArrayElements; ++i)
    11391147        {
    11401148            PVMSVGA3DMIPMAPLEVEL pMipmapLevel = &pSurface->paMipmapLevels[i];
     
    14341442    pMap->cbDepthPitch = pMipLevel->cbSurfacePlane;
    14351443    pMap->pvData       = (uint8_t *)pMipLevel->pSurfaceData
    1436                        + pMap->box.x * pMap->cbPixel
    1437                        + pMap->box.y * pMap->cbRowPitch
     1444                       + (pMap->box.x / pSurface->cxBlock) * pMap->cbPixel
     1445                       + (pMap->box.y / pSurface->cyBlock) * pMap->cbRowPitch
    14381446                       + pMap->box.z * pMap->cbDepthPitch;
    14391447
     1448    LogFunc(("SysMem: pvData %p\n", pMap->pvData));
    14401449    return VINF_SUCCESS;
    14411450}
     
    15061515    /** @todo Multisample?  */
    15071516    return offSubresource;
     1517}
     1518
     1519
     1520uint32_t vmsvga3dGetArrayElements(PVGASTATECC pThisCC, SVGA3dSurfaceId sid)
     1521{
     1522    PVMSVGA3DSURFACE pSurface;
     1523    int rc = vmsvga3dSurfaceFromSid(pThisCC->svga.p3dState, sid, &pSurface);
     1524    AssertRCReturn(rc, 0);
     1525
     1526    return pSurface->surfaceDesc.numArrayElements;
     1527}
     1528
     1529
     1530uint32_t vmsvga3dGetSubresourceCount(PVGASTATECC pThisCC, SVGA3dSurfaceId sid)
     1531{
     1532    PVMSVGA3DSURFACE pSurface;
     1533    int rc = vmsvga3dSurfaceFromSid(pThisCC->svga.p3dState, sid, &pSurface);
     1534    AssertRCReturn(rc, 0);
     1535
     1536    return pSurface->surfaceDesc.numArrayElements * pSurface->cLevels;
    15081537}
    15091538
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.h

    r94223 r94232  
    4242
    4343
     44/** @todo Use this as a parameter for vmsvga3dSurfaceDefine and a field in VMSVGA3DSURFACE instead of a multiple values. */
     45/* A surface description provided by the guest. Mostly mirrors SVGA3dCmdDefineGBSurface_v4 */
     46typedef struct VMSVGA3D_SURFACE_DESC
     47{
     48   SVGA3dSurface1Flags surface1Flags;
     49   SVGA3dSurface2Flags surface2Flags;
     50   SVGA3dSurfaceFormat format;
     51   uint32 numMipLevels;
     52   uint32 multisampleCount;
     53   SVGA3dMSPattern multisamplePattern;
     54   SVGA3dMSQualityLevel qualityLevel;
     55   SVGA3dTextureFilter autogenFilter;
     56   SVGA3dSize size;
     57   uint32 numArrayElements; /* "Number of array elements for a 1D/2D texture. For cubemap
     58                             * texture number of faces * array_size."
     59                             */
     60   uint32 bufferByteStride;
     61} VMSVGA3D_SURFACE_DESC;
     62
    4463typedef enum VMSVGA3D_SURFACE_MAP
    4564{
     
    7796int vmsvga3dSurfaceDefine(PVGASTATECC pThisCC, uint32_t sid, SVGA3dSurface1Flags surfaceFlags, SVGA3dSurfaceFormat format,
    7897                          uint32_t multisampleCount, SVGA3dTextureFilter autogenFilter,
    79                           uint32_t cMipLevels, SVGA3dSize const *pMipLevel0Size, bool fAllocMipLevels);
     98                          uint32_t cMipLevels, SVGA3dSize const *pMipLevel0Size, uint32_t arraySize, bool fAllocMipLevels);
    8099int vmsvga3dSurfaceDestroy(PVGASTATECC pThisCC, uint32_t sid);
    81100int vmsvga3dSurfaceCopy(PVGASTATECC pThisCC, SVGA3dSurfaceImageId dest, SVGA3dSurfaceImageId src,
     
    149168}
    150169
    151 DECLINLINE(uint32_t) vmsvga3dCalcSubresource(uint32_t iMipLevel, uint32_t iFace, uint32_t cMipLevels)
     170uint32_t vmsvga3dGetArrayElements(PVGASTATECC pThisCC, SVGA3dSurfaceId sid);
     171uint32_t vmsvga3dGetSubresourceCount(PVGASTATECC pThisCC, SVGA3dSurfaceId sid);
     172
     173DECLINLINE(uint32_t) vmsvga3dCalcSubresource(uint32_t iMipLevel, uint32_t iArray, uint32_t cMipLevels)
    152174{
    153175    /* Same as in D3D */
    154     return iMipLevel + iFace * cMipLevels;
     176    return iMipLevel + iArray * cMipLevels;
    155177}
    156178
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