void piglit_init(int argc, char **argv) { bool pass = true; piglit_require_extension("GL_ARB_draw_instanced"); glDrawArraysInstancedARB(GL_TRIANGLES, -1, 2, 3); if (!piglit_check_gl_error(GL_INVALID_VALUE)) pass = false; glDrawElementsInstancedARB(GL_TRIANGLES, 2, GL_INT, NULL, 3); if (!piglit_check_gl_error(GL_INVALID_ENUM)) pass = false; glDrawElementsInstancedARB(GL_TRIANGLES, 2, GL_SHORT, NULL, 3); if (!piglit_check_gl_error(GL_INVALID_ENUM)) pass = false; glDrawElementsInstancedARB(GL_TRIANGLES, 2, GL_BYTE, NULL, 3); if (!piglit_check_gl_error(GL_INVALID_ENUM)) pass = false; glDrawElementsInstancedARB(GL_TRIANGLES, 2, GL_FLOAT, NULL, 3); if (!piglit_check_gl_error(GL_INVALID_ENUM)) pass = false; piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL); }
void piglit_init(int argc, char **argv) { bool pass = true; GLuint list; piglit_require_extension("GL_ARB_draw_instanced"); list = glGenLists(1); glNewList(list, GL_COMPILE); glDrawArraysInstancedARB(GL_TRIANGLES, 0, 2, 3); if (!piglit_check_gl_error(GL_INVALID_OPERATION)) pass = false; glDrawElementsInstancedARB(GL_TRIANGLES, 2, GL_UNSIGNED_INT, NULL, 3); if (!piglit_check_gl_error(GL_INVALID_OPERATION)) pass = false; glEndList(); /* Make sure the list is empty. */ glCallList(list); if (!piglit_check_gl_error(0)) pass = false; piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL); }
inline void VL_glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount) { if (glDrawElementsInstanced) glDrawElementsInstanced(mode, count, type, indices, primcount); else if (glDrawElementsInstancedARB) glDrawElementsInstancedARB(mode, count, type, indices, primcount); else if (glDrawElementsInstancedEXT) glDrawElementsInstancedEXT(mode, count, type, indices, primcount); else VL_UNSUPPORTED_FUNC(); }
enum piglit_result piglit_display(void) { static const int indices[6] = {0, 1, 2, 0, 2, 3}; static const float verts[] = { 10, 10, 20, 10, 20, 20, 10, 20, }; static const float green[4] = {0.0, 1.0, 0.0, 1.0}; static const float cyan[4] = {0.0, 1.0, 1.0, 1.0}; static const float blue[4] = {0.0, 0.0, 1.0, 1.0}; enum piglit_result result = PIGLIT_PASS; piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE); glViewport(0, 0, piglit_width, piglit_height); glClearColor(0.5, 0.5, 0.5, 0.0); glClear(GL_COLOR_BUFFER_BIT); glVertexPointer(2, GL_FLOAT, 0, verts); glEnableClientState(GL_VERTEX_ARRAY); glDrawElementsInstancedARB(GL_TRIANGLES, 6, GL_UNSIGNED_INT, indices, 3); glDisableClientState(GL_VERTEX_ARRAY); if (!piglit_probe_rect_rgba(10, 10, 10, 10, green)) result = PIGLIT_FAIL; if (!piglit_probe_rect_rgba(30, 10, 10, 10, cyan)) result = PIGLIT_FAIL; if (!piglit_probe_rect_rgba(50, 10, 10, 10, blue)) result = PIGLIT_FAIL; piglit_present_results(); return result; }
void ParticleInstancingRenderer::Render() { glPushAttrib(GL_ALL_ATTRIB_BITS); CheckOpenGLError(); const SphereGeometryVBO& level = *sphere_geometry_vbos[quality_level]; glUseProgram(program_instancing); CheckOpenGLError(); glValidateProgram(program_instancing); CheckOpenGLError(); glUniform1i(glGetUniformLocation(program_instancing,"per_instance_data_position_radius"), 0); CheckOpenGLError(); glUniform1i(glGetUniformLocation(program_instancing,"per_instance_data_attribute"), 1); CheckOpenGLError(); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, level.GetVBOIndices()); CheckOpenGLError(); glBindBuffer(GL_ARRAY_BUFFER, level.GetVBOVertices()); CheckOpenGLError(); glVertexPointer(2, GL_FLOAT, 0, 0); CheckOpenGLError(); glEnableClientState(GL_VERTEX_ARRAY); CheckOpenGLError(); const size_t total_number_of_instances = NumParticles(); const size_t number_of_batches = 1 + (total_number_of_instances - 1) / instanced_batch_size; for(size_t batch = 0, instances_remaining = total_number_of_instances; batch < number_of_batches; ++batch, instances_remaining -= instanced_batch_size) { size_t current_buffer = batch % 2; const size_t start_instance = batch * instanced_batch_size; const size_t instance_count = std::min(instances_remaining,instanced_batch_size); CopyParticleDataToGpuBuffers(start_instance, instance_count, tbo_position_radius_batches[current_buffer], tex_position_radius_batches[current_buffer], tbo_color_batches[current_buffer], tex_color_batches[current_buffer]); glActiveTexture(GL_TEXTURE0); CheckOpenGLError(); glBindTexture(GL_TEXTURE_BUFFER_ARB, tex_position_radius_batches[current_buffer]); CheckOpenGLError(); glActiveTexture(GL_TEXTURE1); CheckOpenGLError(); glBindTexture(GL_TEXTURE_BUFFER_ARB, tex_color_batches[current_buffer]); CheckOpenGLError(); glDrawElementsInstancedARB(GL_QUAD_STRIP, GLsizei(level.GetNumIndices()), GL_UNSIGNED_SHORT, 0, GLsizei(instance_count)); CheckOpenGLError(); } glDisableClientState(GL_VERTEX_ARRAY); CheckOpenGLError(); glBindBuffer(GL_ARRAY_BUFFER, 0); CheckOpenGLError(); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); CheckOpenGLError(); glActiveTexture(GL_TEXTURE1); CheckOpenGLError(); glBindTexture(GL_TEXTURE_BUFFER_ARB, 0); CheckOpenGLError(); glActiveTexture(GL_TEXTURE0); CheckOpenGLError(); glBindTexture(GL_TEXTURE_BUFFER_ARB, 0); CheckOpenGLError(); glUseProgram(0); CheckOpenGLError(); glPopAttrib(); CheckOpenGLError(); }
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBDrawInstanced_nglDrawElementsInstancedARBBO(JNIEnv *env, jclass clazz, jint mode, jint count, jint type, jlong indices_buffer_offset, jint primcount, jlong function_pointer) { const GLvoid *indices_address = (const GLvoid *)(intptr_t)offsetToPointer(indices_buffer_offset); glDrawElementsInstancedARBPROC glDrawElementsInstancedARB = (glDrawElementsInstancedARBPROC)((intptr_t)function_pointer); glDrawElementsInstancedARB(mode, count, type, indices_address, primcount); }
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_ARBDrawInstanced_nglDrawElementsInstancedARB(JNIEnv *__env, jclass clazz, jint mode, jint count, jint type, jlong indicesAddress, jint primcount) { glDrawElementsInstancedARBPROC glDrawElementsInstancedARB = (glDrawElementsInstancedARBPROC)tlsGetFunction(1109); intptr_t indices = (intptr_t)indicesAddress; UNUSED_PARAM(clazz) glDrawElementsInstancedARB(mode, count, type, indices, primcount); }