[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 1/9] shaders: initialize vertexes once
From: |
Marc-André Lureau |
Subject: |
Re: [Qemu-devel] [PATCH 1/9] shaders: initialize vertexes once |
Date: |
Thu, 10 Sep 2015 14:40:36 +0200 |
Hi
On Wed, Sep 9, 2015 at 1:20 PM, Gerd Hoffmann <address@hidden> wrote:
> 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 <address@hidden>
> ---
> include/ui/shader.h | 4 +++-
> ui/console-gl.c | 7 ++++++-
> ui/shader.c | 32 +++++++++++++++++++++++++++-----
> 3 files changed, 36 insertions(+), 7 deletions(-)
>
> diff --git a/include/ui/shader.h b/include/ui/shader.h
> index 8509596..f7d8618 100644
> --- a/include/ui/shader.h
> +++ b/include/ui/shader.h
> @@ -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);
> diff --git a/ui/console-gl.c b/ui/console-gl.c
> index cb45cf8..baf397b 100644
> --- a/ui/console-gl.c
> +++ b/ui/console-gl.c
> @@ -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);
> +
The gl console doesn't have cleanup, ok
> 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,
> diff --git a/ui/shader.c b/ui/shader.c
> index 52a4632..ada1c4c 100644
> --- a/ui/shader.c
> +++ b/ui/shader.c
> @@ -29,21 +29,43 @@
>
> /* ---------------------------------------------------------------------- */
>
> -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);
> + glDeleteBuffers (1, &buffer);
> +
extra space before (
Is the unbinding necessary?
> + 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);
> }
>
> /* ---------------------------------------------------------------------- */
> --
> 1.8.3.1
>
>
Reviewed-by: Marc-André Lureau <address@hidden>
--
Marc-André Lureau
[Qemu-devel] [PATCH 2/9] sdl2: quick & dirty flicker workaround, Gerd Hoffmann, 2015/09/09
[Qemu-devel] [PATCH 3/9] ui/console: add opengl context and scanout support interfaces., Gerd Hoffmann, 2015/09/09