VirtualBox

Changeset 73330 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jul 23, 2018 3:19:00 PM (6 years ago)
Author:
vboxsync
Message:

DevVGA-SVGA3d-ogl: instancing; compressed formats; workaround for Intel driver

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

Legend:

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

    r73295 r73330  
    10171017        PFNGLGETQUERYOBJECTUIVPROC                      glGetQueryObjectuiv;
    10181018        PFNGLTEXIMAGE3DPROC                             glTexImage3D;
     1019        PFNGLVERTEXATTRIBDIVISORPROC                    glVertexAttribDivisor;
     1020        PFNGLDRAWARRAYSINSTANCEDPROC                    glDrawArraysInstanced;
     1021        PFNGLDRAWELEMENTSINSTANCEDPROC                  glDrawElementsInstanced;
     1022        PFNGLCOMPRESSEDTEXIMAGE2DPROC                   glCompressedTexImage2D;
     1023        PFNGLCOMPRESSEDTEXIMAGE3DPROC                   glCompressedTexImage3D;
    10191024    } ext;
    10201025
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp

    r73297 r73330  
    6565
    6666#ifdef RT_OS_WINDOWS
    67 # define OGLGETPROCADDRESS      wglGetProcAddress
    68 
     67# define OGLGETPROCADDRESS      MyWinGetProcAddress
     68DECLINLINE(PROC) MyWinGetProcAddress(const char *pszSymbol)
     69{
     70    /* Khronos: [on failure] "some implementations will return other values. 1, 2, and 3 are used, as well as -1". */
     71    PROC p = wglGetProcAddress(pszSymbol);
     72    if (RT_VALID_PTR(p))
     73        return p;
     74    return 0;
     75}
    6976#elif defined(RT_OS_DARWIN)
    7077# include <dlfcn.h>
     
    510517
    511518    return VINF_SUCCESS;
     519}
     520
     521/** Check whether this is an Intel GL driver.
     522 *
     523 * @returns true if this seems to be some Intel graphics.
     524 */
     525static bool vmsvga3dIsVendorIntel(void)
     526{
     527    return RTStrNICmp((char *)glGetString(GL_VENDOR), "Intel", 5) == 0;
    512528}
    513529
     
    785801#endif
    786802
    787 #define GLGETPROC(ProcType, ProcName) do { \
    788     pState->ext.ProcName = (ProcType)OGLGETPROCADDRESS(#ProcName); \
    789     AssertMsgReturn(pState->ext.ProcName, (#ProcName " missing"), VERR_NOT_IMPLEMENTED); \
     803#define GLGETPROC(ProcType, ProcName, NameSuffix) do { \
     804    pState->ext.ProcName = (ProcType)OGLGETPROCADDRESS(#ProcName NameSuffix); \
     805    AssertLogRelMsgReturn(pState->ext.ProcName, (#ProcName NameSuffix " missing"), VERR_NOT_IMPLEMENTED); \
    790806} while(0)
    791 #define GLGETPROCOPT(ProcType, ProcName) do { \
    792     pState->ext.ProcName = (ProcType)OGLGETPROCADDRESS(#ProcName); \
    793     AssertMsg(pState->ext.ProcName, (#ProcName " missing (optional)")); \
     807#define GLGETPROCOPT(ProcType, ProcName, NameSuffix) do { \
     808    pState->ext.ProcName = (ProcType)OGLGETPROCADDRESS(#ProcName NameSuffix); \
     809    AssertMsg(pState->ext.ProcName, (#ProcName NameSuffix " missing (optional)")); \
    794810} while(0)
    795811
    796         GLGETPROCOPT(PFNGLGENQUERIESPROC                       , glGenQueries);
    797         GLGETPROCOPT(PFNGLDELETEQUERIESPROC                    , glDeleteQueries);
    798         GLGETPROCOPT(PFNGLBEGINQUERYPROC                       , glBeginQuery);
    799         GLGETPROCOPT(PFNGLENDQUERYPROC                         , glEndQuery);
    800         GLGETPROCOPT(PFNGLGETQUERYOBJECTUIVPROC                , glGetQueryObjectuiv);
    801         GLGETPROC   (PFNGLTEXIMAGE3DPROC                       , glTexImage3D);
    802 
     812    /* OpenGL 2.0 core */
     813    GLGETPROCOPT(PFNGLGENQUERIESPROC                       , glGenQueries, "");
     814    GLGETPROCOPT(PFNGLDELETEQUERIESPROC                    , glDeleteQueries, "");
     815    GLGETPROCOPT(PFNGLBEGINQUERYPROC                       , glBeginQuery, "");
     816    GLGETPROCOPT(PFNGLENDQUERYPROC                         , glEndQuery, "");
     817    GLGETPROCOPT(PFNGLGETQUERYOBJECTUIVPROC                , glGetQueryObjectuiv, "");
     818    GLGETPROC   (PFNGLTEXIMAGE3DPROC                       , glTexImage3D, "");
     819    GLGETPROC   (PFNGLCOMPRESSEDTEXIMAGE2DPROC             , glCompressedTexImage2D, "");
     820    GLGETPROC   (PFNGLCOMPRESSEDTEXIMAGE3DPROC             , glCompressedTexImage3D, "");
     821
     822    /** @todo A structured approach for loading OpenGL functions. */
     823    /* OpenGL 3.3 core, GL_ARB_instanced_arrays. Required. */
     824    if (pState->rsGLVersion >= 3.3f)
     825        GLGETPROC(PFNGLVERTEXATTRIBDIVISORPROC          , glVertexAttribDivisor,   "");
     826    else if (vmsvga3dCheckGLExtension(pState, 3.3f, " GL_ARB_instanced_arrays "))
     827        GLGETPROC(PFNGLVERTEXATTRIBDIVISORPROC          , glVertexAttribDivisor,   "ARB");
     828
     829    /* OpenGL 3.1 core, GL_ARB_draw_instanced. Required. */
     830    if (pState->rsGLVersion >= 3.1f)
     831    {
     832        GLGETPROC(PFNGLDRAWARRAYSINSTANCEDPROC          , glDrawArraysInstanced,   "");
     833        GLGETPROC(PFNGLDRAWELEMENTSINSTANCEDPROC        , glDrawElementsInstanced, "");
     834    }
     835    else if (vmsvga3dCheckGLExtension(pState, 3.1f, " GL_ARB_draw_instanced "))
     836    {
     837        GLGETPROC(PFNGLDRAWARRAYSINSTANCEDPROC          , glDrawArraysInstanced,   "ARB");
     838        GLGETPROC(PFNGLDRAWELEMENTSINSTANCEDPROC        , glDrawElementsInstanced, "ARB");
     839    }
    803840#undef GLGETPROCOPT
    804841#undef GLGETPROC
     
    849886                                   pState->ext.glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB,
    850887                                                                 &pState->caps.maxVertexShaderTemps));
    851 #ifdef DEBUG_sunlover
    852         /// @todo Fix properly!!! Some Windows host drivers return 31 for the compatible OGL context (wglCreateContext).
    853         if (pState->caps.maxVertexShaderTemps < 32)
     888
     889        /* Intel Windows drivers return 31, while the guest expects 32 at least. */
     890        if (   pState->caps.maxVertexShaderTemps < 32
     891            && vmsvga3dIsVendorIntel())
    854892            pState->caps.maxVertexShaderTemps = 32;
    855 #endif
     893
    856894        VMSVGA3D_INIT_CHECKED_BOTH(pState, pContext, pOtherCtx,
    857895                                   pState->ext.glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB,
     
    16381676    case SVGA3D_DXT1:                   /* D3DFMT_DXT1 - WINED3DFMT_DXT1 */
    16391677        pSurface->internalFormatGL = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
    1640 #if 0
    1641         pSurface->formatGL = GL_RGBA_S3TC;          /* ??? */
    1642         pSurface->typeGL = GL_UNSIGNED_INT;         /* ??? */
    1643 #else   /* wine suggests: */
    1644         pSurface->formatGL = GL_RGBA;
    1645         pSurface->typeGL = GL_UNSIGNED_BYTE;
    1646         AssertMsgFailed(("Test me - SVGA3D_DXT1\n"));
    1647 #endif
     1678        pSurface->formatGL = GL_RGBA;        /* not used */
     1679        pSurface->typeGL = GL_UNSIGNED_BYTE; /* not used */
    16481680        break;
    16491681
     
    16541686    case SVGA3D_DXT3:                   /* D3DFMT_DXT3 - WINED3DFMT_DXT3 */
    16551687        pSurface->internalFormatGL = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
    1656 #if 0 /** @todo this needs testing... */
    1657         pSurface->formatGL = GL_RGBA_S3TC;          /* ??? */
    1658         pSurface->typeGL = GL_UNSIGNED_INT;         /* ??? */
    1659 #else   /* wine suggests: */
    1660         pSurface->formatGL = GL_RGBA;
    1661         pSurface->typeGL = GL_UNSIGNED_BYTE;
    1662         AssertMsgFailed(("Test me - SVGA3D_DXT3\n"));
    1663 #endif
     1688        pSurface->formatGL = GL_RGBA;        /* not used */
     1689        pSurface->typeGL = GL_UNSIGNED_BYTE; /* not used */
    16641690        break;
    16651691
     
    16701696    case SVGA3D_DXT5:                   /* D3DFMT_DXT5 - WINED3DFMT_DXT5 */
    16711697        pSurface->internalFormatGL = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
    1672 #if 0 /** @todo this needs testing... */
    1673         pSurface->formatGL = GL_RGBA_S3TC;
    1674         pSurface->typeGL = GL_UNSIGNED_INT;
    1675 #else   /* wine suggests: */
    1676         pSurface->formatGL = GL_RGBA;
    1677         pSurface->typeGL = GL_UNSIGNED_BYTE;
    1678         AssertMsgFailed(("Test me - SVGA3D_DXT5\n"));
    1679 #endif
     1698        pSurface->formatGL = GL_RGBA;        /* not used */
     1699        pSurface->typeGL = GL_UNSIGNED_BYTE; /* not used */
    16801700        break;
    16811701
     
    21702190            PVMSVGA3DMIPMAPLEVEL pMipLevel = &pSurface->pMipmapLevels[i];
    21712191
    2172             if (pMipLevel->fDirty)
    2173                 LogFunc(("sync dirty texture mipmap level %d (pitch %x)\n", i, pMipLevel->cbSurfacePitch));
    2174 
    2175             pState->ext.glTexImage3D(GL_TEXTURE_3D,
    2176                                      i,
    2177                                      pSurface->internalFormatGL,
    2178                                      pMipLevel->mipmapSize.width,
    2179                                      pMipLevel->mipmapSize.height,
    2180                                      pMipLevel->mipmapSize.depth,
    2181                                      0, /* border */
    2182                                      pSurface->formatGL,
    2183                                      pSurface->typeGL,
    2184                                      pMipLevel->pSurfaceData);
     2192            LogFunc(("sync dirty 3D texture mipmap level %d (pitch %x) (dirty %d)\n",
     2193                     i, pMipLevel->cbSurfacePitch, pMipLevel->fDirty));
     2194
     2195            if (   pSurface->internalFormatGL == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
     2196                || pSurface->internalFormatGL == GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
     2197                || pSurface->internalFormatGL == GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)
     2198            {
     2199                pState->ext.glCompressedTexImage3D(GL_TEXTURE_3D,
     2200                                                   i,
     2201                                                   pSurface->internalFormatGL,
     2202                                                   pMipLevel->mipmapSize.width,
     2203                                                   pMipLevel->mipmapSize.height,
     2204                                                   pMipLevel->mipmapSize.depth,
     2205                                                   0,
     2206                                                   pMipLevel->cbSurface,
     2207                                                   pMipLevel->pSurfaceData);
     2208            }
     2209            else
     2210            {
     2211                pState->ext.glTexImage3D(GL_TEXTURE_3D,
     2212                                         i,
     2213                                         pSurface->internalFormatGL,
     2214                                         pMipLevel->mipmapSize.width,
     2215                                         pMipLevel->mipmapSize.height,
     2216                                         pMipLevel->mipmapSize.depth,
     2217                                         0, /* border */
     2218                                         pSurface->formatGL,
     2219                                         pSurface->typeGL,
     2220                                         pMipLevel->pSurfaceData);
     2221            }
    21852222            VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);
    21862223
     
    22002237                Assert(pMipLevel->mipmapSize.depth == 1);
    22012238
    2202                 LogFunc(("sync texture face %d mipmap level %d (dirty %d)\n",
     2239                LogFunc(("sync cube texture face %d mipmap level %d (dirty %d)\n",
    22032240                          iFace, i, pMipLevel->fDirty));
    22042241
    2205                 glTexImage2D(Face,
     2242                if (   pSurface->internalFormatGL == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
     2243                    || pSurface->internalFormatGL == GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
     2244                    || pSurface->internalFormatGL == GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)
     2245                {
     2246                    pState->ext.glCompressedTexImage2D(Face,
     2247                                                       i,
     2248                                                       pSurface->internalFormatGL,
     2249                                                       pMipLevel->mipmapSize.width,
     2250                                                       pMipLevel->mipmapSize.height,
     2251                                                       0,
     2252                                                       pMipLevel->cbSurface,
     2253                                                       pMipLevel->pSurfaceData);
     2254                }
     2255                else
     2256                {
     2257                    glTexImage2D(Face,
     2258                                 i,
     2259                                 pSurface->internalFormatGL,
     2260                                 pMipLevel->mipmapSize.width,
     2261                                 pMipLevel->mipmapSize.height,
     2262                                 0,
     2263                                 pSurface->formatGL,
     2264                                 pSurface->typeGL,
     2265                                 pMipLevel->pSurfaceData);
     2266                }
     2267                VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);
     2268
     2269                pMipLevel->fDirty = false;
     2270            }
     2271        }
     2272    }
     2273    else if (target == GL_TEXTURE_2D)
     2274    {
     2275        for (uint32_t i = 0; i < numMipLevels; ++i)
     2276        {
     2277            /* Allocate and initialize texture memory.  Passing the zero filled pSurfaceData avoids
     2278             * exposing random host memory to the guest and helps a with the fedora 21 surface
     2279             * corruption issues (launchpad, background, search field, login).
     2280             */
     2281            PVMSVGA3DMIPMAPLEVEL pMipLevel = &pSurface->pMipmapLevels[i];
     2282            Assert(pMipLevel->mipmapSize.depth == 1);
     2283
     2284            LogFunc(("sync dirty texture mipmap level %d (pitch %x) (dirty %d)\n",
     2285                     i, pMipLevel->cbSurfacePitch, pMipLevel->fDirty));
     2286
     2287            if (   pSurface->internalFormatGL == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
     2288                || pSurface->internalFormatGL == GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
     2289                || pSurface->internalFormatGL == GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)
     2290            {
     2291                pState->ext.glCompressedTexImage2D(GL_TEXTURE_2D,
     2292                                                   i,
     2293                                                   pSurface->internalFormatGL,
     2294                                                   pMipLevel->mipmapSize.width,
     2295                                                   pMipLevel->mipmapSize.height,
     2296                                                   0,
     2297                                                   pMipLevel->cbSurface,
     2298                                                   pMipLevel->pSurfaceData);
     2299            }
     2300            else
     2301            {
     2302                glTexImage2D(GL_TEXTURE_2D,
    22062303                             i,
    22072304                             pSurface->internalFormatGL,
     
    22122309                             pSurface->typeGL,
    22132310                             pMipLevel->pSurfaceData);
    2214                 VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);
    2215 
    2216                 pMipLevel->fDirty = false;
    22172311            }
    2218         }
    2219     }
    2220     else if (target == GL_TEXTURE_2D)
    2221     {
    2222         for (uint32_t i = 0; i < numMipLevels; ++i)
    2223         {
    2224             /* Allocate and initialize texture memory.  Passing the zero filled pSurfaceData avoids
    2225              * exposing random host memory to the guest and helps a with the fedora 21 surface
    2226              * corruption issues (launchpad, background, search field, login).
    2227              */
    2228             PVMSVGA3DMIPMAPLEVEL pMipLevel = &pSurface->pMipmapLevels[i];
    2229             Assert(pMipLevel->mipmapSize.depth == 1);
    2230 
    2231             if (pMipLevel->fDirty)
    2232                 LogFunc(("sync dirty texture mipmap level %d (pitch %x)\n", i, pMipLevel->cbSurfacePitch));
    2233 
    2234             glTexImage2D(GL_TEXTURE_2D,
    2235                          i,
    2236                          pSurface->internalFormatGL,
    2237                          pMipLevel->mipmapSize.width,
    2238                          pMipLevel->mipmapSize.height,
    2239                          0,
    2240                          pSurface->formatGL,
    2241                          pSurface->typeGL,
    2242                          pMipLevel->pSurfaceData);
    22432312            VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);
    22442313
     
    39093978        return GL_MAX;
    39103979    default:
    3911         AssertMsgFailed(("blendEq=%d (%#x)\n", blendEq, blendEq));
     3980        /* SVGA3D_BLENDEQ_INVALID means that the render state has not been set, therefore use default. */
     3981        AssertMsg(blendEq == SVGA3D_BLENDEQ_INVALID, ("blendEq=%d (%#x)\n", blendEq, blendEq));
    39123982        return GL_FUNC_ADD;
    39133983    }
     
    42544324        case SVGA3D_RS_SEPARATEALPHABLENDENABLE: /* SVGA3dBool */
    42554325        {
    4256             /* Refresh the blending state based on the new enable setting. */
     4326            /* Refresh the blending state based on the new enable setting.
     4327             * This will take existing states and set them using either glBlend* or glBlend*Separate.
     4328             */
    42574329            SVGA3dRenderState renderstate[2];
    42584330
     
    60616133}
    60626134
    6063 int vmsvga3dDrawPrimitivesProcessVertexDecls(PVGASTATE pThis, PVMSVGA3DCONTEXT pContext, uint32_t iVertexDeclBase, uint32_t numVertexDecls, SVGA3dVertexDecl *pVertexDecl)
     6135int vmsvga3dDrawPrimitivesProcessVertexDecls(PVGASTATE pThis, PVMSVGA3DCONTEXT pContext,
     6136                                             uint32_t iVertexDeclBase, uint32_t numVertexDecls,
     6137                                             SVGA3dVertexDecl *pVertexDecl, SVGA3dVertexDivisor const *paVertexDivisors)
    60646138{
    60656139    PVMSVGA3DSTATE      pState = pThis->svga.p3dState;
     
    61296203                                              (const GLvoid *)(uintptr_t)pVertexDecl[iVertex].array.offset);
    61306204            VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);
     6205            if (pState->ext.glVertexAttribDivisor)
     6206            {
     6207                GLuint const divisor = paVertexDivisors && paVertexDivisors[index].s.instanceData ? 1 : 0;
     6208                pState->ext.glVertexAttribDivisor(index, divisor);
     6209                VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);
     6210            }
    61316211            /** @todo case SVGA3D_DECLUSAGE_COLOR: color component order not identical!! test GL_BGRA!!  */
    61326212        }
     
    63136393    AssertReturn(!cVertexDivisor || cVertexDivisor == numVertexDecls, VERR_INVALID_PARAMETER);
    63146394
    6315     /** @todo Non-zero cVertexDivisor */
    6316     Assert(!cVertexDivisor);
     6395    if (!cVertexDivisor)
     6396        pVertexDivisor = NULL; /* Be sure. */
    63176397
    63186398    if (    cid >= pState->cContexts
     
    63426422    }
    63436423
     6424    /* Try to figure out if instancing is used.
     6425     * Support simple instancing case with one set of indexed data and one set per-instance data.
     6426     */
     6427    uint32_t cInstances = 0;
     6428    for (uint32_t iVertexDivisor = 0; iVertexDivisor < cVertexDivisor; ++iVertexDivisor)
     6429    {
     6430        if (pVertexDivisor[iVertexDivisor].s.indexedData)
     6431        {
     6432            if (cInstances == 0)
     6433                cInstances = pVertexDivisor[iVertexDivisor].s.count;
     6434            else
     6435                Assert(cInstances == pVertexDivisor[iVertexDivisor].s.count);
     6436        }
     6437        else if (pVertexDivisor[iVertexDivisor].s.instanceData)
     6438        {
     6439            Assert(pVertexDivisor[iVertexDivisor].s.count == 1);
     6440        }
     6441    }
     6442
    63446443    /* Flush any shader changes; after (!) checking the vertex declarations to deal with pre-transformed vertices. */
    63456444    if (pContext->pShaderContext)
     
    63726471        }
    63736472
    6374         rc = vmsvga3dDrawPrimitivesProcessVertexDecls(pThis, pContext, iCurrentVertex, iVertex - iCurrentVertex, &pVertexDecl[iCurrentVertex]);
     6473        rc = vmsvga3dDrawPrimitivesProcessVertexDecls(pThis, pContext, iCurrentVertex, iVertex - iCurrentVertex,
     6474                                                      &pVertexDecl[iCurrentVertex], pVertexDivisor);
    63756475        AssertRCReturn(rc, rc);
    63766476
     
    64496549            /* Render without an index buffer */
    64506550            Log(("DrawPrimitive %x cPrimitives=%d cVertices=%d index index bias=%d\n", modeDraw, pRange[iPrimitive].primitiveCount, cVertices, pRange[iPrimitive].indexBias));
    6451             glDrawArrays(modeDraw, pRange[iPrimitive].indexBias, cVertices);
     6551            if (cInstances == 0)
     6552            {
     6553                glDrawArrays(modeDraw, pRange[iPrimitive].indexBias, cVertices);
     6554            }
     6555            else
     6556            {
     6557                pState->ext.glDrawArraysInstanced(modeDraw, pRange[iPrimitive].indexBias, cVertices, cInstances);
     6558            }
     6559            VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);
    64526560        }
    64536561        else
     
    64736581            }
    64746582
    6475             /* Render with an index buffer */
    64766583            Log(("DrawIndexedPrimitive %x cPrimitives=%d cVertices=%d hint.first=%d hint.last=%d index offset=%d primitivecount=%d index width=%d index bias=%d\n", modeDraw, pRange[iPrimitive].primitiveCount, cVertices, pVertexDecl[0].rangeHint.first,  pVertexDecl[0].rangeHint.last,  pRange[iPrimitive].indexArray.offset, pRange[iPrimitive].primitiveCount,  pRange[iPrimitive].indexWidth, pRange[iPrimitive].indexBias));
    6477             if (pRange[iPrimitive].indexBias == 0)
    6478                 glDrawElements(modeDraw,
    6479                                cVertices,
    6480                                indexType,
    6481                                (GLvoid *)(uintptr_t)pRange[iPrimitive].indexArray.offset);   /* byte offset in indices buffer */
     6584            if (cInstances == 0)
     6585            {
     6586                /* Render with an index buffer */
     6587                if (pRange[iPrimitive].indexBias == 0)
     6588                    glDrawElements(modeDraw,
     6589                                   cVertices,
     6590                                   indexType,
     6591                                   (GLvoid *)(uintptr_t)pRange[iPrimitive].indexArray.offset);   /* byte offset in indices buffer */
     6592                else
     6593                    pState->ext.glDrawElementsBaseVertex(modeDraw,
     6594                                                         cVertices,
     6595                                                         indexType,
     6596                                                         (GLvoid *)(uintptr_t)pRange[iPrimitive].indexArray.offset, /* byte offset in indices buffer */
     6597                                                         pRange[iPrimitive].indexBias);  /* basevertex */
     6598            }
    64826599            else
    6483                 pState->ext.glDrawElementsBaseVertex(modeDraw,
    6484                                                      cVertices,
    6485                                                      indexType,
    6486                                                      (GLvoid *)(uintptr_t)pRange[iPrimitive].indexArray.offset, /* byte offset in indices buffer */
    6487                                                      pRange[iPrimitive].indexBias);  /* basevertex */
     6600            {
     6601                /* Render with an index buffer */
     6602                if (pRange[iPrimitive].indexBias == 0)
     6603                    pState->ext.glDrawElementsInstanced(modeDraw,
     6604                                                        cVertices,
     6605                                                        indexType,
     6606                                                        (GLvoid *)(uintptr_t)pRange[iPrimitive].indexArray.offset, /* byte offset in indices buffer */
     6607                                                        cInstances);
     6608                else
     6609                    pState->ext.glDrawElementsInstancedBaseVertex(modeDraw,
     6610                                                                  cVertices,
     6611                                                                  indexType,
     6612                                                                  (GLvoid *)(uintptr_t)pRange[iPrimitive].indexArray.offset, /* byte offset in indices buffer */
     6613                                                                  cInstances,
     6614                                                                  pRange[iPrimitive].indexBias);  /* basevertex */
     6615            }
     6616            VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);
    64886617
    64896618            /* Unbind the index buffer after usage. */
     
    64916620            VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);
    64926621        }
    6493         VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);
    64946622    }
    64956623
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