canvas/source/opengl/ogl_buffercontext.hxx | 9 ++++-- canvas/source/opengl/ogl_canvascustomsprite.cxx | 7 ++-- canvas/source/opengl/ogl_spritedevicehelper.cxx | 30 +++++++++++++++------ include/vcl/opengl/OpenGLHelper.hxx | 6 ++-- vcl/source/opengl/OpenGLHelper.cxx | 34 ++++++++++++++++++------ 5 files changed, 63 insertions(+), 23 deletions(-)
New commits: commit 062d9c7b8af0557398f399af0a4d4709b0c7d304 Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Fri Aug 8 05:28:02 2014 +0200 reimplement custom sprite rendering with FBO Change-Id: I8d7a54fac61a3072d4f34615e71e37c70dec4e50 diff --git a/canvas/source/opengl/ogl_buffercontext.hxx b/canvas/source/opengl/ogl_buffercontext.hxx index 7d85e9a..a99446b 100644 --- a/canvas/source/opengl/ogl_buffercontext.hxx +++ b/canvas/source/opengl/ogl_buffercontext.hxx @@ -10,20 +10,25 @@ #ifndef INCLUDED_CANVAS_SOURCE_OPENGL_OGL_BUFFERCONTEXT_HXX #define INCLUDED_CANVAS_SOURCE_OPENGL_OGL_BUFFERCONTEXT_HXX +#include <GL/glew.h> + #include <sal/config.h> #include <boost/shared_ptr.hpp> + namespace oglcanvas { struct IBufferContext { virtual ~IBufferContext() {} - /// start render to buffer. changes gl current context + /// start render to buffer. changes current framebuffer virtual bool startBufferRendering() = 0; - /// end render to buffer. switches to window context, and selects rendered texture + /// end render to buffer. switches to default framebuffer virtual bool endBufferRendering() = 0; + + virtual GLuint getTextureId() = 0; }; typedef ::boost::shared_ptr<IBufferContext> IBufferContextSharedPtr; diff --git a/canvas/source/opengl/ogl_canvascustomsprite.cxx b/canvas/source/opengl/ogl_canvascustomsprite.cxx index 86cbac6..2f2853e 100644 --- a/canvas/source/opengl/ogl_canvascustomsprite.cxx +++ b/canvas/source/opengl/ogl_canvascustomsprite.cxx @@ -159,9 +159,8 @@ namespace oglcanvas // composite that to screen // TODO(P3): buffer texture - // TODO: moggi: reimplement as FBO with rendering to texture - pBufferContext = NULL; - // pBufferContext->startBufferRendering(); + pBufferContext = maCanvasHelper.getDeviceHelper()->createBufferContext(aSpriteSizePixel); + pBufferContext->startBufferRendering(); } // this ends up in pBufferContext, if that one's "current" @@ -174,6 +173,8 @@ namespace oglcanvas // screen now. Calls below switches us back to window // context, and binds to generated, dynamic texture pBufferContext->endBufferRendering(); + GLuint nTexture = pBufferContext->getTextureId(); + glBindTexture(GL_TEXTURE_2D, nTexture); glEnable(GL_TEXTURE_2D); glTexParameteri(GL_TEXTURE_2D, diff --git a/canvas/source/opengl/ogl_spritedevicehelper.cxx b/canvas/source/opengl/ogl_spritedevicehelper.cxx index cd29f37..3f6b534 100644 --- a/canvas/source/opengl/ogl_spritedevicehelper.cxx +++ b/canvas/source/opengl/ogl_spritedevicehelper.cxx @@ -537,21 +537,29 @@ namespace oglcanvas namespace { - /* - * TODO: mogg: reimplement through FBO with texture as backend class BufferContextImpl : public IBufferContext { ::basegfx::B2IVector maSize; const SpriteDeviceHelper& mrDeviceHelper; + GLuint mnFrambufferId; + GLuint mnDepthId; + GLuint mnTextureId; virtual bool startBufferRendering() SAL_OVERRIDE { - return false; + glBindFramebuffer(GL_FRAMEBUFFER, mnFrambufferId); + return true; } virtual bool endBufferRendering() SAL_OVERRIDE { - return false; + glBindFramebuffer(GL_FRAMEBUFFER, 0); + return true; + } + + virtual GLuint getTextureId() SAL_OVERRIDE + { + return mnTextureId; } public: @@ -559,20 +567,26 @@ namespace oglcanvas const ::basegfx::B2IVector& rSize) : maSize(rSize), mrDeviceHelper(rDeviceHelper), - mnTexture(0) + mnFrambufferId(0), + mnDepthId(0), + mnTextureId(0) { + OpenGLHelper::createFramebuffer(maSize.getX(), maSize.getY(), mnFrambufferId, + mnDepthId, mnTextureId, false); } virtual ~BufferContextImpl() { + glDeleteTextures(1, &mnTextureId); + glDeleteRenderbuffers(1, &mnDepthId); + glDeleteFramebuffers(1, &mnFrambufferId); } }; - */ } - IBufferContextSharedPtr SpriteDeviceHelper::createBufferContext(const ::basegfx::B2IVector& ) const + IBufferContextSharedPtr SpriteDeviceHelper::createBufferContext(const ::basegfx::B2IVector& rSize) const { - return NULL; + return IBufferContextSharedPtr(new BufferContextImpl(*this, rSize)); } TextureCache& SpriteDeviceHelper::getTextureCache() const commit 89bc7be3ac9862bf1bd763226f56b6fee723a7cf Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Fri Aug 8 05:05:11 2014 +0200 fix variable name Change-Id: I1cfd6d59e5569177d8ad23245435073d30fe1374 diff --git a/include/vcl/opengl/OpenGLHelper.hxx b/include/vcl/opengl/OpenGLHelper.hxx index 0134697..52093c2 100644 --- a/include/vcl/opengl/OpenGLHelper.hxx +++ b/include/vcl/opengl/OpenGLHelper.hxx @@ -34,7 +34,7 @@ public: * This also affects whether to free with glDeleteRenderbuffers or glDeleteTextures */ static void createFramebuffer(long nWidth, long nHeight, GLuint& nFramebufferId, - GLuint& nRenderbufferTextId, GLuint& nRenderbufferColorId, bool bRenderbuffer = true); + GLuint& nRenderbufferDepthId, GLuint& nRenderbufferColorId, bool bRenderbuffer = true); // Get OpenGL version (needs a context) static float getGLVersion(); commit d24fd018c90c6517f88ecce3ed4f40fa47528ca7 Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Fri Aug 8 04:52:38 2014 +0200 add possibility to generate FBO with texture The caller is responsible to delete the buffers. Depending on bRenderbuffer either with glDeleteRenderbuffers or with glDeleteTextures. Change-Id: I5ccbd49862c381abf04e812765cced485a083f89 diff --git a/include/vcl/opengl/OpenGLHelper.hxx b/include/vcl/opengl/OpenGLHelper.hxx index f80d34b..0134697 100644 --- a/include/vcl/opengl/OpenGLHelper.hxx +++ b/include/vcl/opengl/OpenGLHelper.hxx @@ -30,9 +30,11 @@ public: /** * The caller is responsible for deleting the buffer objects identified by * nFramebufferId, nRenderbufferDepthId and nRenderbufferColorId + * @param bRenderbuffer true => off-screen rendering, false => rendering to texture + * This also affects whether to free with glDeleteRenderbuffers or glDeleteTextures */ - static void createFramebuffer(long nWidth, long nHeight, - GLuint& nFramebufferId, GLuint& nRenderbufferTextId, GLuint& nRenderbufferColorId); + static void createFramebuffer(long nWidth, long nHeight, GLuint& nFramebufferId, + GLuint& nRenderbufferTextId, GLuint& nRenderbufferColorId, bool bRenderbuffer = true); // Get OpenGL version (needs a context) static float getGLVersion(); diff --git a/vcl/source/opengl/OpenGLHelper.cxx b/vcl/source/opengl/OpenGLHelper.cxx index a34ad75..d58b537 100644 --- a/vcl/source/opengl/OpenGLHelper.cxx +++ b/vcl/source/opengl/OpenGLHelper.cxx @@ -275,8 +275,8 @@ std::ostream& operator<<(std::ostream& rStrm, const glm::mat4& rMatrix) return rStrm; } -void OpenGLHelper::createFramebuffer(long nWidth, long nHeight, - GLuint& nFramebufferId, GLuint& nRenderbufferDepthId, GLuint& nRenderbufferColorId) +void OpenGLHelper::createFramebuffer(long nWidth, long nHeight, GLuint& nFramebufferId, + GLuint& nRenderbufferDepthId, GLuint& nRenderbufferColorId, bool bRenderbuffer) { // create a renderbuffer for depth attachment glGenRenderbuffers(1, &nRenderbufferDepthId); @@ -284,13 +284,31 @@ void OpenGLHelper::createFramebuffer(long nWidth, long nHeight, glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, nWidth, nHeight); glBindRenderbuffer(GL_RENDERBUFFER, 0); - // create a renderbuffer for color attachment - glGenRenderbuffers(1, &nRenderbufferColorId); - glBindRenderbuffer(GL_RENDERBUFFER, nRenderbufferColorId); - glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, nWidth, nHeight); - glBindRenderbuffer(GL_RENDERBUFFER, 0); + if(bRenderbuffer) + { + // create a renderbuffer for color attachment + glGenRenderbuffers(1, &nRenderbufferColorId); + glBindRenderbuffer(GL_RENDERBUFFER, nRenderbufferColorId); + glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, nWidth, nHeight); + glBindRenderbuffer(GL_RENDERBUFFER, 0); + } + else + { + glGenTextures(1, &nRenderbufferColorId); + glBindTexture(GL_TEXTURE_2D, nRenderbufferColorId); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, nWidth, nHeight, 0, + GL_RGBA, GL_UNSIGNED_BYTE, 0); + glBindTexture(GL_TEXTURE_2D, 0); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, nRenderbufferColorId, 0); + } - // create a framebuffer object and attach renderbuffer and texture + // create a framebuffer object and attach renderbuffer glGenFramebuffers(1, &nFramebufferId); glCheckFramebufferStatus(GL_FRAMEBUFFER); glBindFramebuffer(GL_FRAMEBUFFER, nFramebufferId); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits