JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL32C_nglMultiDrawElementsBaseVertex__IJIJIJ(JNIEnv *__env, jclass clazz, jint mode, jlong countAddress, jint type, jlong indicesAddress, jint primcount, jlong basevertexAddress) { glMultiDrawElementsBaseVertexPROC glMultiDrawElementsBaseVertex = (glMultiDrawElementsBaseVertexPROC)tlsGetFunction(651); intptr_t count = (intptr_t)countAddress; intptr_t indices = (intptr_t)indicesAddress; intptr_t basevertex = (intptr_t)basevertexAddress; UNUSED_PARAM(clazz) glMultiDrawElementsBaseVertex(mode, count, type, indices, primcount, basevertex); }
virtual void render(bool use_vbo) const { VL_CHECK(GLEW_VERSION_1_4); VL_CHECK(!use_vbo || (use_vbo && (GLEW_ARB_vertex_buffer_object||GLEW_VERSION_1_5||GLEW_VERSION_3_0))) use_vbo &= GLEW_ARB_vertex_buffer_object||GLEW_VERSION_1_5||GLEW_VERSION_3_0; // && indices()->gpuBuffer()->handle() && indices()->sizeGPU(); if ( !use_vbo && !indices()->size() ) return; // apply patch parameters if any and if using PT_PATCHES applyPatchParameters(); // primitive restart enable if(primitiveRestartEnabled()) { if(GLEW_VERSION_3_1) { glEnable(GL_PRIMITIVE_RESTART); glPrimitiveRestartIndex(primitiveRestartIndex()); } else if(GLEW_NV_primitive_restart) { glEnable(GL_PRIMITIVE_RESTART_NV); glPrimitiveRestartIndexNV(primitiveRestartIndex()); } else { vl::Log::error("MultiDrawElements error: primitive restart not supported by this OpenGL implementation!\n"); VL_TRAP(); return; } } GLvoid **indices_ptr = (GLvoid**)&mPointerVector[0]; if (use_vbo && indices()->gpuBuffer()->handle()) { VL_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indices()->gpuBuffer()->handle()); indices_ptr = (GLvoid**)&mNULLPointerVector[0]; } else VL_glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); if (baseVertices().size()) { VL_CHECK( baseVertices().size() == pointerVector().size() ) VL_CHECK( baseVertices().size() == countVector().size() ) if (GLEW_ARB_draw_elements_base_vertex || GLEW_VERSION_3_1) glMultiDrawElementsBaseVertex( primitiveType(), (GLsizei*)&mCountVector[0], indices()->glType(), indices_ptr, (GLsizei)mCountVector.size(), (GLint*)&mBaseVertices[0] ); else { vl::Log::error("MultiDrawElements::render(): glMultiDrawElementsBaseVertex() not supported!\n" "OpenGL 3.1 or GL_ARB_draw_elements_base_vertex extension required.\n" ); } }
inline void multiDrawElementsBaseVertex( MultiDrawElementsBaseVertexMode mode, const GLsizei *count, MultiDrawElementsBaseVertexType type, const GLvoid * const *indices, GLsizei drawcount, const GLint *basevertex) { glMultiDrawElementsBaseVertex( GLenum(mode), count, GLenum(type), indices, drawcount, basevertex); }
enum piglit_result piglit_display(void) { bool pass = true; static const GLsizei count[] = { 4, 4, 4, 4 }; static const void *indices[ARRAY_SIZE(count)] = { 0, 0, 0, 0 }; static const GLint base[ARRAY_SIZE(count)] = { 4, 8, 12, 16 }; glViewport(0, 0, piglit_width, piglit_height); glClearColor(0.2, 0.2, 0.2, 0.2); glClear(GL_COLOR_BUFFER_BIT); glMultiDrawElementsBaseVertex(GL_TRIANGLE_FAN, count, GL_UNSIGNED_INT, indices, ARRAY_SIZE(indices), base); pass = piglit_probe_rect_rgba(0, 0, piglit_width / 2, piglit_height /2, green) && pass; pass = piglit_probe_rect_rgba(piglit_width / 2, 0, piglit_width / 2, piglit_height / 2, blue) && pass; pass = piglit_probe_rect_rgba(0, piglit_height /2, piglit_width / 2, piglit_height / 2, gold) && pass; pass = piglit_probe_rect_rgba(piglit_width / 2, piglit_height /2, piglit_width / 2, piglit_height / 2, magenta) && pass; piglit_present_results(); return pass ? PIGLIT_PASS : PIGLIT_FAIL; }
void VertexArray::multiDrawElementsBaseVertex(const GLenum mode, const GLsizei* count, const GLenum type, const void** indices, const GLsizei drawCount, GLint* baseVertex) const { bind(); glMultiDrawElementsBaseVertex(mode, const_cast<GLsizei*>(count), type, const_cast<void**>(indices), drawCount, baseVertex); }
void VertexArrayObject::multiDrawElementsBaseVertex(GLenum mode, const GLsizei* count, GLenum type, const void** indices, GLsizei drawCount, GLint* baseVertex) { bind(); glMultiDrawElementsBaseVertex(mode, const_cast<GLsizei*>(count), type, const_cast<void**>(indices), drawCount, baseVertex); CheckGLError(); }