diff options
Diffstat (limited to 'qemu/ui/sdl2-gl.c')
-rw-r--r-- | qemu/ui/sdl2-gl.c | 248 |
1 files changed, 0 insertions, 248 deletions
diff --git a/qemu/ui/sdl2-gl.c b/qemu/ui/sdl2-gl.c deleted file mode 100644 index a324ecaca..000000000 --- a/qemu/ui/sdl2-gl.c +++ /dev/null @@ -1,248 +0,0 @@ -/* - * QEMU SDL display driver -- opengl support - * - * Copyright (c) 2014 Red Hat - * - * Authors: - * Gerd Hoffmann <kraxel@redhat.com> - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include "qemu/osdep.h" -#include "qemu-common.h" -#include "ui/console.h" -#include "ui/input.h" -#include "ui/sdl2.h" -#include "sysemu/sysemu.h" - -#include <epoxy/gl.h> - -static void sdl2_set_scanout_mode(struct sdl2_console *scon, bool scanout) -{ - if (scon->scanout_mode == scanout) { - return; - } - - scon->scanout_mode = scanout; - if (!scon->scanout_mode) { - if (scon->fbo_id) { - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, - GL_COLOR_ATTACHMENT0_EXT, - GL_TEXTURE_2D, 0, 0); - glDeleteFramebuffers(1, &scon->fbo_id); - glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0); - scon->fbo_id = 0; - } - if (scon->surface) { - surface_gl_destroy_texture(scon->gls, scon->surface); - surface_gl_create_texture(scon->gls, scon->surface); - } - } -} - -static void sdl2_gl_render_surface(struct sdl2_console *scon) -{ - int ww, wh; - - SDL_GL_MakeCurrent(scon->real_window, scon->winctx); - sdl2_set_scanout_mode(scon, false); - - SDL_GetWindowSize(scon->real_window, &ww, &wh); - surface_gl_setup_viewport(scon->gls, scon->surface, ww, wh); - - surface_gl_render_texture(scon->gls, scon->surface); - SDL_GL_SwapWindow(scon->real_window); -} - -void sdl2_gl_update(DisplayChangeListener *dcl, - int x, int y, int w, int h) -{ - struct sdl2_console *scon = container_of(dcl, struct sdl2_console, dcl); - - assert(scon->opengl); - - SDL_GL_MakeCurrent(scon->real_window, scon->winctx); - surface_gl_update_texture(scon->gls, scon->surface, x, y, w, h); - scon->updates++; -} - -void sdl2_gl_switch(DisplayChangeListener *dcl, - DisplaySurface *new_surface) -{ - struct sdl2_console *scon = container_of(dcl, struct sdl2_console, dcl); - DisplaySurface *old_surface = scon->surface; - - assert(scon->opengl); - - SDL_GL_MakeCurrent(scon->real_window, scon->winctx); - surface_gl_destroy_texture(scon->gls, scon->surface); - - scon->surface = new_surface; - - if (!new_surface) { - console_gl_fini_context(scon->gls); - scon->gls = NULL; - sdl2_window_destroy(scon); - return; - } - - if (!scon->real_window) { - sdl2_window_create(scon); - scon->gls = console_gl_init_context(); - } else if (old_surface && - ((surface_width(old_surface) != surface_width(new_surface)) || - (surface_height(old_surface) != surface_height(new_surface)))) { - sdl2_window_resize(scon); - } - - surface_gl_create_texture(scon->gls, scon->surface); -} - -void sdl2_gl_refresh(DisplayChangeListener *dcl) -{ - struct sdl2_console *scon = container_of(dcl, struct sdl2_console, dcl); - - assert(scon->opengl); - - graphic_hw_update(dcl->con); - if (scon->updates && scon->surface) { - scon->updates = 0; - sdl2_gl_render_surface(scon); - } - sdl2_poll_events(scon); -} - -void sdl2_gl_redraw(struct sdl2_console *scon) -{ - assert(scon->opengl); - - if (scon->surface) { - sdl2_gl_render_surface(scon); - } -} - -QEMUGLContext sdl2_gl_create_context(DisplayChangeListener *dcl, - QEMUGLParams *params) -{ - struct sdl2_console *scon = container_of(dcl, struct sdl2_console, dcl); - SDL_GLContext ctx; - - assert(scon->opengl); - - SDL_GL_MakeCurrent(scon->real_window, scon->winctx); - - SDL_GL_SetAttribute(SDL_GL_SHARE_WITH_CURRENT_CONTEXT, 1); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, - SDL_GL_CONTEXT_PROFILE_CORE); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, params->major_ver); - SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, params->minor_ver); - - ctx = SDL_GL_CreateContext(scon->real_window); - return (QEMUGLContext)ctx; -} - -void sdl2_gl_destroy_context(DisplayChangeListener *dcl, QEMUGLContext ctx) -{ - SDL_GLContext sdlctx = (SDL_GLContext)ctx; - - SDL_GL_DeleteContext(sdlctx); -} - -int sdl2_gl_make_context_current(DisplayChangeListener *dcl, - QEMUGLContext ctx) -{ - struct sdl2_console *scon = container_of(dcl, struct sdl2_console, dcl); - SDL_GLContext sdlctx = (SDL_GLContext)ctx; - - assert(scon->opengl); - - return SDL_GL_MakeCurrent(scon->real_window, sdlctx); -} - -QEMUGLContext sdl2_gl_get_current_context(DisplayChangeListener *dcl) -{ - SDL_GLContext sdlctx; - - sdlctx = SDL_GL_GetCurrentContext(); - return (QEMUGLContext)sdlctx; -} - -void sdl2_gl_scanout(DisplayChangeListener *dcl, - uint32_t backing_id, bool backing_y_0_top, - uint32_t x, uint32_t y, - uint32_t w, uint32_t h) -{ - struct sdl2_console *scon = container_of(dcl, struct sdl2_console, dcl); - - assert(scon->opengl); - scon->x = x; - scon->y = y; - scon->w = w; - scon->h = h; - scon->tex_id = backing_id; - scon->y0_top = backing_y_0_top; - - SDL_GL_MakeCurrent(scon->real_window, scon->winctx); - - if (scon->tex_id == 0 || scon->w == 0 || scon->h == 0) { - sdl2_set_scanout_mode(scon, false); - return; - } - - sdl2_set_scanout_mode(scon, true); - if (!scon->fbo_id) { - glGenFramebuffers(1, &scon->fbo_id); - } - - glBindFramebuffer(GL_FRAMEBUFFER_EXT, scon->fbo_id); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, - GL_TEXTURE_2D, scon->tex_id, 0); -} - -void sdl2_gl_scanout_flush(DisplayChangeListener *dcl, - uint32_t x, uint32_t y, uint32_t w, uint32_t h) -{ - struct sdl2_console *scon = container_of(dcl, struct sdl2_console, dcl); - int ww, wh, y1, y2; - - assert(scon->opengl); - if (!scon->scanout_mode) { - return; - } - if (!scon->fbo_id) { - return; - } - - SDL_GL_MakeCurrent(scon->real_window, scon->winctx); - - glBindFramebuffer(GL_READ_FRAMEBUFFER, scon->fbo_id); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); - - SDL_GetWindowSize(scon->real_window, &ww, &wh); - glViewport(0, 0, ww, wh); - y1 = scon->y0_top ? 0 : scon->h; - y2 = scon->y0_top ? scon->h : 0; - glBlitFramebuffer(0, y1, scon->w, y2, - 0, 0, ww, wh, - GL_COLOR_BUFFER_BIT, GL_NEAREST); - glBindFramebuffer(GL_FRAMEBUFFER_EXT, scon->fbo_id); - - SDL_GL_SwapWindow(scon->real_window); -} |