JNIEXPORT void JNICALL Java_org_lwjgl_opengl_NVBindlessMultiDrawIndirect_nglMultiDrawElementsIndirectBindlessNVBO(JNIEnv *env, jclass clazz, jint mode, jint type, jlong indirect_buffer_offset, jint drawCount, jint stride, jint vertexBufferCount, jlong function_pointer) { const GLvoid *indirect_address = (const GLvoid *)(intptr_t)offsetToPointer(indirect_buffer_offset); glMultiDrawElementsIndirectBindlessNVPROC glMultiDrawElementsIndirectBindlessNV = (glMultiDrawElementsIndirectBindlessNVPROC)((intptr_t)function_pointer); glMultiDrawElementsIndirectBindlessNV(mode, type, indirect_address, drawCount, stride, vertexBufferCount); }
// -------------------------------------------------------------------------------------------------------------------- void UntexturedObjectsGLBindlessIndirect::Render(const std::vector<Matrix>& _transforms) { const auto xformCount = _transforms.size(); const auto objCount = m_commands.size(); assert(xformCount == objCount); // Program Vec3 dir = { -0.5f, -1, 1 }; Vec3 at = { 0, 0, 0 }; Vec3 up = { 0, 0, 1 }; dir = normalize(dir); Vec3 eye = at - 250 * dir; Matrix view = matrix_look_at(eye, at, up); Matrix view_proj = mProj * view; glUseProgram(m_prog); glUniformMatrix4fv(0, 1, GL_TRUE, &view_proj.x.x); // Input Layout glEnableClientState(GL_ELEMENT_ARRAY_UNIFIED_NV); glEnableClientState(GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glVertexAttribFormatNV(0, 3, GL_FLOAT, GL_FALSE, sizeof(UntexturedObjectsProblem::Vertex)); glVertexAttribFormatNV(1, 3, GL_FLOAT, GL_FALSE, sizeof(UntexturedObjectsProblem::Vertex)); // Rasterizer State glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); glDisable(GL_SCISSOR_TEST); // Blend State glDisable(GL_BLEND); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); // Depth Stencil State glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); size_t i = 0; for (auto it = m_commands.begin(); it != m_commands.end(); ++it) { Command *cmd = &*it; cmd->Draw.count = mIndexCount; cmd->Draw.instanceCount = 1; cmd->Draw.firstIndex = 0; cmd->Draw.baseVertex = 0; cmd->Draw.baseInstance = 0; cmd->reserved = 0; cmd->indexBuffer.index = 0; cmd->indexBuffer.reserved = 0; cmd->indexBuffer.address = m_ib_addrs[i]; cmd->indexBuffer.length = m_ib_sizes[i]; cmd->vertexBuffers[0].index = 0; cmd->vertexBuffers[0].reserved = 0; cmd->vertexBuffers[0].address = m_vbo_addrs[i] + offsetof(UntexturedObjectsProblem::Vertex, pos); cmd->vertexBuffers[0].length = m_vbo_sizes[i] - offsetof(UntexturedObjectsProblem::Vertex, pos); cmd->vertexBuffers[1].index = 1; cmd->vertexBuffers[1].reserved = 0; cmd->vertexBuffers[1].address = m_vbo_addrs[i] + offsetof(UntexturedObjectsProblem::Vertex, color); cmd->vertexBuffers[1].length = m_vbo_sizes[i] - offsetof(UntexturedObjectsProblem::Vertex, color); ++i; } memcpy(m_transform_ptr, &*_transforms.begin(), sizeof(Matrix) * xformCount); memcpy(m_cmd_ptr, &*m_commands.begin(), sizeof(Command) * objCount); glMemoryBarrier(GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT); // resolveQueries(); // glBeginQuery(GL_TIME_ELAPSED, m_queries[m_currentQueryIssue]); glMultiDrawElementsIndirectBindlessNV(GL_TRIANGLES, GL_UNSIGNED_SHORT, nullptr, objCount, 0, 2); // glEndQuery(GL_TIME_ELAPSED); // m_currentQueryIssue = (m_currentQueryIssue + 1) % kQueryCount; }