[Spice-devel] [PATCH 02/11] spicec: use standard opengl 3.0 framebuffer
Marc-André Lureau
marcandre.lureau at gmail.com
Tue Sep 24 04:42:13 PDT 2013
---
client/x11/pixels_source_p.h | 1 +
client/x11/red_drawable.cpp | 12 +++----
client/x11/red_pixmap_gl.cpp | 84 +++++++++++++++++++++++---------------------
3 files changed, 50 insertions(+), 47 deletions(-)
diff --git a/client/x11/pixels_source_p.h b/client/x11/pixels_source_p.h
index 64b0c50..8431121 100644
--- a/client/x11/pixels_source_p.h
+++ b/client/x11/pixels_source_p.h
@@ -73,6 +73,7 @@ struct PixelsSource_p {
Win win;
GLuint tex;
GLuint stencil_tex;
+ GLuint rbo;
int width, height;
int width_powed, height_powed;
union {
diff --git a/client/x11/red_drawable.cpp b/client/x11/red_drawable.cpp
index bb8ceb4..54e53f8 100644
--- a/client/x11/red_drawable.cpp
+++ b/client/x11/red_drawable.cpp
@@ -62,7 +62,7 @@ static inline void copy_to_gldrawable_from_gltexture(const RedDrawable_p* dest,
rendertype = source->gl.rendertype;
if (rendertype == RENDER_TYPE_FBO) {
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
} else {
win = source->gl.win;
context = source->gl.context;
@@ -86,7 +86,7 @@ static inline void copy_to_gldrawable_from_gltexture(const RedDrawable_p* dest,
GLuint fbo;
fbo = source->gl.fbo;
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
+ glBindFramebuffer(GL_FRAMEBUFFER_EXT, fbo);
} else {
pbuffer = source->gl.pbuff;
glXMakeCurrent(XPlatform::get_display(), pbuffer, context);
@@ -107,7 +107,7 @@ static inline void copy_to_gldrawable_from_pixmap(const RedDrawable_p* dest,
rendertype = dest->source.x_drawable.rendertype;
if (rendertype == RENDER_TYPE_FBO) {
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
glBindTexture(GL_TEXTURE_2D, 0);
} else {
context = dest->source.x_drawable.context;
@@ -130,7 +130,7 @@ static inline void copy_to_gldrawable_from_pixmap(const RedDrawable_p* dest,
GLuint fbo;
fbo = dest->source.x_drawable.fbo;
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
+ glBindFramebuffer(GL_FRAMEBUFFER_EXT, fbo);
} else {
pbuffer = dest->source.x_drawable.pbuff;
glXMakeCurrent(XPlatform::get_display(), pbuffer, context);
@@ -341,7 +341,7 @@ static inline void copy_to_pixmap_from_gltexture(const RedDrawable_p* dest,
rendertype = source->gl.rendertype;
if (rendertype == RENDER_TYPE_FBO) {
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, source->gl.fbo);
+ glBindFramebuffer(GL_FRAMEBUFFER_EXT, source->gl.fbo);
glBindTexture(GL_TEXTURE_2D, 0);
} else {
context = source->gl.context;
@@ -673,7 +673,7 @@ static inline void fill_gl_drawable(RedDrawable_p* dest, const SpiceRect& area,
vertex_x2 = vertex_x1 + (area.right - area.left);
vertex_y2 = vertex_y1 + (area.bottom - area.top);
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
glColor3f(rgb32_get_red(color), rgb32_get_green(color),
rgb32_get_blue(color));
diff --git a/client/x11/red_pixmap_gl.cpp b/client/x11/red_pixmap_gl.cpp
index 8d81c31..1a58628 100644
--- a/client/x11/red_pixmap_gl.cpp
+++ b/client/x11/red_pixmap_gl.cpp
@@ -38,9 +38,10 @@ RedPixmapGL::RedPixmapGL(int width, int height, RedDrawable::Format format,
RenderType rendertype)
: RedPixmap(width, height, format, top_bottom)
{
- GLuint fbo;
- GLuint tex;
+ GLuint fbo = 0;
+ GLuint tex = 0;
GLuint stencil_tex = 0;
+ GLuint rbo = 0;
Win xwin;
//GLint max_texture_size;
@@ -68,6 +69,9 @@ RedPixmapGL::RedPixmapGL(int width, int height, RedDrawable::Format format,
}*/
if (rendertype == RENDER_TYPE_FBO) {
+ int w = gl_get_to_power_two(width);
+ int h = gl_get_to_power_two(height);
+
glXMakeCurrent(XPlatform::get_display(), xwin, _glcont);
if (!gluCheckExtension((GLubyte *)"GL_EXT_framebuffer_object",
glGetString(GL_EXTENSIONS))) {
@@ -75,41 +79,32 @@ RedPixmapGL::RedPixmapGL(int width, int height, RedDrawable::Format format,
glXDestroyContext(XPlatform::get_display(), _glcont);
THROW("no GL_EXT_framebuffer_object extension");
}
- glEnable(GL_TEXTURE_2D);
- glGenFramebuffersEXT(1, &fbo);
- glGenTextures(1, &tex);
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
+ glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
-
- glTexImage2D(GL_TEXTURE_2D, 0, 4, gl_get_to_power_two(width),
- gl_get_to_power_two(height), 0, GL_BGRA, GL_UNSIGNED_BYTE,
- NULL);
-
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
- GL_TEXTURE_2D, tex, 0);
-
-
- glGenTextures(1, &stencil_tex);
- glBindTexture(GL_TEXTURE_2D, stencil_tex);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_STENCIL_EXT,
- gl_get_to_power_two(width), gl_get_to_power_two(height), 0,
- GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, NULL);
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,
- GL_DEPTH_ATTACHMENT_EXT,
- GL_TEXTURE_2D, stencil_tex, 0);
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,
- GL_STENCIL_ATTACHMENT_EXT,
- GL_TEXTURE_2D, stencil_tex, 0);
glBindTexture(GL_TEXTURE_2D, 0);
+ glGenRenderbuffers(1, &rbo);
+ glBindRenderbuffer(GL_RENDERBUFFER, rbo);
+ glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, w, h);
+ glBindRenderbuffer(GL_RENDERBUFFER, 0);
+
+ glGenFramebuffers(1, &fbo);
+ glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);
+
+ GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
+ if (status != GL_FRAMEBUFFER_COMPLETE)
+ THROW("bad fbo status: %d\n", status);
+
((PixelsSource_p*)get_opaque())->gl.fbo = fbo;
win->set_render_fbo(fbo);
- } else {
+
+ } else if (rendertype == RENDER_TYPE_PBUFF) {
GLXPbuffer pbuff;
pbuff = win->create_pbuff(gl_get_to_power_two(width),
@@ -133,6 +128,8 @@ RedPixmapGL::RedPixmapGL(int width, int height, RedDrawable::Format format,
glBindTexture(GL_TEXTURE_2D, 0);
((PixelsSource_p*)get_opaque())->gl.pbuff = pbuff;
win->set_render_pbuff(pbuff);
+ } else {
+ abort();
}
((PixelsSource_p*)get_opaque())->gl.stencil_tex = stencil_tex;
@@ -269,11 +266,27 @@ void RedPixmapGL::past_copy()
RedPixmapGL::~RedPixmapGL()
{
GLXPbuffer pbuff;
- GLuint fbo;
+ GLuint fbo, rbo;
RenderType rendertype;
GLuint tex;
GLuint stencil_tex;
+ rendertype = ((PixelsSource_p*)get_opaque())->gl.rendertype;
+ if (rendertype == RENDER_TYPE_FBO) {
+ fbo = ((PixelsSource_p*)get_opaque())->gl.fbo;
+ rbo = ((PixelsSource_p*)get_opaque())->gl.rbo;
+ spice_debug("deletefbo %u", fbo);
+ if (fbo) {
+ glDeleteFramebuffers(1, &fbo);
+ }
+ if (rbo) {
+ glDeleteRenderbuffers(1, &rbo);
+ }
+ } else {
+ pbuff = ((PixelsSource_p*)get_opaque())->gl.pbuff;
+ glXDestroyPbuffer(XPlatform::get_display(), pbuff);
+ }
+
/*
* GL textures might be destroyed by res change.
*/
@@ -291,17 +304,6 @@ RedPixmapGL::~RedPixmapGL()
}
}
- rendertype = ((PixelsSource_p*)get_opaque())->gl.rendertype;
- if (rendertype == RENDER_TYPE_FBO) {
- fbo = ((PixelsSource_p*)get_opaque())->gl.fbo;
- if (fbo) {
- glDeleteFramebuffersEXT(1, &fbo);
- }
- } else {
- pbuff = ((PixelsSource_p*)get_opaque())->gl.pbuff;
- glXDestroyPbuffer(XPlatform::get_display(), pbuff);
- }
-
/*
* Both tex and stenctil_tex are textures and therefore they are destroyed
* when the context is gone, so we dont free them here as they might have
--
1.8.3.1
More information about the Spice-devel
mailing list