mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-04 02:57:38 +00:00
ad6c294e3c
The change addressed followings problems. - Recycling of gl::SharedSurface by RemoteTextureMap is not handled by gl::SwapChain. - PrepareForUse()/NotifyNotUsed() of remote texture's TextureHost(SurfaceTextureHost) is not handled - Wrapping of RenderAndroidSurfaceTextureHost by RenderTextureHostWrapper is not handled PrepareForUse()/NotifyNotUsed() is called based on compositor ref count of TextureHost. Normally TextureHost is wrapped by WebRenderTextureHost, then the WebRenderTextureHost handles PrepareForUse()/NotifyNotUsed(). But in remote texture case, WebRenderTextureHost wraps RemoteTextureHostWrapper. And compositable ref of remote texture's TextureHost is updated within RemoteTextureMap::mMutex. Then PrepareForUse()/NotifyNotUsed() happen outside of WebRenderTextureHost in non compositor thread. With pref gfx.canvas.accelerated=true, canvas renderings were broken on android emulator. The boroken rendering seemed to happen by GL of android emulator. The boroken rendering did not happen with tests on android hardware. Differential Revision: https://phabricator.services.mozilla.com/D159261
88 lines
2.4 KiB
C++
88 lines
2.4 KiB
C++
/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 4; -*- */
|
|
/* 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/. */
|
|
|
|
/* GLScreenBuffer is the abstraction for the "default framebuffer" used
|
|
* by an offscreen GLContext. Since it's only for offscreen GLContext's,
|
|
* it's only useful for things like WebGL, and is NOT used by the
|
|
* compositor's GLContext. Remember that GLContext provides an abstraction
|
|
* so that even if you want to draw to the 'screen', even if that's not
|
|
* actually the screen, just draw to 0. This GLScreenBuffer class takes the
|
|
* logic handling out of GLContext.
|
|
*/
|
|
|
|
#ifndef SCREEN_BUFFER_H_
|
|
#define SCREEN_BUFFER_H_
|
|
|
|
#include "GLTypes.h"
|
|
#include "mozilla/gfx/Point.h"
|
|
#include "mozilla/UniquePtr.h"
|
|
|
|
#include <functional>
|
|
#include <queue>
|
|
#include <memory>
|
|
|
|
namespace mozilla {
|
|
namespace gl {
|
|
|
|
class SharedSurface;
|
|
class SurfaceFactory;
|
|
class SwapChain;
|
|
|
|
class SwapChainPresenter final {
|
|
friend class SwapChain;
|
|
|
|
SwapChain* mSwapChain;
|
|
std::shared_ptr<SharedSurface> mBackBuffer;
|
|
|
|
public:
|
|
explicit SwapChainPresenter(SwapChain& swapChain);
|
|
~SwapChainPresenter();
|
|
|
|
const auto& BackBuffer() const { return mBackBuffer; }
|
|
|
|
std::shared_ptr<SharedSurface> SwapBackBuffer(std::shared_ptr<SharedSurface>);
|
|
GLuint Fb() const;
|
|
};
|
|
|
|
// -
|
|
|
|
class SwapChain final {
|
|
friend class SwapChainPresenter;
|
|
|
|
public:
|
|
UniquePtr<SurfaceFactory> mFactory;
|
|
|
|
private:
|
|
std::queue<std::shared_ptr<SharedSurface>> mPool;
|
|
std::shared_ptr<SharedSurface> mFrontBuffer;
|
|
std::function<void()> mDestroyedCallback;
|
|
|
|
public:
|
|
std::shared_ptr<SharedSurface>
|
|
mPrevFrontBuffer; // Hold this ref while it's in-flight.
|
|
private:
|
|
SwapChainPresenter* mPresenter = nullptr;
|
|
|
|
public:
|
|
SwapChain();
|
|
virtual ~SwapChain();
|
|
|
|
void ClearPool();
|
|
void StoreRecycledSurface(const std::shared_ptr<SharedSurface>& surf);
|
|
const auto& FrontBuffer() const { return mFrontBuffer; }
|
|
UniquePtr<SwapChainPresenter> Acquire(const gfx::IntSize&, gfx::ColorSpace2);
|
|
|
|
void SetDestroyedCallback(std::function<void()>&& aDestroyedCallback) {
|
|
MOZ_ASSERT(!mDestroyedCallback);
|
|
mDestroyedCallback = std::move(aDestroyedCallback);
|
|
mPool = {};
|
|
}
|
|
};
|
|
|
|
} // namespace gl
|
|
} // namespace mozilla
|
|
|
|
#endif // SCREEN_BUFFER_H_
|