Commit c046d828 authored by Gerd Hoffmann's avatar Gerd Hoffmann
Browse files

shaders: initialize vertexes once



Create a buffer for the vertex data and place vertexes
there at initialization time.  Then just use the buffer
for each texture blit.

Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
Reviewed-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
parent 5fdb4671
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -3,7 +3,9 @@

#include <epoxy/gl.h>

void qemu_gl_run_texture_blit(GLint texture_blit_prog);
GLuint qemu_gl_init_texture_blit(GLint texture_blit_prog);
void qemu_gl_run_texture_blit(GLint texture_blit_prog,
                              GLint texture_blit_vao);

GLuint qemu_gl_create_compile_shader(GLenum type, const GLchar *src);
GLuint qemu_gl_create_link_program(GLuint vert, GLuint frag);
+6 −1
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@

struct ConsoleGLState {
    GLint texture_blit_prog;
    GLint texture_blit_vao;
};

/* ---------------------------------------------------------------------- */
@@ -47,6 +48,9 @@ ConsoleGLState *console_gl_init_context(void)
        exit(1);
    }

    gls->texture_blit_vao =
        qemu_gl_init_texture_blit(gls->texture_blit_prog);

    return gls;
}

@@ -131,7 +135,8 @@ void surface_gl_render_texture(ConsoleGLState *gls,
    glClearColor(0.1f, 0.1f, 0.1f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    qemu_gl_run_texture_blit(gls->texture_blit_prog);
    qemu_gl_run_texture_blit(gls->texture_blit_prog,
                             gls->texture_blit_vao);
}

void surface_gl_destroy_texture(ConsoleGLState *gls,
+26 −5
Original line number Diff line number Diff line
@@ -29,21 +29,42 @@

/* ---------------------------------------------------------------------- */

void qemu_gl_run_texture_blit(GLint texture_blit_prog)
GLuint qemu_gl_init_texture_blit(GLint texture_blit_prog)
{
    GLfloat in_position[] = {
    static const GLfloat in_position[] = {
        -1, -1,
        1,  -1,
        -1,  1,
        1,   1,
    };
    GLint l_position;
    GLuint vao, buffer;

    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    /* this is the VBO that holds the vertex data */
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(in_position), in_position,
                 GL_STATIC_DRAW);

    glUseProgram(texture_blit_prog);
    l_position = glGetAttribLocation(texture_blit_prog, "in_position");
    glVertexAttribPointer(l_position, 2, GL_FLOAT, GL_FALSE, 0, in_position);
    glVertexAttribPointer(l_position, 2, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(l_position);
    glDrawArrays(GL_TRIANGLE_STRIP, l_position, 4);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);

    return vao;
}

void qemu_gl_run_texture_blit(GLint texture_blit_prog,
                              GLint texture_blit_vao)
{
    glUseProgram(texture_blit_prog);
    glBindVertexArray(texture_blit_vao);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}

/* ---------------------------------------------------------------------- */