Line data Source code
1 :
2 : #include "GLImages.h"
3 : #include "GLContext.h"
4 : #include "GLContextProvider.h"
5 : #include "ScopedGLHelpers.h"
6 : #include "GLImages.h"
7 : #include "GLBlitHelper.h"
8 : #include "GLReadTexImageHelper.h"
9 : #include "GLLibraryEGL.h"
10 :
11 : using namespace mozilla;
12 : using namespace mozilla::gl;
13 :
14 : namespace mozilla {
15 : namespace layers {
16 :
17 3 : static RefPtr<GLContext> sSnapshotContext;
18 :
19 0 : EGLImageImage::EGLImageImage(EGLImage aImage, EGLSync aSync,
20 : const gfx::IntSize& aSize, const gl::OriginPos& aOrigin,
21 0 : bool aOwns)
22 : : GLImage(ImageFormat::EGLIMAGE),
23 : mImage(aImage),
24 : mSync(aSync),
25 : mSize(aSize),
26 0 : mPos(aOrigin),
27 0 : mOwns(aOwns)
28 : {
29 0 : }
30 :
31 0 : EGLImageImage::~EGLImageImage()
32 : {
33 0 : if (!mOwns) {
34 0 : return;
35 : }
36 :
37 0 : if (mImage) {
38 0 : sEGLLibrary.fDestroyImage(EGL_DISPLAY(), mImage);
39 0 : mImage = nullptr;
40 : }
41 :
42 0 : if (mSync) {
43 0 : sEGLLibrary.fDestroySync(EGL_DISPLAY(), mSync);
44 0 : mSync = nullptr;
45 : }
46 0 : }
47 :
48 : already_AddRefed<gfx::SourceSurface>
49 0 : GLImage::GetAsSourceSurface()
50 : {
51 0 : MOZ_ASSERT(NS_IsMainThread(), "Should be on the main thread");
52 :
53 0 : if (!sSnapshotContext) {
54 0 : nsCString discardFailureId;
55 0 : sSnapshotContext = GLContextProvider::CreateHeadless(CreateContextFlags::NONE,
56 0 : &discardFailureId);
57 0 : if (!sSnapshotContext) {
58 0 : NS_WARNING("Failed to create snapshot GLContext");
59 0 : return nullptr;
60 : }
61 : }
62 :
63 0 : sSnapshotContext->MakeCurrent();
64 0 : ScopedTexture scopedTex(sSnapshotContext);
65 0 : ScopedBindTexture boundTex(sSnapshotContext, scopedTex.Texture());
66 :
67 0 : gfx::IntSize size = GetSize();
68 0 : sSnapshotContext->fTexImage2D(LOCAL_GL_TEXTURE_2D, 0, LOCAL_GL_RGBA,
69 : size.width, size.height, 0,
70 : LOCAL_GL_RGBA,
71 : LOCAL_GL_UNSIGNED_BYTE,
72 0 : nullptr);
73 :
74 0 : ScopedFramebufferForTexture autoFBForTex(sSnapshotContext, scopedTex.Texture());
75 0 : if (!autoFBForTex.IsComplete()) {
76 0 : gfxCriticalError() << "GetAsSourceSurface: ScopedFramebufferForTexture failed.";
77 0 : return nullptr;
78 : }
79 :
80 0 : const gl::OriginPos destOrigin = gl::OriginPos::TopLeft;
81 :
82 0 : if (!sSnapshotContext->BlitHelper()->BlitImageToFramebuffer(this, size,
83 : autoFBForTex.FB(),
84 : destOrigin))
85 : {
86 0 : return nullptr;
87 : }
88 :
89 : RefPtr<gfx::DataSourceSurface> source =
90 0 : gfx::Factory::CreateDataSourceSurface(size, gfx::SurfaceFormat::B8G8R8A8);
91 0 : if (NS_WARN_IF(!source)) {
92 0 : return nullptr;
93 : }
94 :
95 0 : ScopedBindFramebuffer bind(sSnapshotContext, autoFBForTex.FB());
96 0 : ReadPixelsIntoDataSurface(sSnapshotContext, source);
97 0 : return source.forget();
98 : }
99 :
100 : #ifdef MOZ_WIDGET_ANDROID
101 : SurfaceTextureImage::SurfaceTextureImage(AndroidSurfaceTextureHandle aHandle,
102 : const gfx::IntSize& aSize,
103 : bool aContinuous,
104 : gl::OriginPos aOriginPos)
105 : : GLImage(ImageFormat::SURFACE_TEXTURE),
106 : mHandle(aHandle),
107 : mSize(aSize),
108 : mContinuous(aContinuous),
109 : mOriginPos(aOriginPos)
110 : {
111 : MOZ_ASSERT(mHandle);
112 : }
113 : #endif
114 :
115 : } // namespace layers
116 : } // namespace mozilla
|