opengl: add flipping vertex shader

Add vertex shader which flips the texture upside down while blitting it.
Add argument to qemu_gl_run_texture_blit() to enable flipping.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Message-id: 20171010135453.6704-4-kraxel@redhat.com
This commit is contained in:
Gerd Hoffmann 2017-10-10 15:54:50 +02:00
parent 46e19e149f
commit 2e1d70b9e0
5 changed files with 24 additions and 6 deletions

View File

@ -673,7 +673,9 @@ ui/shader/%-frag.h: $(SRC_PATH)/ui/shader/%.frag $(SRC_PATH)/scripts/shaderinclu
"FRAG","$@")
ui/shader.o: $(SRC_PATH)/ui/shader.c \
ui/shader/texture-blit-vert.h ui/shader/texture-blit-frag.h
ui/shader/texture-blit-vert.h \
ui/shader/texture-blit-flip-vert.h \
ui/shader/texture-blit-frag.h
# documentation
MAKEINFO=makeinfo

View File

@ -5,7 +5,7 @@
typedef struct QemuGLShader QemuGLShader;
void qemu_gl_run_texture_blit(QemuGLShader *gls);
void qemu_gl_run_texture_blit(QemuGLShader *gls, bool flip);
QemuGLShader *qemu_gl_init_shader(void);
void qemu_gl_fini_shader(QemuGLShader *gls);

View File

@ -109,7 +109,7 @@ void surface_gl_render_texture(QemuGLShader *gls,
glClearColor(0.1f, 0.1f, 0.1f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
qemu_gl_run_texture_blit(gls);
qemu_gl_run_texture_blit(gls, false);
}
void surface_gl_destroy_texture(QemuGLShader *gls,

View File

@ -29,10 +29,12 @@
#include "ui/shader.h"
#include "shader/texture-blit-vert.h"
#include "shader/texture-blit-flip-vert.h"
#include "shader/texture-blit-frag.h"
struct QemuGLShader {
GLint texture_blit_prog;
GLint texture_blit_flip_prog;
GLint texture_blit_vao;
};
@ -68,9 +70,11 @@ static GLuint qemu_gl_init_texture_blit(GLint texture_blit_prog)
return vao;
}
void qemu_gl_run_texture_blit(QemuGLShader *gls)
void qemu_gl_run_texture_blit(QemuGLShader *gls, bool flip)
{
glUseProgram(gls->texture_blit_prog);
glUseProgram(flip
? gls->texture_blit_flip_prog
: gls->texture_blit_prog);
glBindVertexArray(gls->texture_blit_vao);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
@ -150,7 +154,9 @@ QemuGLShader *qemu_gl_init_shader(void)
gls->texture_blit_prog = qemu_gl_create_compile_link_program
(texture_blit_vert_src, texture_blit_frag_src);
if (!gls->texture_blit_prog) {
gls->texture_blit_flip_prog = qemu_gl_create_compile_link_program
(texture_blit_flip_vert_src, texture_blit_frag_src);
if (!gls->texture_blit_prog || !gls->texture_blit_flip_prog) {
exit(1);
}

View File

@ -0,0 +1,10 @@
#version 300 es
in vec2 in_position;
out vec2 ex_tex_coord;
void main(void) {
gl_Position = vec4(in_position, 0.0, 1.0);
ex_tex_coord = vec2(1.0 + in_position.x, 1.0 + in_position.y) * 0.5;
}