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> #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_compile_shader(GLenum type, const GLchar *src);
GLuint qemu_gl_create_link_program(GLuint vert, GLuint frag); GLuint qemu_gl_create_link_program(GLuint vert, GLuint frag);

View file

@ -33,6 +33,7 @@
struct ConsoleGLState { struct ConsoleGLState {
GLint texture_blit_prog; GLint texture_blit_prog;
GLint texture_blit_vao;
}; };
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
@ -47,6 +48,9 @@ ConsoleGLState *console_gl_init_context(void)
exit(1); exit(1);
} }
gls->texture_blit_vao =
qemu_gl_init_texture_blit(gls->texture_blit_prog);
return gls; return gls;
} }
@ -131,7 +135,8 @@ void surface_gl_render_texture(ConsoleGLState *gls,
glClearColor(0.1f, 0.1f, 0.1f, 0.0f); glClearColor(0.1f, 0.1f, 0.1f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT); 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, 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,
-1, 1, -1, 1,
1, 1, 1, 1,
}; };
GLint l_position; 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"); 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); 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);
} }
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */