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>
|
#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);
|
||||||
|
|
|
@ -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,
|
||||||
|
|
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,
|
||||||
-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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
Loading…
Reference in a new issue