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:
parent
4133fa711f
commit
46e19e149f
2
Makefile
2
Makefile
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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 */
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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)))) {
|
||||||
|
51
ui/shader.c
51
ui/shader.c
@ -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,8 +124,8 @@ 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);
|
||||||
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user