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);
}
Пример #2
0
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();
 }
Пример #4
0
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);
}