Bug 1557368 [wpt PR 16856] - Update error type test for attachInternals(), a=testonly
[gecko.git] / gfx / webrender_bindings / RenderEGLImageTextureHost.cpp
blob21c6256e3d2815709d051964b5e3b635bb1cf899
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"
13 namespace mozilla {
14 namespace wr {
16 RenderEGLImageTextureHost::RenderEGLImageTextureHost(EGLImage aImage,
17 EGLSync aSync,
18 gfx::IntSize aSize)
19 : mImage(aImage),
20 mSync(aSync),
21 mSize(aSize),
22 mTextureTarget(LOCAL_GL_TEXTURE_2D),
23 mTextureHandle(0) {
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 {
37 return mSize;
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) {
45 if (mGL) {
46 // This should not happen. SharedSurface_EGLImage is created only in
47 // parent process.
48 MOZ_ASSERT_UNREACHABLE("Unexpected GL context");
49 return InvalidToWrExternalImage();
51 mGL = aGL;
54 if (!mImage || !mGL || !mGL->MakeCurrent()) {
55 return InvalidToWrExternalImage();
58 EGLint status = LOCAL_EGL_CONDITION_SATISFIED;
59 if (mSync) {
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.
66 mSync = 0;
69 if (status != LOCAL_EGL_CONDITION_SATISFIED) {
70 MOZ_ASSERT(
71 status != 0,
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,
95 mSize.height);
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);
105 mTextureHandle = 0;
109 } // namespace wr
110 } // namespace mozilla