summaryrefslogtreecommitdiffstats
path: root/gfx/gl/GLBlitHelper.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/gl/GLBlitHelper.h')
-rw-r--r--gfx/gl/GLBlitHelper.h168
1 files changed, 168 insertions, 0 deletions
diff --git a/gfx/gl/GLBlitHelper.h b/gfx/gl/GLBlitHelper.h
new file mode 100644
index 000000000..31d6a2f5b
--- /dev/null
+++ b/gfx/gl/GLBlitHelper.h
@@ -0,0 +1,168 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim: set ts=8 sts=4 et sw=4 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GLBLITHELPER_H_
+#define GLBLITHELPER_H_
+
+#include "GLContextTypes.h"
+#include "GLConsts.h"
+#include "nsSize.h"
+#include "mozilla/Attributes.h"
+#include "mozilla/gfx/Point.h"
+
+namespace mozilla {
+
+namespace layers {
+class Image;
+class PlanarYCbCrImage;
+class GrallocImage;
+class SurfaceTextureImage;
+class MacIOSurfaceImage;
+class EGLImageImage;
+} // namespace layers
+
+namespace gl {
+
+class GLContext;
+
+/** Buffer blitting helper */
+class GLBlitHelper final
+{
+ enum Channel
+ {
+ Channel_Y = 0,
+ Channel_Cb,
+ Channel_Cr,
+ Channel_Max,
+ };
+
+ /**
+ * BlitTex2D is used to copy blit the content of a GL_TEXTURE_2D object,
+ * BlitTexRect is used to copy blit the content of a GL_TEXTURE_RECT object,
+ * The difference between BlitTex2D and BlitTexRect is the texture type, which affect
+ * the fragment shader a bit.
+ *
+ * ConvertGralloc is used to color convert copy blit the GrallocImage into a
+ * normal RGB texture by egl_image_external extension
+ * ConvertPlnarYcbCr is used to color convert copy blit the PlanarYCbCrImage
+ * into a normal RGB texture by create textures of each color channel, and
+ * convert it in GPU.
+ * Convert type is created for canvas.
+ */
+ enum BlitType
+ {
+ BlitTex2D,
+ BlitTexRect,
+ ConvertGralloc,
+ ConvertPlanarYCbCr,
+ ConvertSurfaceTexture,
+ ConvertEGLImage,
+ ConvertMacIOSurfaceImage
+ };
+ // The GLContext is the sole owner of the GLBlitHelper.
+ GLContext* mGL;
+
+ GLuint mTexBlit_Buffer;
+ GLuint mTexBlit_VertShader;
+ GLuint mTex2DBlit_FragShader;
+ GLuint mTex2DRectBlit_FragShader;
+ GLuint mTex2DBlit_Program;
+ GLuint mTex2DRectBlit_Program;
+
+ GLint mYFlipLoc;
+
+ GLint mTextureTransformLoc;
+
+ // Data for image blit path
+ GLuint mTexExternalBlit_FragShader;
+ GLuint mTexYUVPlanarBlit_FragShader;
+ GLuint mTexNV12PlanarBlit_FragShader;
+ GLuint mTexExternalBlit_Program;
+ GLuint mTexYUVPlanarBlit_Program;
+ GLuint mTexNV12PlanarBlit_Program;
+ GLuint mFBO;
+ GLuint mSrcTexY;
+ GLuint mSrcTexCb;
+ GLuint mSrcTexCr;
+ GLuint mSrcTexEGL;
+ GLint mYTexScaleLoc;
+ GLint mCbCrTexScaleLoc;
+ GLint mYuvColorMatrixLoc;
+ int mTexWidth;
+ int mTexHeight;
+
+ // Cache some uniform values
+ float mCurYScale;
+ float mCurCbCrScale;
+
+ void UseBlitProgram();
+ void SetBlitFramebufferForDestTexture(GLuint aTexture);
+
+ bool UseTexQuadProgram(BlitType target, const gfx::IntSize& srcSize);
+ bool InitTexQuadProgram(BlitType target = BlitTex2D);
+ void DeleteTexBlitProgram();
+ void BindAndUploadYUVTexture(Channel which, uint32_t width, uint32_t height, void* data, bool allocation);
+ void BindAndUploadEGLImage(EGLImage image, GLuint target);
+
+ bool BlitPlanarYCbCrImage(layers::PlanarYCbCrImage* yuvImage);
+#ifdef MOZ_WIDGET_ANDROID
+ // Blit onto the current FB.
+ bool BlitSurfaceTextureImage(layers::SurfaceTextureImage* stImage);
+ bool BlitEGLImageImage(layers::EGLImageImage* eglImage);
+#endif
+#ifdef XP_MACOSX
+ bool BlitMacIOSurfaceImage(layers::MacIOSurfaceImage* ioImage);
+#endif
+
+ explicit GLBlitHelper(GLContext* gl);
+
+ friend class GLContext;
+
+public:
+ ~GLBlitHelper();
+
+ // If you don't have |srcFormats| for the 2nd definition,
+ // then you'll need the framebuffer_blit extensions to use
+ // the first BlitFramebufferToFramebuffer.
+ void BlitFramebufferToFramebuffer(GLuint srcFB, GLuint destFB,
+ const gfx::IntSize& srcSize,
+ const gfx::IntSize& destSize,
+ bool internalFBs = false);
+ void BlitFramebufferToFramebuffer(GLuint srcFB, GLuint destFB,
+ const gfx::IntSize& srcSize,
+ const gfx::IntSize& destSize,
+ const GLFormats& srcFormats,
+ bool internalFBs = false);
+ void BlitTextureToFramebuffer(GLuint srcTex, GLuint destFB,
+ const gfx::IntSize& srcSize,
+ const gfx::IntSize& destSize,
+ GLenum srcTarget = LOCAL_GL_TEXTURE_2D,
+ bool internalFBs = false);
+ void DrawBlitTextureToFramebuffer(GLuint srcTex, GLuint destFB,
+ const gfx::IntSize& srcSize,
+ const gfx::IntSize& destSize,
+ GLenum srcTarget = LOCAL_GL_TEXTURE_2D,
+ bool internalFBs = false);
+ void BlitFramebufferToTexture(GLuint srcFB, GLuint destTex,
+ const gfx::IntSize& srcSize,
+ const gfx::IntSize& destSize,
+ GLenum destTarget = LOCAL_GL_TEXTURE_2D,
+ bool internalFBs = false);
+ void BlitTextureToTexture(GLuint srcTex, GLuint destTex,
+ const gfx::IntSize& srcSize,
+ const gfx::IntSize& destSize,
+ GLenum srcTarget = LOCAL_GL_TEXTURE_2D,
+ GLenum destTarget = LOCAL_GL_TEXTURE_2D);
+ bool BlitImageToFramebuffer(layers::Image* srcImage, const gfx::IntSize& destSize,
+ GLuint destFB, OriginPos destOrigin);
+ bool BlitImageToTexture(layers::Image* srcImage, const gfx::IntSize& destSize,
+ GLuint destTex, GLenum destTarget, OriginPos destOrigin);
+};
+
+} // namespace gl
+} // namespace mozilla
+
+#endif // GLBLITHELPER_H_