VirtualBox

Changeset 82165 in vbox for trunk/src


Ignore:
Timestamp:
Nov 25, 2019 11:18:42 AM (5 years ago)
Author:
vboxsync
Message:

Devices/Graphics: OpenGL backend: fixes for compressed textures.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-internal.h

    r82114 r82165  
    410410    /** Height in blocks: (height + cyBlock - 1) / cyBlock. SSM: not saved, recalculated on load. */
    411411    uint32_t                cBlocksY;
     412    /** Number of blocks: cBlocksX * cBlocksY * mipmapSize.depth. SSM: not saved, recalculated on load. */
     413    uint32_t                cBlocks;
    412414    /** The scanline/pitch size in bytes: at least cBlocksX * cbBlock. */
    413415    uint32_t                cbSurfacePitch;
     
    582584    uint32_t                cxBlock;        /* Block width in pixels. SSM: not saved, recalculated on load. */
    583585    uint32_t                cyBlock;        /* Block height in pixels. SSM: not saved, recalculated on load. */
     586#ifdef VMSVGA3D_OPENGL
     587    uint32_t                cbBlockGL;      /* Block size of the OpenGL texture, same as cbBlock for not-emulated formats. */
     588#endif
    584589
    585590    /* Dirty state; surface was manually updated. */
     
    10561061        PFNGLDRAWARRAYSINSTANCEDPROC                    glDrawArraysInstanced;
    10571062        PFNGLDRAWELEMENTSINSTANCEDPROC                  glDrawElementsInstanced;
     1063        PFNGLGETCOMPRESSEDTEXIMAGEPROC                  glGetCompressedTexImage;
    10581064        PFNGLCOMPRESSEDTEXIMAGE2DPROC                   glCompressedTexImage2D;
    10591065        PFNGLCOMPRESSEDTEXIMAGE3DPROC                   glCompressedTexImage3D;
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp

    r82114 r82165  
    686686    GLGETPROC_(PFNGLTEXIMAGE3DPROC                       , glTexImage3D, "");
    687687    GLGETPROC_(PFNGLTEXSUBIMAGE3DPROC                    , glTexSubImage3D, "");
     688    GLGETPROC_(PFNGLGETCOMPRESSEDTEXIMAGEPROC            , glGetCompressedTexImage, "");
    688689    GLGETPROC_(PFNGLCOMPRESSEDTEXIMAGE2DPROC             , glCompressedTexImage2D, "");
    689690    GLGETPROC_(PFNGLCOMPRESSEDTEXIMAGE3DPROC             , glCompressedTexImage3D, "");
     
    16451646#define AssertTestFmt(f) do {} while(0)
    16461647#endif
     1648    /* Init cbBlockGL for non-emulated formats. */
     1649    pSurface->cbBlockGL = pSurface->cbBlock;
     1650
    16471651    switch (format)
    16481652    {
     
    19391943        pSurface->formatGL = GL_BGRA;
    19401944        pSurface->typeGL = GL_UNSIGNED_INT_8_8_8_8_REV;
     1945        pSurface->cbBlockGL = 4 * pSurface->cxBlock * pSurface->cyBlock;
    19411946        break;
    19421947
     
    21272132                    || pSurfaceDst->internalFormatGL == GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)
    21282133                {
     2134                    uint32_t const cBlocksX = (clipBox.w + pSurfaceSrc->cxBlock - 1) / pSurfaceSrc->cxBlock;
     2135                    uint32_t const cBlocksY = (clipBox.h + pSurfaceSrc->cyBlock - 1) / pSurfaceSrc->cyBlock;
     2136                    uint32_t const imageSize = cBlocksX * cBlocksY * clipBox.d * pSurfaceSrc->cbBlock;
    21292137                    pState->ext.glCompressedTexSubImage3D(target, dest.mipmap,
    21302138                                                          clipBox.x, clipBox.y, clipBox.z,
    21312139                                                          clipBox.w, clipBox.h, clipBox.d,
    2132                                                           pSurfaceSrc->formatGL, pSurfaceSrc->typeGL, pSrcBits);
     2140                                                          pSurfaceSrc->internalFormatGL, (GLsizei)imageSize, pSrcBits);
    21332141                    VMSVGA3D_CHECK_LAST_ERROR_WARN(pState, pContext);
    21342142                }
     
    21482156                    || pSurfaceDst->internalFormatGL == GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)
    21492157                {
     2158                    uint32_t const cBlocksX = (clipBox.w + pSurfaceSrc->cxBlock - 1) / pSurfaceSrc->cxBlock;
     2159                    uint32_t const cBlocksY = (clipBox.h + pSurfaceSrc->cyBlock - 1) / pSurfaceSrc->cyBlock;
     2160                    uint32_t const imageSize = cBlocksX * cBlocksY * pSurfaceSrc->cbBlock;
    21502161                    pState->ext.glCompressedTexSubImage2D(target, dest.mipmap,
    21512162                                                          clipBox.x, clipBox.y, clipBox.w, clipBox.h,
    2152                                                           pSurfaceSrc->formatGL, pSurfaceSrc->typeGL, pSrcBits);
     2163                                                          pSurfaceSrc->internalFormatGL, (GLsizei)imageSize, pSrcBits);
    21532164                    VMSVGA3D_CHECK_LAST_ERROR_WARN(pState, pContext);
    21542165                }
     
    28472858        uint32_t cbSurfacePitch;
    28482859        uint8_t *pDoubleBuffer;
    2849         uint32_t offHst;
     2860        uint64_t offHst;
    28502861
    28512862        uint32_t const u32HostBlockX = pBox->x / pSurface->cxBlock;
    28522863        uint32_t const u32HostBlockY = pBox->y / pSurface->cyBlock;
     2864        uint32_t const u32HostZ      = pBox->z;
    28532865        Assert(u32HostBlockX * pSurface->cxBlock == pBox->x);
    28542866        Assert(u32HostBlockY * pSurface->cyBlock == pBox->y);
     
    28562868        uint32_t const u32GuestBlockX = pBox->srcx / pSurface->cxBlock;
    28572869        uint32_t const u32GuestBlockY = pBox->srcy / pSurface->cyBlock;
     2870        uint32_t const u32GuestZ      = pBox->srcz / pSurface->cyBlock;
    28582871        Assert(u32GuestBlockX * pSurface->cxBlock == pBox->srcx);
    28592872        Assert(u32GuestBlockY * pSurface->cyBlock == pBox->srcy);
     
    28782891        }
    28792892
    2880         /* The buffer must be large enough to hold entire texture in the OpenGL format.
    2881          * Multiply by the width and height "reduction" factors.
    2882          * This can allocate more memory than required, but it is simpler for now.
    2883          * Actually cbBuf = cbGLPixel * pMipmapLevel->mipmapSize.width * pMipmapLevel->mipmapSize.height
    2884          */
    2885         pDoubleBuffer = (uint8_t *)RTMemAlloc(pMipLevel->cbSurface * pSurface->cxBlock * pSurface->cyBlock);
     2893        /* The buffer must be large enough to hold entire texture in the OpenGL format. */
     2894        pDoubleBuffer = (uint8_t *)RTMemAlloc(pSurface->cbBlockGL * pMipLevel->cBlocks);
    28862895        AssertReturn(pDoubleBuffer, VERR_NO_MEMORY);
    28872896
    28882897        if (transfer == SVGA3D_READ_HOST_VRAM)
    28892898        {
     2899            /* Read the entire texture to the double buffer. */
    28902900            GLint activeTexture;
    28912901
     
    29062916            vmsvga3dOglSetPackParams(pState, pContext, pSurface, &SavedParams);
    29072917
    2908             glGetTexImage(texImageTarget,
    2909                           uHostMipmap,
    2910                           pSurface->formatGL,
    2911                           pSurface->typeGL,
    2912                           pDoubleBuffer);
    2913             VMSVGA3D_CHECK_LAST_ERROR_WARN(pState, pContext);
     2918            if (   pSurface->internalFormatGL == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
     2919                || pSurface->internalFormatGL == GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
     2920                || pSurface->internalFormatGL == GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)
     2921            {
     2922                pState->ext.glGetCompressedTexImage(texImageTarget, uHostMipmap, pDoubleBuffer);
     2923                VMSVGA3D_CHECK_LAST_ERROR_WARN(pState, pContext);
     2924            }
     2925            else
     2926            {
     2927                glGetTexImage(texImageTarget, uHostMipmap, pSurface->formatGL, pSurface->typeGL, pDoubleBuffer);
     2928                VMSVGA3D_CHECK_LAST_ERROR_WARN(pState, pContext);
     2929            }
    29142930
    29152931            vmsvga3dOglRestorePackParams(pState, pContext, pSurface, &SavedParams);
     
    29192935            VMSVGA3D_CHECK_LAST_ERROR_WARN(pState, pContext);
    29202936
    2921             offHst = u32HostBlockX * pSurface->cbBlock + u32HostBlockY * pMipLevel->cbSurfacePitch;
     2937            offHst = u32HostBlockX * pSurface->cbBlock + u32HostBlockY * pMipLevel->cbSurfacePitch + u32HostZ * pMipLevel->cbSurfacePlane;
    29222938            cbSurfacePitch = pMipLevel->cbSurfacePitch;
    29232939        }
     
    29292945        }
    29302946
    2931         uint32_t const offGst = u32GuestBlockX * pSurface->cbBlock + u32GuestBlockY * cbGuestPitch;
    2932 
    2933         rc = vmsvgaR3GmrTransfer(pThis,
    2934                                  pThisCC,
    2935                                  transfer,
    2936                                  pDoubleBuffer,
    2937                                  pMipLevel->cbSurface,
    2938                                  offHst,
    2939                                  cbSurfacePitch,
    2940                                  GuestPtr,
    2941                                  offGst,
    2942                                  cbGuestPitch,
    2943                                  cBlocksX * pSurface->cbBlock,
    2944                                  cBlocksY);
    2945         AssertRC(rc);
     2947        uint64_t offGst = u32GuestBlockX * pSurface->cbBlock + u32GuestBlockY * cbGuestPitch + u32GuestZ * cbGuestPitch * pMipLevel->mipmapSize.height;
     2948
     2949        for (uint32_t iPlane = 0; iPlane < pBox->d; ++iPlane)
     2950        {
     2951            AssertBreak(offHst < UINT32_MAX);
     2952            AssertBreak(offGst < UINT32_MAX);
     2953
     2954            rc = vmsvgaR3GmrTransfer(pThis,
     2955                                     pThisCC,
     2956                                     transfer,
     2957                                     pDoubleBuffer,
     2958                                     pMipLevel->cbSurface,
     2959                                     (uint32_t)offHst,
     2960                                     cbSurfacePitch,
     2961                                     GuestPtr,
     2962                                     (uint32_t)offGst,
     2963                                     cbGuestPitch,
     2964                                     cBlocksX * pSurface->cbBlock,
     2965                                     cBlocksY);
     2966            AssertRC(rc);
     2967
     2968            offHst += pMipLevel->cbSurfacePlane;
     2969            offGst += pMipLevel->mipmapSize.height * cbGuestPitch;
     2970        }
    29462971
    29472972        /* Update the opengl surface data. */
     
    29773002                                                          pBox->h,
    29783003                                                          pBox->d,
    2979                                                           pSurface->formatGL,
    2980                                                           pSurface->typeGL,
     3004                                                          pSurface->internalFormatGL,
     3005                                                          cbSurfacePitch * cBlocksY * pBox->d,
    29813006                                                          pDoubleBuffer);
    29823007                }
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d.cpp

    r82114 r82165  
    314314        pMipmapLevel->cBlocksX       = cBlocksX;
    315315        pMipmapLevel->cBlocksY       = cBlocksY;
     316        pMipmapLevel->cBlocks        = cBlocksX * cBlocksY * pMipmapLevel->mipmapSize.depth;
    316317        pMipmapLevel->cbSurfacePitch = cbSurfacePitch;
    317318        pMipmapLevel->cbSurfacePlane = cbSurfacePlane;
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