mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-22 01:35:35 +00:00
ec1078c65a
Backed out changeset e2a6160242e5 (bug 1150944) Backed out changeset 1c510537d20b (bug 1150944) Backed out changeset 7ae813666ed5 (bug 1150944) Backed out changeset 2f29ac2e31cd (bug 1150944) Backed out changeset bf7681b1567e (bug 1150944) Backed out changeset 79c6b8d014d2 (bug 1034370)
87 lines
2.3 KiB
C++
87 lines
2.3 KiB
C++
|
|
#include "GLImages.h"
|
|
#include "GLContext.h"
|
|
#include "GLContextProvider.h"
|
|
#include "ScopedGLHelpers.h"
|
|
#include "GLImages.h"
|
|
#include "GLBlitHelper.h"
|
|
#include "GLReadTexImageHelper.h"
|
|
#include "GLLibraryEGL.h"
|
|
|
|
using namespace mozilla;
|
|
using namespace mozilla::gl;
|
|
|
|
namespace mozilla {
|
|
namespace layers {
|
|
|
|
static nsRefPtr<GLContext> sSnapshotContext;
|
|
|
|
EGLImageImage::~EGLImageImage()
|
|
{
|
|
if (!mData.mOwns) {
|
|
return;
|
|
}
|
|
|
|
if (mData.mImage) {
|
|
sEGLLibrary.fDestroyImage(EGL_DISPLAY(), mData.mImage);
|
|
mData.mImage = nullptr;
|
|
}
|
|
|
|
if (mData.mSync) {
|
|
sEGLLibrary.fDestroySync(EGL_DISPLAY(), mData.mSync);
|
|
mData.mSync = nullptr;
|
|
}
|
|
}
|
|
|
|
already_AddRefed<gfx::SourceSurface>
|
|
GLImage::GetAsSourceSurface()
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread(), "Should be on the main thread");
|
|
|
|
if (!sSnapshotContext) {
|
|
sSnapshotContext = GLContextProvider::CreateHeadless(false);
|
|
if (!sSnapshotContext) {
|
|
NS_WARNING("Failed to create snapshot GLContext");
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
sSnapshotContext->MakeCurrent();
|
|
ScopedTexture scopedTex(sSnapshotContext);
|
|
ScopedBindTexture boundTex(sSnapshotContext, scopedTex.Texture());
|
|
|
|
gfx::IntSize size = GetSize();
|
|
sSnapshotContext->fTexImage2D(LOCAL_GL_TEXTURE_2D, 0, LOCAL_GL_RGBA,
|
|
size.width, size.height, 0,
|
|
LOCAL_GL_RGBA,
|
|
LOCAL_GL_UNSIGNED_BYTE,
|
|
nullptr);
|
|
|
|
ScopedFramebufferForTexture autoFBForTex(sSnapshotContext, scopedTex.Texture());
|
|
if (!autoFBForTex.IsComplete()) {
|
|
MOZ_CRASH("ScopedFramebufferForTexture failed.");
|
|
}
|
|
|
|
const gl::OriginPos destOrigin = gl::OriginPos::TopLeft;
|
|
|
|
if (!sSnapshotContext->BlitHelper()->BlitImageToFramebuffer(this, size,
|
|
autoFBForTex.FB(),
|
|
destOrigin))
|
|
{
|
|
return nullptr;
|
|
}
|
|
|
|
RefPtr<gfx::DataSourceSurface> source =
|
|
gfx::Factory::CreateDataSourceSurface(size, gfx::SurfaceFormat::B8G8R8A8);
|
|
if (NS_WARN_IF(!source)) {
|
|
return nullptr;
|
|
}
|
|
|
|
ScopedBindFramebuffer bind(sSnapshotContext, autoFBForTex.FB());
|
|
ReadPixelsIntoDataSurface(sSnapshotContext, source);
|
|
return source.forget();
|
|
}
|
|
|
|
} // namespace layers
|
|
} // namespace mozilla
|