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: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
Gerd Hoffmann 2015-07-10 14:40:01 +02:00
parent 5fdb4671b0
commit c046d82844
3 changed files with 35 additions and 7 deletions

View File

@ -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);

View File

@ -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,

View File

@ -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);
}
/* ---------------------------------------------------------------------- */