Changeset 73330 in vbox for trunk/src/VBox
- Timestamp:
- Jul 23, 2018 3:19:00 PM (6 years ago)
- Location:
- trunk/src/VBox/Devices/Graphics
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-internal.h
r73295 r73330 1017 1017 PFNGLGETQUERYOBJECTUIVPROC glGetQueryObjectuiv; 1018 1018 PFNGLTEXIMAGE3DPROC glTexImage3D; 1019 PFNGLVERTEXATTRIBDIVISORPROC glVertexAttribDivisor; 1020 PFNGLDRAWARRAYSINSTANCEDPROC glDrawArraysInstanced; 1021 PFNGLDRAWELEMENTSINSTANCEDPROC glDrawElementsInstanced; 1022 PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2D; 1023 PFNGLCOMPRESSEDTEXIMAGE3DPROC glCompressedTexImage3D; 1019 1024 } ext; 1020 1025 -
trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp
r73297 r73330 65 65 66 66 #ifdef RT_OS_WINDOWS 67 # define OGLGETPROCADDRESS wglGetProcAddress 68 67 # define OGLGETPROCADDRESS MyWinGetProcAddress 68 DECLINLINE(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 } 69 76 #elif defined(RT_OS_DARWIN) 70 77 # include <dlfcn.h> … … 510 517 511 518 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 */ 525 static bool vmsvga3dIsVendorIntel(void) 526 { 527 return RTStrNICmp((char *)glGetString(GL_VENDOR), "Intel", 5) == 0; 512 528 } 513 529 … … 785 801 #endif 786 802 787 #define GLGETPROC(ProcType, ProcName ) do { \788 pState->ext.ProcName = (ProcType)OGLGETPROCADDRESS(#ProcName ); \789 Assert MsgReturn(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); \ 790 806 } 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)")); \ 794 810 } while(0) 795 811 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 } 803 840 #undef GLGETPROCOPT 804 841 #undef GLGETPROC … … 849 886 pState->ext.glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB, 850 887 &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()) 854 892 pState->caps.maxVertexShaderTemps = 32; 855 #endif 893 856 894 VMSVGA3D_INIT_CHECKED_BOTH(pState, pContext, pOtherCtx, 857 895 pState->ext.glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, … … 1638 1676 case SVGA3D_DXT1: /* D3DFMT_DXT1 - WINED3DFMT_DXT1 */ 1639 1677 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 */ 1648 1680 break; 1649 1681 … … 1654 1686 case SVGA3D_DXT3: /* D3DFMT_DXT3 - WINED3DFMT_DXT3 */ 1655 1687 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 */ 1664 1690 break; 1665 1691 … … 1670 1696 case SVGA3D_DXT5: /* D3DFMT_DXT5 - WINED3DFMT_DXT5 */ 1671 1697 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 */ 1680 1700 break; 1681 1701 … … 2170 2190 PVMSVGA3DMIPMAPLEVEL pMipLevel = &pSurface->pMipmapLevels[i]; 2171 2191 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 } 2185 2222 VMSVGA3D_CHECK_LAST_ERROR(pState, pContext); 2186 2223 … … 2200 2237 Assert(pMipLevel->mipmapSize.depth == 1); 2201 2238 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", 2203 2240 iFace, i, pMipLevel->fDirty)); 2204 2241 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, 2206 2303 i, 2207 2304 pSurface->internalFormatGL, … … 2212 2309 pSurface->typeGL, 2213 2310 pMipLevel->pSurfaceData); 2214 VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);2215 2216 pMipLevel->fDirty = false;2217 2311 } 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 avoids2225 * exposing random host memory to the guest and helps a with the fedora 21 surface2226 * 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);2243 2312 VMSVGA3D_CHECK_LAST_ERROR(pState, pContext); 2244 2313 … … 3909 3978 return GL_MAX; 3910 3979 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)); 3912 3982 return GL_FUNC_ADD; 3913 3983 } … … 4254 4324 case SVGA3D_RS_SEPARATEALPHABLENDENABLE: /* SVGA3dBool */ 4255 4325 { 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 */ 4257 4329 SVGA3dRenderState renderstate[2]; 4258 4330 … … 6061 6133 } 6062 6134 6063 int vmsvga3dDrawPrimitivesProcessVertexDecls(PVGASTATE pThis, PVMSVGA3DCONTEXT pContext, uint32_t iVertexDeclBase, uint32_t numVertexDecls, SVGA3dVertexDecl *pVertexDecl) 6135 int vmsvga3dDrawPrimitivesProcessVertexDecls(PVGASTATE pThis, PVMSVGA3DCONTEXT pContext, 6136 uint32_t iVertexDeclBase, uint32_t numVertexDecls, 6137 SVGA3dVertexDecl *pVertexDecl, SVGA3dVertexDivisor const *paVertexDivisors) 6064 6138 { 6065 6139 PVMSVGA3DSTATE pState = pThis->svga.p3dState; … … 6129 6203 (const GLvoid *)(uintptr_t)pVertexDecl[iVertex].array.offset); 6130 6204 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 } 6131 6211 /** @todo case SVGA3D_DECLUSAGE_COLOR: color component order not identical!! test GL_BGRA!! */ 6132 6212 } … … 6313 6393 AssertReturn(!cVertexDivisor || cVertexDivisor == numVertexDecls, VERR_INVALID_PARAMETER); 6314 6394 6315 /** @todo Non-zero cVertexDivisor */6316 Assert(!cVertexDivisor);6395 if (!cVertexDivisor) 6396 pVertexDivisor = NULL; /* Be sure. */ 6317 6397 6318 6398 if ( cid >= pState->cContexts … … 6342 6422 } 6343 6423 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 6344 6443 /* Flush any shader changes; after (!) checking the vertex declarations to deal with pre-transformed vertices. */ 6345 6444 if (pContext->pShaderContext) … … 6372 6471 } 6373 6472 6374 rc = vmsvga3dDrawPrimitivesProcessVertexDecls(pThis, pContext, iCurrentVertex, iVertex - iCurrentVertex, &pVertexDecl[iCurrentVertex]); 6473 rc = vmsvga3dDrawPrimitivesProcessVertexDecls(pThis, pContext, iCurrentVertex, iVertex - iCurrentVertex, 6474 &pVertexDecl[iCurrentVertex], pVertexDivisor); 6375 6475 AssertRCReturn(rc, rc); 6376 6476 … … 6449 6549 /* Render without an index buffer */ 6450 6550 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); 6452 6560 } 6453 6561 else … … 6473 6581 } 6474 6582 6475 /* Render with an index buffer */6476 6583 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 } 6482 6599 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); 6488 6617 6489 6618 /* Unbind the index buffer after usage. */ … … 6491 6620 VMSVGA3D_CHECK_LAST_ERROR(pState, pContext); 6492 6621 } 6493 VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);6494 6622 } 6495 6623
Note:
See TracChangeset
for help on using the changeset viewer.