mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-23 12:51:06 +00:00
34ec60f7ff
SharedSurface_EGLImage has mostly avoided bitrotting. However, it now sometimes gets destructed after the GLContext has been lost, resulting in a crash when attempting to clean up its resources. To avoid this, we hold a weak reference to the EglDisplay, and use that to clean up rather than the GLContext. To support rendering with SWGL, EGLImageTextureHost ensures the correct preferCompositorSurface, supportsExternalCompositing, and imageType values are sent to webrender. RenderEGLImageTextureHost now implements RenderTextureHostSWGL, as well as the new CreateTextureSource() function, and EGLImageTextureSource is initialized with a GL context reference so that it may actually work. Additionally we use eglWaitSync() rather than eglClientWaitSync() where available for improved performance. And we ensure that we bind the EGL images' textures to GL_TEXTURE_2D rather than GL_TEXTURE_EXTERNAL when running on the Android emulator to work around the buggy implementation in some emulator versions. Differential Revision: https://phabricator.services.mozilla.com/D211291
69 lines
2.1 KiB
C++
69 lines
2.1 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 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 MOZILLA_GFX_RENDEREGLIMAGETEXTUREHOST_H
|
|
#define MOZILLA_GFX_RENDEREGLIMAGETEXTUREHOST_H
|
|
|
|
#include "mozilla/layers/TextureHostOGL.h"
|
|
#include "RenderTextureHostSWGL.h"
|
|
|
|
namespace mozilla {
|
|
|
|
namespace wr {
|
|
|
|
// RenderEGLImageTextureHost is created only for SharedSurface_EGLImage that is
|
|
// created in parent process.
|
|
class RenderEGLImageTextureHost final : public RenderTextureHostSWGL {
|
|
public:
|
|
RenderEGLImageTextureHost(EGLImage aImage, EGLSync aSync, gfx::IntSize aSize,
|
|
gfx::SurfaceFormat aFormat);
|
|
|
|
wr::WrExternalImage Lock(uint8_t aChannelIndex, gl::GLContext* aGL) override;
|
|
void Unlock() override;
|
|
size_t Bytes() override {
|
|
return mSize.width * mSize.height * BytesPerPixel(mFormat);
|
|
}
|
|
|
|
RenderEGLImageTextureHost* AsRenderEGLImageTextureHost() override {
|
|
return this;
|
|
}
|
|
|
|
RefPtr<layers::TextureSource> CreateTextureSource(
|
|
layers::TextureSourceProvider* aProvider) override;
|
|
|
|
// RenderTextureHostSWGL
|
|
gfx::SurfaceFormat GetFormat() const override;
|
|
gfx::ColorDepth GetColorDepth() const override {
|
|
return gfx::ColorDepth::COLOR_8;
|
|
}
|
|
size_t GetPlaneCount() const override { return 1; };
|
|
bool MapPlane(RenderCompositor* aCompositor, uint8_t aChannelIndex,
|
|
PlaneInfo& aPlaneInfo) override;
|
|
void UnmapPlanes() override;
|
|
|
|
private:
|
|
virtual ~RenderEGLImageTextureHost();
|
|
bool CreateTextureHandle();
|
|
void DeleteTextureHandle();
|
|
bool WaitSync();
|
|
already_AddRefed<gfx::DataSourceSurface> ReadTexImage();
|
|
|
|
const EGLImage mImage;
|
|
EGLSync mSync;
|
|
const gfx::IntSize mSize;
|
|
const gfx::SurfaceFormat mFormat;
|
|
|
|
RefPtr<gl::GLContext> mGL;
|
|
GLenum mTextureTarget;
|
|
GLuint mTextureHandle;
|
|
RefPtr<gfx::DataSourceSurface> mReadback;
|
|
};
|
|
|
|
} // namespace wr
|
|
} // namespace mozilla
|
|
|
|
#endif // MOZILLA_GFX_RENDEREGLIMAGETEXTUREHOST_H
|