summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Franzke <benjaminfranzke@googlemail.com>2010-12-08 01:56:42 +0100
committerBenjamin Franzke <benjaminfranzke@googlemail.com>2012-02-28 08:29:09 +0100
commit038014c713fb829f8afe98a92ae500670e92e57a (patch)
tree520341bcde50664e5dae9f0f66d292f72033524e
parent53d82587fc031d2847f993fdd4d2dfd3fe565f00 (diff)
wayland: Generate {Frame,Render}Buffer in MakeCurrent only once
-rw-r--r--src/video/wayland/SDL_waylandgl.c36
-rw-r--r--src/video/wayland/SDL_waylandvideo.h1
-rw-r--r--src/video/wayland/SDL_waylandwindow.c8
-rw-r--r--src/video/wayland/SDL_waylandwindow.h1
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;