diff options
author | Benjamin Franzke <benjaminfranzke@googlemail.com> | 2010-12-08 01:56:42 +0100 |
---|---|---|
committer | Benjamin Franzke <benjaminfranzke@googlemail.com> | 2012-02-28 08:29:09 +0100 |
commit | 038014c713fb829f8afe98a92ae500670e92e57a (patch) | |
tree | 520341bcde50664e5dae9f0f66d292f72033524e | |
parent | 53d82587fc031d2847f993fdd4d2dfd3fe565f00 (diff) |
wayland: Generate {Frame,Render}Buffer in MakeCurrent only once
-rw-r--r-- | src/video/wayland/SDL_waylandgl.c | 36 | ||||
-rw-r--r-- | src/video/wayland/SDL_waylandvideo.h | 1 | ||||
-rw-r--r-- | src/video/wayland/SDL_waylandwindow.c | 8 | ||||
-rw-r--r-- | src/video/wayland/SDL_waylandwindow.h | 1 |
4 files changed, 32 insertions, 14 deletions
diff --git a/src/video/wayland/SDL_waylandgl.c b/src/video/wayland/SDL_waylandgl.c index 6006c531..2d340cfe 100644 --- a/src/video/wayland/SDL_waylandgl.c +++ b/src/video/wayland/SDL_waylandgl.c @@ -36,11 +36,19 @@ Wayland_GL_MakeCurrent(_THIS, SDL_Window *window, SDL_GLContext context) return -1; } - glGenFramebuffers(1, &data->fbo); + if (!data->fbo_generated) { + glGenFramebuffers(1, &data->fbo); + data->fbo_generated = 1; + } glBindFramebuffer(GL_FRAMEBUFFER_EXT, data->fbo); - glGenRenderbuffers(1, &wind->depth_rbo); - glBindRenderbuffer(GL_RENDERBUFFER_EXT, wind->depth_rbo); + if (!wind->rbos_generated) { + glGenRenderbuffers(1, &wind->depth_rbo); + glGenRenderbuffers(2, wind->color_rbo); + wind->rbos_generated = 1; + } + + glBindRenderbuffer(GL_RENDERBUFFER_EXT, wind->depth_rbo); glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, @@ -49,22 +57,24 @@ Wayland_GL_MakeCurrent(_THIS, SDL_Window *window, SDL_GLContext context) GL_DEPTH_COMPONENT, wind->sdlwindow->w, wind->sdlwindow->h); - glGenRenderbuffers(2, wind->color_rbo); - for (i = 0; i < 2; ++i) { - glBindRenderbuffer(GL_RENDERBUFFER_EXT, wind->color_rbo[i]); - glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER_EXT, - wind->image[i]); - } + for (i = 0; i < 2; ++i) { + glBindRenderbuffer(GL_RENDERBUFFER_EXT, wind->color_rbo[i]); + glEGLImageTargetRenderbufferStorageOES(GL_RENDERBUFFER_EXT, + wind->image[i]); + } wind->current = 0; glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, wind->color_rbo[wind->current]); - printf("framebuffer complete: %d\n", - glCheckFramebufferStatus(GL_FRAMEBUFFER_EXT) == GL_FRAMEBUFFER_COMPLETE); - return 1; + if (glCheckFramebufferStatus(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE) { + SDL_SetError("Framebuffer Incomplete."); + return -1; + } + + return 0; } int @@ -141,6 +151,8 @@ Wayland_GL_LoadLibrary(_THIS, const char *path) eglBindAPI(EGL_OPENGL_API); + data->fbo_generated = 0; + return 0; } diff --git a/src/video/wayland/SDL_waylandvideo.h b/src/video/wayland/SDL_waylandvideo.h index 5274c97c..4d62d099 100644 --- a/src/video/wayland/SDL_waylandvideo.h +++ b/src/video/wayland/SDL_waylandvideo.h @@ -53,6 +53,7 @@ typedef struct EGLDisplay edpy; GLuint fbo; + uint8_t fbo_generated; struct xkb_desc *xkb; diff --git a/src/video/wayland/SDL_waylandwindow.c b/src/video/wayland/SDL_waylandwindow.c index 80b6376b..0d1efa3d 100644 --- a/src/video/wayland/SDL_waylandwindow.c +++ b/src/video/wayland/SDL_waylandwindow.c @@ -80,6 +80,7 @@ int Wayland_CreateWindow(_THIS, SDL_Window * window) stride, visual); } data->current = 0; + data->rbos_generated = 0; return 0; @@ -95,8 +96,11 @@ void Wayland_DestroyWindow(_THIS, SDL_Window * window) if (data) { d = data->waylandData; - glDeleteRenderbuffers(1, &data->depth_rbo); - glDeleteRenderbuffers(2, data->color_rbo); + if (data->rbos_generated) { + glDeleteRenderbuffers(1, &data->depth_rbo); + glDeleteRenderbuffers(2, data->color_rbo); + data->rbos_generated = 0; + } for (i = 0; i < 2; ++i) { wl_buffer_destroy(data->buffer[i]); eglDestroyImageKHR(d->edpy, data->image[i]); diff --git a/src/video/wayland/SDL_waylandwindow.h b/src/video/wayland/SDL_waylandwindow.h index 88cd6b37..d6ba1feb 100644 --- a/src/video/wayland/SDL_waylandwindow.h +++ b/src/video/wayland/SDL_waylandwindow.h @@ -17,6 +17,7 @@ typedef struct EGLImageKHR image[2]; GLuint color_rbo[2]; GLuint depth_rbo; + uint8_t rbos_generated; uint32_t current; struct SDL_WaylandInput *keyboard_device; |