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:
parent
5fdb4671b0
commit
c046d82844
@ -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);
|
||||
|
@ -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,
|
||||
|
31
ui/shader.c
31
ui/shader.c
@ -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);
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
Loading…
Reference in New Issue
Block a user