1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "RenderEGLImageTextureHost.h"
9 #include "mozilla/gfx/Logging.h"
10 #include "GLContextEGL.h"
11 #include "GLLibraryEGL.h"
16 RenderEGLImageTextureHost::RenderEGLImageTextureHost(EGLImage aImage
,
22 mTextureTarget(LOCAL_GL_TEXTURE_2D
),
24 MOZ_COUNT_CTOR_INHERITED(RenderEGLImageTextureHost
, RenderTextureHostOGL
);
27 RenderEGLImageTextureHost::~RenderEGLImageTextureHost() {
28 MOZ_COUNT_DTOR_INHERITED(RenderEGLImageTextureHost
, RenderTextureHostOGL
);
29 DeleteTextureHandle();
32 GLuint
RenderEGLImageTextureHost::GetGLHandle(uint8_t aChannelIndex
) const {
33 return mTextureHandle
;
36 gfx::IntSize
RenderEGLImageTextureHost::GetSize(uint8_t aChannelIndex
) const {
40 wr::WrExternalImage
RenderEGLImageTextureHost::Lock(
41 uint8_t aChannelIndex
, gl::GLContext
* aGL
, wr::ImageRendering aRendering
) {
42 MOZ_ASSERT(aChannelIndex
== 0);
44 if (mGL
.get() != aGL
) {
46 // This should not happen. SharedSurface_EGLImage is created only in
48 MOZ_ASSERT_UNREACHABLE("Unexpected GL context");
49 return InvalidToWrExternalImage();
54 if (!mImage
|| !mGL
|| !mGL
->MakeCurrent()) {
55 return InvalidToWrExternalImage();
58 EGLint status
= LOCAL_EGL_CONDITION_SATISFIED
;
60 const auto& gle
= gl::GLContextEGL::Cast(mGL
);
61 const auto& egl
= gle
->mEgl
;
62 MOZ_ASSERT(egl
->IsExtensionSupported(gl::GLLibraryEGL::KHR_fence_sync
));
63 status
= egl
->fClientWaitSync(egl
->Display(), mSync
, 0, LOCAL_EGL_FOREVER
);
64 // We do not need to delete sync here. It is deleted by
65 // SharedSurface_EGLImage.
69 if (status
!= LOCAL_EGL_CONDITION_SATISFIED
) {
72 "ClientWaitSync generated an error. Has mSync already been destroyed?");
73 return InvalidToWrExternalImage();
76 if (!mTextureHandle
) {
77 mTextureTarget
= mGL
->GetPreferredEGLImageTextureTarget();
78 MOZ_ASSERT(mTextureTarget
== LOCAL_GL_TEXTURE_2D
||
79 mTextureTarget
== LOCAL_GL_TEXTURE_EXTERNAL
);
81 mGL
->fGenTextures(1, &mTextureHandle
);
82 // Cache rendering filter.
83 mCachedRendering
= aRendering
;
84 ActivateBindAndTexParameteri(mGL
, LOCAL_GL_TEXTURE0
, mTextureTarget
,
85 mTextureHandle
, aRendering
);
86 mGL
->fEGLImageTargetTexture2D(mTextureTarget
, mImage
);
87 } else if (IsFilterUpdateNecessary(aRendering
)) {
88 // Cache new rendering filter.
89 mCachedRendering
= aRendering
;
90 ActivateBindAndTexParameteri(mGL
, LOCAL_GL_TEXTURE0
, mTextureTarget
,
91 mTextureHandle
, aRendering
);
94 return NativeTextureToWrExternalImage(mTextureHandle
, 0, 0, mSize
.width
,
98 void RenderEGLImageTextureHost::Unlock() {}
100 void RenderEGLImageTextureHost::DeleteTextureHandle() {
101 if (mTextureHandle
) {
102 // XXX recycle gl texture, since SharedSurface_EGLImage and
103 // RenderEGLImageTextureHost is not recycled.
104 mGL
->fDeleteTextures(1, &mTextureHandle
);
110 } // namespace mozilla