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);
}
Ejemplo n.º 2
0
// --------------------------------------------------------------------------------------------------------------------
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;
}