opengl: move shader init from console-gl.c to shader.c

With the upcoming dmabuf support in qemu there will be more users of the
shaders than just console-gl.c.  So rename ConsoleGLState to
QemuGLShader, rename some functions too, move code from console-gl.c to
shaders.c.

No functional change.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Message-id: 20171010135453.6704-3-kraxel@redhat.com
This commit is contained in:
Gerd Hoffmann 2017-10-10 15:54:49 +02:00
parent 4133fa711f
commit 46e19e149f
12 changed files with 68 additions and 72 deletions

View File

@ -672,7 +672,7 @@ ui/shader/%-frag.h: $(SRC_PATH)/ui/shader/%.frag $(SRC_PATH)/scripts/shaderinclu
perl $(SRC_PATH)/scripts/shaderinclude.pl $< > $@,\ perl $(SRC_PATH)/scripts/shaderinclude.pl $< > $@,\
"FRAG","$@") "FRAG","$@")
ui/console-gl.o: $(SRC_PATH)/ui/console-gl.c \ 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-frag.h
# documentation # documentation

View File

@ -12,6 +12,7 @@
#ifdef CONFIG_OPENGL #ifdef CONFIG_OPENGL
# include <epoxy/gl.h> # include <epoxy/gl.h>
# include "ui/shader.h"
#endif #endif
/* keyboard/mouse support */ /* keyboard/mouse support */
@ -415,22 +416,19 @@ void qemu_console_resize(QemuConsole *con, int width, int height);
DisplaySurface *qemu_console_surface(QemuConsole *con); DisplaySurface *qemu_console_surface(QemuConsole *con);
/* console-gl.c */ /* console-gl.c */
typedef struct ConsoleGLState ConsoleGLState;
#ifdef CONFIG_OPENGL #ifdef CONFIG_OPENGL
ConsoleGLState *console_gl_init_context(void);
void console_gl_fini_context(ConsoleGLState *gls);
bool console_gl_check_format(DisplayChangeListener *dcl, bool console_gl_check_format(DisplayChangeListener *dcl,
pixman_format_code_t format); pixman_format_code_t format);
void surface_gl_create_texture(ConsoleGLState *gls, void surface_gl_create_texture(QemuGLShader *gls,
DisplaySurface *surface); DisplaySurface *surface);
void surface_gl_update_texture(ConsoleGLState *gls, void surface_gl_update_texture(QemuGLShader *gls,
DisplaySurface *surface, DisplaySurface *surface,
int x, int y, int w, int h); int x, int y, int w, int h);
void surface_gl_render_texture(ConsoleGLState *gls, void surface_gl_render_texture(QemuGLShader *gls,
DisplaySurface *surface); DisplaySurface *surface);
void surface_gl_destroy_texture(ConsoleGLState *gls, void surface_gl_destroy_texture(QemuGLShader *gls,
DisplaySurface *surface); DisplaySurface *surface);
void surface_gl_setup_viewport(ConsoleGLState *gls, void surface_gl_setup_viewport(QemuGLShader *gls,
DisplaySurface *surface, DisplaySurface *surface,
int ww, int wh); int ww, int wh);
#endif #endif

View File

@ -47,7 +47,7 @@ typedef struct VirtualGfxConsole {
double scale_x; double scale_x;
double scale_y; double scale_y;
#if defined(CONFIG_OPENGL) #if defined(CONFIG_OPENGL)
ConsoleGLState *gls; QemuGLShader *gls;
EGLContext ectx; EGLContext ectx;
EGLSurface esurface; EGLSurface esurface;
int glupdates; int glupdates;

View File

@ -26,7 +26,7 @@ struct sdl2_console {
int idle_counter; int idle_counter;
SDL_GLContext winctx; SDL_GLContext winctx;
#ifdef CONFIG_OPENGL #ifdef CONFIG_OPENGL
ConsoleGLState *gls; QemuGLShader *gls;
egl_fb guest_fb; egl_fb guest_fb;
egl_fb win_fb; egl_fb win_fb;
bool y0_top; bool y0_top;

View File

@ -3,13 +3,11 @@
#include <epoxy/gl.h> #include <epoxy/gl.h>
GLuint qemu_gl_init_texture_blit(GLint texture_blit_prog); typedef struct QemuGLShader QemuGLShader;
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); void qemu_gl_run_texture_blit(QemuGLShader *gls);
GLuint qemu_gl_create_link_program(GLuint vert, GLuint frag);
GLuint qemu_gl_create_compile_link_program(const GLchar *vert_src, QemuGLShader *qemu_gl_init_shader(void);
const GLchar *frag_src); void qemu_gl_fini_shader(QemuGLShader *gls);
#endif /* QEMU_SHADER_H */ #endif /* QEMU_SHADER_H */

View File

@ -119,7 +119,7 @@ struct SimpleSpiceDisplay {
/* opengl rendering */ /* opengl rendering */
QEMUBH *gl_unblock_bh; QEMUBH *gl_unblock_bh;
QEMUTimer *gl_unblock_timer; QEMUTimer *gl_unblock_timer;
ConsoleGLState *gls; QemuGLShader *gls;
int gl_updates; int gl_updates;
bool have_scanout; bool have_scanout;
bool have_surface; bool have_surface;

View File

@ -29,40 +29,8 @@
#include "ui/console.h" #include "ui/console.h"
#include "ui/shader.h" #include "ui/shader.h"
#include "shader/texture-blit-vert.h"
#include "shader/texture-blit-frag.h"
struct ConsoleGLState {
GLint texture_blit_prog;
GLint texture_blit_vao;
};
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
ConsoleGLState *console_gl_init_context(void)
{
ConsoleGLState *gls = g_new0(ConsoleGLState, 1);
gls->texture_blit_prog = qemu_gl_create_compile_link_program
(texture_blit_vert_src, texture_blit_frag_src);
if (!gls->texture_blit_prog) {
exit(1);
}
gls->texture_blit_vao =
qemu_gl_init_texture_blit(gls->texture_blit_prog);
return gls;
}
void console_gl_fini_context(ConsoleGLState *gls)
{
if (!gls) {
return;
}
g_free(gls);
}
bool console_gl_check_format(DisplayChangeListener *dcl, bool console_gl_check_format(DisplayChangeListener *dcl,
pixman_format_code_t format) pixman_format_code_t format)
{ {
@ -76,7 +44,7 @@ bool console_gl_check_format(DisplayChangeListener *dcl,
} }
} }
void surface_gl_create_texture(ConsoleGLState *gls, void surface_gl_create_texture(QemuGLShader *gls,
DisplaySurface *surface) DisplaySurface *surface)
{ {
assert(gls); assert(gls);
@ -116,7 +84,7 @@ void surface_gl_create_texture(ConsoleGLState *gls,
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
} }
void surface_gl_update_texture(ConsoleGLState *gls, void surface_gl_update_texture(QemuGLShader *gls,
DisplaySurface *surface, DisplaySurface *surface,
int x, int y, int w, int h) int x, int y, int w, int h)
{ {
@ -133,7 +101,7 @@ void surface_gl_update_texture(ConsoleGLState *gls,
+ surface_bytes_per_pixel(surface) * x); + surface_bytes_per_pixel(surface) * x);
} }
void surface_gl_render_texture(ConsoleGLState *gls, void surface_gl_render_texture(QemuGLShader *gls,
DisplaySurface *surface) DisplaySurface *surface)
{ {
assert(gls); assert(gls);
@ -141,11 +109,10 @@ 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);
gls->texture_blit_vao);
} }
void surface_gl_destroy_texture(ConsoleGLState *gls, void surface_gl_destroy_texture(QemuGLShader *gls,
DisplaySurface *surface) DisplaySurface *surface)
{ {
if (!surface || !surface->texture) { if (!surface || !surface->texture) {
@ -155,7 +122,7 @@ void surface_gl_destroy_texture(ConsoleGLState *gls,
surface->texture = 0; surface->texture = 0;
} }
void surface_gl_setup_viewport(ConsoleGLState *gls, void surface_gl_setup_viewport(QemuGLShader *gls,
DisplaySurface *surface, DisplaySurface *surface,
int ww, int wh) int ww, int wh)
{ {

View File

@ -113,7 +113,7 @@ void gd_egl_refresh(DisplayChangeListener *dcl)
if (!vc->gfx.esurface) { if (!vc->gfx.esurface) {
return; return;
} }
vc->gfx.gls = console_gl_init_context(); vc->gfx.gls = qemu_gl_init_shader();
if (vc->gfx.ds) { if (vc->gfx.ds) {
surface_gl_create_texture(vc->gfx.gls, vc->gfx.ds); surface_gl_create_texture(vc->gfx.gls, vc->gfx.ds);
} }

View File

@ -96,7 +96,7 @@ void gd_gl_area_refresh(DisplayChangeListener *dcl)
return; return;
} }
gtk_gl_area_make_current(GTK_GL_AREA(vc->gfx.drawing_area)); gtk_gl_area_make_current(GTK_GL_AREA(vc->gfx.drawing_area));
vc->gfx.gls = console_gl_init_context(); vc->gfx.gls = qemu_gl_init_shader();
if (vc->gfx.ds) { if (vc->gfx.ds) {
surface_gl_create_texture(vc->gfx.gls, vc->gfx.ds); surface_gl_create_texture(vc->gfx.gls, vc->gfx.ds);
} }

View File

@ -90,7 +90,7 @@ void sdl2_gl_switch(DisplayChangeListener *dcl,
scon->surface = new_surface; scon->surface = new_surface;
if (!new_surface) { if (!new_surface) {
console_gl_fini_context(scon->gls); qemu_gl_fini_shader(scon->gls);
scon->gls = NULL; scon->gls = NULL;
sdl2_window_destroy(scon); sdl2_window_destroy(scon);
return; return;
@ -98,7 +98,7 @@ void sdl2_gl_switch(DisplayChangeListener *dcl,
if (!scon->real_window) { if (!scon->real_window) {
sdl2_window_create(scon); sdl2_window_create(scon);
scon->gls = console_gl_init_context(); scon->gls = qemu_gl_init_shader();
} else if (old_surface && } else if (old_surface &&
((surface_width(old_surface) != surface_width(new_surface)) || ((surface_width(old_surface) != surface_width(new_surface)) ||
(surface_height(old_surface) != surface_height(new_surface)))) { (surface_height(old_surface) != surface_height(new_surface)))) {

View File

@ -28,9 +28,17 @@
#include "qemu-common.h" #include "qemu-common.h"
#include "ui/shader.h" #include "ui/shader.h"
#include "shader/texture-blit-vert.h"
#include "shader/texture-blit-frag.h"
struct QemuGLShader {
GLint texture_blit_prog;
GLint texture_blit_vao;
};
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
GLuint qemu_gl_init_texture_blit(GLint texture_blit_prog) static GLuint qemu_gl_init_texture_blit(GLint texture_blit_prog)
{ {
static const GLfloat in_position[] = { static const GLfloat in_position[] = {
-1, -1, -1, -1,
@ -60,17 +68,16 @@ GLuint qemu_gl_init_texture_blit(GLint texture_blit_prog)
return vao; return vao;
} }
void qemu_gl_run_texture_blit(GLint texture_blit_prog, void qemu_gl_run_texture_blit(QemuGLShader *gls)
GLint texture_blit_vao)
{ {
glUseProgram(texture_blit_prog); glUseProgram(gls->texture_blit_prog);
glBindVertexArray(texture_blit_vao); glBindVertexArray(gls->texture_blit_vao);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
} }
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
GLuint qemu_gl_create_compile_shader(GLenum type, const GLchar *src) static GLuint qemu_gl_create_compile_shader(GLenum type, const GLchar *src)
{ {
GLuint shader; GLuint shader;
GLint status, length; GLint status, length;
@ -94,7 +101,7 @@ GLuint qemu_gl_create_compile_shader(GLenum type, const GLchar *src)
return shader; return shader;
} }
GLuint qemu_gl_create_link_program(GLuint vert, GLuint frag) static GLuint qemu_gl_create_link_program(GLuint vert, GLuint frag)
{ {
GLuint program; GLuint program;
GLint status, length; GLint status, length;
@ -117,7 +124,7 @@ GLuint qemu_gl_create_link_program(GLuint vert, GLuint frag)
return program; return program;
} }
GLuint qemu_gl_create_compile_link_program(const GLchar *vert_src, static GLuint qemu_gl_create_compile_link_program(const GLchar *vert_src,
const GLchar *frag_src) const GLchar *frag_src)
{ {
GLuint vert_shader, frag_shader, program; GLuint vert_shader, frag_shader, program;
@ -134,3 +141,29 @@ GLuint qemu_gl_create_compile_link_program(const GLchar *vert_src,
return program; return program;
} }
/* ---------------------------------------------------------------------- */
QemuGLShader *qemu_gl_init_shader(void)
{
QemuGLShader *gls = g_new0(QemuGLShader, 1);
gls->texture_blit_prog = qemu_gl_create_compile_link_program
(texture_blit_vert_src, texture_blit_frag_src);
if (!gls->texture_blit_prog) {
exit(1);
}
gls->texture_blit_vao =
qemu_gl_init_texture_blit(gls->texture_blit_prog);
return gls;
}
void qemu_gl_fini_shader(QemuGLShader *gls)
{
if (!gls) {
return;
}
g_free(gls);
}

View File

@ -1019,7 +1019,7 @@ static void qemu_spice_display_init_one(QemuConsole *con)
ssd->gl_unblock_bh = qemu_bh_new(qemu_spice_gl_unblock_bh, ssd); ssd->gl_unblock_bh = qemu_bh_new(qemu_spice_gl_unblock_bh, ssd);
ssd->gl_unblock_timer = timer_new_ms(QEMU_CLOCK_REALTIME, ssd->gl_unblock_timer = timer_new_ms(QEMU_CLOCK_REALTIME,
qemu_spice_gl_block_timer, ssd); qemu_spice_gl_block_timer, ssd);
ssd->gls = console_gl_init_context(); ssd->gls = qemu_gl_init_shader();
ssd->have_surface = false; ssd->have_surface = false;
ssd->have_scanout = false; ssd->have_scanout = false;
} }