Bug 1308363 - Remove GONK specific code from gfx/. r=jrmuizel,sotaro
This commit is contained in:
@@ -51,7 +51,6 @@
|
|||||||
#include "mozilla/layers/CompositorBridgeChild.h"
|
#include "mozilla/layers/CompositorBridgeChild.h"
|
||||||
#include "mozilla/layers/ContentProcessController.h"
|
#include "mozilla/layers/ContentProcessController.h"
|
||||||
#include "mozilla/layers/ImageBridgeChild.h"
|
#include "mozilla/layers/ImageBridgeChild.h"
|
||||||
#include "mozilla/layers/SharedBufferManagerChild.h"
|
|
||||||
#include "mozilla/layout/RenderFrameChild.h"
|
#include "mozilla/layout/RenderFrameChild.h"
|
||||||
#include "mozilla/net/NeckoChild.h"
|
#include "mozilla/net/NeckoChild.h"
|
||||||
#include "mozilla/plugins/PluginInstanceParent.h"
|
#include "mozilla/plugins/PluginInstanceParent.h"
|
||||||
@@ -1214,13 +1213,6 @@ ContentChild::RecvReinitRendering(Endpoint<PCompositorBridgeChild>&& aCompositor
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
PSharedBufferManagerChild*
|
|
||||||
ContentChild::AllocPSharedBufferManagerChild(mozilla::ipc::Transport* aTransport,
|
|
||||||
base::ProcessId aOtherProcess)
|
|
||||||
{
|
|
||||||
return SharedBufferManagerChild::StartUpInChildProcess(aTransport, aOtherProcess);
|
|
||||||
}
|
|
||||||
|
|
||||||
PBackgroundChild*
|
PBackgroundChild*
|
||||||
ContentChild::AllocPBackgroundChild(Transport* aTransport,
|
ContentChild::AllocPBackgroundChild(Transport* aTransport,
|
||||||
ProcessId aOtherProcess)
|
ProcessId aOtherProcess)
|
||||||
|
|||||||
@@ -173,10 +173,6 @@ public:
|
|||||||
Endpoint<PImageBridgeChild>&& aImageBridge,
|
Endpoint<PImageBridgeChild>&& aImageBridge,
|
||||||
Endpoint<PVRManagerChild>&& aVRBridge) override;
|
Endpoint<PVRManagerChild>&& aVRBridge) override;
|
||||||
|
|
||||||
PSharedBufferManagerChild*
|
|
||||||
AllocPSharedBufferManagerChild(mozilla::ipc::Transport* aTransport,
|
|
||||||
base::ProcessId aOtherProcess) override;
|
|
||||||
|
|
||||||
PProcessHangMonitorChild*
|
PProcessHangMonitorChild*
|
||||||
AllocPProcessHangMonitorChild(Transport* aTransport,
|
AllocPProcessHangMonitorChild(Transport* aTransport,
|
||||||
ProcessId aOtherProcess) override;
|
ProcessId aOtherProcess) override;
|
||||||
|
|||||||
@@ -85,7 +85,6 @@
|
|||||||
#include "mozilla/layers/CompositorThread.h"
|
#include "mozilla/layers/CompositorThread.h"
|
||||||
#include "mozilla/layers/ImageBridgeParent.h"
|
#include "mozilla/layers/ImageBridgeParent.h"
|
||||||
#include "mozilla/layers/LayerTreeOwnerTracker.h"
|
#include "mozilla/layers/LayerTreeOwnerTracker.h"
|
||||||
#include "mozilla/layers/SharedBufferManagerParent.h"
|
|
||||||
#include "mozilla/layout/RenderFrameParent.h"
|
#include "mozilla/layout/RenderFrameParent.h"
|
||||||
#include "mozilla/LookAndFeel.h"
|
#include "mozilla/LookAndFeel.h"
|
||||||
#include "mozilla/media/MediaParent.h"
|
#include "mozilla/media/MediaParent.h"
|
||||||
@@ -2214,10 +2213,6 @@ ContentParent::InitInternal(ProcessPriority aInitialPriority,
|
|||||||
|
|
||||||
gpm->AddListener(this);
|
gpm->AddListener(this);
|
||||||
}
|
}
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
DebugOnly<bool> opened = PSharedBufferManager::Open(this);
|
|
||||||
MOZ_ASSERT(opened);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gAppData) {
|
if (gAppData) {
|
||||||
@@ -2847,13 +2842,6 @@ ContentParent::AllocPProcessHangMonitorParent(Transport* aTransport,
|
|||||||
return mHangMonitorActor;
|
return mHangMonitorActor;
|
||||||
}
|
}
|
||||||
|
|
||||||
PSharedBufferManagerParent*
|
|
||||||
ContentParent::AllocPSharedBufferManagerParent(mozilla::ipc::Transport* aTransport,
|
|
||||||
base::ProcessId aOtherProcess)
|
|
||||||
{
|
|
||||||
return SharedBufferManagerParent::Create(aTransport, aOtherProcess);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ContentParent::RecvGetProcessAttributes(ContentParentId* aCpId,
|
ContentParent::RecvGetProcessAttributes(ContentParentId* aCpId,
|
||||||
bool* aIsForApp, bool* aIsForBrowser)
|
bool* aIsForApp, bool* aIsForBrowser)
|
||||||
|
|||||||
@@ -67,7 +67,6 @@ class PJavaScriptParent;
|
|||||||
} // namespace jsipc
|
} // namespace jsipc
|
||||||
|
|
||||||
namespace layers {
|
namespace layers {
|
||||||
class PSharedBufferManagerParent;
|
|
||||||
struct TextureFactoryIdentifier;
|
struct TextureFactoryIdentifier;
|
||||||
} // namespace layers
|
} // namespace layers
|
||||||
|
|
||||||
@@ -702,10 +701,6 @@ private:
|
|||||||
AllocPGMPServiceParent(mozilla::ipc::Transport* aTransport,
|
AllocPGMPServiceParent(mozilla::ipc::Transport* aTransport,
|
||||||
base::ProcessId aOtherProcess) override;
|
base::ProcessId aOtherProcess) override;
|
||||||
|
|
||||||
PSharedBufferManagerParent*
|
|
||||||
AllocPSharedBufferManagerParent(mozilla::ipc::Transport* aTranport,
|
|
||||||
base::ProcessId aOtherProcess) override;
|
|
||||||
|
|
||||||
PBackgroundParent*
|
PBackgroundParent*
|
||||||
AllocPBackgroundParent(Transport* aTransport, ProcessId aOtherProcess)
|
AllocPBackgroundParent(Transport* aTransport, ProcessId aOtherProcess)
|
||||||
override;
|
override;
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ include protocol PSendStream;
|
|||||||
include protocol POfflineCacheUpdate;
|
include protocol POfflineCacheUpdate;
|
||||||
include protocol PRenderFrame;
|
include protocol PRenderFrame;
|
||||||
include protocol PScreenManager;
|
include protocol PScreenManager;
|
||||||
include protocol PSharedBufferManager;
|
|
||||||
include protocol PSpeechSynthesis;
|
include protocol PSpeechSynthesis;
|
||||||
include protocol PStorage;
|
include protocol PStorage;
|
||||||
include protocol PTelephony;
|
include protocol PTelephony;
|
||||||
@@ -344,7 +343,6 @@ nested(upto inside_cpow) sync protocol PContent
|
|||||||
parent spawns PPluginModule;
|
parent spawns PPluginModule;
|
||||||
|
|
||||||
parent opens PProcessHangMonitor;
|
parent opens PProcessHangMonitor;
|
||||||
parent opens PSharedBufferManager;
|
|
||||||
parent opens PGMPService;
|
parent opens PGMPService;
|
||||||
child opens PBackground;
|
child opens PBackground;
|
||||||
|
|
||||||
|
|||||||
@@ -372,10 +372,7 @@ void RecordingFontUserDataDestroyFunc(void *aUserData)
|
|||||||
RecordingFontUserData *userData =
|
RecordingFontUserData *userData =
|
||||||
static_cast<RecordingFontUserData*>(aUserData);
|
static_cast<RecordingFontUserData*>(aUserData);
|
||||||
|
|
||||||
// TODO support font in b2g recordings
|
|
||||||
#ifndef MOZ_WIDGET_GONK
|
|
||||||
userData->recorder->RecordEvent(RecordedScaledFontDestruction(userData->refPtr));
|
userData->recorder->RecordEvent(RecordedScaledFontDestruction(userData->refPtr));
|
||||||
#endif
|
|
||||||
|
|
||||||
delete userData;
|
delete userData;
|
||||||
}
|
}
|
||||||
@@ -390,8 +387,6 @@ DrawTargetRecording::FillGlyphs(ScaledFont *aFont,
|
|||||||
EnsurePatternDependenciesStored(aPattern);
|
EnsurePatternDependenciesStored(aPattern);
|
||||||
|
|
||||||
if (!aFont->GetUserData(reinterpret_cast<UserDataKey*>(mRecorder.get()))) {
|
if (!aFont->GetUserData(reinterpret_cast<UserDataKey*>(mRecorder.get()))) {
|
||||||
// TODO support font in b2g recordings
|
|
||||||
#ifndef MOZ_WIDGET_GONK
|
|
||||||
RecordedFontData fontData(aFont);
|
RecordedFontData fontData(aFont);
|
||||||
RecordedFontDetails fontDetails;
|
RecordedFontDetails fontDetails;
|
||||||
if (fontData.GetFontDetails(fontDetails)) {
|
if (fontData.GetFontDetails(fontDetails)) {
|
||||||
@@ -412,7 +407,6 @@ DrawTargetRecording::FillGlyphs(ScaledFont *aFont,
|
|||||||
gfxWarning() << "DrawTargetRecording::FillGlyphs failed to serialise ScaledFont";
|
gfxWarning() << "DrawTargetRecording::FillGlyphs failed to serialise ScaledFont";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
RecordingFontUserData *userData = new RecordingFontUserData;
|
RecordingFontUserData *userData = new RecordingFontUserData;
|
||||||
userData->refPtr = aFont;
|
userData->refPtr = aFont;
|
||||||
userData->recorder = mRecorder;
|
userData->recorder = mRecorder;
|
||||||
@@ -420,10 +414,7 @@ DrawTargetRecording::FillGlyphs(ScaledFont *aFont,
|
|||||||
&RecordingFontUserDataDestroyFunc);
|
&RecordingFontUserDataDestroyFunc);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO support font in b2g recordings
|
|
||||||
#ifndef MOZ_WIDGET_GONK
|
|
||||||
mRecorder->RecordEvent(RecordedFillGlyphs(this, aFont, aPattern, aOptions, aBuffer.mGlyphs, aBuffer.mNumGlyphs));
|
mRecorder->RecordEvent(RecordedFillGlyphs(this, aFont, aPattern, aOptions, aBuffer.mGlyphs, aBuffer.mNumGlyphs));
|
||||||
#endif
|
|
||||||
mFinalDT->FillGlyphs(aFont, aBuffer, aPattern, aOptions, aRenderingOptions);
|
mFinalDT->FillGlyphs(aFont, aBuffer, aPattern, aOptions, aRenderingOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
#endif
|
#endif
|
||||||
#include "mozilla/Tuple.h"
|
#include "mozilla/Tuple.h"
|
||||||
|
|
||||||
#if defined(MOZ_WIDGET_GONK) || defined(MOZ_WIDGET_ANDROID)
|
#if defined(MOZ_WIDGET_ANDROID)
|
||||||
#include "nsDebug.h"
|
#include "nsDebug.h"
|
||||||
#endif
|
#endif
|
||||||
#include "Point.h"
|
#include "Point.h"
|
||||||
@@ -140,7 +140,7 @@ struct BasicLogger
|
|||||||
// in the appropriate places in that method.
|
// in the appropriate places in that method.
|
||||||
static bool ShouldOutputMessage(int aLevel) {
|
static bool ShouldOutputMessage(int aLevel) {
|
||||||
if (LoggingPrefs::sGfxLogLevel >= aLevel) {
|
if (LoggingPrefs::sGfxLogLevel >= aLevel) {
|
||||||
#if defined(MOZ_WIDGET_GONK) || defined(MOZ_WIDGET_ANDROID)
|
#if defined(MOZ_WIDGET_ANDROID)
|
||||||
return true;
|
return true;
|
||||||
#else
|
#else
|
||||||
#if defined(MOZ_LOGGING)
|
#if defined(MOZ_LOGGING)
|
||||||
@@ -173,7 +173,7 @@ struct BasicLogger
|
|||||||
// make the corresponding change in the ShouldOutputMessage method
|
// make the corresponding change in the ShouldOutputMessage method
|
||||||
// above.
|
// above.
|
||||||
if (LoggingPrefs::sGfxLogLevel >= aLevel) {
|
if (LoggingPrefs::sGfxLogLevel >= aLevel) {
|
||||||
#if defined(MOZ_WIDGET_GONK) || defined(MOZ_WIDGET_ANDROID)
|
#if defined(MOZ_WIDGET_ANDROID)
|
||||||
printf_stderr("%s%s", aString.c_str(), aNoNewline ? "" : "\n");
|
printf_stderr("%s%s", aString.c_str(), aNoNewline ? "" : "\n");
|
||||||
#else
|
#else
|
||||||
#if defined(MOZ_LOGGING)
|
#if defined(MOZ_LOGGING)
|
||||||
|
|||||||
@@ -207,12 +207,12 @@ FINAL_LIBRARY = 'xul'
|
|||||||
for var in ('USE_CAIRO', 'MOZ2D_HAS_MOZ_CAIRO'):
|
for var in ('USE_CAIRO', 'MOZ2D_HAS_MOZ_CAIRO'):
|
||||||
DEFINES[var] = True
|
DEFINES[var] = True
|
||||||
|
|
||||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('android', 'gtk2', 'gtk3', 'gonk'):
|
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('android', 'gtk2', 'gtk3'):
|
||||||
DEFINES['MOZ_ENABLE_FREETYPE'] = True
|
DEFINES['MOZ_ENABLE_FREETYPE'] = True
|
||||||
|
|
||||||
CXXFLAGS += CONFIG['MOZ_CAIRO_CFLAGS']
|
CXXFLAGS += CONFIG['MOZ_CAIRO_CFLAGS']
|
||||||
|
|
||||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('android', 'gtk2', 'gtk3', 'gonk'):
|
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('android', 'gtk2', 'gtk3'):
|
||||||
CXXFLAGS += CONFIG['CAIRO_FT_CFLAGS']
|
CXXFLAGS += CONFIG['CAIRO_FT_CFLAGS']
|
||||||
|
|
||||||
LOCAL_INCLUDES += CONFIG['SKIA_INCLUDES']
|
LOCAL_INCLUDES += CONFIG['SKIA_INCLUDES']
|
||||||
|
|||||||
@@ -15,11 +15,6 @@
|
|||||||
#include "mozilla/gfx/Matrix.h"
|
#include "mozilla/gfx/Matrix.h"
|
||||||
#include "mozilla/UniquePtr.h"
|
#include "mozilla/UniquePtr.h"
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#include "GrallocImages.h"
|
|
||||||
#include "GLLibraryEGL.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
#ifdef MOZ_WIDGET_ANDROID
|
||||||
#include "AndroidSurfaceTexture.h"
|
#include "AndroidSurfaceTexture.h"
|
||||||
#include "GLImages.h"
|
#include "GLImages.h"
|
||||||
@@ -152,7 +147,7 @@ GLBlitHelper::InitTexQuadProgram(BlitType target)
|
|||||||
vTexCoord * uTexCoordMult); \n\
|
vTexCoord * uTexCoordMult); \n\
|
||||||
} \n\
|
} \n\
|
||||||
";
|
";
|
||||||
#ifdef ANDROID /* MOZ_WIDGET_ANDROID || MOZ_WIDGET_GONK */
|
#ifdef ANDROID /* MOZ_WIDGET_ANDROID */
|
||||||
const char kTexExternalBlit_FragShaderSource[] = "\
|
const char kTexExternalBlit_FragShaderSource[] = "\
|
||||||
#version 100 \n\
|
#version 100 \n\
|
||||||
#extension GL_OES_EGL_image_external : require \n\
|
#extension GL_OES_EGL_image_external : require \n\
|
||||||
@@ -684,38 +679,6 @@ GLBlitHelper::BindAndUploadEGLImage(EGLImage image, GLuint target)
|
|||||||
mGL->fEGLImageTargetTexture2D(target, image);
|
mGL->fEGLImageTargetTexture2D(target, image);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
|
|
||||||
bool
|
|
||||||
GLBlitHelper::BlitGrallocImage(layers::GrallocImage* grallocImage)
|
|
||||||
{
|
|
||||||
ScopedBindTextureUnit boundTU(mGL, LOCAL_GL_TEXTURE0);
|
|
||||||
mGL->fClear(LOCAL_GL_COLOR_BUFFER_BIT);
|
|
||||||
|
|
||||||
EGLint attrs[] = {
|
|
||||||
LOCAL_EGL_IMAGE_PRESERVED, LOCAL_EGL_TRUE,
|
|
||||||
LOCAL_EGL_NONE, LOCAL_EGL_NONE
|
|
||||||
};
|
|
||||||
EGLImage image = sEGLLibrary.fCreateImage(sEGLLibrary.Display(),
|
|
||||||
EGL_NO_CONTEXT,
|
|
||||||
LOCAL_EGL_NATIVE_BUFFER_ANDROID,
|
|
||||||
grallocImage->GetNativeBuffer(), attrs);
|
|
||||||
if (image == EGL_NO_IMAGE)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
int oldBinding = 0;
|
|
||||||
mGL->fGetIntegerv(LOCAL_GL_TEXTURE_BINDING_EXTERNAL_OES, &oldBinding);
|
|
||||||
|
|
||||||
BindAndUploadEGLImage(image, LOCAL_GL_TEXTURE_EXTERNAL_OES);
|
|
||||||
|
|
||||||
mGL->fDrawArrays(LOCAL_GL_TRIANGLE_STRIP, 0, 4);
|
|
||||||
|
|
||||||
sEGLLibrary.fDestroyImage(sEGLLibrary.Display(), image);
|
|
||||||
mGL->fBindTexture(LOCAL_GL_TEXTURE_EXTERNAL_OES, oldBinding);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
#ifdef MOZ_WIDGET_ANDROID
|
||||||
|
|
||||||
#define ATTACH_WAIT_MS 50
|
#define ATTACH_WAIT_MS 50
|
||||||
@@ -873,13 +836,6 @@ GLBlitHelper::BlitImageToFramebuffer(layers::Image* srcImage,
|
|||||||
srcOrigin = OriginPos::TopLeft;
|
srcOrigin = OriginPos::TopLeft;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
case ImageFormat::GRALLOC_PLANAR_YCBCR:
|
|
||||||
type = ConvertGralloc;
|
|
||||||
srcOrigin = OriginPos::TopLeft;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
#ifdef MOZ_WIDGET_ANDROID
|
||||||
case ImageFormat::SURFACE_TEXTURE:
|
case ImageFormat::SURFACE_TEXTURE:
|
||||||
type = ConvertSurfaceTexture;
|
type = ConvertSurfaceTexture;
|
||||||
@@ -915,11 +871,6 @@ GLBlitHelper::BlitImageToFramebuffer(layers::Image* srcImage,
|
|||||||
mGL->fViewport(0, 0, destSize.width, destSize.height);
|
mGL->fViewport(0, 0, destSize.width, destSize.height);
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
case ConvertGralloc:
|
|
||||||
return BlitGrallocImage(static_cast<layers::GrallocImage*>(srcImage));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
case ConvertPlanarYCbCr: {
|
case ConvertPlanarYCbCr: {
|
||||||
const auto saved = mGL->GetIntAs<GLint>(LOCAL_GL_UNPACK_ALIGNMENT);
|
const auto saved = mGL->GetIntAs<GLint>(LOCAL_GL_UNPACK_ALIGNMENT);
|
||||||
mGL->fPixelStorei(LOCAL_GL_UNPACK_ALIGNMENT, 1);
|
mGL->fPixelStorei(LOCAL_GL_UNPACK_ALIGNMENT, 1);
|
||||||
|
|||||||
@@ -107,9 +107,6 @@ class GLBlitHelper final
|
|||||||
void BindAndUploadYUVTexture(Channel which, uint32_t width, uint32_t height, void* data, bool allocation);
|
void BindAndUploadYUVTexture(Channel which, uint32_t width, uint32_t height, void* data, bool allocation);
|
||||||
void BindAndUploadEGLImage(EGLImage image, GLuint target);
|
void BindAndUploadEGLImage(EGLImage image, GLuint target);
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
bool BlitGrallocImage(layers::GrallocImage* grallocImage);
|
|
||||||
#endif
|
|
||||||
bool BlitPlanarYCbCrImage(layers::PlanarYCbCrImage* yuvImage);
|
bool BlitPlanarYCbCrImage(layers::PlanarYCbCrImage* yuvImage);
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
#ifdef MOZ_WIDGET_ANDROID
|
||||||
// Blit onto the current FB.
|
// Blit onto the current FB.
|
||||||
|
|||||||
@@ -16,12 +16,6 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(XP_UNIX)
|
#if defined(XP_UNIX)
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#include "libdisplay/GonkDisplay.h"
|
|
||||||
#include "nsWindow.h"
|
|
||||||
#include "nsScreenManagerGonk.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_ANDROID
|
#ifdef MOZ_WIDGET_ANDROID
|
||||||
#include <android/native_window.h>
|
#include <android/native_window.h>
|
||||||
#include <android/native_window_jni.h>
|
#include <android/native_window_jni.h>
|
||||||
@@ -30,13 +24,6 @@
|
|||||||
#ifdef ANDROID
|
#ifdef ANDROID
|
||||||
#include <android/log.h>
|
#include <android/log.h>
|
||||||
#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "Gonk" , ## args)
|
#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "Gonk" , ## args)
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#include "cutils/properties.h"
|
|
||||||
#include <ui/GraphicBuffer.h>
|
|
||||||
|
|
||||||
using namespace android;
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define GLES2_LIB "libGLESv2.so"
|
#define GLES2_LIB "libGLESv2.so"
|
||||||
@@ -237,17 +224,6 @@ GLContextEGL::~GLContextEGL()
|
|||||||
sEGLLibrary.fDestroyContext(EGL_DISPLAY(), mContext);
|
sEGLLibrary.fDestroyContext(EGL_DISPLAY(), mContext);
|
||||||
sEGLLibrary.UnsetCachedCurrentContext();
|
sEGLLibrary.UnsetCachedCurrentContext();
|
||||||
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION < 17
|
|
||||||
if (!mIsOffscreen) {
|
|
||||||
// In ICS, SurfaceFlinger's DisplayHardware::fini() does not destroy the EGLSurface associated with the
|
|
||||||
// native framebuffer. Destroying it causes crashes in the ICS emulator
|
|
||||||
// EGL implementation, specifically because the egl_window_surface_t dtor
|
|
||||||
// calls nativeWindow->cancelBuffer and FramebufferNativeWindow does not initialize
|
|
||||||
// the cancelBuffer function pointer, see bug 986836
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
mozilla::gl::DestroySurface(mSurface);
|
mozilla::gl::DestroySurface(mSurface);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -437,12 +413,6 @@ GLContextEGL::SwapBuffers()
|
|||||||
? mSurfaceOverride
|
? mSurfaceOverride
|
||||||
: mSurface;
|
: mSurface;
|
||||||
if (surface) {
|
if (surface) {
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION < 17
|
|
||||||
if (!mIsOffscreen) {
|
|
||||||
// eglSwapBuffers() is called by hwcomposer.
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return sEGLLibrary.fSwapBuffers(EGL_DISPLAY(), surface);
|
return sEGLLibrary.fSwapBuffers(EGL_DISPLAY(), surface);
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
@@ -633,9 +603,6 @@ static const EGLint kEGLConfigAttribsRGBA32[] = {
|
|||||||
LOCAL_EGL_GREEN_SIZE, 8,
|
LOCAL_EGL_GREEN_SIZE, 8,
|
||||||
LOCAL_EGL_BLUE_SIZE, 8,
|
LOCAL_EGL_BLUE_SIZE, 8,
|
||||||
LOCAL_EGL_ALPHA_SIZE, 8,
|
LOCAL_EGL_ALPHA_SIZE, 8,
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
|
|
||||||
LOCAL_EGL_FRAMEBUFFER_TARGET_ANDROID, LOCAL_EGL_TRUE,
|
|
||||||
#endif
|
|
||||||
EGL_ATTRIBS_LIST_SAFE_TERMINATION_WORKING_AROUND_BUGS
|
EGL_ATTRIBS_LIST_SAFE_TERMINATION_WORKING_AROUND_BUGS
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -667,29 +634,6 @@ CreateConfig(EGLConfig* aConfig, int32_t depth, nsIWidget* aWidget)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
// On gonk, it's important to select a configuration with the
|
|
||||||
// the correct order as well as bits per channel.
|
|
||||||
// EGL_NATIVE_VISUAL_ID gives us the Android pixel format which
|
|
||||||
// is an enum that tells us both order and bits per channel.
|
|
||||||
// For example -
|
|
||||||
// HAL_PIXEL_FORMAT_RGBX_8888
|
|
||||||
// HAL_PIXEL_FORMAT_BGRA_8888
|
|
||||||
// HAL_PIXEL_FORMAT_RGB_565
|
|
||||||
nsWindow* window = static_cast<nsWindow*>(aWidget);
|
|
||||||
for (int j = 0; j < ncfg; ++j) {
|
|
||||||
EGLConfig config = configs[j];
|
|
||||||
EGLint format;
|
|
||||||
if (sEGLLibrary.fGetConfigAttrib(EGL_DISPLAY(), config,
|
|
||||||
LOCAL_EGL_NATIVE_VISUAL_ID, &format) &&
|
|
||||||
format == window->GetScreen()->GetSurfaceFormat())
|
|
||||||
{
|
|
||||||
*aConfig = config;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (int j = 0; j < ncfg; ++j) {
|
for (int j = 0; j < ncfg; ++j) {
|
||||||
EGLConfig config = configs[j];
|
EGLConfig config = configs[j];
|
||||||
EGLint r, g, b, a;
|
EGLint r, g, b, a;
|
||||||
|
|||||||
@@ -431,11 +431,6 @@ GLLibraryEGL::EnsureInitialized(bool forceAccel, nsACString* const out_failureId
|
|||||||
Unused << GLLibraryLoader::LoadSymbols(mEGLLibrary, &optionalSymbols[0],
|
Unused << GLLibraryLoader::LoadSymbols(mEGLLibrary, &optionalSymbols[0],
|
||||||
nullptr, nullptr, false);
|
nullptr, nullptr, false);
|
||||||
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 18
|
|
||||||
MOZ_RELEASE_ASSERT(mSymbols.fQueryStringImplementationANDROID,
|
|
||||||
"GFX: Couldn't find eglQueryStringImplementationANDROID");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
InitClientExtensions();
|
InitClientExtensions();
|
||||||
|
|
||||||
const auto lookupFunction =
|
const auto lookupFunction =
|
||||||
|
|||||||
@@ -24,11 +24,6 @@
|
|||||||
#include "mozilla/gfx/DeviceManagerDx.h"
|
#include "mozilla/gfx/DeviceManagerDx.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#include "SharedSurfaceGralloc.h"
|
|
||||||
#include "nsXULAppAPI.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef XP_MACOSX
|
#ifdef XP_MACOSX
|
||||||
#include "SharedSurfaceIO.h"
|
#include "SharedSurfaceIO.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -89,8 +84,6 @@ GLScreenBuffer::CreateFactory(GLContext* gl,
|
|||||||
case mozilla::layers::LayersBackend::LAYERS_OPENGL: {
|
case mozilla::layers::LayersBackend::LAYERS_OPENGL: {
|
||||||
#if defined(XP_MACOSX)
|
#if defined(XP_MACOSX)
|
||||||
factory = SurfaceFactory_IOSurface::Create(gl, caps, ipcChannel, flags);
|
factory = SurfaceFactory_IOSurface::Create(gl, caps, ipcChannel, flags);
|
||||||
#elif defined(MOZ_WIDGET_GONK)
|
|
||||||
factory = MakeUnique<SurfaceFactory_Gralloc>(gl, caps, ipcChannel, flags);
|
|
||||||
#elif defined(GL_PROVIDER_GLX)
|
#elif defined(GL_PROVIDER_GLX)
|
||||||
if (sGLXLibrary.UseTextureFromPixmap())
|
if (sGLXLibrary.UseTextureFromPixmap())
|
||||||
factory = SurfaceFactory_GLXDrawable::Create(gl, caps, ipcChannel, flags);
|
factory = SurfaceFactory_GLXDrawable::Create(gl, caps, ipcChannel, flags);
|
||||||
|
|||||||
@@ -1,294 +0,0 @@
|
|||||||
/* -*- Mode: c++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40; -*- */
|
|
||||||
/* 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/. */
|
|
||||||
|
|
||||||
#include "mozilla/Preferences.h"
|
|
||||||
#include "mozilla/UniquePtr.h"
|
|
||||||
|
|
||||||
#include "SharedSurfaceGralloc.h"
|
|
||||||
|
|
||||||
#include "GLContext.h"
|
|
||||||
#include "SharedSurface.h"
|
|
||||||
#include "GLLibraryEGL.h"
|
|
||||||
#include "mozilla/layers/GrallocTextureClient.h"
|
|
||||||
#include "mozilla/layers/ShadowLayers.h"
|
|
||||||
|
|
||||||
#include "ui/GraphicBuffer.h"
|
|
||||||
#include "../layers/ipc/ShadowLayers.h"
|
|
||||||
#include "ScopedGLHelpers.h"
|
|
||||||
|
|
||||||
#include "gfxPlatform.h"
|
|
||||||
#include "gfxPrefs.h"
|
|
||||||
|
|
||||||
#define DEBUG_GRALLOC
|
|
||||||
#ifdef DEBUG_GRALLOC
|
|
||||||
#define DEBUG_PRINT(...) do { printf_stderr(__VA_ARGS__); } while (0)
|
|
||||||
#else
|
|
||||||
#define DEBUG_PRINT(...) do { } while (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace mozilla {
|
|
||||||
namespace gl {
|
|
||||||
|
|
||||||
using namespace mozilla::layers;
|
|
||||||
using namespace android;
|
|
||||||
|
|
||||||
SurfaceFactory_Gralloc::SurfaceFactory_Gralloc(GLContext* prodGL, const SurfaceCaps& caps,
|
|
||||||
const RefPtr<layers::LayersIPCChannel>& allocator,
|
|
||||||
const layers::TextureFlags& flags)
|
|
||||||
: SurfaceFactory(SharedSurfaceType::Gralloc, prodGL, caps, allocator, flags)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(mAllocator);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*static*/ UniquePtr<SharedSurface_Gralloc>
|
|
||||||
SharedSurface_Gralloc::Create(GLContext* prodGL,
|
|
||||||
const GLFormats& formats,
|
|
||||||
const gfx::IntSize& size,
|
|
||||||
bool hasAlpha,
|
|
||||||
layers::TextureFlags flags,
|
|
||||||
LayersIPCChannel* allocator)
|
|
||||||
{
|
|
||||||
GLLibraryEGL* egl = &sEGLLibrary;
|
|
||||||
MOZ_ASSERT(egl);
|
|
||||||
|
|
||||||
UniquePtr<SharedSurface_Gralloc> ret;
|
|
||||||
|
|
||||||
DEBUG_PRINT("SharedSurface_Gralloc::Create -------\n");
|
|
||||||
|
|
||||||
if (!HasExtensions(egl, prodGL))
|
|
||||||
return Move(ret);
|
|
||||||
|
|
||||||
gfxContentType type = hasAlpha ? gfxContentType::COLOR_ALPHA
|
|
||||||
: gfxContentType::COLOR;
|
|
||||||
|
|
||||||
GrallocTextureData* texData = GrallocTextureData::CreateForGLRendering(
|
|
||||||
size, gfxPlatform::GetPlatform()->Optimal2DFormatForContent(type), allocator
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!texData) {
|
|
||||||
return Move(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
RefPtr<TextureClient> grallocTC = new TextureClient(texData, flags, allocator);
|
|
||||||
|
|
||||||
sp<GraphicBuffer> buffer = texData->GetGraphicBuffer();
|
|
||||||
|
|
||||||
EGLDisplay display = egl->Display();
|
|
||||||
EGLClientBuffer clientBuffer = buffer->getNativeBuffer();
|
|
||||||
EGLint attrs[] = {
|
|
||||||
LOCAL_EGL_NONE, LOCAL_EGL_NONE
|
|
||||||
};
|
|
||||||
EGLImage image = egl->fCreateImage(display,
|
|
||||||
EGL_NO_CONTEXT,
|
|
||||||
LOCAL_EGL_NATIVE_BUFFER_ANDROID,
|
|
||||||
clientBuffer, attrs);
|
|
||||||
if (!image) {
|
|
||||||
return Move(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
prodGL->MakeCurrent();
|
|
||||||
GLuint prodTex = 0;
|
|
||||||
prodGL->fGenTextures(1, &prodTex);
|
|
||||||
ScopedBindTexture autoTex(prodGL, prodTex);
|
|
||||||
|
|
||||||
prodGL->fTexParameteri(LOCAL_GL_TEXTURE_2D, LOCAL_GL_TEXTURE_MIN_FILTER, LOCAL_GL_LINEAR);
|
|
||||||
prodGL->fTexParameteri(LOCAL_GL_TEXTURE_2D, LOCAL_GL_TEXTURE_MAG_FILTER, LOCAL_GL_LINEAR);
|
|
||||||
prodGL->fTexParameteri(LOCAL_GL_TEXTURE_2D, LOCAL_GL_TEXTURE_WRAP_S, LOCAL_GL_CLAMP_TO_EDGE);
|
|
||||||
prodGL->fTexParameteri(LOCAL_GL_TEXTURE_2D, LOCAL_GL_TEXTURE_WRAP_T, LOCAL_GL_CLAMP_TO_EDGE);
|
|
||||||
|
|
||||||
prodGL->fEGLImageTargetTexture2D(LOCAL_GL_TEXTURE_2D, image);
|
|
||||||
|
|
||||||
egl->fDestroyImage(display, image);
|
|
||||||
|
|
||||||
ret.reset( new SharedSurface_Gralloc(prodGL, size, hasAlpha, egl,
|
|
||||||
allocator, grallocTC,
|
|
||||||
prodTex) );
|
|
||||||
|
|
||||||
DEBUG_PRINT("SharedSurface_Gralloc::Create: success -- surface %p,"
|
|
||||||
" GraphicBuffer %p.\n",
|
|
||||||
ret.get(), buffer.get());
|
|
||||||
|
|
||||||
return Move(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
SharedSurface_Gralloc::SharedSurface_Gralloc(GLContext* prodGL,
|
|
||||||
const gfx::IntSize& size,
|
|
||||||
bool hasAlpha,
|
|
||||||
GLLibraryEGL* egl,
|
|
||||||
layers::LayersIPCChannel* allocator,
|
|
||||||
layers::TextureClient* textureClient,
|
|
||||||
GLuint prodTex)
|
|
||||||
: SharedSurface(SharedSurfaceType::Gralloc,
|
|
||||||
AttachmentType::GLTexture,
|
|
||||||
prodGL,
|
|
||||||
size,
|
|
||||||
hasAlpha,
|
|
||||||
true)
|
|
||||||
, mEGL(egl)
|
|
||||||
, mSync(0)
|
|
||||||
, mAllocator(allocator)
|
|
||||||
, mTextureClient(textureClient)
|
|
||||||
, mProdTex(prodTex)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
SharedSurface_Gralloc::HasExtensions(GLLibraryEGL* egl, GLContext* gl)
|
|
||||||
{
|
|
||||||
return egl->HasKHRImageBase() &&
|
|
||||||
gl->IsExtensionSupported(GLContext::OES_EGL_image);
|
|
||||||
}
|
|
||||||
|
|
||||||
SharedSurface_Gralloc::~SharedSurface_Gralloc()
|
|
||||||
{
|
|
||||||
DEBUG_PRINT("[SharedSurface_Gralloc %p] destroyed\n", this);
|
|
||||||
|
|
||||||
if (!mGL || !mGL->MakeCurrent())
|
|
||||||
return;
|
|
||||||
|
|
||||||
mGL->fDeleteTextures(1, &mProdTex);
|
|
||||||
|
|
||||||
if (mSync) {
|
|
||||||
MOZ_ALWAYS_TRUE( mEGL->fDestroySync(mEGL->Display(), mSync) );
|
|
||||||
mSync = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SharedSurface_Gralloc::ProducerReleaseImpl()
|
|
||||||
{
|
|
||||||
if (mSync) {
|
|
||||||
MOZ_ALWAYS_TRUE( mEGL->fDestroySync(mEGL->Display(), mSync) );
|
|
||||||
mSync = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool disableSyncFence = false;
|
|
||||||
// Disable sync fence on AdrenoTM200.
|
|
||||||
// AdrenoTM200's sync fence does not work correctly. See Bug 1022205.
|
|
||||||
if (mGL->Renderer() == GLRenderer::AdrenoTM200) {
|
|
||||||
disableSyncFence = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// When Android native fences are available, try
|
|
||||||
// them first since they're more likely to work.
|
|
||||||
// Android native fences are also likely to perform better.
|
|
||||||
if (!disableSyncFence &&
|
|
||||||
mEGL->IsExtensionSupported(GLLibraryEGL::ANDROID_native_fence_sync))
|
|
||||||
{
|
|
||||||
mGL->MakeCurrent();
|
|
||||||
EGLSync sync = mEGL->fCreateSync(mEGL->Display(),
|
|
||||||
LOCAL_EGL_SYNC_NATIVE_FENCE_ANDROID,
|
|
||||||
nullptr);
|
|
||||||
if (sync) {
|
|
||||||
mGL->fFlush();
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
|
|
||||||
int fenceFd = mEGL->fDupNativeFenceFDANDROID(mEGL->Display(), sync);
|
|
||||||
if (fenceFd != -1) {
|
|
||||||
mEGL->fDestroySync(mEGL->Display(), sync);
|
|
||||||
mTextureClient->SetAcquireFenceHandle(FenceHandle(new FenceHandle::FdObj(fenceFd)));
|
|
||||||
} else {
|
|
||||||
mSync = sync;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
mSync = sync;
|
|
||||||
#endif
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!disableSyncFence &&
|
|
||||||
mEGL->IsExtensionSupported(GLLibraryEGL::KHR_fence_sync))
|
|
||||||
{
|
|
||||||
mGL->MakeCurrent();
|
|
||||||
mSync = mEGL->fCreateSync(mEGL->Display(),
|
|
||||||
LOCAL_EGL_SYNC_FENCE,
|
|
||||||
nullptr);
|
|
||||||
if (mSync) {
|
|
||||||
mGL->fFlush();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// We should be able to rely on genlock write locks/read locks.
|
|
||||||
// But they're broken on some configs, and even a glFinish doesn't
|
|
||||||
// work. glReadPixels seems to, though.
|
|
||||||
if (gfxPrefs::GrallocFenceWithReadPixels()) {
|
|
||||||
mGL->MakeCurrent();
|
|
||||||
UniquePtr<char[]> buf = MakeUnique<char[]>(4);
|
|
||||||
mGL->fReadPixels(0, 0, 1, 1, LOCAL_GL_RGBA, LOCAL_GL_UNSIGNED_BYTE, buf.get());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SharedSurface_Gralloc::WaitForBufferOwnership()
|
|
||||||
{
|
|
||||||
mTextureClient->WaitForBufferOwnership();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
SharedSurface_Gralloc::ToSurfaceDescriptor(layers::SurfaceDescriptor* const out_descriptor)
|
|
||||||
{
|
|
||||||
mTextureClient->mWorkaroundAnnoyingSharedSurfaceOwnershipIssues = true;
|
|
||||||
return mTextureClient->ToSurfaceDescriptor(*out_descriptor);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
SharedSurface_Gralloc::ReadbackBySharedHandle(gfx::DataSourceSurface* out_surface)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(out_surface);
|
|
||||||
sp<GraphicBuffer> buffer = static_cast<GrallocTextureData*>(
|
|
||||||
mTextureClient->GetInternalData()
|
|
||||||
)->GetGraphicBuffer();
|
|
||||||
|
|
||||||
const uint8_t* grallocData = nullptr;
|
|
||||||
auto result = buffer->lock(
|
|
||||||
GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_NEVER,
|
|
||||||
const_cast<void**>(reinterpret_cast<const void**>(&grallocData))
|
|
||||||
);
|
|
||||||
|
|
||||||
if (result == BAD_VALUE) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
gfx::DataSourceSurface::ScopedMap map(out_surface, gfx::DataSourceSurface::WRITE);
|
|
||||||
if (!map.IsMapped()) {
|
|
||||||
buffer->unlock();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t stride = buffer->getStride() * android::bytesPerPixel(buffer->getPixelFormat());
|
|
||||||
uint32_t height = buffer->getHeight();
|
|
||||||
uint32_t width = buffer->getWidth();
|
|
||||||
for (uint32_t i = 0; i < height; i++) {
|
|
||||||
memcpy(map.GetData() + i * map.GetStride(),
|
|
||||||
grallocData + i * stride, width * 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer->unlock();
|
|
||||||
|
|
||||||
android::PixelFormat srcFormat = buffer->getPixelFormat();
|
|
||||||
MOZ_ASSERT(srcFormat == PIXEL_FORMAT_RGBA_8888 ||
|
|
||||||
srcFormat == PIXEL_FORMAT_BGRA_8888 ||
|
|
||||||
srcFormat == PIXEL_FORMAT_RGBX_8888);
|
|
||||||
bool isSrcRGB = srcFormat == PIXEL_FORMAT_RGBA_8888 ||
|
|
||||||
srcFormat == PIXEL_FORMAT_RGBX_8888;
|
|
||||||
|
|
||||||
gfx::SurfaceFormat destFormat = out_surface->GetFormat();
|
|
||||||
MOZ_ASSERT(destFormat == gfx::SurfaceFormat::R8G8B8X8 ||
|
|
||||||
destFormat == gfx::SurfaceFormat::R8G8B8A8 ||
|
|
||||||
destFormat == gfx::SurfaceFormat::B8G8R8X8 ||
|
|
||||||
destFormat == gfx::SurfaceFormat::B8G8R8A8);
|
|
||||||
bool isDestRGB = destFormat == gfx::SurfaceFormat::R8G8B8X8 ||
|
|
||||||
destFormat == gfx::SurfaceFormat::R8G8B8A8;
|
|
||||||
|
|
||||||
if (isSrcRGB != isDestRGB) {
|
|
||||||
SwapRAndBComponents(out_surface);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace gl
|
|
||||||
} // namespace mozilla
|
|
||||||
@@ -1,104 +0,0 @@
|
|||||||
/* -*- Mode: c++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40; -*- */
|
|
||||||
/* 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 SHARED_SURFACE_GRALLOC_H_
|
|
||||||
#define SHARED_SURFACE_GRALLOC_H_
|
|
||||||
|
|
||||||
#include "mozilla/layers/CompositorTypes.h"
|
|
||||||
#include "mozilla/layers/LayersSurfaces.h"
|
|
||||||
#include "SharedSurface.h"
|
|
||||||
|
|
||||||
namespace mozilla {
|
|
||||||
namespace layers {
|
|
||||||
class LayersIPCChannel;
|
|
||||||
class TextureClient;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace gl {
|
|
||||||
class GLContext;
|
|
||||||
class GLLibraryEGL;
|
|
||||||
|
|
||||||
class SharedSurface_Gralloc
|
|
||||||
: public SharedSurface
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static UniquePtr<SharedSurface_Gralloc> Create(GLContext* prodGL,
|
|
||||||
const GLFormats& formats,
|
|
||||||
const gfx::IntSize& size,
|
|
||||||
bool hasAlpha,
|
|
||||||
layers::TextureFlags flags,
|
|
||||||
layers::LayersIPCChannel* allocator);
|
|
||||||
|
|
||||||
static SharedSurface_Gralloc* Cast(SharedSurface* surf) {
|
|
||||||
MOZ_ASSERT(surf->mType == SharedSurfaceType::Gralloc);
|
|
||||||
|
|
||||||
return (SharedSurface_Gralloc*)surf;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
GLLibraryEGL* const mEGL;
|
|
||||||
EGLSync mSync;
|
|
||||||
RefPtr<layers::LayersIPCChannel> mAllocator;
|
|
||||||
RefPtr<layers::TextureClient> mTextureClient;
|
|
||||||
const GLuint mProdTex;
|
|
||||||
|
|
||||||
SharedSurface_Gralloc(GLContext* prodGL,
|
|
||||||
const gfx::IntSize& size,
|
|
||||||
bool hasAlpha,
|
|
||||||
GLLibraryEGL* egl,
|
|
||||||
layers::LayersIPCChannel* allocator,
|
|
||||||
layers::TextureClient* textureClient,
|
|
||||||
GLuint prodTex);
|
|
||||||
|
|
||||||
static bool HasExtensions(GLLibraryEGL* egl, GLContext* gl);
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual ~SharedSurface_Gralloc();
|
|
||||||
|
|
||||||
virtual void ProducerAcquireImpl() override {}
|
|
||||||
virtual void ProducerReleaseImpl() override;
|
|
||||||
|
|
||||||
virtual void WaitForBufferOwnership() override;
|
|
||||||
|
|
||||||
virtual void LockProdImpl() override {}
|
|
||||||
virtual void UnlockProdImpl() override {}
|
|
||||||
|
|
||||||
virtual GLuint ProdTexture() override {
|
|
||||||
return mProdTex;
|
|
||||||
}
|
|
||||||
|
|
||||||
layers::TextureClient* GetTextureClient() {
|
|
||||||
return mTextureClient;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual bool ToSurfaceDescriptor(layers::SurfaceDescriptor* const out_descriptor) override;
|
|
||||||
|
|
||||||
virtual bool ReadbackBySharedHandle(gfx::DataSourceSurface* out_surface) override;
|
|
||||||
};
|
|
||||||
|
|
||||||
class SurfaceFactory_Gralloc
|
|
||||||
: public SurfaceFactory
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
SurfaceFactory_Gralloc(GLContext* prodGL, const SurfaceCaps& caps,
|
|
||||||
const RefPtr<layers::LayersIPCChannel>& allocator,
|
|
||||||
const layers::TextureFlags& flags);
|
|
||||||
|
|
||||||
virtual UniquePtr<SharedSurface> CreateShared(const gfx::IntSize& size) override {
|
|
||||||
bool hasAlpha = mReadCaps.alpha;
|
|
||||||
|
|
||||||
UniquePtr<SharedSurface> ret;
|
|
||||||
if (mAllocator) {
|
|
||||||
ret = SharedSurface_Gralloc::Create(mGL, mFormats, size, hasAlpha,
|
|
||||||
mFlags, mAllocator);
|
|
||||||
}
|
|
||||||
return Move(ret);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} /* namespace gl */
|
|
||||||
} /* namespace mozilla */
|
|
||||||
|
|
||||||
#endif /* SHARED_SURFACE_GRALLOC_H_ */
|
|
||||||
@@ -19,8 +19,6 @@ elif 'gtk' in CONFIG['MOZ_WIDGET_TOOLKIT']:
|
|||||||
gl_provider = 'GLX'
|
gl_provider = 'GLX'
|
||||||
elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':
|
elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':
|
||||||
gl_provider = 'EGL'
|
gl_provider = 'EGL'
|
||||||
elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk':
|
|
||||||
gl_provider = 'EGL'
|
|
||||||
|
|
||||||
if CONFIG['MOZ_GL_PROVIDER']:
|
if CONFIG['MOZ_GL_PROVIDER']:
|
||||||
gl_provider = CONFIG['MOZ_GL_PROVIDER']
|
gl_provider = CONFIG['MOZ_GL_PROVIDER']
|
||||||
@@ -84,12 +82,6 @@ if CONFIG['MOZ_ENABLE_SKIA_GPU']:
|
|||||||
# Suppress warnings from Skia header files.
|
# Suppress warnings from Skia header files.
|
||||||
SOURCES['SkiaGLGlue.cpp'].flags += ['-Wno-implicit-fallthrough']
|
SOURCES['SkiaGLGlue.cpp'].flags += ['-Wno-implicit-fallthrough']
|
||||||
|
|
||||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk':
|
|
||||||
UNIFIED_SOURCES += ['SharedSurfaceGralloc.cpp']
|
|
||||||
EXPORTS += ['SharedSurfaceGralloc.h']
|
|
||||||
LOCAL_INCLUDES += ['/widget/gonk']
|
|
||||||
LOCAL_INCLUDES += ['%' + '%s/%s' % (CONFIG['ANDROID_SOURCE'], 'hardware/libhardware/include')]
|
|
||||||
|
|
||||||
if gl_provider == 'CGL':
|
if gl_provider == 'CGL':
|
||||||
# These files include Mac headers that are unfriendly to unified builds
|
# These files include Mac headers that are unfriendly to unified builds
|
||||||
SOURCES += [
|
SOURCES += [
|
||||||
|
|||||||
@@ -14,13 +14,6 @@
|
|||||||
#include "gfx2DGlue.h"
|
#include "gfx2DGlue.h"
|
||||||
#include "nsAppRunner.h"
|
#include "nsAppRunner.h"
|
||||||
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
|
|
||||||
#include "libdisplay/GonkDisplay.h" // for GonkDisplay
|
|
||||||
#include <ui/Fence.h>
|
|
||||||
#include "nsWindow.h"
|
|
||||||
#include "nsScreenManagerGonk.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
|
|
||||||
namespace layers {
|
namespace layers {
|
||||||
@@ -607,37 +600,6 @@ Compositor::IsValid() const
|
|||||||
return !!mParent;
|
return !!mParent;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
|
|
||||||
void
|
|
||||||
Compositor::SetDispAcquireFence(Layer* aLayer)
|
|
||||||
{
|
|
||||||
// OpenGL does not provide ReleaseFence for rendering.
|
|
||||||
// Instead use DispAcquireFence as layer buffer's ReleaseFence
|
|
||||||
// to prevent flickering and tearing.
|
|
||||||
// DispAcquireFence is DisplaySurface's AcquireFence.
|
|
||||||
// AcquireFence will be signaled when a buffer's content is available.
|
|
||||||
// See Bug 974152.
|
|
||||||
if (!aLayer || !mWidget) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
nsWindow* window = static_cast<nsWindow*>(mWidget->RealWidget());
|
|
||||||
RefPtr<FenceHandle::FdObj> fence = new FenceHandle::FdObj(
|
|
||||||
window->GetScreen()->GetPrevDispAcquireFd());
|
|
||||||
mReleaseFenceHandle.Merge(FenceHandle(fence));
|
|
||||||
}
|
|
||||||
|
|
||||||
FenceHandle
|
|
||||||
Compositor::GetReleaseFence()
|
|
||||||
{
|
|
||||||
if (!mReleaseFenceHandle.IsValid()) {
|
|
||||||
return FenceHandle();
|
|
||||||
}
|
|
||||||
|
|
||||||
RefPtr<FenceHandle::FdObj> fdObj = mReleaseFenceHandle.GetDupFdObj();
|
|
||||||
return FenceHandle(fdObj);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
void
|
void
|
||||||
Compositor::SetDispAcquireFence(Layer* aLayer)
|
Compositor::SetDispAcquireFence(Layer* aLayer)
|
||||||
{
|
{
|
||||||
@@ -648,7 +610,6 @@ Compositor::GetReleaseFence()
|
|||||||
{
|
{
|
||||||
return FenceHandle();
|
return FenceHandle();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
} // namespace layers
|
} // namespace layers
|
||||||
} // namespace mozilla
|
} // namespace mozilla
|
||||||
|
|||||||
@@ -683,10 +683,6 @@ protected:
|
|||||||
|
|
||||||
bool mIsDestroyed;
|
bool mIsDestroyed;
|
||||||
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
|
|
||||||
FenceHandle mReleaseFenceHandle;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
gfx::Color mClearColor;
|
gfx::Color mClearColor;
|
||||||
gfx::Color mDefaultClearColor;
|
gfx::Color mDefaultClearColor;
|
||||||
|
|
||||||
|
|||||||
@@ -1,478 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* vim: set ts=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/. */
|
|
||||||
|
|
||||||
#include "GrallocImages.h"
|
|
||||||
#include <stddef.h> // for size_t
|
|
||||||
#include <stdint.h> // for int8_t, uint8_t, uint32_t, etc
|
|
||||||
#include "nsDebug.h" // for NS_WARNING, NS_PRECONDITION
|
|
||||||
#include "mozilla/layers/ImageBridgeChild.h"
|
|
||||||
#include "mozilla/layers/GrallocTextureClient.h"
|
|
||||||
#include "gfx2DGlue.h"
|
|
||||||
#include "YCbCrUtils.h" // for YCbCr conversions
|
|
||||||
|
|
||||||
#include <ColorConverter.h>
|
|
||||||
#include <OMX_IVCommon.h>
|
|
||||||
|
|
||||||
|
|
||||||
using namespace mozilla::ipc;
|
|
||||||
using namespace android;
|
|
||||||
|
|
||||||
#define ALIGN(x, align) ((x + align - 1) & ~(align - 1))
|
|
||||||
|
|
||||||
namespace mozilla {
|
|
||||||
namespace layers {
|
|
||||||
|
|
||||||
int32_t GrallocImage::sColorIdMap[] = {
|
|
||||||
HAL_PIXEL_FORMAT_YCbCr_420_P, OMX_COLOR_FormatYUV420Planar,
|
|
||||||
HAL_PIXEL_FORMAT_YCbCr_422_P, OMX_COLOR_FormatYUV422Planar,
|
|
||||||
HAL_PIXEL_FORMAT_YCbCr_420_SP, OMX_COLOR_FormatYUV420SemiPlanar,
|
|
||||||
HAL_PIXEL_FORMAT_YCrCb_420_SP, -1,
|
|
||||||
HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO, -1,
|
|
||||||
HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED, HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED,
|
|
||||||
HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS, HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS,
|
|
||||||
HAL_PIXEL_FORMAT_YV12, OMX_COLOR_FormatYUV420Planar,
|
|
||||||
HAL_PIXEL_FORMAT_RGBA_8888, -1,
|
|
||||||
0, 0
|
|
||||||
};
|
|
||||||
|
|
||||||
struct GraphicBufferAutoUnlock {
|
|
||||||
android::sp<GraphicBuffer> mGraphicBuffer;
|
|
||||||
|
|
||||||
GraphicBufferAutoUnlock(android::sp<GraphicBuffer>& aGraphicBuffer)
|
|
||||||
: mGraphicBuffer(aGraphicBuffer) { }
|
|
||||||
|
|
||||||
~GraphicBufferAutoUnlock() { mGraphicBuffer->unlock(); }
|
|
||||||
};
|
|
||||||
|
|
||||||
GrallocImage::GrallocImage()
|
|
||||||
: RecyclingPlanarYCbCrImage(nullptr)
|
|
||||||
{
|
|
||||||
mFormat = ImageFormat::GRALLOC_PLANAR_YCBCR;
|
|
||||||
}
|
|
||||||
|
|
||||||
GrallocImage::~GrallocImage()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
GrallocImage::SetData(const Data& aData)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(!mTextureClient, "TextureClient is already set");
|
|
||||||
NS_PRECONDITION(aData.mYSize.width % 2 == 0, "Image should have even width");
|
|
||||||
NS_PRECONDITION(aData.mYSize.height % 2 == 0, "Image should have even height");
|
|
||||||
NS_PRECONDITION(aData.mYStride % 16 == 0, "Image should have stride of multiple of 16 pixels");
|
|
||||||
|
|
||||||
mData = aData;
|
|
||||||
mSize = aData.mPicSize;
|
|
||||||
|
|
||||||
if (gfxPlatform::GetPlatform()->IsInGonkEmulator()) {
|
|
||||||
// Emulator does not support HAL_PIXEL_FORMAT_YV12.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
RefPtr<LayersIPCChannel> allocator = ImageBridgeChild::GetSingleton();
|
|
||||||
GrallocTextureData* texData = GrallocTextureData::Create(mData.mYSize, HAL_PIXEL_FORMAT_YV12,
|
|
||||||
gfx::BackendType::NONE,
|
|
||||||
GraphicBuffer::USAGE_SW_READ_OFTEN |
|
|
||||||
GraphicBuffer::USAGE_SW_WRITE_OFTEN |
|
|
||||||
GraphicBuffer::USAGE_HW_TEXTURE,
|
|
||||||
allocator
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!texData) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
mTextureClient = new TextureClient(texData, TextureFlags::DEFAULT, allocator);
|
|
||||||
sp<GraphicBuffer> graphicBuffer = texData->GetGraphicBuffer();
|
|
||||||
|
|
||||||
void* vaddr;
|
|
||||||
if (graphicBuffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN,
|
|
||||||
&vaddr) != OK) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t* yChannel = static_cast<uint8_t*>(vaddr);
|
|
||||||
gfx::IntSize ySize = aData.mYSize;
|
|
||||||
int32_t yStride = graphicBuffer->getStride();
|
|
||||||
|
|
||||||
uint8_t* vChannel = yChannel + (yStride * ySize.height);
|
|
||||||
gfx::IntSize uvSize = gfx::IntSize(ySize.width / 2,
|
|
||||||
ySize.height / 2);
|
|
||||||
// Align to 16 bytes boundary
|
|
||||||
int32_t uvStride = ((yStride / 2) + 15) & ~0x0F;
|
|
||||||
uint8_t* uChannel = vChannel + (uvStride * uvSize.height);
|
|
||||||
|
|
||||||
// Memory outside of the image width may not writable. If the stride
|
|
||||||
// equals to the image width then we can use only one copy.
|
|
||||||
if (yStride == mData.mYStride &&
|
|
||||||
yStride == ySize.width) {
|
|
||||||
memcpy(yChannel, mData.mYChannel, yStride * ySize.height);
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < ySize.height; i++) {
|
|
||||||
memcpy(yChannel + i * yStride,
|
|
||||||
mData.mYChannel + i * mData.mYStride,
|
|
||||||
ySize.width);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (uvStride == mData.mCbCrStride &&
|
|
||||||
uvStride == uvSize.width) {
|
|
||||||
memcpy(uChannel, mData.mCbChannel, uvStride * uvSize.height);
|
|
||||||
memcpy(vChannel, mData.mCrChannel, uvStride * uvSize.height);
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < uvSize.height; i++) {
|
|
||||||
memcpy(uChannel + i * uvStride,
|
|
||||||
mData.mCbChannel + i * mData.mCbCrStride,
|
|
||||||
uvSize.width);
|
|
||||||
memcpy(vChannel + i * uvStride,
|
|
||||||
mData.mCrChannel + i * mData.mCbCrStride,
|
|
||||||
uvSize.width);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
graphicBuffer->unlock();
|
|
||||||
// Initialze the channels' addresses.
|
|
||||||
// Do not cache the addresses when gralloc buffer is not locked.
|
|
||||||
// gralloc hal could map gralloc buffer only when the buffer is locked,
|
|
||||||
// though some gralloc hals implementation maps it when it is allocated.
|
|
||||||
mData.mYChannel = nullptr;
|
|
||||||
mData.mCrChannel = nullptr;
|
|
||||||
mData.mCbChannel = nullptr;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocImage::AdoptData(TextureClient* aGraphicBuffer, const gfx::IntSize& aSize)
|
|
||||||
{
|
|
||||||
mTextureClient = aGraphicBuffer;
|
|
||||||
mSize = aSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts YVU420 semi planar frames to RGB565, possibly taking different
|
|
||||||
* stride values.
|
|
||||||
* Needed because the Android ColorConverter class assumes that the Y and UV
|
|
||||||
* channels have equal stride.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
ConvertYVU420SPToRGB565(void *aYData, uint32_t aYStride,
|
|
||||||
void *aUData, void *aVData, uint32_t aUVStride,
|
|
||||||
void *aOut,
|
|
||||||
uint32_t aWidth, uint32_t aHeight)
|
|
||||||
{
|
|
||||||
uint8_t *y = (uint8_t*)aYData;
|
|
||||||
bool isCbCr;
|
|
||||||
int8_t *uv;
|
|
||||||
|
|
||||||
if (aUData < aVData) {
|
|
||||||
// The color format is YCbCr
|
|
||||||
isCbCr = true;
|
|
||||||
uv = (int8_t*)aUData;
|
|
||||||
} else {
|
|
||||||
// The color format is YCrCb
|
|
||||||
isCbCr = false;
|
|
||||||
uv = (int8_t*)aVData;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t *rgb = (uint16_t*)aOut;
|
|
||||||
|
|
||||||
for (size_t i = 0; i < aHeight; i++) {
|
|
||||||
for (size_t j = 0; j < aWidth; j++) {
|
|
||||||
int8_t d, e;
|
|
||||||
|
|
||||||
if (isCbCr) {
|
|
||||||
d = uv[j & ~1] - 128;
|
|
||||||
e = uv[j | 1] - 128;
|
|
||||||
} else {
|
|
||||||
d = uv[j | 1] - 128;
|
|
||||||
e = uv[j & ~1] - 128;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Constants taken from https://en.wikipedia.org/wiki/YUV
|
|
||||||
int32_t r = (298 * y[j] + 409 * e + 128) >> 11;
|
|
||||||
int32_t g = (298 * y[j] - 100 * d - 208 * e + 128) >> 10;
|
|
||||||
int32_t b = (298 * y[j] + 516 * d + 128) >> 11;
|
|
||||||
|
|
||||||
r = r > 0x1f ? 0x1f : r < 0 ? 0 : r;
|
|
||||||
g = g > 0x3f ? 0x3f : g < 0 ? 0 : g;
|
|
||||||
b = b > 0x1f ? 0x1f : b < 0 ? 0 : b;
|
|
||||||
|
|
||||||
*rgb++ = (uint16_t)(r << 11 | g << 5 | b);
|
|
||||||
}
|
|
||||||
|
|
||||||
y += aYStride;
|
|
||||||
if (i % 2) {
|
|
||||||
uv += aUVStride;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts the format of vendor-specific YVU420(planar and semi-planar)
|
|
||||||
* with the help of GraphicBuffer::lockYCbCr. In this way, we can convert
|
|
||||||
* the YUV color format without awaring actual definition/enumeration
|
|
||||||
* of vendor formats.
|
|
||||||
*/
|
|
||||||
static status_t
|
|
||||||
ConvertVendorYUVFormatToRGB565(android::sp<GraphicBuffer>& aBuffer,
|
|
||||||
gfx::DataSourceSurface *aSurface,
|
|
||||||
gfx::DataSourceSurface::MappedSurface *aMappedSurface)
|
|
||||||
{
|
|
||||||
status_t rv = BAD_VALUE;
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
android_ycbcr ycbcr;
|
|
||||||
|
|
||||||
// Check if the vendor provides explicit addresses of Y/Cb/Cr buffer from lockYCbCr
|
|
||||||
rv = aBuffer->lockYCbCr(android::GraphicBuffer::USAGE_SW_READ_OFTEN, &ycbcr);
|
|
||||||
|
|
||||||
if (rv != OK) {
|
|
||||||
NS_WARNING("Couldn't lock graphic buffer using lockYCbCr()");
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
GraphicBufferAutoUnlock unlock(aBuffer);
|
|
||||||
|
|
||||||
uint32_t width = aSurface->GetSize().width;
|
|
||||||
uint32_t height = aSurface->GetSize().height;
|
|
||||||
|
|
||||||
if (ycbcr.chroma_step == 2) {
|
|
||||||
// From the system/core/include/system/graphics.h
|
|
||||||
// @chroma_step is the distance in bytes from one chroma pixel value to
|
|
||||||
// the next. This is 2 bytes for semiplanar (because chroma values are
|
|
||||||
// interleaved and each chroma value is one byte) and 1 for planar.
|
|
||||||
ConvertYVU420SPToRGB565(ycbcr.y, ycbcr.ystride,
|
|
||||||
ycbcr.cb, ycbcr.cr, ycbcr.cstride,
|
|
||||||
aMappedSurface->mData,
|
|
||||||
width, height);
|
|
||||||
} else {
|
|
||||||
layers::PlanarYCbCrData ycbcrData;
|
|
||||||
ycbcrData.mYChannel = static_cast<uint8_t*>(ycbcr.y);
|
|
||||||
ycbcrData.mYStride = ycbcr.ystride;
|
|
||||||
ycbcrData.mYSize = aSurface->GetSize();
|
|
||||||
ycbcrData.mCbChannel = static_cast<uint8_t*>(ycbcr.cb);
|
|
||||||
ycbcrData.mCrChannel = static_cast<uint8_t*>(ycbcr.cr);
|
|
||||||
ycbcrData.mCbCrStride = ycbcr.cstride;
|
|
||||||
ycbcrData.mCbCrSize = aSurface->GetSize() / 2;
|
|
||||||
ycbcrData.mPicSize = aSurface->GetSize();
|
|
||||||
|
|
||||||
gfx::ConvertYCbCrToRGB(ycbcrData,
|
|
||||||
aSurface->GetFormat(),
|
|
||||||
aSurface->GetSize(),
|
|
||||||
aMappedSurface->mData,
|
|
||||||
aMappedSurface->mStride);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
static status_t
|
|
||||||
ConvertOmxYUVFormatToRGB565(android::sp<GraphicBuffer>& aBuffer,
|
|
||||||
gfx::DataSourceSurface *aSurface,
|
|
||||||
gfx::DataSourceSurface::MappedSurface *aMappedSurface,
|
|
||||||
const layers::PlanarYCbCrData& aYcbcrData)
|
|
||||||
{
|
|
||||||
uint32_t omxFormat =
|
|
||||||
GrallocImage::GetOmxFormat(aBuffer->getPixelFormat());
|
|
||||||
if (!omxFormat) {
|
|
||||||
NS_WARNING("Unknown color format");
|
|
||||||
return BAD_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
status_t rv;
|
|
||||||
uint8_t *buffer;
|
|
||||||
|
|
||||||
rv = aBuffer->lock(android::GraphicBuffer::USAGE_SW_READ_OFTEN,
|
|
||||||
reinterpret_cast<void **>(&buffer));
|
|
||||||
if (rv != OK) {
|
|
||||||
NS_WARNING("Couldn't lock graphic buffer");
|
|
||||||
return BAD_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
GraphicBufferAutoUnlock unlock(aBuffer);
|
|
||||||
|
|
||||||
uint32_t format = aBuffer->getPixelFormat();
|
|
||||||
uint32_t width = aSurface->GetSize().width;
|
|
||||||
uint32_t height = aSurface->GetSize().height;
|
|
||||||
uint32_t stride = aBuffer->getStride();
|
|
||||||
|
|
||||||
if (format == GrallocImage::HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO) {
|
|
||||||
// The Adreno hardware decoder aligns image dimensions to a multiple of 32,
|
|
||||||
// so we have to account for that here
|
|
||||||
uint32_t alignedWidth = ALIGN(width, 32);
|
|
||||||
uint32_t alignedHeight = ALIGN(height, 32);
|
|
||||||
uint32_t uvOffset = ALIGN(alignedHeight * alignedWidth, 4096);
|
|
||||||
uint32_t uvStride = 2 * ALIGN(width / 2, 32);
|
|
||||||
ConvertYVU420SPToRGB565(buffer, alignedWidth,
|
|
||||||
buffer + uvOffset + 1,
|
|
||||||
buffer + uvOffset,
|
|
||||||
uvStride,
|
|
||||||
aMappedSurface->mData,
|
|
||||||
width, height);
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (format == HAL_PIXEL_FORMAT_YCrCb_420_SP) {
|
|
||||||
uint32_t uvOffset = height * stride;
|
|
||||||
ConvertYVU420SPToRGB565(buffer, stride,
|
|
||||||
buffer + uvOffset + 1,
|
|
||||||
buffer + uvOffset,
|
|
||||||
stride,
|
|
||||||
aMappedSurface->mData,
|
|
||||||
width, height);
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (format == HAL_PIXEL_FORMAT_YV12) {
|
|
||||||
// Depend on platforms, it is possible for HW decoder to output YV12 format.
|
|
||||||
// It means the mData won't be configured during the SetData API because the
|
|
||||||
// yuv data has already stored in GraphicBuffer. Here we try to confgiure the
|
|
||||||
// mData if it doesn't contain valid configuration.
|
|
||||||
layers::PlanarYCbCrData ycbcrData = aYcbcrData;
|
|
||||||
if (!ycbcrData.mYChannel) {
|
|
||||||
ycbcrData.mYChannel = buffer;
|
|
||||||
ycbcrData.mYSkip = 0;
|
|
||||||
ycbcrData.mYStride = aBuffer->getStride();
|
|
||||||
ycbcrData.mYSize = aSurface->GetSize();
|
|
||||||
ycbcrData.mCbSkip = 0;
|
|
||||||
ycbcrData.mCbCrSize = aSurface->GetSize() / 2;
|
|
||||||
ycbcrData.mPicSize = aSurface->GetSize();
|
|
||||||
ycbcrData.mCrChannel = buffer + ycbcrData.mYStride * aBuffer->getHeight();
|
|
||||||
ycbcrData.mCrSkip = 0;
|
|
||||||
// Align to 16 bytes boundary
|
|
||||||
ycbcrData.mCbCrStride = ALIGN(ycbcrData.mYStride / 2, 16);
|
|
||||||
ycbcrData.mCbChannel = ycbcrData.mCrChannel + (ycbcrData.mCbCrStride * aBuffer->getHeight() / 2);
|
|
||||||
} else {
|
|
||||||
// Update channels' address.
|
|
||||||
// Gralloc buffer could map gralloc buffer only when the buffer is locked.
|
|
||||||
ycbcrData.mYChannel = buffer;
|
|
||||||
ycbcrData.mCrChannel = buffer + ycbcrData.mYStride * aBuffer->getHeight();
|
|
||||||
ycbcrData.mCbChannel = ycbcrData.mCrChannel + (ycbcrData.mCbCrStride * aBuffer->getHeight() / 2);
|
|
||||||
}
|
|
||||||
gfx::ConvertYCbCrToRGB(ycbcrData,
|
|
||||||
aSurface->GetFormat(),
|
|
||||||
aSurface->GetSize(),
|
|
||||||
aMappedSurface->mData,
|
|
||||||
aMappedSurface->mStride);
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (format == HAL_PIXEL_FORMAT_RGBA_8888) {
|
|
||||||
uint32_t* src = (uint32_t*)(buffer);
|
|
||||||
uint16_t* dest = (uint16_t*)(aMappedSurface->mData);
|
|
||||||
|
|
||||||
// Convert RGBA8888 to RGB565
|
|
||||||
for (size_t i = 0; i < width * height; i++) {
|
|
||||||
uint32_t r = ((*src >> 0 ) & 0xFF);
|
|
||||||
uint32_t g = ((*src >> 8 ) & 0xFF);
|
|
||||||
uint32_t b = ((*src >> 16) & 0xFF);
|
|
||||||
*dest++ = ((r >> 3) << 11) | ((g >> 2) << 5) | ((b >> 3) << 0);
|
|
||||||
src++;
|
|
||||||
}
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
android::ColorConverter colorConverter((OMX_COLOR_FORMATTYPE)omxFormat,
|
|
||||||
OMX_COLOR_Format16bitRGB565);
|
|
||||||
if (!colorConverter.isValid()) {
|
|
||||||
NS_WARNING("Invalid color conversion");
|
|
||||||
return BAD_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t pixelStride = aMappedSurface->mStride/gfx::BytesPerPixel(gfx::SurfaceFormat::R5G6B5_UINT16);
|
|
||||||
rv = colorConverter.convert(buffer, width, height,
|
|
||||||
0, 0, width - 1, height - 1 /* source crop */,
|
|
||||||
aMappedSurface->mData, pixelStride, height,
|
|
||||||
0, 0, width - 1, height - 1 /* dest crop */);
|
|
||||||
if (rv) {
|
|
||||||
NS_WARNING("OMX color conversion failed");
|
|
||||||
return BAD_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
already_AddRefed<gfx::DataSourceSurface>
|
|
||||||
GetDataSourceSurfaceFrom(android::sp<android::GraphicBuffer>& aGraphicBuffer,
|
|
||||||
gfx::IntSize aSize,
|
|
||||||
const layers::PlanarYCbCrData& aYcbcrData)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(aGraphicBuffer.get());
|
|
||||||
|
|
||||||
RefPtr<gfx::DataSourceSurface> surface =
|
|
||||||
gfx::Factory::CreateDataSourceSurface(aSize, gfx::SurfaceFormat::R5G6B5_UINT16);
|
|
||||||
if (NS_WARN_IF(!surface)) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
gfx::DataSourceSurface::MappedSurface mappedSurface;
|
|
||||||
if (!surface->Map(gfx::DataSourceSurface::WRITE, &mappedSurface)) {
|
|
||||||
NS_WARNING("Could not map DataSourceSurface");
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t rv;
|
|
||||||
rv = ConvertOmxYUVFormatToRGB565(aGraphicBuffer, surface, &mappedSurface, aYcbcrData);
|
|
||||||
if (rv == OK) {
|
|
||||||
surface->Unmap();
|
|
||||||
return surface.forget();
|
|
||||||
}
|
|
||||||
|
|
||||||
rv = ConvertVendorYUVFormatToRGB565(aGraphicBuffer, surface, &mappedSurface);
|
|
||||||
surface->Unmap();
|
|
||||||
if (rv != OK) {
|
|
||||||
NS_WARNING("Unknown color format");
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
return surface.forget();
|
|
||||||
}
|
|
||||||
|
|
||||||
already_AddRefed<gfx::SourceSurface>
|
|
||||||
GrallocImage::GetAsSourceSurface()
|
|
||||||
{
|
|
||||||
if (!mTextureClient) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
android::sp<GraphicBuffer> graphicBuffer = GetGraphicBuffer();
|
|
||||||
|
|
||||||
RefPtr<gfx::DataSourceSurface> surface =
|
|
||||||
GetDataSourceSurfaceFrom(graphicBuffer, mSize, mData);
|
|
||||||
|
|
||||||
return surface.forget();
|
|
||||||
}
|
|
||||||
|
|
||||||
android::sp<android::GraphicBuffer>
|
|
||||||
GrallocImage::GetGraphicBuffer() const
|
|
||||||
{
|
|
||||||
if (!mTextureClient) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return static_cast<GrallocTextureData*>(mTextureClient->GetInternalData())->GetGraphicBuffer();
|
|
||||||
}
|
|
||||||
|
|
||||||
void*
|
|
||||||
GrallocImage::GetNativeBuffer()
|
|
||||||
{
|
|
||||||
if (!mTextureClient) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
android::sp<android::GraphicBuffer> graphicBuffer = GetGraphicBuffer();
|
|
||||||
if (!graphicBuffer.get()) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return graphicBuffer->getNativeBuffer();
|
|
||||||
}
|
|
||||||
|
|
||||||
TextureClient*
|
|
||||||
GrallocImage::GetTextureClient(KnowsCompositor* aForwarder)
|
|
||||||
{
|
|
||||||
return mTextureClient;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace layers
|
|
||||||
} // namespace mozilla
|
|
||||||
@@ -1,136 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
* 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 GRALLOCIMAGES_H
|
|
||||||
#define GRALLOCIMAGES_H
|
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
|
|
||||||
#include "ImageLayers.h"
|
|
||||||
#include "ImageContainer.h"
|
|
||||||
#include "mozilla/gfx/Point.h"
|
|
||||||
#include "mozilla/layers/AtomicRefCountedWithFinalize.h"
|
|
||||||
#include "mozilla/layers/FenceUtils.h"
|
|
||||||
#include "mozilla/layers/LayersSurfaces.h"
|
|
||||||
|
|
||||||
#include <ui/GraphicBuffer.h>
|
|
||||||
|
|
||||||
namespace mozilla {
|
|
||||||
namespace layers {
|
|
||||||
|
|
||||||
class TextureClient;
|
|
||||||
|
|
||||||
already_AddRefed<gfx::DataSourceSurface>
|
|
||||||
GetDataSourceSurfaceFrom(android::sp<android::GraphicBuffer>& aGraphicBuffer,
|
|
||||||
gfx::IntSize aSize,
|
|
||||||
const layers::PlanarYCbCrData& aYcbcrData);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The YUV format supported by Android HAL
|
|
||||||
*
|
|
||||||
* 4:2:0 - CbCr width and height is half that of Y.
|
|
||||||
*
|
|
||||||
* This format assumes
|
|
||||||
* - an even width
|
|
||||||
* - an even height
|
|
||||||
* - a horizontal stride multiple of 16 pixels
|
|
||||||
* - a vertical stride equal to the height
|
|
||||||
*
|
|
||||||
* y_size = stride * height
|
|
||||||
* c_size = ALIGN(stride/2, 16) * height/2
|
|
||||||
* size = y_size + c_size * 2
|
|
||||||
* cr_offset = y_size
|
|
||||||
* cb_offset = y_size + c_size
|
|
||||||
*
|
|
||||||
* The Image that is rendered is the picture region defined by
|
|
||||||
* mPicX, mPicY and mPicSize. The size of the rendered image is
|
|
||||||
* mPicSize, not mYSize or mCbCrSize.
|
|
||||||
*/
|
|
||||||
class GrallocImage : public RecyclingPlanarYCbCrImage
|
|
||||||
{
|
|
||||||
typedef PlanarYCbCrData Data;
|
|
||||||
static int32_t sColorIdMap[];
|
|
||||||
public:
|
|
||||||
GrallocImage();
|
|
||||||
|
|
||||||
virtual ~GrallocImage();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This makes a copy of the data buffers, in order to support functioning
|
|
||||||
* in all different layer managers.
|
|
||||||
*/
|
|
||||||
virtual bool SetData(const Data& aData);
|
|
||||||
|
|
||||||
using RecyclingPlanarYCbCrImage::AdoptData;
|
|
||||||
/**
|
|
||||||
* Share the SurfaceDescriptor without making the copy, in order
|
|
||||||
* to support functioning in all different layer managers.
|
|
||||||
*/
|
|
||||||
void AdoptData(TextureClient* aGraphicBuffer, const gfx::IntSize& aSize);
|
|
||||||
|
|
||||||
// From [android 4.0.4]/hardware/msm7k/libgralloc-qsd8k/gralloc_priv.h
|
|
||||||
enum {
|
|
||||||
/* OEM specific HAL formats */
|
|
||||||
HAL_PIXEL_FORMAT_YCbCr_422_P = 0x102,
|
|
||||||
HAL_PIXEL_FORMAT_YCbCr_420_P = 0x103,
|
|
||||||
HAL_PIXEL_FORMAT_YCbCr_420_SP = 0x109,
|
|
||||||
HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO = 0x10A,
|
|
||||||
HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED = 0x7FA30C03,
|
|
||||||
HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS = 0x7FA30C04,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
|
||||||
GRALLOC_SW_UAGE = android::GraphicBuffer::USAGE_SOFTWARE_MASK,
|
|
||||||
};
|
|
||||||
|
|
||||||
virtual already_AddRefed<gfx::SourceSurface> GetAsSourceSurface() override;
|
|
||||||
|
|
||||||
android::sp<android::GraphicBuffer> GetGraphicBuffer() const;
|
|
||||||
|
|
||||||
void* GetNativeBuffer();
|
|
||||||
|
|
||||||
virtual bool IsValid() { return !!mTextureClient; }
|
|
||||||
|
|
||||||
virtual TextureClient* GetTextureClient(KnowsCompositor* aForwarder) override;
|
|
||||||
|
|
||||||
virtual GrallocImage* AsGrallocImage() override
|
|
||||||
{
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual uint8_t* GetBuffer()
|
|
||||||
{
|
|
||||||
return static_cast<uint8_t*>(GetNativeBuffer());
|
|
||||||
}
|
|
||||||
|
|
||||||
int GetUsage()
|
|
||||||
{
|
|
||||||
return (static_cast<ANativeWindowBuffer*>(GetNativeBuffer()))->usage;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int GetOmxFormat(int aFormat)
|
|
||||||
{
|
|
||||||
uint32_t omxFormat = 0;
|
|
||||||
|
|
||||||
for (int i = 0; sColorIdMap[i]; i += 2) {
|
|
||||||
if (sColorIdMap[i] == aFormat) {
|
|
||||||
omxFormat = sColorIdMap[i + 1];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return omxFormat;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
RefPtr<TextureClient> mTextureClient;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace layers
|
|
||||||
} // namespace mozilla
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* GRALLOCIMAGES_H */
|
|
||||||
@@ -24,9 +24,6 @@
|
|||||||
#include "mozilla/gfx/gfxVars.h"
|
#include "mozilla/gfx/gfxVars.h"
|
||||||
#include "nsISupportsUtils.h" // for NS_IF_ADDREF
|
#include "nsISupportsUtils.h" // for NS_IF_ADDREF
|
||||||
#include "YCbCrUtils.h" // for YCbCr conversions
|
#include "YCbCrUtils.h" // for YCbCr conversions
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#include "GrallocImages.h"
|
|
||||||
#endif
|
|
||||||
#include "gfx2DGlue.h"
|
#include "gfx2DGlue.h"
|
||||||
#include "mozilla/gfx/2D.h"
|
#include "mozilla/gfx/2D.h"
|
||||||
|
|
||||||
@@ -178,18 +175,6 @@ ImageContainer::CreateSharedRGBImage()
|
|||||||
return new SharedRGBImage(mImageClient);
|
return new SharedRGBImage(mImageClient);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
RefPtr<OverlayImage>
|
|
||||||
ImageContainer::CreateOverlayImage()
|
|
||||||
{
|
|
||||||
ReentrantMonitorAutoEnter mon(mReentrantMonitor);
|
|
||||||
if (!mImageClient || !mImageClient->AsImageClientSingle()) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return new OverlayImage();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ImageContainer::SetCurrentImageInternal(const nsTArray<NonOwningImage>& aImages)
|
ImageContainer::SetCurrentImageInternal(const nsTArray<NonOwningImage>& aImages)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -152,7 +152,6 @@ class SharedPlanarYCbCrImage;
|
|||||||
class PlanarYCbCrImage;
|
class PlanarYCbCrImage;
|
||||||
class TextureClient;
|
class TextureClient;
|
||||||
class KnowsCompositor;
|
class KnowsCompositor;
|
||||||
class GrallocImage;
|
|
||||||
class NVImage;
|
class NVImage;
|
||||||
|
|
||||||
struct ImageBackendData
|
struct ImageBackendData
|
||||||
@@ -171,8 +170,6 @@ class SharedRGBImage;
|
|||||||
class SurfaceTextureImage;
|
class SurfaceTextureImage;
|
||||||
#elif defined(XP_MACOSX)
|
#elif defined(XP_MACOSX)
|
||||||
class MacIOSurfaceImage;
|
class MacIOSurfaceImage;
|
||||||
#elif defined(MOZ_WIDGET_GONK)
|
|
||||||
class OverlayImage;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -215,11 +212,6 @@ public:
|
|||||||
|
|
||||||
virtual already_AddRefed<gfx::SourceSurface> GetAsSourceSurface() = 0;
|
virtual already_AddRefed<gfx::SourceSurface> GetAsSourceSurface() = 0;
|
||||||
|
|
||||||
virtual GrallocImage* AsGrallocImage()
|
|
||||||
{
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual bool IsValid() { return true; }
|
virtual bool IsValid() { return true; }
|
||||||
|
|
||||||
virtual uint8_t* GetBuffer() { return nullptr; }
|
virtual uint8_t* GetBuffer() { return nullptr; }
|
||||||
@@ -385,10 +377,6 @@ public:
|
|||||||
// Factory methods for shared image types.
|
// Factory methods for shared image types.
|
||||||
RefPtr<SharedRGBImage> CreateSharedRGBImage();
|
RefPtr<SharedRGBImage> CreateSharedRGBImage();
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
RefPtr<OverlayImage> CreateOverlayImage();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct NonOwningImage {
|
struct NonOwningImage {
|
||||||
explicit NonOwningImage(Image* aImage = nullptr,
|
explicit NonOwningImage(Image* aImage = nullptr,
|
||||||
TimeStamp aTimeStamp = TimeStamp(),
|
TimeStamp aTimeStamp = TimeStamp(),
|
||||||
@@ -909,54 +897,6 @@ private:
|
|||||||
TextureFlags mTextureFlags;
|
TextureFlags mTextureFlags;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
class OverlayImage : public Image {
|
|
||||||
/**
|
|
||||||
* OverlayImage is a special Image type that does not hold any buffer.
|
|
||||||
* It only hold an Id as identifier to the real content of the Image.
|
|
||||||
* Therefore, OverlayImage must be handled by some specialized hardware(e.g. HWC)
|
|
||||||
* to show its content.
|
|
||||||
*/
|
|
||||||
public:
|
|
||||||
struct Data {
|
|
||||||
int32_t mOverlayId;
|
|
||||||
gfx::IntSize mSize;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SidebandStreamData {
|
|
||||||
GonkNativeHandle mStream;
|
|
||||||
gfx::IntSize mSize;
|
|
||||||
};
|
|
||||||
|
|
||||||
OverlayImage() : Image(nullptr, ImageFormat::OVERLAY_IMAGE) { mOverlayId = INVALID_OVERLAY; }
|
|
||||||
|
|
||||||
void SetData(const Data& aData)
|
|
||||||
{
|
|
||||||
mOverlayId = aData.mOverlayId;
|
|
||||||
mSize = aData.mSize;
|
|
||||||
mSidebandStream = GonkNativeHandle();
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetData(const SidebandStreamData& aData)
|
|
||||||
{
|
|
||||||
mSidebandStream = aData.mStream;
|
|
||||||
mSize = aData.mSize;
|
|
||||||
mOverlayId = INVALID_OVERLAY;
|
|
||||||
}
|
|
||||||
|
|
||||||
already_AddRefed<gfx::SourceSurface> GetAsSourceSurface() { return nullptr; } ;
|
|
||||||
int32_t GetOverlayId() { return mOverlayId; }
|
|
||||||
GonkNativeHandle& GetSidebandStream() { return mSidebandStream; }
|
|
||||||
|
|
||||||
gfx::IntSize GetSize() { return mSize; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
int32_t mOverlayId;
|
|
||||||
GonkNativeHandle mSidebandStream;
|
|
||||||
gfx::IntSize mSize;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} // namespace layers
|
} // namespace layers
|
||||||
} // namespace mozilla
|
} // namespace mozilla
|
||||||
|
|
||||||
|
|||||||
@@ -461,101 +461,6 @@ protected:
|
|||||||
int64_t mFrameStamp;
|
int64_t mFrameStamp;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
// B2G optimization.
|
|
||||||
class DebugGLGraphicBuffer final: public DebugGLData {
|
|
||||||
public:
|
|
||||||
DebugGLGraphicBuffer(void *layerRef,
|
|
||||||
GLenum target,
|
|
||||||
GLuint name,
|
|
||||||
const LayerRenderState &aState,
|
|
||||||
bool aIsMask,
|
|
||||||
UniquePtr<Packet> aPacket)
|
|
||||||
: DebugGLData(Packet::TEXTURE),
|
|
||||||
mLayerRef(reinterpret_cast<uint64_t>(layerRef)),
|
|
||||||
mTarget(target),
|
|
||||||
mName(name),
|
|
||||||
mState(aState),
|
|
||||||
mIsMask(aIsMask),
|
|
||||||
mPacket(Move(aPacket))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual bool Write() override {
|
|
||||||
return WriteToStream(*mPacket);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TryPack(bool packData) {
|
|
||||||
android::sp<android::GraphicBuffer> buffer = mState.mSurface;
|
|
||||||
MOZ_ASSERT(buffer.get());
|
|
||||||
|
|
||||||
mPacket->set_type(mDataType);
|
|
||||||
TexturePacket* tp = mPacket->mutable_texture();
|
|
||||||
tp->set_layerref(mLayerRef);
|
|
||||||
tp->set_name(mName);
|
|
||||||
tp->set_target(mTarget);
|
|
||||||
tp->set_ismask(mIsMask);
|
|
||||||
|
|
||||||
int pFormat = buffer->getPixelFormat();
|
|
||||||
if (HAL_PIXEL_FORMAT_RGBA_8888 != pFormat &&
|
|
||||||
HAL_PIXEL_FORMAT_RGBX_8888 != pFormat) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t stride = buffer->getStride() * 4;
|
|
||||||
int32_t height = buffer->getHeight();
|
|
||||||
int32_t width = buffer->getWidth();
|
|
||||||
int32_t sourceSize = stride * height;
|
|
||||||
if (sourceSize <= 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t dFormat = mState.FormatRBSwapped() ?
|
|
||||||
LOCAL_GL_BGRA : LOCAL_GL_RGBA;
|
|
||||||
tp->set_dataformat(dFormat);
|
|
||||||
tp->set_dataformat((1 << 16 | tp->dataformat()));
|
|
||||||
tp->set_width(width);
|
|
||||||
tp->set_height(height);
|
|
||||||
tp->set_stride(stride);
|
|
||||||
|
|
||||||
if (packData) {
|
|
||||||
uint8_t* grallocData = nullptr;
|
|
||||||
if (BAD_VALUE == buffer->lock(GRALLOC_USAGE_SW_READ_OFTEN |
|
|
||||||
GRALLOC_USAGE_SW_WRITE_NEVER,
|
|
||||||
reinterpret_cast<void**>(&grallocData)))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// Do not return before buffer->unlock();
|
|
||||||
auto compressedData =
|
|
||||||
MakeUnique<char[]>(LZ4::maxCompressedSize(sourceSize));
|
|
||||||
int compressedSize = LZ4::compress((char*)grallocData,
|
|
||||||
sourceSize,
|
|
||||||
compressedData.get());
|
|
||||||
|
|
||||||
if (compressedSize > 0) {
|
|
||||||
tp->set_data(compressedData.get(), compressedSize);
|
|
||||||
} else {
|
|
||||||
buffer->unlock();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer->unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
uint64_t mLayerRef;
|
|
||||||
GLenum mTarget;
|
|
||||||
GLuint mName;
|
|
||||||
const LayerRenderState &mState;
|
|
||||||
bool mIsMask;
|
|
||||||
UniquePtr<Packet> mPacket;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class DebugGLTextureData final: public DebugGLData {
|
class DebugGLTextureData final: public DebugGLData {
|
||||||
public:
|
public:
|
||||||
DebugGLTextureData(GLContext* cx,
|
DebugGLTextureData(GLContext* cx,
|
||||||
@@ -947,13 +852,6 @@ private:
|
|||||||
bool aFlipY,
|
bool aFlipY,
|
||||||
bool aIsMask,
|
bool aIsMask,
|
||||||
UniquePtr<Packet> aPacket);
|
UniquePtr<Packet> aPacket);
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
static bool SendGraphicBuffer(GLContext* aGLContext,
|
|
||||||
void* aLayerRef,
|
|
||||||
TextureSourceOGL* aSource,
|
|
||||||
const TexturedEffect* aEffect,
|
|
||||||
bool aIsMask);
|
|
||||||
#endif
|
|
||||||
static void SetAndSendTexture(GLContext* aGLContext,
|
static void SetAndSendTexture(GLContext* aGLContext,
|
||||||
void* aLayerRef,
|
void* aLayerRef,
|
||||||
TextureSourceOGL* aSource,
|
TextureSourceOGL* aSource,
|
||||||
@@ -1110,51 +1008,6 @@ SenderHelper::SendTextureSource(GLContext* aGLContext,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
bool
|
|
||||||
SenderHelper::SendGraphicBuffer(GLContext* aGLContext,
|
|
||||||
void* aLayerRef,
|
|
||||||
TextureSourceOGL* aSource,
|
|
||||||
const TexturedEffect* aEffect,
|
|
||||||
bool aIsMask) {
|
|
||||||
GLuint texID = GetTextureID(aGLContext, aSource);
|
|
||||||
if (HasTextureIdBeenSent(texID)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!aEffect->mState.mSurface.get()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Expose packet creation here, so we could dump primary texture effect attributes.
|
|
||||||
auto packet = MakeUnique<layerscope::Packet>();
|
|
||||||
layerscope::TexturePacket* texturePacket = packet->mutable_texture();
|
|
||||||
texturePacket->set_mpremultiplied(aEffect->mPremultiplied);
|
|
||||||
DumpFilter(texturePacket, aEffect->mSamplingFilter);
|
|
||||||
DumpRect(texturePacket->mutable_mtexturecoords(), aEffect->mTextureCoords);
|
|
||||||
|
|
||||||
GLenum target = aSource->GetTextureTarget();
|
|
||||||
mozilla::UniquePtr<DebugGLGraphicBuffer> package =
|
|
||||||
MakeUnique<DebugGLGraphicBuffer>(aLayerRef, target, texID, aEffect->mState, aIsMask, Move(packet));
|
|
||||||
|
|
||||||
// The texure content in this TexureHost is not altered,
|
|
||||||
// we don't need to send it again.
|
|
||||||
bool changed = gLayerScopeManager.GetContentMonitor()->IsChangedOrNew(
|
|
||||||
aEffect->mState.mTexture);
|
|
||||||
if (!package->TryPack(changed)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transfer ownership to SocketManager.
|
|
||||||
gLayerScopeManager.GetSocketManager()->AppendDebugData(package.release());
|
|
||||||
sSentTextureIds.push_back(texID);
|
|
||||||
|
|
||||||
gLayerScopeManager.CurrentSession().mTexIDs.push_back(texID);
|
|
||||||
|
|
||||||
gLayerScopeManager.GetContentMonitor()->ClearChangedHost(aEffect->mState.mTexture);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void
|
void
|
||||||
SenderHelper::SetAndSendTexture(GLContext* aGLContext,
|
SenderHelper::SetAndSendTexture(GLContext* aGLContext,
|
||||||
void* aLayerRef,
|
void* aLayerRef,
|
||||||
@@ -1180,12 +1033,6 @@ SenderHelper::SendTexturedEffect(GLContext* aGLContext,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
if (SendGraphicBuffer(aGLContext, aLayerRef, source, aEffect, false)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Fallback texture sending path.
|
// Fallback texture sending path.
|
||||||
SetAndSendTexture(aGLContext, aLayerRef, source, aEffect);
|
SetAndSendTexture(aGLContext, aLayerRef, source, aEffect);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -366,8 +366,6 @@ AppendToString(std::stringstream& aStream, ImageFormat format,
|
|||||||
aStream << "ImageFormat::PLANAR_YCBCR"; break;
|
aStream << "ImageFormat::PLANAR_YCBCR"; break;
|
||||||
case ImageFormat::GRALLOC_PLANAR_YCBCR:
|
case ImageFormat::GRALLOC_PLANAR_YCBCR:
|
||||||
aStream << "ImageFormat::GRALLOC_PLANAR_YCBCR"; break;
|
aStream << "ImageFormat::GRALLOC_PLANAR_YCBCR"; break;
|
||||||
case ImageFormat::GONK_CAMERA_IMAGE:
|
|
||||||
aStream << "ImageFormat::GONK_CAMERA_IMAGE"; break;
|
|
||||||
case ImageFormat::SHARED_RGB:
|
case ImageFormat::SHARED_RGB:
|
||||||
aStream << "ImageFormat::SHARED_RGB"; break;
|
aStream << "ImageFormat::SHARED_RGB"; break;
|
||||||
case ImageFormat::CAIRO_SURFACE:
|
case ImageFormat::CAIRO_SURFACE:
|
||||||
|
|||||||
@@ -5,21 +5,12 @@
|
|||||||
|
|
||||||
#include "LayersTypes.h"
|
#include "LayersTypes.h"
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#include <ui/GraphicBuffer.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
namespace layers {
|
namespace layers {
|
||||||
|
|
||||||
LayerRenderState::LayerRenderState()
|
LayerRenderState::LayerRenderState()
|
||||||
: mFlags(LayerRenderStateFlags::LAYER_RENDER_STATE_DEFAULT)
|
: mFlags(LayerRenderStateFlags::LAYER_RENDER_STATE_DEFAULT)
|
||||||
, mHasOwnOffset(false)
|
, mHasOwnOffset(false)
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
, mSurface(nullptr)
|
|
||||||
, mOverlayId(INVALID_OVERLAY)
|
|
||||||
, mTexture(nullptr)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -27,12 +18,6 @@ LayerRenderState::LayerRenderState(const LayerRenderState& aOther)
|
|||||||
: mFlags(aOther.mFlags)
|
: mFlags(aOther.mFlags)
|
||||||
, mHasOwnOffset(aOther.mHasOwnOffset)
|
, mHasOwnOffset(aOther.mHasOwnOffset)
|
||||||
, mOffset(aOther.mOffset)
|
, mOffset(aOther.mOffset)
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
, mSurface(aOther.mSurface)
|
|
||||||
, mOverlayId(aOther.mOverlayId)
|
|
||||||
, mSize(aOther.mSize)
|
|
||||||
, mTexture(aOther.mTexture)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,19 +25,5 @@ LayerRenderState::~LayerRenderState()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
LayerRenderState::LayerRenderState(android::GraphicBuffer* aSurface,
|
|
||||||
const gfx::IntSize& aSize,
|
|
||||||
LayerRenderStateFlags aFlags,
|
|
||||||
TextureHost* aTexture)
|
|
||||||
: mFlags(aFlags)
|
|
||||||
, mHasOwnOffset(false)
|
|
||||||
, mSurface(aSurface)
|
|
||||||
, mOverlayId(INVALID_OVERLAY)
|
|
||||||
, mSize(aSize)
|
|
||||||
, mTexture(aTexture)
|
|
||||||
{}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} // namespace layers
|
} // namespace layers
|
||||||
} // namespace mozilla
|
} // namespace mozilla
|
||||||
|
|||||||
@@ -8,11 +8,6 @@
|
|||||||
|
|
||||||
#include <stdint.h> // for uint32_t
|
#include <stdint.h> // for uint32_t
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#include <utils/RefBase.h>
|
|
||||||
#include "mozilla/layers/GonkNativeHandle.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "Units.h"
|
#include "Units.h"
|
||||||
#include "mozilla/gfx/Point.h" // for IntPoint
|
#include "mozilla/gfx/Point.h" // for IntPoint
|
||||||
#include "mozilla/TypedEnumBits.h"
|
#include "mozilla/TypedEnumBits.h"
|
||||||
@@ -86,8 +81,6 @@ enum class LayerRenderStateFlags : int8_t {
|
|||||||
};
|
};
|
||||||
MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(LayerRenderStateFlags)
|
MOZ_MAKE_ENUM_CLASS_BITWISE_OPERATORS(LayerRenderStateFlags)
|
||||||
|
|
||||||
// The 'ifdef MOZ_WIDGET_GONK' sadness here is because we don't want to include
|
|
||||||
// android::sp unless we have to.
|
|
||||||
struct LayerRenderState {
|
struct LayerRenderState {
|
||||||
// Constructors and destructor are defined in LayersTypes.cpp so we don't
|
// Constructors and destructor are defined in LayersTypes.cpp so we don't
|
||||||
// have to pull in a definition for GraphicBuffer.h here. In KK at least,
|
// have to pull in a definition for GraphicBuffer.h here. In KK at least,
|
||||||
@@ -97,36 +90,6 @@ struct LayerRenderState {
|
|||||||
LayerRenderState(const LayerRenderState& aOther);
|
LayerRenderState(const LayerRenderState& aOther);
|
||||||
~LayerRenderState();
|
~LayerRenderState();
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
LayerRenderState(android::GraphicBuffer* aSurface,
|
|
||||||
const gfx::IntSize& aSize,
|
|
||||||
LayerRenderStateFlags aFlags,
|
|
||||||
TextureHost* aTexture);
|
|
||||||
|
|
||||||
bool OriginBottomLeft() const
|
|
||||||
{ return bool(mFlags & LayerRenderStateFlags::ORIGIN_BOTTOM_LEFT); }
|
|
||||||
|
|
||||||
bool BufferRotated() const
|
|
||||||
{ return bool(mFlags & LayerRenderStateFlags::BUFFER_ROTATION); }
|
|
||||||
|
|
||||||
bool FormatRBSwapped() const
|
|
||||||
{ return bool(mFlags & LayerRenderStateFlags::FORMAT_RB_SWAP); }
|
|
||||||
|
|
||||||
void SetOverlayId(const int32_t& aId)
|
|
||||||
{ mOverlayId = aId; }
|
|
||||||
|
|
||||||
void SetSidebandStream(const GonkNativeHandle& aStream)
|
|
||||||
{
|
|
||||||
mSidebandStream = aStream;
|
|
||||||
}
|
|
||||||
|
|
||||||
android::GraphicBuffer* GetGrallocBuffer() const
|
|
||||||
{ return mSurface.get(); }
|
|
||||||
|
|
||||||
const GonkNativeHandle& GetSidebandStream()
|
|
||||||
{ return mSidebandStream; }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void SetOffset(const nsIntPoint& aOffset)
|
void SetOffset(const nsIntPoint& aOffset)
|
||||||
{
|
{
|
||||||
mOffset = aOffset;
|
mOffset = aOffset;
|
||||||
@@ -139,17 +102,6 @@ struct LayerRenderState {
|
|||||||
bool mHasOwnOffset;
|
bool mHasOwnOffset;
|
||||||
// the location of the layer's origin on mSurface
|
// the location of the layer's origin on mSurface
|
||||||
nsIntPoint mOffset;
|
nsIntPoint mOffset;
|
||||||
// The 'ifdef MOZ_WIDGET_GONK' sadness here is because we don't want to include
|
|
||||||
// android::sp unless we have to.
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
// surface to render
|
|
||||||
android::sp<android::GraphicBuffer> mSurface;
|
|
||||||
int32_t mOverlayId;
|
|
||||||
// size of mSurface
|
|
||||||
gfx::IntSize mSize;
|
|
||||||
TextureHost* mTexture;
|
|
||||||
GonkNativeHandle mSidebandStream;
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class ScaleMode : int8_t {
|
enum class ScaleMode : int8_t {
|
||||||
|
|||||||
@@ -406,20 +406,6 @@ ComputeBufferRect(const IntRect& aRequestedRect)
|
|||||||
// rendering glitch, and guarantees image rows can be SIMD'd for
|
// rendering glitch, and guarantees image rows can be SIMD'd for
|
||||||
// even r5g6b5 surfaces pretty much everywhere.
|
// even r5g6b5 surfaces pretty much everywhere.
|
||||||
rect.width = std::max(aRequestedRect.width, 64);
|
rect.width = std::max(aRequestedRect.width, 64);
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
// Set a minumum height to guarantee a minumum height of buffers we
|
|
||||||
// allocate. Some GL implementations fail to render gralloc textures
|
|
||||||
// with a height 9px-16px. It happens on Adreno 200. Adreno 320 does not
|
|
||||||
// have this problem. 32 is choosed as alignment of gralloc buffers.
|
|
||||||
// See Bug 873937.
|
|
||||||
// Increase the height only when the requested height is more than 0.
|
|
||||||
// See Bug 895976.
|
|
||||||
// XXX it might be better to disable it on the gpu that does not have
|
|
||||||
// the height problem.
|
|
||||||
if (rect.height > 0) {
|
|
||||||
rect.height = std::max(aRequestedRect.height, 32);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return rect;
|
return rect;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -480,7 +466,7 @@ RotatedContentBuffer::BeginPaint(PaintedLayer* aLayer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (mode == SurfaceMode::SURFACE_COMPONENT_ALPHA) {
|
if (mode == SurfaceMode::SURFACE_COMPONENT_ALPHA) {
|
||||||
#if defined(MOZ_GFX_OPTIMIZE_MOBILE) || defined(MOZ_WIDGET_GONK)
|
#if defined(MOZ_GFX_OPTIMIZE_MOBILE)
|
||||||
mode = SurfaceMode::SURFACE_SINGLE_CHANNEL_ALPHA;
|
mode = SurfaceMode::SURFACE_SINGLE_CHANNEL_ALPHA;
|
||||||
#else
|
#else
|
||||||
if (!aLayer->GetParent() ||
|
if (!aLayer->GetParent() ||
|
||||||
|
|||||||
@@ -22,10 +22,6 @@
|
|||||||
#include "nsRegion.h" // for nsIntRegion
|
#include "nsRegion.h" // for nsIntRegion
|
||||||
#include "nsTArray.h" // for nsTArray
|
#include "nsTArray.h" // for nsTArray
|
||||||
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
|
|
||||||
#include <ui/Fence.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
|
|
||||||
struct TileUnit {};
|
struct TileUnit {};
|
||||||
|
|||||||
@@ -1,306 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
* 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/. */
|
|
||||||
|
|
||||||
#include "GrallocTextureHostBasic.h"
|
|
||||||
#include "GrallocImages.h" // for GetDataSourceSurfaceFrom()
|
|
||||||
#include "mozilla/layers/SharedBufferManagerParent.h"
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 17
|
|
||||||
#include <ui/Fence.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace mozilla {
|
|
||||||
namespace layers {
|
|
||||||
|
|
||||||
static gfx::SurfaceFormat
|
|
||||||
HalFormatToSurfaceFormat(int aHalFormat, TextureFlags aFlags)
|
|
||||||
{
|
|
||||||
bool swapRB = bool(aFlags & TextureFlags::RB_SWAPPED);
|
|
||||||
switch (aHalFormat) {
|
|
||||||
case android::PIXEL_FORMAT_BGRA_8888:
|
|
||||||
return swapRB ? gfx::SurfaceFormat::R8G8B8A8 : gfx::SurfaceFormat::B8G8R8A8;
|
|
||||||
case android::PIXEL_FORMAT_RGBA_8888:
|
|
||||||
return swapRB ? gfx::SurfaceFormat::B8G8R8A8 : gfx::SurfaceFormat::R8G8B8A8;
|
|
||||||
case android::PIXEL_FORMAT_RGBX_8888:
|
|
||||||
return swapRB ? gfx::SurfaceFormat::B8G8R8X8 : gfx::SurfaceFormat::R8G8B8X8;
|
|
||||||
case android::PIXEL_FORMAT_RGB_565:
|
|
||||||
return gfx::SurfaceFormat::R5G6B5_UINT16;
|
|
||||||
case HAL_PIXEL_FORMAT_YCbCr_422_SP:
|
|
||||||
case HAL_PIXEL_FORMAT_YCrCb_420_SP:
|
|
||||||
case HAL_PIXEL_FORMAT_YCbCr_422_I:
|
|
||||||
case GrallocImage::HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
|
|
||||||
case GrallocImage::HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
|
|
||||||
case HAL_PIXEL_FORMAT_YV12:
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
|
|
||||||
case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
|
|
||||||
#endif
|
|
||||||
// Needs convert to RGB565
|
|
||||||
return gfx::SurfaceFormat::R5G6B5_UINT16;
|
|
||||||
default:
|
|
||||||
if (aHalFormat >= 0x100 && aHalFormat <= 0x1FF) {
|
|
||||||
// Reserved range for HAL specific formats.
|
|
||||||
// Needs convert to RGB565
|
|
||||||
return gfx::SurfaceFormat::R5G6B5_UINT16;
|
|
||||||
} else {
|
|
||||||
MOZ_CRASH("GFX: Unhandled HAL pixel format");
|
|
||||||
return gfx::SurfaceFormat::UNKNOWN; // not reached
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
|
||||||
NeedsConvertFromYUVtoRGB565(int aHalFormat)
|
|
||||||
{
|
|
||||||
switch (aHalFormat) {
|
|
||||||
case android::PIXEL_FORMAT_BGRA_8888:
|
|
||||||
case android::PIXEL_FORMAT_RGBA_8888:
|
|
||||||
case android::PIXEL_FORMAT_RGBX_8888:
|
|
||||||
case android::PIXEL_FORMAT_RGB_565:
|
|
||||||
return false;
|
|
||||||
case HAL_PIXEL_FORMAT_YCbCr_422_SP:
|
|
||||||
case HAL_PIXEL_FORMAT_YCrCb_420_SP:
|
|
||||||
case HAL_PIXEL_FORMAT_YCbCr_422_I:
|
|
||||||
case GrallocImage::HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
|
|
||||||
case GrallocImage::HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
|
|
||||||
case HAL_PIXEL_FORMAT_YV12:
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
|
|
||||||
case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
|
|
||||||
#endif
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
if (aHalFormat >= 0x100 && aHalFormat <= 0x1FF) {
|
|
||||||
// Reserved range for HAL specific formats.
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
MOZ_CRASH("GFX: Unhandled HAL pixel format YUV");
|
|
||||||
return false; // not reached
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
GrallocTextureHostBasic::GrallocTextureHostBasic(
|
|
||||||
TextureFlags aFlags,
|
|
||||||
const SurfaceDescriptorGralloc& aDescriptor)
|
|
||||||
: TextureHost(aFlags)
|
|
||||||
, mGrallocHandle(aDescriptor)
|
|
||||||
, mSize(0, 0)
|
|
||||||
, mCropSize(0, 0)
|
|
||||||
, mFormat(gfx::SurfaceFormat::UNKNOWN)
|
|
||||||
, mIsOpaque(aDescriptor.isOpaque())
|
|
||||||
{
|
|
||||||
android::GraphicBuffer* grallocBuffer = GetGraphicBufferFromDesc(mGrallocHandle).get();
|
|
||||||
MOZ_ASSERT(grallocBuffer);
|
|
||||||
|
|
||||||
if (grallocBuffer) {
|
|
||||||
mFormat =
|
|
||||||
HalFormatToSurfaceFormat(grallocBuffer->getPixelFormat(),
|
|
||||||
aFlags & TextureFlags::RB_SWAPPED);
|
|
||||||
mSize = gfx::IntSize(grallocBuffer->getWidth(), grallocBuffer->getHeight());
|
|
||||||
mCropSize = mSize;
|
|
||||||
} else {
|
|
||||||
printf_stderr("gralloc buffer is nullptr\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
GrallocTextureHostBasic::Lock()
|
|
||||||
{
|
|
||||||
if (!mCompositor || !IsValid()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mTextureSource) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
android::sp<android::GraphicBuffer> graphicBuffer =
|
|
||||||
GetGraphicBufferFromDesc(mGrallocHandle);
|
|
||||||
MOZ_ASSERT(graphicBuffer.get());
|
|
||||||
|
|
||||||
RefPtr<gfx::DataSourceSurface> surf;
|
|
||||||
if (NeedsConvertFromYUVtoRGB565(graphicBuffer->getPixelFormat())) {
|
|
||||||
PlanarYCbCrData ycbcrData;
|
|
||||||
surf = GetDataSourceSurfaceFrom(graphicBuffer,
|
|
||||||
mCropSize,
|
|
||||||
ycbcrData);
|
|
||||||
} else {
|
|
||||||
uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN;
|
|
||||||
int32_t rv = graphicBuffer->lock(usage,
|
|
||||||
reinterpret_cast<void**>(&mMappedBuffer));
|
|
||||||
if (rv) {
|
|
||||||
mMappedBuffer = nullptr;
|
|
||||||
NS_WARNING("Couldn't lock graphic buffer");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
surf = gfx::Factory::CreateWrappingDataSourceSurface(
|
|
||||||
mMappedBuffer,
|
|
||||||
graphicBuffer->getStride() * gfx::BytesPerPixel(mFormat),
|
|
||||||
mCropSize,
|
|
||||||
mFormat);
|
|
||||||
}
|
|
||||||
if (surf) {
|
|
||||||
mTextureSource = mCompositor->CreateDataTextureSource(mFlags);
|
|
||||||
mTextureSource->Update(surf, nullptr);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
mMappedBuffer = nullptr;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
GrallocTextureHostBasic::IsValid() const
|
|
||||||
{
|
|
||||||
android::GraphicBuffer* graphicBuffer = GetGraphicBufferFromDesc(mGrallocHandle).get();
|
|
||||||
return graphicBuffer != nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
GrallocTextureHostBasic::BindTextureSource(CompositableTextureSourceRef& aTexture)
|
|
||||||
{
|
|
||||||
aTexture = mTextureSource;
|
|
||||||
return !!aTexture;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureHostBasic::UnbindTextureSource()
|
|
||||||
{
|
|
||||||
TextureHost::UnbindTextureSource();
|
|
||||||
ClearTextureSource();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureHostBasic::ClearTextureSource()
|
|
||||||
{
|
|
||||||
mTextureSource = nullptr;
|
|
||||||
if (mMappedBuffer) {
|
|
||||||
android::GraphicBuffer* graphicBuffer = GetGraphicBufferFromDesc(mGrallocHandle).get();
|
|
||||||
MOZ_ASSERT(graphicBuffer);
|
|
||||||
mMappedBuffer = nullptr;
|
|
||||||
graphicBuffer->unlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureHostBasic::SetCompositor(Compositor* aCompositor)
|
|
||||||
{
|
|
||||||
BasicCompositor* compositor = AssertBasicCompositor(aCompositor);
|
|
||||||
if (!compositor) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mCompositor = compositor;
|
|
||||||
if (mTextureSource) {
|
|
||||||
mTextureSource->SetCompositor(compositor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Compositor*
|
|
||||||
GrallocTextureHostBasic::GetCompositor()
|
|
||||||
{
|
|
||||||
return mCompositor;
|
|
||||||
}
|
|
||||||
|
|
||||||
gfx::SurfaceFormat
|
|
||||||
GrallocTextureHostBasic::GetFormat() const {
|
|
||||||
return mFormat;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureHostBasic::WaitAcquireFenceHandleSyncComplete()
|
|
||||||
{
|
|
||||||
if (!mAcquireFenceHandle.IsValid()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 17
|
|
||||||
RefPtr<FenceHandle::FdObj> fdObj = mAcquireFenceHandle.GetAndResetFdObj();
|
|
||||||
android::sp<android::Fence> fence(
|
|
||||||
new android::Fence(fdObj->GetAndResetFd()));
|
|
||||||
|
|
||||||
// Wait fece complete with timeout.
|
|
||||||
// If a source of the fence becomes invalid because of error,
|
|
||||||
// fene complete is not signaled. See Bug 1061435.
|
|
||||||
int rv = fence->wait(400 /*400 msec*/);
|
|
||||||
if (rv != android::OK) {
|
|
||||||
NS_ERROR("failed to wait fence complete");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureHostBasic::SetCropRect(nsIntRect aCropRect)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(aCropRect.TopLeft() == gfx::IntPoint(0, 0));
|
|
||||||
MOZ_ASSERT(!aCropRect.IsEmpty());
|
|
||||||
MOZ_ASSERT(aCropRect.width <= mSize.width);
|
|
||||||
MOZ_ASSERT(aCropRect.height <= mSize.height);
|
|
||||||
|
|
||||||
gfx::IntSize cropSize(aCropRect.width, aCropRect.height);
|
|
||||||
if (mCropSize == cropSize) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mCropSize = cropSize;
|
|
||||||
ClearTextureSource();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureHostBasic::DeallocateSharedData()
|
|
||||||
{
|
|
||||||
ClearTextureSource();
|
|
||||||
|
|
||||||
if (mGrallocHandle.buffer().type() != MaybeMagicGrallocBufferHandle::Tnull_t) {
|
|
||||||
MaybeMagicGrallocBufferHandle handle = mGrallocHandle.buffer();
|
|
||||||
base::ProcessId owner;
|
|
||||||
if (handle.type() == MaybeMagicGrallocBufferHandle::TGrallocBufferRef) {
|
|
||||||
owner = handle.get_GrallocBufferRef().mOwner;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
owner = handle.get_MagicGrallocBufferHandle().mRef.mOwner;
|
|
||||||
}
|
|
||||||
|
|
||||||
SharedBufferManagerParent::DropGrallocBuffer(owner, mGrallocHandle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureHostBasic::ForgetSharedData()
|
|
||||||
{
|
|
||||||
ClearTextureSource();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureHostBasic::DeallocateDeviceData()
|
|
||||||
{
|
|
||||||
ClearTextureSource();
|
|
||||||
}
|
|
||||||
|
|
||||||
LayerRenderState
|
|
||||||
GrallocTextureHostBasic::GetRenderState()
|
|
||||||
{
|
|
||||||
android::GraphicBuffer* graphicBuffer = GetGraphicBufferFromDesc(mGrallocHandle).get();
|
|
||||||
|
|
||||||
if (graphicBuffer) {
|
|
||||||
LayerRenderStateFlags flags = LayerRenderStateFlags::LAYER_RENDER_STATE_DEFAULT;
|
|
||||||
if (mIsOpaque) {
|
|
||||||
flags |= LayerRenderStateFlags::OPAQUE;
|
|
||||||
}
|
|
||||||
if (mFlags & TextureFlags::ORIGIN_BOTTOM_LEFT) {
|
|
||||||
flags |= LayerRenderStateFlags::ORIGIN_BOTTOM_LEFT;
|
|
||||||
}
|
|
||||||
if (mFlags & TextureFlags::RB_SWAPPED) {
|
|
||||||
flags |= LayerRenderStateFlags::FORMAT_RB_SWAP;
|
|
||||||
}
|
|
||||||
return LayerRenderState(graphicBuffer,
|
|
||||||
mCropSize,
|
|
||||||
flags,
|
|
||||||
this);
|
|
||||||
}
|
|
||||||
|
|
||||||
return LayerRenderState();
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace layers
|
|
||||||
} // namespace mozilla
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
* 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_GRALLOCTEXTUREHOST_BASIC_H
|
|
||||||
#define MOZILLA_GFX_GRALLOCTEXTUREHOST_BASIC_H
|
|
||||||
|
|
||||||
#include "mozilla/layers/BasicCompositor.h"
|
|
||||||
#include "mozilla/layers/ShadowLayerUtilsGralloc.h"
|
|
||||||
#include "mozilla/layers/TextureHostBasic.h"
|
|
||||||
|
|
||||||
namespace mozilla {
|
|
||||||
namespace layers {
|
|
||||||
|
|
||||||
class BasicCompositor;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A TextureHost for shared gralloc
|
|
||||||
*
|
|
||||||
* Most of the logic actually happens in GrallocTextureSourceBasic.
|
|
||||||
*/
|
|
||||||
class GrallocTextureHostBasic : public TextureHost
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
GrallocTextureHostBasic(TextureFlags aFlags,
|
|
||||||
const SurfaceDescriptorGralloc& aDescriptor);
|
|
||||||
|
|
||||||
virtual void SetCompositor(Compositor* aCompositor) override;
|
|
||||||
|
|
||||||
virtual Compositor* GetCompositor() override;
|
|
||||||
|
|
||||||
virtual bool Lock() override;
|
|
||||||
|
|
||||||
virtual gfx::SurfaceFormat GetFormat() const override;
|
|
||||||
|
|
||||||
virtual bool BindTextureSource(CompositableTextureSourceRef& aTexture) override;
|
|
||||||
|
|
||||||
virtual void UnbindTextureSource() override;
|
|
||||||
|
|
||||||
virtual already_AddRefed<gfx::DataSourceSurface> GetAsSurface() override
|
|
||||||
{
|
|
||||||
return nullptr; // XXX - implement this (for MOZ_DUMP_PAINTING)
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void WaitAcquireFenceHandleSyncComplete() override;
|
|
||||||
|
|
||||||
virtual gfx::IntSize GetSize() const override { return mCropSize; }
|
|
||||||
|
|
||||||
virtual void SetCropRect(nsIntRect aCropRect) override;
|
|
||||||
|
|
||||||
virtual void DeallocateSharedData() override;
|
|
||||||
|
|
||||||
virtual void ForgetSharedData() override;
|
|
||||||
|
|
||||||
virtual void DeallocateDeviceData() override;
|
|
||||||
|
|
||||||
virtual LayerRenderState GetRenderState() override;
|
|
||||||
|
|
||||||
bool IsValid() const;
|
|
||||||
|
|
||||||
void ClearTextureSource();
|
|
||||||
|
|
||||||
#ifdef MOZ_LAYERS_HAVE_LOG
|
|
||||||
virtual const char* Name() override { return "GrallocTextureHostBasic"; }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
protected:
|
|
||||||
RefPtr<BasicCompositor> mCompositor;
|
|
||||||
RefPtr<DataTextureSource> mTextureSource;
|
|
||||||
SurfaceDescriptorGralloc mGrallocHandle;
|
|
||||||
// gralloc buffer size.
|
|
||||||
gfx::IntSize mSize;
|
|
||||||
// Size reported by TextureClient, can be different in some cases (video?),
|
|
||||||
// used by LayerRenderState.
|
|
||||||
gfx::IntSize mCropSize;
|
|
||||||
gfx::SurfaceFormat mFormat;
|
|
||||||
bool mIsOpaque;
|
|
||||||
/**
|
|
||||||
* Points to a mapped gralloc buffer when TextureSource is valid.
|
|
||||||
*/
|
|
||||||
uint8_t* mMappedBuffer;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace layers
|
|
||||||
} // namespace mozilla
|
|
||||||
|
|
||||||
#endif // MOZILLA_GFX_GRALLOCTEXTUREHOST_BASIC_H
|
|
||||||
@@ -7,9 +7,6 @@
|
|||||||
#ifdef XP_MACOSX
|
#ifdef XP_MACOSX
|
||||||
#include "MacIOSurfaceTextureHostBasic.h"
|
#include "MacIOSurfaceTextureHostBasic.h"
|
||||||
#endif
|
#endif
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#include "GrallocTextureHostBasic.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using namespace mozilla::gl;
|
using namespace mozilla::gl;
|
||||||
using namespace mozilla::gfx;
|
using namespace mozilla::gfx;
|
||||||
@@ -28,13 +25,6 @@ CreateTextureHostBasic(const SurfaceDescriptor& aDesc,
|
|||||||
aDesc.get_SurfaceDescriptorMacIOSurface();
|
aDesc.get_SurfaceDescriptorMacIOSurface();
|
||||||
return MakeAndAddRef<MacIOSurfaceTextureHostBasic>(aFlags, desc);
|
return MakeAndAddRef<MacIOSurfaceTextureHostBasic>(aFlags, desc);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
if (aDesc.type() == SurfaceDescriptor::TSurfaceDescriptorGralloc) {
|
|
||||||
const SurfaceDescriptorGralloc& desc =
|
|
||||||
aDesc.get_SurfaceDescriptorGralloc();
|
|
||||||
return MakeAndAddRef<GrallocTextureHostBasic>(aFlags, desc);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
return CreateBackendIndependentTextureHost(aDesc, aDeallocator, aFlags);
|
return CreateBackendIndependentTextureHost(aDesc, aDeallocator, aFlags);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
#include "mozilla/layers/AsyncCanvasRenderer.h"
|
#include "mozilla/layers/AsyncCanvasRenderer.h"
|
||||||
#include "mozilla/layers/CompositableForwarder.h"
|
#include "mozilla/layers/CompositableForwarder.h"
|
||||||
#include "mozilla/layers/CompositorBridgeChild.h" // for CompositorBridgeChild
|
#include "mozilla/layers/CompositorBridgeChild.h" // for CompositorBridgeChild
|
||||||
#include "mozilla/layers/GrallocTextureClient.h"
|
|
||||||
#include "mozilla/layers/LayersTypes.h"
|
#include "mozilla/layers/LayersTypes.h"
|
||||||
#include "mozilla/layers/TextureClient.h" // for TextureClient, etc
|
#include "mozilla/layers/TextureClient.h" // for TextureClient, etc
|
||||||
#include "mozilla/layers/TextureClientOGL.h"
|
#include "mozilla/layers/TextureClientOGL.h"
|
||||||
|
|||||||
@@ -238,7 +238,7 @@ ClientLayerManager::BeginTransactionWithTarget(gfxContext* aTarget)
|
|||||||
//
|
//
|
||||||
// Desktop does not support async zoom yet, so we ignore this for those
|
// Desktop does not support async zoom yet, so we ignore this for those
|
||||||
// platforms.
|
// platforms.
|
||||||
#if defined(MOZ_WIDGET_ANDROID) || defined(MOZ_WIDGET_GONK) || defined(MOZ_WIDGET_UIKIT)
|
#if defined(MOZ_WIDGET_ANDROID) || defined(MOZ_WIDGET_UIKIT)
|
||||||
if (mWidget && mWidget->GetOwningTabChild()) {
|
if (mWidget && mWidget->GetOwningTabChild()) {
|
||||||
mCompositorMightResample = AsyncPanZoomEnabled();
|
mCompositorMightResample = AsyncPanZoomEnabled();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ ClientTiledPaintedLayer::BeginPaint()
|
|||||||
|
|
||||||
if (!displayPortAncestor || !scrollAncestor) {
|
if (!displayPortAncestor || !scrollAncestor) {
|
||||||
// No displayport or scroll ancestor, so we can't do progressive rendering.
|
// No displayport or scroll ancestor, so we can't do progressive rendering.
|
||||||
#if defined(MOZ_WIDGET_ANDROID) || defined(MOZ_WIDGET_GONK)
|
#if defined(MOZ_WIDGET_ANDROID)
|
||||||
// Both Android and b2g on phones are guaranteed to have a displayport set, so this
|
// Both Android and b2g on phones are guaranteed to have a displayport set, so this
|
||||||
// should never happen.
|
// should never happen.
|
||||||
NS_WARNING("Tiled PaintedLayer with no scrollable container ancestor");
|
NS_WARNING("Tiled PaintedLayer with no scrollable container ancestor");
|
||||||
|
|||||||
@@ -33,10 +33,6 @@
|
|||||||
#include "nsISupportsImpl.h" // for Image::Release, etc
|
#include "nsISupportsImpl.h" // for Image::Release, etc
|
||||||
#include "nsRect.h" // for mozilla::gfx::IntRect
|
#include "nsRect.h" // for mozilla::gfx::IntRect
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#include "GrallocImages.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
namespace layers {
|
namespace layers {
|
||||||
|
|
||||||
@@ -222,28 +218,6 @@ ImageClientSingle::UpdateImage(ImageContainer* aContainer, uint32_t aContentFlag
|
|||||||
for (auto& img : images) {
|
for (auto& img : images) {
|
||||||
Image* image = img.mImage;
|
Image* image = img.mImage;
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
if (image->GetFormat() == ImageFormat::OVERLAY_IMAGE) {
|
|
||||||
OverlayImage* overlayImage = static_cast<OverlayImage*>(image);
|
|
||||||
OverlaySource source;
|
|
||||||
if (overlayImage->GetSidebandStream().IsValid()) {
|
|
||||||
// Duplicate GonkNativeHandle::NhObj for ipc,
|
|
||||||
// since ParamTraits<GonkNativeHandle>::Write() absorbs native_handle_t.
|
|
||||||
RefPtr<GonkNativeHandle::NhObj> nhObj = overlayImage->GetSidebandStream().GetDupNhObj();
|
|
||||||
GonkNativeHandle handle(nhObj);
|
|
||||||
if (!handle.IsValid()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
source.handle() = OverlayHandle(handle);
|
|
||||||
} else {
|
|
||||||
source.handle() = OverlayHandle(overlayImage->GetOverlayId());
|
|
||||||
}
|
|
||||||
source.size() = overlayImage->GetSize();
|
|
||||||
GetForwarder()->UseOverlaySource(this, source, image->GetPictureRect());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
RefPtr<TextureClient> texture = image->GetTextureClient(GetForwarder());
|
RefPtr<TextureClient> texture = image->GetTextureClient(GetForwarder());
|
||||||
const bool hasTextureClient = !!texture;
|
const bool hasTextureClient = !!texture;
|
||||||
|
|
||||||
|
|||||||
@@ -53,11 +53,6 @@
|
|||||||
#include "mozilla/layers/MacIOSurfaceTextureClientOGL.h"
|
#include "mozilla/layers/MacIOSurfaceTextureClientOGL.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#include <cutils/properties.h>
|
|
||||||
#include "mozilla/layers/GrallocTextureClient.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
#define RECYCLE_LOG(...) printf_stderr(__VA_ARGS__)
|
#define RECYCLE_LOG(...) printf_stderr(__VA_ARGS__)
|
||||||
#else
|
#else
|
||||||
@@ -726,13 +721,6 @@ TextureClient::WaitForBufferOwnership(bool aWaitReleaseFence)
|
|||||||
if (mFenceHandleWaiter) {
|
if (mFenceHandleWaiter) {
|
||||||
mFenceHandleWaiter->WaitComplete();
|
mFenceHandleWaiter->WaitComplete();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION < 21
|
|
||||||
if (aWaitReleaseFence && mReleaseFenceHandle.IsValid()) {
|
|
||||||
mData->WaitForFence(&mReleaseFenceHandle);
|
|
||||||
mReleaseFenceHandle = FenceHandle();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// static
|
// static
|
||||||
@@ -1131,13 +1119,6 @@ TextureClient::CreateForDrawing(TextureForwarder* aAllocator,
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
if (!data && aSize.width <= aMaxTextureSize && aSize.height <= aMaxTextureSize) {
|
|
||||||
data = GrallocTextureData::CreateForDrawing(aSize, aFormat, moz2DBackend,
|
|
||||||
aAllocator);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef XP_MACOSX
|
#ifdef XP_MACOSX
|
||||||
if (!data && gfxPrefs::UseIOSurfaceTextures()) {
|
if (!data && gfxPrefs::UseIOSurfaceTextures()) {
|
||||||
data = MacIOSurfaceTextureData::Create(aSize, aFormat, moz2DBackend);
|
data = MacIOSurfaceTextureData::Create(aSize, aFormat, moz2DBackend);
|
||||||
|
|||||||
@@ -42,17 +42,12 @@ namespace mozilla {
|
|||||||
#define GFX_DEBUG_TRACK_CLIENTS_IN_POOL 1
|
#define GFX_DEBUG_TRACK_CLIENTS_IN_POOL 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace gl {
|
|
||||||
class SharedSurface_Gralloc;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace layers {
|
namespace layers {
|
||||||
|
|
||||||
class AsyncTransactionWaiter;
|
class AsyncTransactionWaiter;
|
||||||
class BufferTextureData;
|
class BufferTextureData;
|
||||||
class CompositableForwarder;
|
class CompositableForwarder;
|
||||||
class KnowsCompositor;
|
class KnowsCompositor;
|
||||||
class GrallocTextureData;
|
|
||||||
class LayersIPCChannel;
|
class LayersIPCChannel;
|
||||||
class CompositableClient;
|
class CompositableClient;
|
||||||
struct PlanarYCbCrData;
|
struct PlanarYCbCrData;
|
||||||
@@ -306,8 +301,6 @@ public:
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
virtual GrallocTextureData* AsGrallocTextureData() { return nullptr; }
|
|
||||||
|
|
||||||
virtual BufferTextureData* AsBufferTextureData() { return nullptr; }
|
virtual BufferTextureData* AsBufferTextureData() { return nullptr; }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -652,15 +645,8 @@ public:
|
|||||||
|
|
||||||
bool NeedsFenceHandle()
|
bool NeedsFenceHandle()
|
||||||
{
|
{
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
|
|
||||||
if (!mData) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return !!mData->AsGrallocTextureData();
|
|
||||||
#else
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void WaitFenceHandleOnImageBridge(Mutex& aMutex);
|
void WaitFenceHandleOnImageBridge(Mutex& aMutex);
|
||||||
void ClearWaitFenceHandleOnImageBridge(Mutex& aMutex);
|
void ClearWaitFenceHandleOnImageBridge(Mutex& aMutex);
|
||||||
@@ -731,7 +717,6 @@ private:
|
|||||||
void Finalize() {}
|
void Finalize() {}
|
||||||
|
|
||||||
friend class AtomicRefCountedWithFinalize<TextureClient>;
|
friend class AtomicRefCountedWithFinalize<TextureClient>;
|
||||||
friend class gl::SharedSurface_Gralloc;
|
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* Should only be called *once* per texture, in TextureClient::InitIPDLActor.
|
* Should only be called *once* per texture, in TextureClient::InitIPDLActor.
|
||||||
|
|||||||
@@ -13,11 +13,6 @@
|
|||||||
#include "nsThreadUtils.h"
|
#include "nsThreadUtils.h"
|
||||||
#include "SharedSurface.h"
|
#include "SharedSurface.h"
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#include "mozilla/layers/GrallocTextureClient.h"
|
|
||||||
#include "SharedSurfaceGralloc.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
using namespace mozilla::gl;
|
using namespace mozilla::gl;
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
@@ -73,67 +68,6 @@ SharedSurfaceTextureClient::Create(UniquePtr<gl::SharedSurface> surf, gl::Surfac
|
|||||||
return MakeAndAddRef<SharedSurfaceTextureClient>(data, flags, aAllocator);
|
return MakeAndAddRef<SharedSurfaceTextureClient>(data, flags, aAllocator);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
SharedSurfaceTextureClient::SetReleaseFenceHandle(const FenceHandle& aReleaseFenceHandle)
|
|
||||||
{
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
gl::SharedSurface_Gralloc* surf = nullptr;
|
|
||||||
if (Surf()->mType == gl::SharedSurfaceType::Gralloc) {
|
|
||||||
surf = gl::SharedSurface_Gralloc::Cast(Surf());
|
|
||||||
}
|
|
||||||
if (surf && surf->GetTextureClient()) {
|
|
||||||
surf->GetTextureClient()->SetReleaseFenceHandle(aReleaseFenceHandle);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
TextureClient::SetReleaseFenceHandle(aReleaseFenceHandle);
|
|
||||||
}
|
|
||||||
|
|
||||||
FenceHandle
|
|
||||||
SharedSurfaceTextureClient::GetAndResetReleaseFenceHandle()
|
|
||||||
{
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
gl::SharedSurface_Gralloc* surf = nullptr;
|
|
||||||
if (Surf()->mType == gl::SharedSurfaceType::Gralloc) {
|
|
||||||
surf = gl::SharedSurface_Gralloc::Cast(Surf());
|
|
||||||
}
|
|
||||||
if (surf && surf->GetTextureClient()) {
|
|
||||||
return surf->GetTextureClient()->GetAndResetReleaseFenceHandle();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return TextureClient::GetAndResetReleaseFenceHandle();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SharedSurfaceTextureClient::SetAcquireFenceHandle(const FenceHandle& aAcquireFenceHandle)
|
|
||||||
{
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
gl::SharedSurface_Gralloc* surf = nullptr;
|
|
||||||
if (Surf()->mType == gl::SharedSurfaceType::Gralloc) {
|
|
||||||
surf = gl::SharedSurface_Gralloc::Cast(Surf());
|
|
||||||
}
|
|
||||||
if (surf && surf->GetTextureClient()) {
|
|
||||||
return surf->GetTextureClient()->SetAcquireFenceHandle(aAcquireFenceHandle);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
TextureClient::SetAcquireFenceHandle(aAcquireFenceHandle);
|
|
||||||
}
|
|
||||||
|
|
||||||
const FenceHandle&
|
|
||||||
SharedSurfaceTextureClient::GetAcquireFenceHandle() const
|
|
||||||
{
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
gl::SharedSurface_Gralloc* surf = nullptr;
|
|
||||||
if (Surf()->mType == gl::SharedSurfaceType::Gralloc) {
|
|
||||||
surf = gl::SharedSurface_Gralloc::Cast(Surf());
|
|
||||||
}
|
|
||||||
if (surf && surf->GetTextureClient()) {
|
|
||||||
return surf->GetTextureClient()->GetAcquireFenceHandle();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return TextureClient::GetAcquireFenceHandle();
|
|
||||||
}
|
|
||||||
|
|
||||||
SharedSurfaceTextureClient::~SharedSurfaceTextureClient()
|
SharedSurfaceTextureClient::~SharedSurfaceTextureClient()
|
||||||
{
|
{
|
||||||
// XXX - Things break when using the proper destruction handshake with
|
// XXX - Things break when using the proper destruction handshake with
|
||||||
|
|||||||
@@ -66,14 +66,6 @@ public:
|
|||||||
Create(UniquePtr<gl::SharedSurface> surf, gl::SurfaceFactory* factory,
|
Create(UniquePtr<gl::SharedSurface> surf, gl::SurfaceFactory* factory,
|
||||||
LayersIPCChannel* aAllocator, TextureFlags aFlags);
|
LayersIPCChannel* aAllocator, TextureFlags aFlags);
|
||||||
|
|
||||||
virtual void SetReleaseFenceHandle(const FenceHandle& aReleaseFenceHandle) override;
|
|
||||||
|
|
||||||
virtual FenceHandle GetAndResetReleaseFenceHandle() override;
|
|
||||||
|
|
||||||
virtual void SetAcquireFenceHandle(const FenceHandle& aAcquireFenceHandle) override;
|
|
||||||
|
|
||||||
virtual const FenceHandle& GetAcquireFenceHandle() const override;
|
|
||||||
|
|
||||||
gl::SharedSurface* Surf() const {
|
gl::SharedSurface* Surf() const {
|
||||||
return static_cast<const SharedSurfaceTextureData*>(GetInternalData())->Surf();
|
return static_cast<const SharedSurfaceTextureData*>(GetInternalData())->Surf();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -308,7 +308,7 @@ ClientTiledLayerBuffer::GetContentType(SurfaceMode* aMode) const
|
|||||||
SurfaceMode mode = mPaintedLayer.GetSurfaceMode();
|
SurfaceMode mode = mPaintedLayer.GetSurfaceMode();
|
||||||
|
|
||||||
if (mode == SurfaceMode::SURFACE_COMPONENT_ALPHA) {
|
if (mode == SurfaceMode::SURFACE_COMPONENT_ALPHA) {
|
||||||
#if defined(MOZ_GFX_OPTIMIZE_MOBILE) || defined(MOZ_WIDGET_GONK)
|
#if defined(MOZ_GFX_OPTIMIZE_MOBILE)
|
||||||
mode = SurfaceMode::SURFACE_SINGLE_CHANNEL_ALPHA;
|
mode = SurfaceMode::SURFACE_SINGLE_CHANNEL_ALPHA;
|
||||||
#else
|
#else
|
||||||
if (!mPaintedLayer.GetParent() ||
|
if (!mPaintedLayer.GetParent() ||
|
||||||
@@ -319,7 +319,7 @@ ClientTiledLayerBuffer::GetContentType(SurfaceMode* aMode) const
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
} else if (mode == SurfaceMode::SURFACE_OPAQUE) {
|
} else if (mode == SurfaceMode::SURFACE_OPAQUE) {
|
||||||
#if defined(MOZ_GFX_OPTIMIZE_MOBILE) || defined(MOZ_WIDGET_GONK)
|
#if defined(MOZ_GFX_OPTIMIZE_MOBILE)
|
||||||
if (IsLowPrecision()) {
|
if (IsLowPrecision()) {
|
||||||
// If we're in low-res mode, drawing can sample from outside the visible
|
// If we're in low-res mode, drawing can sample from outside the visible
|
||||||
// region. Make sure that we only sample transparency if that happens.
|
// region. Make sure that we only sample transparency if that happens.
|
||||||
|
|||||||
@@ -703,15 +703,6 @@ LayerRenderState
|
|||||||
ImageHostOverlay::GetRenderState()
|
ImageHostOverlay::GetRenderState()
|
||||||
{
|
{
|
||||||
LayerRenderState state;
|
LayerRenderState state;
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
if (mOverlay.handle().type() == OverlayHandle::Tint32_t) {
|
|
||||||
state.SetOverlayId(mOverlay.handle().get_int32_t());
|
|
||||||
} else if (mOverlay.handle().type() == OverlayHandle::TGonkNativeHandle) {
|
|
||||||
state.SetSidebandStream(mOverlay.handle().get_GonkNativeHandle());
|
|
||||||
}
|
|
||||||
state.mSize.width = mPictureRect.Width();
|
|
||||||
state.mSize.height = mPictureRect.Height();
|
|
||||||
#endif
|
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -58,16 +58,12 @@
|
|||||||
#include <android/log.h>
|
#include <android/log.h>
|
||||||
#include <android/native_window.h>
|
#include <android/native_window.h>
|
||||||
#endif
|
#endif
|
||||||
#if defined(MOZ_WIDGET_ANDROID) || defined(MOZ_WIDGET_GONK)
|
#if defined(MOZ_WIDGET_ANDROID)
|
||||||
#include "opengl/CompositorOGL.h"
|
#include "opengl/CompositorOGL.h"
|
||||||
#include "GLContextEGL.h"
|
#include "GLContextEGL.h"
|
||||||
#include "GLContextProvider.h"
|
#include "GLContextProvider.h"
|
||||||
#include "ScopedGLHelpers.h"
|
#include "ScopedGLHelpers.h"
|
||||||
#endif
|
#endif
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#include "nsScreenManagerGonk.h"
|
|
||||||
#include "nsWindow.h"
|
|
||||||
#endif
|
|
||||||
#include "GeckoProfiler.h"
|
#include "GeckoProfiler.h"
|
||||||
#include "TextRenderer.h" // for TextRenderer
|
#include "TextRenderer.h" // for TextRenderer
|
||||||
#include "mozilla/layers/CompositorBridgeParent.h"
|
#include "mozilla/layers/CompositorBridgeParent.h"
|
||||||
@@ -481,7 +477,7 @@ LayerManagerComposite::UpdateAndRender()
|
|||||||
}
|
}
|
||||||
|
|
||||||
Render(invalid, opaque);
|
Render(invalid, opaque);
|
||||||
#if defined(MOZ_WIDGET_ANDROID) || defined(MOZ_WIDGET_GONK)
|
#if defined(MOZ_WIDGET_ANDROID)
|
||||||
RenderToPresentationSurface();
|
RenderToPresentationSurface();
|
||||||
#endif
|
#endif
|
||||||
mGeometryChanged = false;
|
mGeometryChanged = false;
|
||||||
@@ -1006,7 +1002,7 @@ LayerManagerComposite::Render(const nsIntRegion& aInvalidRegion, const nsIntRegi
|
|||||||
RecordFrame();
|
RecordFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(MOZ_WIDGET_ANDROID) || defined(MOZ_WIDGET_GONK)
|
#if defined(MOZ_WIDGET_ANDROID)
|
||||||
class ScopedCompositorProjMatrix {
|
class ScopedCompositorProjMatrix {
|
||||||
public:
|
public:
|
||||||
ScopedCompositorProjMatrix(CompositorOGL* aCompositor, const Matrix4x4& aProjMatrix):
|
ScopedCompositorProjMatrix(CompositorOGL* aCompositor, const Matrix4x4& aProjMatrix):
|
||||||
@@ -1113,40 +1109,6 @@ LayerManagerComposite::RenderToPresentationSurface()
|
|||||||
const IntSize windowSize(ANativeWindow_getWidth(window),
|
const IntSize windowSize(ANativeWindow_getWidth(window),
|
||||||
ANativeWindow_getHeight(window));
|
ANativeWindow_getHeight(window));
|
||||||
|
|
||||||
#elif defined(MOZ_WIDGET_GONK)
|
|
||||||
CompositorOGL* compositor = mCompositor->AsCompositorOGL();
|
|
||||||
nsScreenGonk* screen = static_cast<nsWindow*>(mCompositor->GetWidget()->RealWidget())->GetScreen();
|
|
||||||
if (!screen->IsPrimaryScreen()) {
|
|
||||||
// Only primary screen support mirroring
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsWindow* mirrorScreenWidget = screen->GetMirroringWidget();
|
|
||||||
if (!mirrorScreenWidget) {
|
|
||||||
// No mirroring
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsScreenGonk* mirrorScreen = mirrorScreenWidget->GetScreen();
|
|
||||||
if (!mirrorScreen->GetTopWindows().IsEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
EGLSurface surface = mirrorScreen->GetEGLSurface();
|
|
||||||
if (surface == LOCAL_EGL_NO_SURFACE) {
|
|
||||||
// Create GLContext
|
|
||||||
RefPtr<GLContext> gl = gl::GLContextProvider::CreateForWindow(mirrorScreenWidget, false);
|
|
||||||
mirrorScreenWidget->SetNativeData(NS_NATIVE_OPENGL_CONTEXT,
|
|
||||||
reinterpret_cast<uintptr_t>(gl.get()));
|
|
||||||
surface = mirrorScreen->GetEGLSurface();
|
|
||||||
if (surface == LOCAL_EGL_NO_SURFACE) {
|
|
||||||
// Failed to create EGLSurface
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GLContext* gl = compositor->gl();
|
|
||||||
GLContextEGL* egl = GLContextEGL::Cast(gl);
|
|
||||||
const IntSize windowSize = mirrorScreen->GetNaturalBounds().Size().ToUnknownSize();
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ((windowSize.width <= 0) || (windowSize.height <= 0)) {
|
if ((windowSize.width <= 0) || (windowSize.height <= 0)) {
|
||||||
@@ -1213,15 +1175,6 @@ LayerManagerComposite::RenderToPresentationSurface()
|
|||||||
RootLayer()->RenderLayer(clipRect);
|
RootLayer()->RenderLayer(clipRect);
|
||||||
|
|
||||||
mCompositor->EndFrame();
|
mCompositor->EndFrame();
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
mCompositor->SetDispAcquireFence(mRoot); // Call after EndFrame()
|
|
||||||
|
|
||||||
RefPtr<Composer2D> composer2D;
|
|
||||||
composer2D = mCompositor->GetWidget()->GetComposer2D();
|
|
||||||
if (composer2D) {
|
|
||||||
composer2D->Render(mirrorScreenWidget);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -326,7 +326,7 @@ private:
|
|||||||
* Render the current layer tree to the active target.
|
* Render the current layer tree to the active target.
|
||||||
*/
|
*/
|
||||||
void Render(const nsIntRegion& aInvalidRegion, const nsIntRegion& aOpaqueRegion);
|
void Render(const nsIntRegion& aInvalidRegion, const nsIntRegion& aOpaqueRegion);
|
||||||
#if defined(MOZ_WIDGET_ANDROID) || defined(MOZ_WIDGET_GONK)
|
#if defined(MOZ_WIDGET_ANDROID)
|
||||||
void RenderToPresentationSurface();
|
void RenderToPresentationSurface();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -35,11 +35,6 @@
|
|||||||
#include "../d3d11/CompositorD3D11.h"
|
#include "../d3d11/CompositorD3D11.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#include "../opengl/GrallocTextureClient.h"
|
|
||||||
#include "../opengl/GrallocTextureHost.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MOZ_X11
|
#ifdef MOZ_X11
|
||||||
#include "mozilla/layers/X11TextureHost.h"
|
#include "mozilla/layers/X11TextureHost.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -241,7 +236,6 @@ TextureHost::Create(const SurfaceDescriptor& aDesc,
|
|||||||
case SurfaceDescriptor::TSurfaceDescriptorSharedGLTexture:
|
case SurfaceDescriptor::TSurfaceDescriptorSharedGLTexture:
|
||||||
return CreateTextureHostOGL(aDesc, aDeallocator, aFlags);
|
return CreateTextureHostOGL(aDesc, aDeallocator, aFlags);
|
||||||
|
|
||||||
case SurfaceDescriptor::TSurfaceDescriptorGralloc:
|
|
||||||
case SurfaceDescriptor::TSurfaceDescriptorMacIOSurface:
|
case SurfaceDescriptor::TSurfaceDescriptorMacIOSurface:
|
||||||
if (aBackend == LayersBackend::LAYERS_OPENGL) {
|
if (aBackend == LayersBackend::LAYERS_OPENGL) {
|
||||||
return CreateTextureHostOGL(aDesc, aDeallocator, aFlags);
|
return CreateTextureHostOGL(aDesc, aDeallocator, aFlags);
|
||||||
@@ -386,9 +380,8 @@ TextureHost::NotifyNotUsed()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Do not need to call NotifyNotUsed() if TextureHost does not have
|
// Do not need to call NotifyNotUsed() if TextureHost does not have
|
||||||
// TextureFlags::RECYCLE flag and TextureHost is not GrallocTextureHostOGL.
|
// TextureFlags::RECYCLE flag.
|
||||||
if (!(GetFlags() & TextureFlags::RECYCLE) &&
|
if (!(GetFlags() & TextureFlags::RECYCLE)) {
|
||||||
!AsGrallocTextureHostOGL()) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -397,13 +390,11 @@ TextureHost::NotifyNotUsed()
|
|||||||
// - TextureHost does not have Compositor.
|
// - TextureHost does not have Compositor.
|
||||||
// - Compositor is BasicCompositor.
|
// - Compositor is BasicCompositor.
|
||||||
// - TextureHost has intermediate buffer.
|
// - TextureHost has intermediate buffer.
|
||||||
// - TextureHost is GrallocTextureHostOGL. Fence object is used to detect
|
|
||||||
// end of buffer usage.
|
// end of buffer usage.
|
||||||
if (!compositor ||
|
if (!compositor ||
|
||||||
compositor->IsDestroyed() ||
|
compositor->IsDestroyed() ||
|
||||||
compositor->AsBasicCompositor() ||
|
compositor->AsBasicCompositor() ||
|
||||||
HasIntermediateBuffer() ||
|
HasIntermediateBuffer()) {
|
||||||
AsGrallocTextureHostOGL()) {
|
|
||||||
static_cast<TextureParent*>(mActor)->NotifyNotUsed(mFwdTransactionId);
|
static_cast<TextureParent*>(mActor)->NotifyNotUsed(mFwdTransactionId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ class Compositor;
|
|||||||
class CompositableParentManager;
|
class CompositableParentManager;
|
||||||
class ReadLockDescriptor;
|
class ReadLockDescriptor;
|
||||||
class CompositorBridgeParent;
|
class CompositorBridgeParent;
|
||||||
class GrallocTextureHostOGL;
|
|
||||||
class SurfaceDescriptor;
|
class SurfaceDescriptor;
|
||||||
class HostIPCAllocator;
|
class HostIPCAllocator;
|
||||||
class ISurfaceAllocator;
|
class ISurfaceAllocator;
|
||||||
@@ -622,8 +621,6 @@ public:
|
|||||||
|
|
||||||
virtual BufferTextureHost* AsBufferTextureHost() { return nullptr; }
|
virtual BufferTextureHost* AsBufferTextureHost() { return nullptr; }
|
||||||
|
|
||||||
virtual GrallocTextureHostOGL* AsGrallocTextureHostOGL() { return nullptr; }
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void ReadUnlock();
|
void ReadUnlock();
|
||||||
|
|
||||||
|
|||||||
@@ -28,10 +28,6 @@
|
|||||||
#include "nsRegion.h" // for nsIntRegion
|
#include "nsRegion.h" // for nsIntRegion
|
||||||
#include "nscore.h" // for nsACString
|
#include "nscore.h" // for nsACString
|
||||||
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
|
|
||||||
#include <ui/Fence.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
|
|
||||||
namespace layers {
|
namespace layers {
|
||||||
|
|||||||
@@ -72,12 +72,6 @@ public:
|
|||||||
const ThebesBufferData& aThebesBufferData,
|
const ThebesBufferData& aThebesBufferData,
|
||||||
const nsIntRegion& aUpdatedRegion) = 0;
|
const nsIntRegion& aUpdatedRegion) = 0;
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
virtual void UseOverlaySource(CompositableClient* aCompositabl,
|
|
||||||
const OverlaySource& aOverlay,
|
|
||||||
const gfx::IntRect& aPictureRect) = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
virtual void Destroy(CompositableChild* aCompositable);
|
virtual void Destroy(CompositableChild* aCompositable);
|
||||||
|
|
||||||
virtual bool DestroyInTransaction(PTextureChild* aTexture, bool synchronously) = 0;
|
virtual bool DestroyInTransaction(PTextureChild* aTexture, bool synchronously) = 0;
|
||||||
|
|||||||
@@ -16,7 +16,6 @@
|
|||||||
#include "mozilla/layers/CompositorTypes.h"
|
#include "mozilla/layers/CompositorTypes.h"
|
||||||
#include "mozilla/layers/ContentHost.h" // for ContentHostBase
|
#include "mozilla/layers/ContentHost.h" // for ContentHostBase
|
||||||
#include "mozilla/layers/ImageBridgeParent.h" // for ImageBridgeParent
|
#include "mozilla/layers/ImageBridgeParent.h" // for ImageBridgeParent
|
||||||
#include "mozilla/layers/SharedBufferManagerParent.h"
|
|
||||||
#include "mozilla/layers/LayerManagerComposite.h"
|
#include "mozilla/layers/LayerManagerComposite.h"
|
||||||
#include "mozilla/layers/LayersSurfaces.h" // for SurfaceDescriptor
|
#include "mozilla/layers/LayersSurfaces.h" // for SurfaceDescriptor
|
||||||
#include "mozilla/layers/LayersTypes.h" // for MOZ_LAYERS_LOG
|
#include "mozilla/layers/LayersTypes.h" // for MOZ_LAYERS_LOG
|
||||||
@@ -61,7 +60,7 @@ ScheduleComposition(CompositableHost* aCompositable)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(DEBUG) || defined(MOZ_WIDGET_GONK)
|
#if defined(DEBUG)
|
||||||
static bool ValidatePictureRect(const mozilla::gfx::IntSize& aSize,
|
static bool ValidatePictureRect(const mozilla::gfx::IntSize& aSize,
|
||||||
const nsIntRect& aPictureRect)
|
const nsIntRect& aPictureRect)
|
||||||
{
|
{
|
||||||
@@ -246,16 +245,6 @@ CompositableParentManager::ReceiveCompositableUpdate(const CompositableOperation
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
case CompositableOperationDetail::TOpUseOverlaySource: {
|
|
||||||
const OpUseOverlaySource& op = aEdit.detail().get_OpUseOverlaySource();
|
|
||||||
if (!ValidatePictureRect(op.overlay().size(), op.picture())) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
compositable->UseOverlaySource(op.overlay(), op.picture());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
default: {
|
default: {
|
||||||
MOZ_ASSERT(false, "bad type");
|
MOZ_ASSERT(false, "bad type");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,10 +14,6 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include "GeckoProfiler.h"
|
#include "GeckoProfiler.h"
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#include "mozilla/layers/GrallocTextureHost.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define TEST_STEPS 1000
|
#define TEST_STEPS 1000
|
||||||
#define DURATION_THRESHOLD 30
|
#define DURATION_THRESHOLD 30
|
||||||
#define THRESHOLD_ABORT_COUNT 5
|
#define THRESHOLD_ABORT_COUNT 5
|
||||||
@@ -275,92 +271,6 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
class TrivialGrallocQuadBench : public BenchTest {
|
|
||||||
public:
|
|
||||||
TrivialGrallocQuadBench()
|
|
||||||
: BenchTest("Travial Gralloc Quad (10s 256x256 quads)")
|
|
||||||
{}
|
|
||||||
|
|
||||||
uint32_t* mBuf;
|
|
||||||
android::sp<android::GraphicBuffer> mGralloc;
|
|
||||||
RefPtr<TextureSource> mTexture;
|
|
||||||
|
|
||||||
virtual void Setup(Compositor* aCompositor, size_t aStep) {
|
|
||||||
mBuf = nullptr;
|
|
||||||
int w = 256;
|
|
||||||
int h = 256;
|
|
||||||
int32_t format = android::PIXEL_FORMAT_RGBA_8888;;
|
|
||||||
mGralloc = new android::GraphicBuffer(w, h,
|
|
||||||
format,
|
|
||||||
android::GraphicBuffer::USAGE_SW_READ_OFTEN |
|
|
||||||
android::GraphicBuffer::USAGE_SW_WRITE_OFTEN |
|
|
||||||
android::GraphicBuffer::USAGE_HW_TEXTURE);
|
|
||||||
mTexture = new mozilla::layers::GrallocTextureSourceOGL((CompositorOGL*)aCompositor, mGralloc.get(), SurfaceFormat::B8G8R8A8);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DrawFrame(Compositor* aCompositor, const gfx::Rect& aScreenRect, size_t aStep) {
|
|
||||||
EffectChain effects;
|
|
||||||
effects.mPrimaryEffect = CreateEffect(aStep);
|
|
||||||
|
|
||||||
DrawFrameTrivialQuad(aCompositor, aScreenRect, aStep, effects);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void Teardown(Compositor* aCompositor) {
|
|
||||||
mGralloc = nullptr;
|
|
||||||
mTexture = nullptr;
|
|
||||||
free(mBuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual already_AddRefed<Effect> CreateEffect(size_t i) {
|
|
||||||
return CreateTexturedEffect(SurfaceFormat::B8G8R8A8, mTexture,
|
|
||||||
SamplingFilter::POINT);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class StressGrallocQuadBench : public BenchTest {
|
|
||||||
public:
|
|
||||||
StressGrallocQuadBench()
|
|
||||||
: BenchTest("Stress Gralloc Quad (10s 256x256 quads)")
|
|
||||||
{}
|
|
||||||
|
|
||||||
uint32_t* mBuf;
|
|
||||||
android::sp<android::GraphicBuffer> mGralloc;
|
|
||||||
RefPtr<TextureSource> mTexture;
|
|
||||||
|
|
||||||
virtual void Setup(Compositor* aCompositor, size_t aStep) {
|
|
||||||
mBuf = nullptr;
|
|
||||||
int w = 256;
|
|
||||||
int h = 256;
|
|
||||||
int32_t format = android::PIXEL_FORMAT_RGBA_8888;;
|
|
||||||
mGralloc = new android::GraphicBuffer(w, h,
|
|
||||||
format,
|
|
||||||
android::GraphicBuffer::USAGE_SW_READ_OFTEN |
|
|
||||||
android::GraphicBuffer::USAGE_SW_WRITE_OFTEN |
|
|
||||||
android::GraphicBuffer::USAGE_HW_TEXTURE);
|
|
||||||
mTexture = new mozilla::layers::GrallocTextureSourceOGL((CompositorOGL*)aCompositor, mGralloc.get(), SurfaceFormat::B8G8R8A8);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DrawFrame(Compositor* aCompositor, const gfx::Rect& aScreenRect, size_t aStep) {
|
|
||||||
EffectChain effects;
|
|
||||||
effects.mPrimaryEffect = CreateEffect(aStep);
|
|
||||||
|
|
||||||
DrawFrameStressQuad(aCompositor, aScreenRect, aStep, effects);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void Teardown(Compositor* aCompositor) {
|
|
||||||
mGralloc = nullptr;
|
|
||||||
mTexture = nullptr;
|
|
||||||
free(mBuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual already_AddRefed<Effect> CreateEffect(size_t i) {
|
|
||||||
return CreateTexturedEffect(SurfaceFormat::B8G8R8A8, mTexture,
|
|
||||||
SamplingFilter::POINT);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void RunCompositorBench(Compositor* aCompositor, const gfx::Rect& aScreenRect)
|
static void RunCompositorBench(Compositor* aCompositor, const gfx::Rect& aScreenRect)
|
||||||
{
|
{
|
||||||
std::vector<BenchTest*> tests;
|
std::vector<BenchTest*> tests;
|
||||||
@@ -371,10 +281,6 @@ static void RunCompositorBench(Compositor* aCompositor, const gfx::Rect& aScreen
|
|||||||
tests.push_back(new EffectSolidColorStressBench());
|
tests.push_back(new EffectSolidColorStressBench());
|
||||||
tests.push_back(new TrivialTexturedQuadBench());
|
tests.push_back(new TrivialTexturedQuadBench());
|
||||||
tests.push_back(new StressTexturedQuadBench());
|
tests.push_back(new StressTexturedQuadBench());
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
tests.push_back(new TrivialGrallocQuadBench());
|
|
||||||
tests.push_back(new StressGrallocQuadBench());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (size_t i = 0; i < tests.size(); i++) {
|
for (size_t i = 0; i < tests.size(); i++) {
|
||||||
BenchTest* test = tests[i];
|
BenchTest* test = tests[i];
|
||||||
|
|||||||
@@ -85,11 +85,6 @@
|
|||||||
# include "mozilla/widget/CompositorWidgetParent.h"
|
# include "mozilla/widget/CompositorWidgetParent.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#include "GeckoTouchDispatcher.h"
|
|
||||||
#include "nsScreenManagerGonk.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "LayerScope.h"
|
#include "LayerScope.h"
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
@@ -349,24 +344,9 @@ CompositorVsyncScheduler::CompositorVsyncScheduler(CompositorBridgeParent* aComp
|
|||||||
, mCurrentCompositeTask(nullptr)
|
, mCurrentCompositeTask(nullptr)
|
||||||
, mSetNeedsCompositeMonitor("SetNeedsCompositeMonitor")
|
, mSetNeedsCompositeMonitor("SetNeedsCompositeMonitor")
|
||||||
, mSetNeedsCompositeTask(nullptr)
|
, mSetNeedsCompositeTask(nullptr)
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
, mDisplayEnabled(false)
|
|
||||||
, mSetDisplayMonitor("SetDisplayMonitor")
|
|
||||||
, mSetDisplayTask(nullptr)
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(NS_IsMainThread() || XRE_GetProcessType() == GeckoProcessType_GPU);
|
MOZ_ASSERT(NS_IsMainThread() || XRE_GetProcessType() == GeckoProcessType_GPU);
|
||||||
mVsyncObserver = new Observer(this);
|
mVsyncObserver = new Observer(this);
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
GeckoTouchDispatcher::GetInstance()->SetCompositorVsyncScheduler(this);
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
RefPtr<nsScreenManagerGonk> screenManager = nsScreenManagerGonk::GetInstance();
|
|
||||||
screenManager->SetCompositorVsyncScheduler(this);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// mAsapScheduling is set on the main thread during init,
|
// mAsapScheduling is set on the main thread during init,
|
||||||
// but is only accessed after on the compositor thread.
|
// but is only accessed after on the compositor thread.
|
||||||
@@ -382,54 +362,6 @@ CompositorVsyncScheduler::~CompositorVsyncScheduler()
|
|||||||
mCompositorBridgeParent = nullptr;
|
mCompositorBridgeParent = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
void
|
|
||||||
CompositorVsyncScheduler::SetDisplay(bool aDisplayEnable)
|
|
||||||
{
|
|
||||||
// SetDisplay() is usually called from nsScreenManager at main thread. Post
|
|
||||||
// to compositor thread if needs.
|
|
||||||
if (!CompositorThreadHolder::IsInCompositorThread()) {
|
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
|
||||||
MonitorAutoLock lock(mSetDisplayMonitor);
|
|
||||||
RefPtr<CancelableRunnable> task =
|
|
||||||
NewCancelableRunnableMethod<bool>(this, &CompositorVsyncScheduler::SetDisplay, aDisplayEnable);
|
|
||||||
mSetDisplayTask = task;
|
|
||||||
ScheduleTask(task.forget(), 0);
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
MonitorAutoLock lock(mSetDisplayMonitor);
|
|
||||||
mSetDisplayTask = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mDisplayEnabled == aDisplayEnable) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mDisplayEnabled = aDisplayEnable;
|
|
||||||
if (!mDisplayEnabled) {
|
|
||||||
CancelCurrentSetNeedsCompositeTask();
|
|
||||||
CancelCurrentCompositeTask();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CompositorVsyncScheduler::CancelSetDisplayTask()
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread());
|
|
||||||
MonitorAutoLock lock(mSetDisplayMonitor);
|
|
||||||
if (mSetDisplayTask) {
|
|
||||||
mSetDisplayTask->Cancel();
|
|
||||||
mSetDisplayTask = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// CancelSetDisplayTask is only be called in clean-up process, so
|
|
||||||
// mDisplayEnabled could be false there.
|
|
||||||
mDisplayEnabled = false;
|
|
||||||
}
|
|
||||||
#endif //ANDROID_VERSION >= 19
|
|
||||||
#endif //MOZ_WIDGET_GONK
|
|
||||||
|
|
||||||
void
|
void
|
||||||
CompositorVsyncScheduler::Destroy()
|
CompositorVsyncScheduler::Destroy()
|
||||||
{
|
{
|
||||||
@@ -442,11 +374,6 @@ CompositorVsyncScheduler::Destroy()
|
|||||||
mVsyncObserver->Destroy();
|
mVsyncObserver->Destroy();
|
||||||
mVsyncObserver = nullptr;
|
mVsyncObserver = nullptr;
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
CancelSetDisplayTask();
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
CancelCurrentSetNeedsCompositeTask();
|
CancelCurrentSetNeedsCompositeTask();
|
||||||
CancelCurrentCompositeTask();
|
CancelCurrentCompositeTask();
|
||||||
}
|
}
|
||||||
@@ -521,15 +448,6 @@ CompositorVsyncScheduler::SetNeedsComposite()
|
|||||||
mSetNeedsCompositeTask = nullptr;
|
mSetNeedsCompositeTask = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
// Skip composition when display off.
|
|
||||||
if (!mDisplayEnabled) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
mNeedsComposite++;
|
mNeedsComposite++;
|
||||||
if (!mIsObservingVsync && mNeedsComposite) {
|
if (!mIsObservingVsync && mNeedsComposite) {
|
||||||
ObserveVsync();
|
ObserveVsync();
|
||||||
@@ -652,9 +570,6 @@ CompositorVsyncScheduler::UnobserveVsync()
|
|||||||
void
|
void
|
||||||
CompositorVsyncScheduler::DispatchTouchEvents(TimeStamp aVsyncTimestamp)
|
CompositorVsyncScheduler::DispatchTouchEvents(TimeStamp aVsyncTimestamp)
|
||||||
{
|
{
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
GeckoTouchDispatcher::GetInstance()->NotifyVsync(aVsyncTimestamp);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -95,19 +95,6 @@ public:
|
|||||||
explicit CompositorVsyncScheduler(CompositorBridgeParent* aCompositorBridgeParent,
|
explicit CompositorVsyncScheduler(CompositorBridgeParent* aCompositorBridgeParent,
|
||||||
widget::CompositorWidget* aWidget);
|
widget::CompositorWidget* aWidget);
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
// emulator-ics never trigger the display on/off, so compositor will always
|
|
||||||
// skip composition request at that device. Only check the display status
|
|
||||||
// with kk device and upon.
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
// SetDisplay() and CancelSetDisplayTask() are used for the display on/off.
|
|
||||||
// It will clear all composition related task and flag, and skip another
|
|
||||||
// composition task during the display off. That could prevent the problem
|
|
||||||
// that compositor might show the old content at the first frame of display on.
|
|
||||||
void SetDisplay(bool aDisplayEnable);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool NotifyVsync(TimeStamp aVsyncTimestamp);
|
bool NotifyVsync(TimeStamp aVsyncTimestamp);
|
||||||
void SetNeedsComposite();
|
void SetNeedsComposite();
|
||||||
void OnForceComposeToTarget();
|
void OnForceComposeToTarget();
|
||||||
@@ -144,11 +131,6 @@ private:
|
|||||||
void DispatchTouchEvents(TimeStamp aVsyncTimestamp);
|
void DispatchTouchEvents(TimeStamp aVsyncTimestamp);
|
||||||
void DispatchVREvents(TimeStamp aVsyncTimestamp);
|
void DispatchVREvents(TimeStamp aVsyncTimestamp);
|
||||||
void CancelCurrentSetNeedsCompositeTask();
|
void CancelCurrentSetNeedsCompositeTask();
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
void CancelSetDisplayTask();
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class Observer final : public VsyncObserver
|
class Observer final : public VsyncObserver
|
||||||
{
|
{
|
||||||
@@ -183,14 +165,6 @@ private:
|
|||||||
|
|
||||||
mozilla::Monitor mSetNeedsCompositeMonitor;
|
mozilla::Monitor mSetNeedsCompositeMonitor;
|
||||||
RefPtr<CancelableRunnable> mSetNeedsCompositeTask;
|
RefPtr<CancelableRunnable> mSetNeedsCompositeTask;
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
bool mDisplayEnabled;
|
|
||||||
mozilla::Monitor mSetDisplayMonitor;
|
|
||||||
RefPtr<CancelableRunnable> mSetDisplayTask;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class CompositorBridgeParentBase : public PCompositorBridgeParent,
|
class CompositorBridgeParentBase : public PCompositorBridgeParent,
|
||||||
|
|||||||
@@ -5,12 +5,6 @@
|
|||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* 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/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
|
|
||||||
#pragma GCC visibility push(default)
|
|
||||||
#include "sync/sync.h" // for sync_merge
|
|
||||||
#pragma GCC visibility pop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "FenceUtils.h"
|
#include "FenceUtils.h"
|
||||||
|
|
||||||
using namespace mozilla::layers;
|
using namespace mozilla::layers;
|
||||||
@@ -24,23 +18,12 @@ ParamTraits<FenceHandle>::Write(Message* aMsg,
|
|||||||
FenceHandle handle = aParam;
|
FenceHandle handle = aParam;
|
||||||
|
|
||||||
MOZ_ASSERT(handle.IsValid());
|
MOZ_ASSERT(handle.IsValid());
|
||||||
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
|
|
||||||
RefPtr<FenceHandle::FdObj> fence = handle.GetAndResetFdObj();
|
|
||||||
aMsg->WriteFileDescriptor(base::FileDescriptor(fence->GetAndResetFd(), true));
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ParamTraits<FenceHandle>::Read(const Message* aMsg,
|
ParamTraits<FenceHandle>::Read(const Message* aMsg,
|
||||||
PickleIterator* aIter, paramType* aResult)
|
PickleIterator* aIter, paramType* aResult)
|
||||||
{
|
{
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
|
|
||||||
base::FileDescriptor fd;
|
|
||||||
if (aMsg->ReadFileDescriptor(aIter, &fd)) {
|
|
||||||
aResult->Merge(FenceHandle(new FenceHandle::FdObj(fd.fd)));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,22 +46,6 @@ FenceHandle::FenceHandle(FdObj* aFdObj)
|
|||||||
void
|
void
|
||||||
FenceHandle::Merge(const FenceHandle& aFenceHandle)
|
FenceHandle::Merge(const FenceHandle& aFenceHandle)
|
||||||
{
|
{
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
|
|
||||||
if (!aFenceHandle.IsValid()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!IsValid()) {
|
|
||||||
mFence = aFenceHandle.mFence;
|
|
||||||
} else {
|
|
||||||
int result = sync_merge("FenceHandle", mFence->mFd, aFenceHandle.mFence->mFd);
|
|
||||||
if (result == -1) {
|
|
||||||
mFence = aFenceHandle.mFence;
|
|
||||||
} else {
|
|
||||||
mFence = new FdObj(result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -8,88 +8,15 @@
|
|||||||
#ifndef IPC_GonkNativeHandle_h
|
#ifndef IPC_GonkNativeHandle_h
|
||||||
#define IPC_GonkNativeHandle_h
|
#define IPC_GonkNativeHandle_h
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#include <cutils/native_handle.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "mozilla/RefPtr.h" // for RefPtr
|
#include "mozilla/RefPtr.h" // for RefPtr
|
||||||
#include "nsISupportsImpl.h"
|
#include "nsISupportsImpl.h"
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
namespace layers {
|
namespace layers {
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
// GonkNativeHandle wraps android's native_handle_t and is used to support
|
|
||||||
// android's sideband stream.
|
|
||||||
// The sideband stream is a device-specific mechanism for passing buffers
|
|
||||||
// to hwcomposer. It is used to render TV streams and DRM protected streams.
|
|
||||||
// The native_handle_t represents device-specific kernel objects on android.
|
|
||||||
class GonkNativeHandle {
|
|
||||||
public:
|
|
||||||
class NhObj {
|
|
||||||
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(NhObj)
|
|
||||||
friend class GonkNativeHandle;
|
|
||||||
public:
|
|
||||||
NhObj()
|
|
||||||
: mHandle(nullptr) {}
|
|
||||||
explicit NhObj(native_handle_t* aHandle)
|
|
||||||
: mHandle(aHandle) {}
|
|
||||||
native_handle_t* GetAndResetNativeHandle()
|
|
||||||
{
|
|
||||||
native_handle_t* handle = mHandle;
|
|
||||||
mHandle = nullptr;
|
|
||||||
return handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
virtual ~NhObj() {
|
|
||||||
if (mHandle) {
|
|
||||||
native_handle_close(mHandle);
|
|
||||||
native_handle_delete(mHandle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
native_handle_t* mHandle;
|
|
||||||
};
|
|
||||||
|
|
||||||
GonkNativeHandle();
|
|
||||||
|
|
||||||
explicit GonkNativeHandle(NhObj* aNhObj);
|
|
||||||
|
|
||||||
bool operator==(const GonkNativeHandle& aOther) const {
|
|
||||||
return mNhObj.get() == aOther.mNhObj.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsValid() const
|
|
||||||
{
|
|
||||||
return mNhObj && mNhObj->mHandle;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TransferToAnother(GonkNativeHandle& aHandle);
|
|
||||||
|
|
||||||
already_AddRefed<NhObj> GetAndResetNhObj();
|
|
||||||
|
|
||||||
already_AddRefed<NhObj> GetDupNhObj();
|
|
||||||
|
|
||||||
static already_AddRefed<NhObj> CreateDupNhObj(native_handle_t* aHandle);
|
|
||||||
|
|
||||||
// Return non owning handle.
|
|
||||||
native_handle_t* GetRawNativeHandle() const
|
|
||||||
{
|
|
||||||
if (mNhObj) {
|
|
||||||
return mNhObj->mHandle;
|
|
||||||
}
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
RefPtr<NhObj> mNhObj;
|
|
||||||
};
|
|
||||||
#else
|
|
||||||
struct GonkNativeHandle {
|
struct GonkNativeHandle {
|
||||||
bool operator==(const GonkNativeHandle&) const { return false; }
|
bool operator==(const GonkNativeHandle&) const { return false; }
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
|
||||||
} // namespace layers
|
} // namespace layers
|
||||||
} // namespace mozilla
|
} // namespace mozilla
|
||||||
|
|||||||
@@ -14,22 +14,12 @@
|
|||||||
|
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
template <>
|
|
||||||
struct ParamTraits<mozilla::layers::GonkNativeHandle> {
|
|
||||||
typedef mozilla::layers::GonkNativeHandle paramType;
|
|
||||||
|
|
||||||
static void Write(Message* aMsg, const paramType& aParam);
|
|
||||||
static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult);
|
|
||||||
};
|
|
||||||
#else
|
|
||||||
template <>
|
template <>
|
||||||
struct ParamTraits<mozilla::layers::GonkNativeHandle> {
|
struct ParamTraits<mozilla::layers::GonkNativeHandle> {
|
||||||
typedef mozilla::layers::GonkNativeHandle paramType;
|
typedef mozilla::layers::GonkNativeHandle paramType;
|
||||||
static void Write(Message*, const paramType&) {}
|
static void Write(Message*, const paramType&) {}
|
||||||
static bool Read(const Message*, PickleIterator*, paramType*) { return false; }
|
static bool Read(const Message*, PickleIterator*, paramType*) { return false; }
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
|
||||||
} // namespace IPC
|
} // namespace IPC
|
||||||
|
|
||||||
|
|||||||
@@ -17,18 +17,6 @@
|
|||||||
#include "mozilla/layers/LayersMessages.h" // for ShmemSection
|
#include "mozilla/layers/LayersMessages.h" // for ShmemSection
|
||||||
#include "LayersTypes.h"
|
#include "LayersTypes.h"
|
||||||
|
|
||||||
/*
|
|
||||||
* FIXME [bjacob] *** PURE CRAZYNESS WARNING ***
|
|
||||||
* (I think that this doesn't apply anymore.)
|
|
||||||
*
|
|
||||||
* This #define is actually needed here, because subclasses of ISurfaceAllocator,
|
|
||||||
* namely ShadowLayerForwarder, will or will not override AllocGrallocBuffer
|
|
||||||
* depending on whether MOZ_HAVE_SURFACEDESCRIPTORGRALLOC is defined.
|
|
||||||
*/
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#define MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
namespace ipc {
|
namespace ipc {
|
||||||
class Shmem;
|
class Shmem;
|
||||||
|
|||||||
@@ -219,24 +219,6 @@ ImageBridgeChild::UseComponentAlphaTextures(CompositableClient* aCompositable,
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
void
|
|
||||||
ImageBridgeChild::UseOverlaySource(CompositableClient* aCompositable,
|
|
||||||
const OverlaySource& aOverlay,
|
|
||||||
const nsIntRect& aPictureRect)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(aCompositable);
|
|
||||||
MOZ_ASSERT(aCompositable->IsConnected());
|
|
||||||
|
|
||||||
CompositableOperation op(
|
|
||||||
nullptr,
|
|
||||||
aCompositable->GetIPDLActor(),
|
|
||||||
OpUseOverlaySource(aOverlay, aPictureRect));
|
|
||||||
|
|
||||||
mTxn->AddEdit(op);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ImageBridgeChild::HoldUntilCompositableRefReleasedIfNecessary(TextureClient* aClient)
|
ImageBridgeChild::HoldUntilCompositableRefReleasedIfNecessary(TextureClient* aClient)
|
||||||
{
|
{
|
||||||
@@ -280,17 +262,7 @@ ImageBridgeChild::HoldUntilFenceHandleDelivery(TextureClient* aClient, uint64_t
|
|||||||
// XXX Re-enable fence handling
|
// XXX Re-enable fence handling
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
if (!aClient) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
MutexAutoLock lock(mWaitingFenceHandleMutex);
|
|
||||||
aClient->SetLastFwdTransactionId(aTransactionId);
|
|
||||||
aClient->WaitFenceHandleOnImageBridge(mWaitingFenceHandleMutex);
|
|
||||||
mTexturesWaitingFenceHandle.Put(aClient->GetSerial(), aClient);
|
|
||||||
#else
|
|
||||||
NS_RUNTIMEABORT("not reached");
|
NS_RUNTIMEABORT("not reached");
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -299,17 +271,7 @@ ImageBridgeChild::DeliverFenceToNonRecycle(uint64_t aTextureId, FenceHandle& aRe
|
|||||||
// XXX Re-enable fence handling
|
// XXX Re-enable fence handling
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
MutexAutoLock lock(mWaitingFenceHandleMutex);
|
|
||||||
TextureClient* client = mTexturesWaitingFenceHandle.Get(aTextureId).get();
|
|
||||||
if (!client) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
MOZ_ASSERT(aTextureId == client->GetSerial());
|
|
||||||
client->SetReleaseFenceHandle(aReleaseFenceHandle);
|
|
||||||
#else
|
|
||||||
NS_RUNTIMEABORT("not reached");
|
NS_RUNTIMEABORT("not reached");
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -318,30 +280,7 @@ ImageBridgeChild::NotifyNotUsedToNonRecycle(uint64_t aTextureId, uint64_t aTrans
|
|||||||
// XXX Re-enable fence handling
|
// XXX Re-enable fence handling
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
MutexAutoLock lock(mWaitingFenceHandleMutex);
|
|
||||||
|
|
||||||
RefPtr<TextureClient> client = mTexturesWaitingFenceHandle.Get(aTextureId);
|
|
||||||
if (!client) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (aTransactionId < client->GetLastFwdTransactionId()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
MOZ_ASSERT(aTextureId == client->GetSerial());
|
|
||||||
client->ClearWaitFenceHandleOnImageBridge(mWaitingFenceHandleMutex);
|
|
||||||
mTexturesWaitingFenceHandle.Remove(aTextureId);
|
|
||||||
|
|
||||||
// Release TextureClient on allocator's message loop.
|
|
||||||
RefPtr<TextureClientReleaseTask> task =
|
|
||||||
MakeAndAddRef<TextureClientReleaseTask>(client);
|
|
||||||
RefPtr<LayersIPCChannel> allocator = client->GetAllocator();
|
|
||||||
client = nullptr;
|
|
||||||
allocator->GetMessageLoop()->PostTask(task.forget());
|
|
||||||
#else
|
|
||||||
NS_RUNTIMEABORT("not reached");
|
NS_RUNTIMEABORT("not reached");
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -350,13 +289,7 @@ ImageBridgeChild::CancelWaitFenceHandle(TextureClient* aClient)
|
|||||||
// XXX Re-enable fence handling
|
// XXX Re-enable fence handling
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
MutexAutoLock lock(mWaitingFenceHandleMutex);
|
|
||||||
aClient->ClearWaitFenceHandleOnImageBridge(mWaitingFenceHandleMutex);
|
|
||||||
mTexturesWaitingFenceHandle.Remove(aClient->GetSerial());
|
|
||||||
#else
|
|
||||||
NS_RUNTIMEABORT("not reached");
|
NS_RUNTIMEABORT("not reached");
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -516,9 +449,6 @@ ImageBridgeChild::ImageBridgeChild()
|
|||||||
: mCanSend(false)
|
: mCanSend(false)
|
||||||
, mCalledClose(false)
|
, mCalledClose(false)
|
||||||
, mFwdTransactionId(0)
|
, mFwdTransactionId(0)
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
, mWaitingFenceHandleMutex("ImageBridgeChild::mWaitingFenceHandleMutex")
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
|
||||||
@@ -722,18 +652,11 @@ ImageBridgeChild::FlushAllImagesSync(SynchronousTask* aTask,
|
|||||||
ImageContainer* aContainer,
|
ImageContainer* aContainer,
|
||||||
RefPtr<AsyncTransactionWaiter> aWaiter)
|
RefPtr<AsyncTransactionWaiter> aWaiter)
|
||||||
{
|
{
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
MOZ_ASSERT(aWaiter);
|
|
||||||
#else
|
|
||||||
MOZ_ASSERT(!aWaiter);
|
MOZ_ASSERT(!aWaiter);
|
||||||
#endif
|
|
||||||
|
|
||||||
AutoCompleteTask complete(aTask);
|
AutoCompleteTask complete(aTask);
|
||||||
|
|
||||||
if (!CanSend()) {
|
if (!CanSend()) {
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
aWaiter->DecrementWaitCount();
|
|
||||||
#endif
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -744,13 +667,6 @@ ImageBridgeChild::FlushAllImagesSync(SynchronousTask* aTask,
|
|||||||
}
|
}
|
||||||
aClient->FlushAllImages(aWaiter);
|
aClient->FlushAllImages(aWaiter);
|
||||||
EndTransaction();
|
EndTransaction();
|
||||||
// This decrement is balanced by the increment in FlushAllImages.
|
|
||||||
// If any AsyncTransactionTrackers were created by FlushAllImages and attached
|
|
||||||
// to aWaiter, aWaiter will not complete until those trackers all complete.
|
|
||||||
// Otherwise, aWaiter will be ready to complete now.
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
aWaiter->DecrementWaitCount();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -767,11 +683,6 @@ ImageBridgeChild::FlushAllImages(ImageClient* aClient, ImageContainer* aContaine
|
|||||||
SynchronousTask task("FlushAllImages Lock");
|
SynchronousTask task("FlushAllImages Lock");
|
||||||
|
|
||||||
RefPtr<AsyncTransactionWaiter> waiter;
|
RefPtr<AsyncTransactionWaiter> waiter;
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
waiter = new AsyncTransactionWaiter();
|
|
||||||
// This increment is balanced by the decrement in FlushAllImagesSync
|
|
||||||
waiter->IncrementWaitCount();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// RefPtrs on arguments are not needed since this dispatches synchronously.
|
// RefPtrs on arguments are not needed since this dispatches synchronously.
|
||||||
RefPtr<Runnable> runnable = WrapRunnable(
|
RefPtr<Runnable> runnable = WrapRunnable(
|
||||||
@@ -784,10 +695,6 @@ ImageBridgeChild::FlushAllImages(ImageClient* aClient, ImageContainer* aContaine
|
|||||||
GetMessageLoop()->PostTask(runnable.forget());
|
GetMessageLoop()->PostTask(runnable.forget());
|
||||||
|
|
||||||
task.Wait();
|
task.Wait();
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
waiter->WaitComplete();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -844,9 +751,6 @@ ImageBridgeChild::EndTransaction()
|
|||||||
void
|
void
|
||||||
ImageBridgeChild::SendImageBridgeThreadId()
|
ImageBridgeChild::SendImageBridgeThreadId()
|
||||||
{
|
{
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
PImageBridgeChild::SendImageBridgeThreadId(gettid());
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|||||||
@@ -279,11 +279,6 @@ public:
|
|||||||
virtual void UseComponentAlphaTextures(CompositableClient* aCompositable,
|
virtual void UseComponentAlphaTextures(CompositableClient* aCompositable,
|
||||||
TextureClient* aClientOnBlack,
|
TextureClient* aClientOnBlack,
|
||||||
TextureClient* aClientOnWhite) override;
|
TextureClient* aClientOnWhite) override;
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
virtual void UseOverlaySource(CompositableClient* aCompositable,
|
|
||||||
const OverlaySource& aOverlay,
|
|
||||||
const nsIntRect& aPictureRect) override;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void Destroy(CompositableChild* aCompositable) override;
|
void Destroy(CompositableChild* aCompositable) override;
|
||||||
|
|
||||||
@@ -415,11 +410,6 @@ private:
|
|||||||
nsDataHashtable<nsUint64HashKey, RefPtr<TextureClient> > mTexturesWaitingRecycled;
|
nsDataHashtable<nsUint64HashKey, RefPtr<TextureClient> > mTexturesWaitingRecycled;
|
||||||
|
|
||||||
AsyncTransactionTrackersHolder mTrackersHolder;
|
AsyncTransactionTrackersHolder mTrackersHolder;
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
Mutex mWaitingFenceHandleMutex;
|
|
||||||
nsDataHashtable<nsUint64HashKey, RefPtr<TextureClient> > mTexturesWaitingFenceHandle;
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace layers
|
} // namespace layers
|
||||||
|
|||||||
@@ -132,9 +132,6 @@ ImageBridgeParent::RecvImageBridgeThreadId(const PlatformThreadId& aThreadId)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
mSetChildThreadPriority = true;
|
mSetChildThreadPriority = true;
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
hal::SetThreadPriority(aThreadId, hal::THREAD_PRIORITY_COMPOSITOR);
|
|
||||||
#endif
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,8 +52,6 @@ using mozilla::layout::RenderFrameParent;
|
|||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
namespace layers {
|
namespace layers {
|
||||||
|
|
||||||
class PGrallocBufferParent;
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// Convenience accessors
|
// Convenience accessors
|
||||||
static ShadowLayerParent*
|
static ShadowLayerParent*
|
||||||
|
|||||||
@@ -4,8 +4,6 @@
|
|||||||
|
|
||||||
using struct gfxPoint from "gfxPoint.h";
|
using struct gfxPoint from "gfxPoint.h";
|
||||||
using nsIntRegion from "nsRegion.h";
|
using nsIntRegion from "nsRegion.h";
|
||||||
using struct mozilla::layers::MagicGrallocBufferHandle from "gfxipc/ShadowLayerUtils.h";
|
|
||||||
using struct mozilla::layers::GrallocBufferRef from "gfxipc/ShadowLayerUtils.h";
|
|
||||||
using struct mozilla::layers::SurfaceDescriptorX11 from "gfxipc/ShadowLayerUtils.h";
|
using struct mozilla::layers::SurfaceDescriptorX11 from "gfxipc/ShadowLayerUtils.h";
|
||||||
using mozilla::StereoMode from "ImageTypes.h";
|
using mozilla::StereoMode from "ImageTypes.h";
|
||||||
using mozilla::YUVColorSpace from "ImageTypes.h";
|
using mozilla::YUVColorSpace from "ImageTypes.h";
|
||||||
@@ -31,12 +29,6 @@ struct OverlaySource {
|
|||||||
IntSize size;
|
IntSize size;
|
||||||
};
|
};
|
||||||
|
|
||||||
union MaybeMagicGrallocBufferHandle {
|
|
||||||
MagicGrallocBufferHandle;
|
|
||||||
GrallocBufferRef;
|
|
||||||
null_t;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SurfaceDescriptorD3D9 {
|
struct SurfaceDescriptorD3D9 {
|
||||||
// IDirect3DTexture9*
|
// IDirect3DTexture9*
|
||||||
uintptr_t texture;
|
uintptr_t texture;
|
||||||
@@ -94,11 +86,6 @@ struct SurfaceDescriptorSharedGLTexture {
|
|||||||
bool hasAlpha;
|
bool hasAlpha;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SurfaceDescriptorGralloc {
|
|
||||||
MaybeMagicGrallocBufferHandle buffer;
|
|
||||||
bool isOpaque;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SurfaceDescriptorGPUVideo {
|
struct SurfaceDescriptorGPUVideo {
|
||||||
uint64_t handle;
|
uint64_t handle;
|
||||||
};
|
};
|
||||||
@@ -146,7 +133,6 @@ union SurfaceDescriptor {
|
|||||||
SurfaceTextureDescriptor;
|
SurfaceTextureDescriptor;
|
||||||
EGLImageDescriptor;
|
EGLImageDescriptor;
|
||||||
SurfaceDescriptorMacIOSurface;
|
SurfaceDescriptorMacIOSurface;
|
||||||
SurfaceDescriptorGralloc;
|
|
||||||
SurfaceDescriptorSharedGLTexture;
|
SurfaceDescriptorSharedGLTexture;
|
||||||
SurfaceDescriptorGPUVideo;
|
SurfaceDescriptorGPUVideo;
|
||||||
null_t;
|
null_t;
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
* vim: sw=2 ts=8 et :
|
|
||||||
*/
|
|
||||||
/* 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/. */
|
|
||||||
|
|
||||||
include LayersSurfaces;
|
|
||||||
include ProtocolTypes;
|
|
||||||
|
|
||||||
include "mozilla/GfxMessageUtils.h";
|
|
||||||
|
|
||||||
namespace mozilla {
|
|
||||||
namespace layers {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is a dedicated protocol to track/allocate/deallocate gralloc buffers.
|
|
||||||
*/
|
|
||||||
|
|
||||||
sync protocol PSharedBufferManager {
|
|
||||||
parent:
|
|
||||||
sync AllocateGrallocBuffer(IntSize size, uint32_t format, uint32_t usage)
|
|
||||||
returns (MaybeMagicGrallocBufferHandle handle);
|
|
||||||
both:
|
|
||||||
async DropGrallocBuffer(MaybeMagicGrallocBufferHandle handle);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace layers
|
|
||||||
} // namespace mozilla
|
|
||||||
@@ -28,21 +28,6 @@ struct SurfaceDescriptorX11 {
|
|||||||
} // namespace mozilla
|
} // namespace mozilla
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(MOZ_WIDGET_GONK)
|
|
||||||
# include "mozilla/layers/ShadowLayerUtilsGralloc.h"
|
|
||||||
#else
|
|
||||||
namespace mozilla { namespace layers {
|
|
||||||
struct MagicGrallocBufferHandle {
|
|
||||||
bool operator==(const MagicGrallocBufferHandle&) const { return false; }
|
|
||||||
};
|
|
||||||
|
|
||||||
struct GrallocBufferRef {
|
|
||||||
bool operator==(const GrallocBufferRef&) const { return false; }
|
|
||||||
};
|
|
||||||
} // namespace layers
|
|
||||||
} // namespace mozilla
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
#if !defined(MOZ_HAVE_SURFACEDESCRIPTORX11)
|
#if !defined(MOZ_HAVE_SURFACEDESCRIPTORX11)
|
||||||
@@ -54,22 +39,6 @@ struct ParamTraits<mozilla::layers::SurfaceDescriptorX11> {
|
|||||||
};
|
};
|
||||||
#endif // !defined(MOZ_HAVE_XSURFACEDESCRIPTORX11)
|
#endif // !defined(MOZ_HAVE_XSURFACEDESCRIPTORX11)
|
||||||
|
|
||||||
#if !defined(MOZ_HAVE_SURFACEDESCRIPTORGRALLOC)
|
|
||||||
template <>
|
|
||||||
struct ParamTraits<mozilla::layers::MagicGrallocBufferHandle> {
|
|
||||||
typedef mozilla::layers::MagicGrallocBufferHandle paramType;
|
|
||||||
static void Write(Message*, const paramType&) {}
|
|
||||||
static bool Read(const Message*, PickleIterator*, paramType*) { return false; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct ParamTraits<mozilla::layers::GrallocBufferRef> {
|
|
||||||
typedef mozilla::layers::GrallocBufferRef paramType;
|
|
||||||
static void Write(Message*, const paramType&) {}
|
|
||||||
static bool Read(const Message*, PickleIterator*, paramType*) { return false; }
|
|
||||||
};
|
|
||||||
#endif // !defined(MOZ_HAVE_XSURFACEDESCRIPTORGRALLOC)
|
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct ParamTraits<mozilla::ScreenRotation>
|
struct ParamTraits<mozilla::ScreenRotation>
|
||||||
: public ContiguousEnumSerializer<
|
: public ContiguousEnumSerializer<
|
||||||
|
|||||||
@@ -1,253 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
* vim: sw=2 ts=8 et :
|
|
||||||
*/
|
|
||||||
/* 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/. */
|
|
||||||
|
|
||||||
#include "mozilla/DebugOnly.h"
|
|
||||||
|
|
||||||
#include "mozilla/gfx/Point.h"
|
|
||||||
#include "mozilla/layers/LayerTransactionChild.h"
|
|
||||||
#include "mozilla/layers/ShadowLayers.h"
|
|
||||||
#include "mozilla/layers/LayerManagerComposite.h"
|
|
||||||
#include "mozilla/layers/CompositorTypes.h"
|
|
||||||
#include "mozilla/layers/TextureHost.h"
|
|
||||||
#include "mozilla/layers/SharedBufferManagerChild.h"
|
|
||||||
#include "mozilla/layers/SharedBufferManagerParent.h"
|
|
||||||
#include "mozilla/UniquePtr.h"
|
|
||||||
#include "mozilla/Unused.h"
|
|
||||||
#include "nsXULAppAPI.h"
|
|
||||||
|
|
||||||
#include "ShadowLayerUtilsGralloc.h"
|
|
||||||
|
|
||||||
#include "nsIMemoryReporter.h"
|
|
||||||
|
|
||||||
#include "gfxPlatform.h"
|
|
||||||
#include "gfx2DGlue.h"
|
|
||||||
#include "GLContext.h"
|
|
||||||
|
|
||||||
#include "GeckoProfiler.h"
|
|
||||||
|
|
||||||
#include "cutils/properties.h"
|
|
||||||
|
|
||||||
#include "MainThreadUtils.h"
|
|
||||||
|
|
||||||
using namespace android;
|
|
||||||
using namespace mozilla::layers;
|
|
||||||
using namespace mozilla::gl;
|
|
||||||
|
|
||||||
using base::FileDescriptor;
|
|
||||||
|
|
||||||
namespace IPC {
|
|
||||||
|
|
||||||
void
|
|
||||||
ParamTraits<GrallocBufferRef>::Write(Message* aMsg,
|
|
||||||
const paramType& aParam)
|
|
||||||
{
|
|
||||||
aMsg->WriteInt(aParam.mOwner);
|
|
||||||
aMsg->WriteInt64(aParam.mKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
ParamTraits<GrallocBufferRef>::Read(const Message* aMsg, PickleIterator* aIter,
|
|
||||||
paramType* aParam)
|
|
||||||
{
|
|
||||||
int owner;
|
|
||||||
int64_t index;
|
|
||||||
if (!aMsg->ReadInt(aIter, &owner) ||
|
|
||||||
!aMsg->ReadInt64(aIter, &index)) {
|
|
||||||
printf_stderr("ParamTraits<GrallocBufferRef>::Read() failed to read a message\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
aParam->mOwner = owner;
|
|
||||||
aParam->mKey = index;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
ParamTraits<MagicGrallocBufferHandle>::Write(Message* aMsg,
|
|
||||||
const paramType& aParam)
|
|
||||||
{
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
sp<GraphicBuffer> flattenable = aParam.mGraphicBuffer;
|
|
||||||
#else
|
|
||||||
Flattenable *flattenable = aParam.mGraphicBuffer.get();
|
|
||||||
#endif
|
|
||||||
size_t nbytes = flattenable->getFlattenedSize();
|
|
||||||
size_t nfds = flattenable->getFdCount();
|
|
||||||
|
|
||||||
char data[nbytes];
|
|
||||||
int fds[nfds];
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
// Make a copy of "data" and "fds" for flatten() to avoid casting problem
|
|
||||||
void *pdata = (void *)data;
|
|
||||||
int *pfds = fds;
|
|
||||||
|
|
||||||
flattenable->flatten(pdata, nbytes, pfds, nfds);
|
|
||||||
|
|
||||||
// In Kitkat, flatten() will change the value of nbytes and nfds, which dues
|
|
||||||
// to multiple parcelable object consumption. The actual size and fd count
|
|
||||||
// which returned by getFlattenedSize() and getFdCount() are not changed.
|
|
||||||
// So we change nbytes and nfds back by call corresponding calls.
|
|
||||||
nbytes = flattenable->getFlattenedSize();
|
|
||||||
nfds = flattenable->getFdCount();
|
|
||||||
#else
|
|
||||||
flattenable->flatten(data, nbytes, fds, nfds);
|
|
||||||
#endif
|
|
||||||
aMsg->WriteInt(aParam.mRef.mOwner);
|
|
||||||
aMsg->WriteInt64(aParam.mRef.mKey);
|
|
||||||
aMsg->WriteSize(nbytes);
|
|
||||||
aMsg->WriteBytes(data, nbytes);
|
|
||||||
for (size_t n = 0; n < nfds; ++n) {
|
|
||||||
// These buffers can't die in transit because they're created
|
|
||||||
// synchonously and the parent-side buffer can only be dropped if
|
|
||||||
// there's a crash.
|
|
||||||
aMsg->WriteFileDescriptor(FileDescriptor(fds[n], false));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
ParamTraits<MagicGrallocBufferHandle>::Read(const Message* aMsg,
|
|
||||||
PickleIterator* aIter, paramType* aResult)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(!aResult->mGraphicBuffer.get());
|
|
||||||
MOZ_ASSERT(aResult->mRef.mOwner == 0);
|
|
||||||
MOZ_ASSERT(aResult->mRef.mKey == -1);
|
|
||||||
|
|
||||||
size_t nbytes;
|
|
||||||
int owner;
|
|
||||||
int64_t index;
|
|
||||||
|
|
||||||
if (!aMsg->ReadInt(aIter, &owner) ||
|
|
||||||
!aMsg->ReadInt64(aIter, &index) ||
|
|
||||||
!aMsg->ReadSize(aIter, &nbytes)) {
|
|
||||||
printf_stderr("ParamTraits<MagicGrallocBufferHandle>::Read() failed to read a message\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto data = mozilla::MakeUnique<char[]>(nbytes);
|
|
||||||
|
|
||||||
if (!aMsg->ReadBytesInto(aIter, data.get(), nbytes)) {
|
|
||||||
printf_stderr("ParamTraits<MagicGrallocBufferHandle>::Read() failed to read a message\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t nfds = aMsg->num_fds();
|
|
||||||
int fds[nfds];
|
|
||||||
|
|
||||||
for (size_t n = 0; n < nfds; ++n) {
|
|
||||||
FileDescriptor fd;
|
|
||||||
if (!aMsg->ReadFileDescriptor(aIter, &fd)) {
|
|
||||||
printf_stderr("ParamTraits<MagicGrallocBufferHandle>::Read() failed to read file descriptors\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// If the GraphicBuffer was shared cross-process, SCM_RIGHTS does
|
|
||||||
// the right thing and dup's the fd. If it's shared cross-thread,
|
|
||||||
// SCM_RIGHTS doesn't dup the fd.
|
|
||||||
// But in shared cross-thread, dup fd is not necessary because we get
|
|
||||||
// a pointer to the GraphicBuffer directly from SharedBufferManagerParent
|
|
||||||
// and don't create a new GraphicBuffer around the fd.
|
|
||||||
fds[n] = fd.fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
aResult->mRef.mOwner = owner;
|
|
||||||
aResult->mRef.mKey = index;
|
|
||||||
if (XRE_IsParentProcess()) {
|
|
||||||
// If we are in chrome process, we can just get GraphicBuffer directly from
|
|
||||||
// SharedBufferManagerParent.
|
|
||||||
aResult->mGraphicBuffer = SharedBufferManagerParent::GetGraphicBuffer(aResult->mRef);
|
|
||||||
} else {
|
|
||||||
// Deserialize GraphicBuffer
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
sp<GraphicBuffer> buffer(new GraphicBuffer());
|
|
||||||
const void* datap = (const void*)data.get();
|
|
||||||
const int* fdsp = &fds[0];
|
|
||||||
if (NO_ERROR != buffer->unflatten(datap, nbytes, fdsp, nfds)) {
|
|
||||||
buffer = nullptr;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
sp<GraphicBuffer> buffer(new GraphicBuffer());
|
|
||||||
Flattenable *flattenable = buffer.get();
|
|
||||||
if (NO_ERROR != flattenable->unflatten(data.get(), nbytes, fds, nfds)) {
|
|
||||||
buffer = nullptr;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (buffer.get()) {
|
|
||||||
aResult->mGraphicBuffer = buffer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!aResult->mGraphicBuffer.get()) {
|
|
||||||
printf_stderr("ParamTraits<MagicGrallocBufferHandle>::Read() failed to get gralloc buffer\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace IPC
|
|
||||||
|
|
||||||
namespace mozilla {
|
|
||||||
namespace layers {
|
|
||||||
|
|
||||||
MagicGrallocBufferHandle::MagicGrallocBufferHandle(const sp<GraphicBuffer>& aGraphicBuffer, GrallocBufferRef ref)
|
|
||||||
: mGraphicBuffer(aGraphicBuffer)
|
|
||||||
, mRef(ref)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// Parent process
|
|
||||||
|
|
||||||
/*static*/ bool
|
|
||||||
LayerManagerComposite::SupportsDirectTexturing()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*static*/ void
|
|
||||||
LayerManagerComposite::PlatformSyncBeforeReplyUpdate()
|
|
||||||
{
|
|
||||||
// Nothing to be done for gralloc.
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// Both processes
|
|
||||||
|
|
||||||
/*static*/ sp<GraphicBuffer>
|
|
||||||
GetGraphicBufferFrom(MaybeMagicGrallocBufferHandle aHandle)
|
|
||||||
{
|
|
||||||
if (aHandle.type() != MaybeMagicGrallocBufferHandle::TMagicGrallocBufferHandle) {
|
|
||||||
if (aHandle.type() == MaybeMagicGrallocBufferHandle::TGrallocBufferRef) {
|
|
||||||
if (XRE_IsParentProcess()) {
|
|
||||||
return SharedBufferManagerParent::GetGraphicBuffer(aHandle.get_GrallocBufferRef());
|
|
||||||
}
|
|
||||||
return SharedBufferManagerChild::GetSingleton()->GetGraphicBuffer(aHandle.get_GrallocBufferRef().mKey);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
MagicGrallocBufferHandle realHandle = aHandle.get_MagicGrallocBufferHandle();
|
|
||||||
return realHandle.mGraphicBuffer;
|
|
||||||
}
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
android::sp<android::GraphicBuffer>
|
|
||||||
GetGraphicBufferFromDesc(SurfaceDescriptor aDesc)
|
|
||||||
{
|
|
||||||
MaybeMagicGrallocBufferHandle handle;
|
|
||||||
if (aDesc.type() == SurfaceDescriptor::TSurfaceDescriptorGralloc) {
|
|
||||||
handle = aDesc.get_SurfaceDescriptorGralloc().buffer();
|
|
||||||
}
|
|
||||||
return GetGraphicBufferFrom(handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*static*/ void
|
|
||||||
ShadowLayerForwarder::PlatformSyncBeforeUpdate()
|
|
||||||
{
|
|
||||||
// Nothing to be done for gralloc.
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace layers
|
|
||||||
} // namespace mozilla
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
* vim: sw=2 ts=8 et :
|
|
||||||
*/
|
|
||||||
/* 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_layers_ShadowLayerUtilsGralloc_h
|
|
||||||
#define mozilla_layers_ShadowLayerUtilsGralloc_h
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <ui/GraphicBuffer.h>
|
|
||||||
|
|
||||||
#include "base/process.h"
|
|
||||||
#include "ipc/IPCMessageUtils.h"
|
|
||||||
|
|
||||||
#define MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
||||||
#define MOZ_HAVE_PLATFORM_SPECIFIC_LAYER_BUFFERS
|
|
||||||
|
|
||||||
namespace mozilla {
|
|
||||||
namespace layers {
|
|
||||||
|
|
||||||
class MaybeMagicGrallocBufferHandle;
|
|
||||||
class SurfaceDescriptor;
|
|
||||||
|
|
||||||
struct GrallocBufferRef {
|
|
||||||
base::ProcessId mOwner;
|
|
||||||
int64_t mKey;
|
|
||||||
|
|
||||||
GrallocBufferRef()
|
|
||||||
: mOwner(0)
|
|
||||||
, mKey(-1)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator== (const GrallocBufferRef rhs) const{
|
|
||||||
return mOwner == rhs.mOwner && mKey == rhs.mKey;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* This class exists to share the underlying GraphicBuffer resources
|
|
||||||
* from one thread context to another. This requires going through
|
|
||||||
* slow paths in the kernel so can be somewhat expensive.
|
|
||||||
*
|
|
||||||
* This is not just platform-specific, but also
|
|
||||||
* gralloc-implementation-specific.
|
|
||||||
*/
|
|
||||||
struct MagicGrallocBufferHandle {
|
|
||||||
typedef android::GraphicBuffer GraphicBuffer;
|
|
||||||
MagicGrallocBufferHandle() {}
|
|
||||||
|
|
||||||
MagicGrallocBufferHandle(const android::sp<GraphicBuffer>& aGraphicBuffer, GrallocBufferRef ref);
|
|
||||||
|
|
||||||
// Default copy ctor and operator= are OK
|
|
||||||
|
|
||||||
bool operator==(const MagicGrallocBufferHandle& aOther) const {
|
|
||||||
return mGraphicBuffer == aOther.mGraphicBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
android::sp<GraphicBuffer> mGraphicBuffer;
|
|
||||||
GrallocBufferRef mRef;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Util function to find GraphicBuffer from SurfaceDescriptor, caller of this function should check origin
|
|
||||||
* to make sure not corrupt others buffer
|
|
||||||
*/
|
|
||||||
android::sp<android::GraphicBuffer> GetGraphicBufferFrom(MaybeMagicGrallocBufferHandle aHandle);
|
|
||||||
android::sp<android::GraphicBuffer> GetGraphicBufferFromDesc(SurfaceDescriptor aDesc);
|
|
||||||
|
|
||||||
} // namespace layers
|
|
||||||
} // namespace mozilla
|
|
||||||
|
|
||||||
namespace IPC {
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct ParamTraits<mozilla::layers::MagicGrallocBufferHandle> {
|
|
||||||
typedef mozilla::layers::MagicGrallocBufferHandle paramType;
|
|
||||||
|
|
||||||
static void Write(Message* aMsg, const paramType& aParam);
|
|
||||||
static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult);
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
struct ParamTraits<mozilla::layers::GrallocBufferRef> {
|
|
||||||
typedef mozilla::layers::GrallocBufferRef paramType;
|
|
||||||
static void Write(Message* aMsg, const paramType& aParam);
|
|
||||||
static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace IPC
|
|
||||||
|
|
||||||
#endif // mozilla_layers_ShadowLayerUtilsGralloc_h
|
|
||||||
@@ -29,7 +29,6 @@
|
|||||||
#include "mozilla/layers/LayersSurfaces.h" // for SurfaceDescriptor, etc
|
#include "mozilla/layers/LayersSurfaces.h" // for SurfaceDescriptor, etc
|
||||||
#include "mozilla/layers/LayersTypes.h" // for MOZ_LAYERS_LOG
|
#include "mozilla/layers/LayersTypes.h" // for MOZ_LAYERS_LOG
|
||||||
#include "mozilla/layers/LayerTransactionChild.h"
|
#include "mozilla/layers/LayerTransactionChild.h"
|
||||||
#include "mozilla/layers/SharedBufferManagerChild.h"
|
|
||||||
#include "mozilla/layers/PCompositableChild.h"
|
#include "mozilla/layers/PCompositableChild.h"
|
||||||
#include "mozilla/layers/PTextureChild.h"
|
#include "mozilla/layers/PTextureChild.h"
|
||||||
#include "ShadowLayerUtils.h"
|
#include "ShadowLayerUtils.h"
|
||||||
@@ -357,24 +356,6 @@ ShadowLayerForwarder::UseTiledLayerBuffer(CompositableClient* aCompositable,
|
|||||||
{
|
{
|
||||||
MOZ_ASSERT(aCompositable && aCompositable->IsConnected());
|
MOZ_ASSERT(aCompositable && aCompositable->IsConnected());
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
// GrallocTextureData alwasys requests fence delivery if ANDROID_VERSION >= 17.
|
|
||||||
const InfallibleTArray<TileDescriptor>& tileDescriptors = aTileLayerDescriptor.tiles();
|
|
||||||
for (size_t i = 0; i < tileDescriptors.Length(); i++) {
|
|
||||||
const TileDescriptor& tileDesc = tileDescriptors[i];
|
|
||||||
if (tileDesc.type() != TileDescriptor::TTexturedTileDescriptor) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const TexturedTileDescriptor& texturedDesc = tileDesc.get_TexturedTileDescriptor();
|
|
||||||
RefPtr<TextureClient> texture = TextureClient::AsTextureClient(texturedDesc.textureChild());
|
|
||||||
mClientLayerManager->GetCompositorBridgeChild()->HoldUntilCompositableRefReleasedIfNecessary(texture);
|
|
||||||
if (texturedDesc.textureOnWhite().type() == MaybeTexture::TPTextureChild) {
|
|
||||||
texture = TextureClient::AsTextureClient(texturedDesc.textureOnWhite().get_PTextureChild());
|
|
||||||
mClientLayerManager->GetCompositorBridgeChild()->HoldUntilCompositableRefReleasedIfNecessary(texture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
mTxn->AddNoSwapPaint(CompositableOperation(nullptr, aCompositable->GetIPDLActor(),
|
mTxn->AddNoSwapPaint(CompositableOperation(nullptr, aCompositable->GetIPDLActor(),
|
||||||
OpUseTiledLayerBuffer(aTileLayerDescriptor)));
|
OpUseTiledLayerBuffer(aTileLayerDescriptor)));
|
||||||
}
|
}
|
||||||
@@ -463,20 +444,6 @@ ShadowLayerForwarder::UseComponentAlphaTextures(CompositableClient* aCompositabl
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
void
|
|
||||||
ShadowLayerForwarder::UseOverlaySource(CompositableClient* aCompositable,
|
|
||||||
const OverlaySource& aOverlay,
|
|
||||||
const nsIntRect& aPictureRect)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(aCompositable);
|
|
||||||
MOZ_ASSERT(aCompositable->IsConnected());
|
|
||||||
|
|
||||||
mTxn->AddEdit(CompositableOperation(nullptr, aCompositable->GetIPDLActor(),
|
|
||||||
OpUseOverlaySource(aOverlay, aPictureRect)));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
AddOpDestroy(Transaction* aTxn, const OpDestroy& op, bool synchronously)
|
AddOpDestroy(Transaction* aTxn, const OpDestroy& op, bool synchronously)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -274,11 +274,6 @@ public:
|
|||||||
virtual void UseComponentAlphaTextures(CompositableClient* aCompositable,
|
virtual void UseComponentAlphaTextures(CompositableClient* aCompositable,
|
||||||
TextureClient* aClientOnBlack,
|
TextureClient* aClientOnBlack,
|
||||||
TextureClient* aClientOnWhite) override;
|
TextureClient* aClientOnWhite) override;
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
virtual void UseOverlaySource(CompositableClient* aCompositable,
|
|
||||||
const OverlaySource& aOverlay,
|
|
||||||
const nsIntRect& aPictureRect) override;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used for debugging to tell the compositor how long this frame took to paint.
|
* Used for debugging to tell the compositor how long this frame took to paint.
|
||||||
|
|||||||
@@ -1,352 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
* vim: sw=2 ts=8 et :
|
|
||||||
*/
|
|
||||||
/* 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/. */
|
|
||||||
|
|
||||||
#include "base/task.h" // for NewRunnableFunction, etc
|
|
||||||
#include "base/thread.h" // for Thread
|
|
||||||
#include "mozilla/gfx/Logging.h" // for gfxDebug
|
|
||||||
#include "mozilla/layers/SharedBufferManagerChild.h"
|
|
||||||
#include "mozilla/layers/SharedBufferManagerParent.h"
|
|
||||||
#include "mozilla/Sprintf.h" // for SprintfLiteral
|
|
||||||
#include "mozilla/StaticPtr.h" // for StaticRefPtr
|
|
||||||
#include "mozilla/ReentrantMonitor.h" // for ReentrantMonitor, etc
|
|
||||||
#include "nsThreadUtils.h" // for NS_IsMainThread
|
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#define LOG(args...) __android_log_print(ANDROID_LOG_INFO, "SBMChild", ## args)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace mozilla {
|
|
||||||
namespace layers {
|
|
||||||
|
|
||||||
using namespace mozilla::gfx;
|
|
||||||
|
|
||||||
// Singleton
|
|
||||||
SharedBufferManagerChild* SharedBufferManagerChild::sSharedBufferManagerChildSingleton = nullptr;
|
|
||||||
SharedBufferManagerParent* SharedBufferManagerChild::sSharedBufferManagerParentSingleton = nullptr;
|
|
||||||
base::Thread* SharedBufferManagerChild::sSharedBufferManagerChildThread = nullptr;
|
|
||||||
|
|
||||||
SharedBufferManagerChild::SharedBufferManagerChild()
|
|
||||||
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
||||||
: mBufferMutex("BufferMonitor")
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
|
||||||
InSharedBufferManagerChildThread()
|
|
||||||
{
|
|
||||||
return SharedBufferManagerChild::sSharedBufferManagerChildThread->thread_id() == PlatformThread::CurrentId();
|
|
||||||
}
|
|
||||||
|
|
||||||
// dispatched function
|
|
||||||
static void
|
|
||||||
DeleteSharedBufferManagerSync(ReentrantMonitor *aBarrier, bool *aDone)
|
|
||||||
{
|
|
||||||
ReentrantMonitorAutoEnter autoMon(*aBarrier);
|
|
||||||
|
|
||||||
MOZ_ASSERT(InSharedBufferManagerChildThread(),
|
|
||||||
"Should be in SharedBufferManagerChild thread.");
|
|
||||||
SharedBufferManagerChild::sSharedBufferManagerChildSingleton = nullptr;
|
|
||||||
SharedBufferManagerChild::sSharedBufferManagerParentSingleton = nullptr;
|
|
||||||
*aDone = true;
|
|
||||||
aBarrier->NotifyAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
// dispatched function
|
|
||||||
static void
|
|
||||||
ConnectSharedBufferManager(SharedBufferManagerChild *child, SharedBufferManagerParent *parent)
|
|
||||||
{
|
|
||||||
MessageLoop *parentMsgLoop = parent->GetMessageLoop();
|
|
||||||
ipc::MessageChannel *parentChannel = parent->GetIPCChannel();
|
|
||||||
child->Open(parentChannel, parentMsgLoop, mozilla::ipc::ChildSide);
|
|
||||||
}
|
|
||||||
|
|
||||||
base::Thread*
|
|
||||||
SharedBufferManagerChild::GetThread() const
|
|
||||||
{
|
|
||||||
return sSharedBufferManagerChildThread;
|
|
||||||
}
|
|
||||||
|
|
||||||
SharedBufferManagerChild*
|
|
||||||
SharedBufferManagerChild::GetSingleton()
|
|
||||||
{
|
|
||||||
return sSharedBufferManagerChildSingleton;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
SharedBufferManagerChild::IsCreated()
|
|
||||||
{
|
|
||||||
return GetSingleton() != nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SharedBufferManagerChild::StartUp()
|
|
||||||
{
|
|
||||||
NS_ASSERTION(NS_IsMainThread(), "Should be on the main Thread!");
|
|
||||||
SharedBufferManagerChild::StartUpOnThread(new base::Thread("BufferMgrChild"));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
ConnectSharedBufferManagerInChildProcess(mozilla::ipc::Transport* aTransport,
|
|
||||||
base::ProcessId aOtherPid)
|
|
||||||
{
|
|
||||||
// Bind the IPC channel to the shared buffer manager thread.
|
|
||||||
SharedBufferManagerChild::sSharedBufferManagerChildSingleton->Open(aTransport,
|
|
||||||
aOtherPid,
|
|
||||||
XRE_GetIOMessageLoop(),
|
|
||||||
ipc::ChildSide);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
PSharedBufferManagerChild*
|
|
||||||
SharedBufferManagerChild::StartUpInChildProcess(Transport* aTransport,
|
|
||||||
base::ProcessId aOtherPid)
|
|
||||||
{
|
|
||||||
NS_ASSERTION(NS_IsMainThread(), "Should be on the main Thread!");
|
|
||||||
|
|
||||||
sSharedBufferManagerChildThread = new base::Thread("BufferMgrChild");
|
|
||||||
if (!sSharedBufferManagerChildThread->Start()) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
sSharedBufferManagerChildSingleton = new SharedBufferManagerChild();
|
|
||||||
sSharedBufferManagerChildSingleton->GetMessageLoop()->PostTask(
|
|
||||||
NewRunnableFunction(ConnectSharedBufferManagerInChildProcess,
|
|
||||||
aTransport, aOtherPid));
|
|
||||||
|
|
||||||
return sSharedBufferManagerChildSingleton;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SharedBufferManagerChild::ShutDown()
|
|
||||||
{
|
|
||||||
NS_ASSERTION(NS_IsMainThread(), "Should be on the main Thread!");
|
|
||||||
if (IsCreated()) {
|
|
||||||
SharedBufferManagerChild::DestroyManager();
|
|
||||||
delete sSharedBufferManagerChildThread;
|
|
||||||
sSharedBufferManagerChildThread = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
SharedBufferManagerChild::StartUpOnThread(base::Thread* aThread)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(aThread, "SharedBufferManager needs a thread.");
|
|
||||||
if (sSharedBufferManagerChildSingleton != nullptr) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
sSharedBufferManagerChildThread = aThread;
|
|
||||||
if (!aThread->IsRunning()) {
|
|
||||||
aThread->Start();
|
|
||||||
}
|
|
||||||
sSharedBufferManagerChildSingleton = new SharedBufferManagerChild();
|
|
||||||
char thrname[128];
|
|
||||||
SprintfLiteral(thrname, "BufMgrParent#%d", base::Process::Current().pid());
|
|
||||||
sSharedBufferManagerParentSingleton = new SharedBufferManagerParent(
|
|
||||||
base::Process::Current().pid(), new base::Thread(thrname));
|
|
||||||
sSharedBufferManagerChildSingleton->ConnectAsync(sSharedBufferManagerParentSingleton);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SharedBufferManagerChild::DestroyManager()
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(!InSharedBufferManagerChildThread(),
|
|
||||||
"This method must not be called in this thread.");
|
|
||||||
// ...because we are about to dispatch synchronous messages to the
|
|
||||||
// BufferManagerChild thread.
|
|
||||||
|
|
||||||
if (!IsCreated()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ReentrantMonitor barrier("BufferManagerDestroyTask lock");
|
|
||||||
ReentrantMonitorAutoEnter autoMon(barrier);
|
|
||||||
|
|
||||||
bool done = false;
|
|
||||||
sSharedBufferManagerChildSingleton->GetMessageLoop()->PostTask(
|
|
||||||
NewRunnableFunction(&DeleteSharedBufferManagerSync, &barrier, &done));
|
|
||||||
while (!done) {
|
|
||||||
barrier.Wait();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
MessageLoop *
|
|
||||||
SharedBufferManagerChild::GetMessageLoop() const
|
|
||||||
{
|
|
||||||
return sSharedBufferManagerChildThread != nullptr ?
|
|
||||||
sSharedBufferManagerChildThread->message_loop() :
|
|
||||||
nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SharedBufferManagerChild::ConnectAsync(SharedBufferManagerParent* aParent)
|
|
||||||
{
|
|
||||||
GetMessageLoop()->PostTask(NewRunnableFunction(&ConnectSharedBufferManager,
|
|
||||||
this, aParent));
|
|
||||||
}
|
|
||||||
|
|
||||||
// dispatched function
|
|
||||||
void
|
|
||||||
SharedBufferManagerChild::AllocGrallocBufferSync(const GrallocParam& aParam,
|
|
||||||
Monitor* aBarrier,
|
|
||||||
bool* aDone)
|
|
||||||
{
|
|
||||||
MonitorAutoLock autoMon(*aBarrier);
|
|
||||||
|
|
||||||
sSharedBufferManagerChildSingleton->AllocGrallocBufferNow(aParam.size,
|
|
||||||
aParam.format,
|
|
||||||
aParam.usage,
|
|
||||||
aParam.buffer);
|
|
||||||
*aDone = true;
|
|
||||||
aBarrier->NotifyAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
// dispatched function
|
|
||||||
void
|
|
||||||
SharedBufferManagerChild::DeallocGrallocBufferSync(const mozilla::layers::MaybeMagicGrallocBufferHandle& aBuffer)
|
|
||||||
{
|
|
||||||
SharedBufferManagerChild::sSharedBufferManagerChildSingleton->
|
|
||||||
DeallocGrallocBufferNow(aBuffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
SharedBufferManagerChild::AllocGrallocBuffer(const gfx::IntSize& aSize,
|
|
||||||
const uint32_t& aFormat,
|
|
||||||
const uint32_t& aUsage,
|
|
||||||
mozilla::layers::MaybeMagicGrallocBufferHandle* aBuffer)
|
|
||||||
{
|
|
||||||
if (aSize.width <= 0 || aSize.height <= 0) {
|
|
||||||
gfxDebug() << "Asking for gralloc of invalid size " << aSize.width << "x" << aSize.height;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (InSharedBufferManagerChildThread()) {
|
|
||||||
return SharedBufferManagerChild::AllocGrallocBufferNow(aSize, aFormat, aUsage, aBuffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
Monitor barrier("AllocSurfaceDescriptorGralloc Lock");
|
|
||||||
MonitorAutoLock autoMon(barrier);
|
|
||||||
bool done = false;
|
|
||||||
|
|
||||||
GetMessageLoop()->PostTask(
|
|
||||||
NewRunnableFunction(&AllocGrallocBufferSync,
|
|
||||||
GrallocParam(aSize, aFormat, aUsage, aBuffer), &barrier, &done));
|
|
||||||
|
|
||||||
while (!done) {
|
|
||||||
barrier.Wait();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
SharedBufferManagerChild::AllocGrallocBufferNow(const IntSize& aSize,
|
|
||||||
const uint32_t& aFormat,
|
|
||||||
const uint32_t& aUsage,
|
|
||||||
mozilla::layers::MaybeMagicGrallocBufferHandle* aHandle)
|
|
||||||
{
|
|
||||||
// These are protected functions, we can just assert and ask the caller to test
|
|
||||||
MOZ_ASSERT(aSize.width >= 0 && aSize.height >= 0);
|
|
||||||
|
|
||||||
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
||||||
mozilla::layers::MaybeMagicGrallocBufferHandle handle;
|
|
||||||
if (!SendAllocateGrallocBuffer(aSize, aFormat, aUsage, &handle)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (handle.type() != mozilla::layers::MaybeMagicGrallocBufferHandle::TMagicGrallocBufferHandle) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
*aHandle = handle.get_MagicGrallocBufferHandle().mRef;
|
|
||||||
|
|
||||||
{
|
|
||||||
MutexAutoLock lock(mBufferMutex);
|
|
||||||
MOZ_ASSERT(mBuffers.count(handle.get_MagicGrallocBufferHandle().mRef.mKey)==0);
|
|
||||||
mBuffers[handle.get_MagicGrallocBufferHandle().mRef.mKey] = handle.get_MagicGrallocBufferHandle().mGraphicBuffer;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
#else
|
|
||||||
NS_RUNTIMEABORT("No GrallocBuffer for you");
|
|
||||||
return true;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SharedBufferManagerChild::DeallocGrallocBuffer(const mozilla::layers::MaybeMagicGrallocBufferHandle& aBuffer)
|
|
||||||
{
|
|
||||||
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
||||||
NS_ASSERTION(aBuffer.type() != mozilla::layers::MaybeMagicGrallocBufferHandle::TMagicGrallocBufferHandle, "We shouldn't try to do IPC with real buffer");
|
|
||||||
if (aBuffer.type() != mozilla::layers::MaybeMagicGrallocBufferHandle::TGrallocBufferRef) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (InSharedBufferManagerChildThread()) {
|
|
||||||
return SharedBufferManagerChild::DeallocGrallocBufferNow(aBuffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
GetMessageLoop()->PostTask(NewRunnableFunction(&DeallocGrallocBufferSync, aBuffer));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SharedBufferManagerChild::DeallocGrallocBufferNow(const mozilla::layers::MaybeMagicGrallocBufferHandle& aBuffer)
|
|
||||||
{
|
|
||||||
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
||||||
NS_ASSERTION(aBuffer.type() != mozilla::layers::MaybeMagicGrallocBufferHandle::TMagicGrallocBufferHandle, "We shouldn't try to do IPC with real buffer");
|
|
||||||
|
|
||||||
{
|
|
||||||
MutexAutoLock lock(mBufferMutex);
|
|
||||||
mBuffers.erase(aBuffer.get_GrallocBufferRef().mKey);
|
|
||||||
}
|
|
||||||
SendDropGrallocBuffer(aBuffer);
|
|
||||||
#else
|
|
||||||
NS_RUNTIMEABORT("No GrallocBuffer for you");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SharedBufferManagerChild::DropGrallocBuffer(const mozilla::layers::MaybeMagicGrallocBufferHandle& aHandle)
|
|
||||||
{
|
|
||||||
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
||||||
int64_t bufferKey = -1;
|
|
||||||
if (aHandle.type() == mozilla::layers::MaybeMagicGrallocBufferHandle::TMagicGrallocBufferHandle) {
|
|
||||||
bufferKey = aHandle.get_MagicGrallocBufferHandle().mRef.mKey;
|
|
||||||
} else if (aHandle.type() == mozilla::layers::MaybeMagicGrallocBufferHandle::TGrallocBufferRef) {
|
|
||||||
bufferKey = aHandle.get_GrallocBufferRef().mKey;
|
|
||||||
} else {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
MutexAutoLock lock(mBufferMutex);
|
|
||||||
mBuffers.erase(bufferKey);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SharedBufferManagerChild::RecvDropGrallocBuffer(const mozilla::layers::MaybeMagicGrallocBufferHandle& aHandle)
|
|
||||||
{
|
|
||||||
DropGrallocBuffer(aHandle);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
||||||
android::sp<android::GraphicBuffer>
|
|
||||||
SharedBufferManagerChild::GetGraphicBuffer(int64_t key)
|
|
||||||
{
|
|
||||||
MutexAutoLock lock(mBufferMutex);
|
|
||||||
if (mBuffers.count(key) == 0) {
|
|
||||||
printf_stderr("SharedBufferManagerChild::GetGraphicBuffer -- invalid key");
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return mBuffers[key];
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} /* namespace layers */
|
|
||||||
} /* namespace mozilla */
|
|
||||||
@@ -1,168 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* vim: set sw=2 ts=8 et 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 SharedBufferManagerCHILD_H_
|
|
||||||
#define SharedBufferManagerCHILD_H_
|
|
||||||
|
|
||||||
#include "mozilla/layers/PSharedBufferManagerChild.h"
|
|
||||||
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
||||||
#include "mozilla/Mutex.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace base {
|
|
||||||
class Thread;
|
|
||||||
} // namespace base
|
|
||||||
|
|
||||||
namespace mozilla {
|
|
||||||
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
||||||
class Mutex;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace layers {
|
|
||||||
class SharedBufferManagerParent;
|
|
||||||
|
|
||||||
struct GrallocParam {
|
|
||||||
gfx::IntSize size;
|
|
||||||
uint32_t format;
|
|
||||||
uint32_t usage;
|
|
||||||
mozilla::layers::MaybeMagicGrallocBufferHandle* buffer;
|
|
||||||
|
|
||||||
GrallocParam(const gfx::IntSize& aSize,
|
|
||||||
const uint32_t& aFormat,
|
|
||||||
const uint32_t& aUsage,
|
|
||||||
mozilla::layers::MaybeMagicGrallocBufferHandle* aBuffer)
|
|
||||||
: size(aSize)
|
|
||||||
, format(aFormat)
|
|
||||||
, usage(aUsage)
|
|
||||||
, buffer(aBuffer)
|
|
||||||
{}
|
|
||||||
};
|
|
||||||
|
|
||||||
class SharedBufferManagerChild : public PSharedBufferManagerChild {
|
|
||||||
public:
|
|
||||||
SharedBufferManagerChild();
|
|
||||||
/**
|
|
||||||
* Creates the gralloc buffer manager with a dedicated thread for SharedBufferManagerChild.
|
|
||||||
*
|
|
||||||
* We may want to use a specific thread in the future. In this case, use
|
|
||||||
* CreateWithThread instead.
|
|
||||||
*/
|
|
||||||
static void StartUp();
|
|
||||||
|
|
||||||
static PSharedBufferManagerChild*
|
|
||||||
StartUpInChildProcess(Transport* aTransport, ProcessId aOtherProcess);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates the SharedBufferManagerChild manager protocol.
|
|
||||||
*/
|
|
||||||
static bool StartUpOnThread(base::Thread* aThread);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destroys The SharedBufferManager protocol.
|
|
||||||
*
|
|
||||||
* The actual destruction happens synchronously on the SharedBufferManagerChild thread
|
|
||||||
* which means that if this function is called from another thread, the current
|
|
||||||
* thread will be paused until the destruction is done.
|
|
||||||
*/
|
|
||||||
static void DestroyManager();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destroys the grallob buffer manager calling DestroyManager, and destroys the
|
|
||||||
* SharedBufferManager's thread.
|
|
||||||
*
|
|
||||||
* If you don't want to destroy the thread, call DestroyManager directly
|
|
||||||
* instead.
|
|
||||||
*/
|
|
||||||
static void ShutDown();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* returns the singleton instance.
|
|
||||||
*
|
|
||||||
* can be called from any thread.
|
|
||||||
*/
|
|
||||||
static SharedBufferManagerChild* GetSingleton();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Dispatches a task to the SharedBufferManagerChild thread to do the connection
|
|
||||||
*/
|
|
||||||
void ConnectAsync(SharedBufferManagerParent* aParent);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allocate GrallocBuffer remotely.
|
|
||||||
*/
|
|
||||||
bool
|
|
||||||
AllocGrallocBuffer(const gfx::IntSize&, const uint32_t&, const uint32_t&, mozilla::layers::MaybeMagicGrallocBufferHandle*);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deallocate a remotely allocated gralloc buffer.
|
|
||||||
* As gralloc buffer life cycle controlled by sp, this just break the sharing status of the underlying buffer
|
|
||||||
* and decrease the reference count on both side.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
DeallocGrallocBuffer(const mozilla::layers::MaybeMagicGrallocBufferHandle& aBuffer);
|
|
||||||
|
|
||||||
void
|
|
||||||
DropGrallocBuffer(const mozilla::layers::MaybeMagicGrallocBufferHandle& aHandle);
|
|
||||||
|
|
||||||
virtual bool RecvDropGrallocBuffer(const mozilla::layers::MaybeMagicGrallocBufferHandle& aHandle);
|
|
||||||
|
|
||||||
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
||||||
android::sp<android::GraphicBuffer> GetGraphicBuffer(int64_t key);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
base::Thread* GetThread() const;
|
|
||||||
|
|
||||||
MessageLoop* GetMessageLoop() const;
|
|
||||||
|
|
||||||
static bool IsCreated();
|
|
||||||
|
|
||||||
static base::Thread* sSharedBufferManagerChildThread;
|
|
||||||
static SharedBufferManagerChild* sSharedBufferManagerChildSingleton;
|
|
||||||
static SharedBufferManagerParent* sSharedBufferManagerParentSingleton; // Only available in Chrome process
|
|
||||||
|
|
||||||
protected:
|
|
||||||
/**
|
|
||||||
* Part of the allocation of gralloc SurfaceDescriptor that is
|
|
||||||
* executed on the SharedBufferManagerChild thread after invoking
|
|
||||||
* AllocSurfaceDescriptorGralloc.
|
|
||||||
*
|
|
||||||
* Must be called from the SharedBufferManagerChild thread.
|
|
||||||
*/
|
|
||||||
bool
|
|
||||||
AllocGrallocBufferNow(const gfx::IntSize& aSize,
|
|
||||||
const uint32_t& aFormat,
|
|
||||||
const uint32_t& aUsage,
|
|
||||||
mozilla::layers::MaybeMagicGrallocBufferHandle* aBuffer);
|
|
||||||
|
|
||||||
// Dispatched function
|
|
||||||
static void
|
|
||||||
AllocGrallocBufferSync(const GrallocParam& aParam,
|
|
||||||
Monitor* aBarrier,
|
|
||||||
bool* aDone);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Part of the deallocation of gralloc SurfaceDescriptor that is
|
|
||||||
* executed on the SharedBufferManagerChild thread after invoking
|
|
||||||
* DeallocSurfaceDescriptorGralloc.
|
|
||||||
*
|
|
||||||
* Must be called from the SharedBufferManagerChild thread.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
DeallocGrallocBufferNow(const mozilla::layers::MaybeMagicGrallocBufferHandle& handle);
|
|
||||||
|
|
||||||
// dispatched function
|
|
||||||
static void
|
|
||||||
DeallocGrallocBufferSync(const mozilla::layers::MaybeMagicGrallocBufferHandle& handle);
|
|
||||||
|
|
||||||
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
||||||
std::map<int64_t, android::sp<android::GraphicBuffer> > mBuffers;
|
|
||||||
Mutex mBufferMutex;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
} /* namespace layers */
|
|
||||||
} /* namespace mozilla */
|
|
||||||
#endif /* SharedBufferManagerCHILD_H_*/
|
|
||||||
@@ -1,364 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* vim: set sw=2 ts=8 et 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/. */
|
|
||||||
|
|
||||||
#include "mozilla/layers/SharedBufferManagerParent.h"
|
|
||||||
#include "base/message_loop.h" // for MessageLoop
|
|
||||||
#include "base/process.h" // for ProcessId
|
|
||||||
#include "base/task.h" // for CancelableTask, DeleteTask, etc
|
|
||||||
#include "base/thread.h"
|
|
||||||
#include "mozilla/Sprintf.h" // for SprintfLiteral
|
|
||||||
#include "mozilla/ipc/MessageChannel.h" // for MessageChannel, etc
|
|
||||||
#include "mozilla/ipc/ProtocolUtils.h"
|
|
||||||
#include "mozilla/ipc/Transport.h" // for Transport
|
|
||||||
#include "mozilla/Sprintf.h"
|
|
||||||
#include "mozilla/UniquePtr.h" // for UniquePtr
|
|
||||||
#include "mozilla/Unused.h"
|
|
||||||
#include "nsIMemoryReporter.h"
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#include "mozilla/LinuxUtils.h"
|
|
||||||
#include "ui/PixelFormat.h"
|
|
||||||
#endif
|
|
||||||
#include "nsPrintfCString.h"
|
|
||||||
#include "nsThreadUtils.h"
|
|
||||||
|
|
||||||
using namespace mozilla::ipc;
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
using namespace android;
|
|
||||||
#endif
|
|
||||||
using std::map;
|
|
||||||
|
|
||||||
namespace mozilla {
|
|
||||||
namespace layers {
|
|
||||||
|
|
||||||
map<base::ProcessId, SharedBufferManagerParent* > SharedBufferManagerParent::sManagers;
|
|
||||||
StaticAutoPtr<Monitor> SharedBufferManagerParent::sManagerMonitor;
|
|
||||||
uint64_t SharedBufferManagerParent::sBufferKey(0);
|
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
class GrallocReporter final : public nsIMemoryReporter
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
NS_DECL_ISUPPORTS
|
|
||||||
|
|
||||||
NS_IMETHOD CollectReports(nsIHandleReportCallback* aHandleReport,
|
|
||||||
nsISupports* aData, bool aAnonymize) override
|
|
||||||
{
|
|
||||||
if (SharedBufferManagerParent::sManagerMonitor) {
|
|
||||||
SharedBufferManagerParent::sManagerMonitor->Lock();
|
|
||||||
}
|
|
||||||
map<base::ProcessId, SharedBufferManagerParent*>::iterator it;
|
|
||||||
for (it = SharedBufferManagerParent::sManagers.begin(); it != SharedBufferManagerParent::sManagers.end(); it++) {
|
|
||||||
base::ProcessId pid = it->first;
|
|
||||||
SharedBufferManagerParent *mgr = it->second;
|
|
||||||
if (!mgr) {
|
|
||||||
printf_stderr("GrallocReporter::CollectReports(): mgr is nullptr");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsAutoCString pidName;
|
|
||||||
LinuxUtils::GetThreadName(pid, pidName);
|
|
||||||
|
|
||||||
MutexAutoLock lock(mgr->mLock);
|
|
||||||
std::map<int64_t, android::sp<android::GraphicBuffer> >::iterator buf_it;
|
|
||||||
for (buf_it = mgr->mBuffers.begin(); buf_it != mgr->mBuffers.end(); buf_it++) {
|
|
||||||
android::sp<android::GraphicBuffer> gb = buf_it->second;
|
|
||||||
int bpp = android::bytesPerPixel(gb->getPixelFormat());
|
|
||||||
int stride = gb->getStride();
|
|
||||||
int height = gb->getHeight();
|
|
||||||
int amount = bpp > 0
|
|
||||||
? (stride * height * bpp)
|
|
||||||
// Special case for BSP specific formats (mainly YUV formats, count it as normal YUV buffer).
|
|
||||||
: (stride * height * 3 / 2);
|
|
||||||
|
|
||||||
nsPrintfCString gpath("gralloc/%s (pid=%d)/buffer(width=%d, height=%d, bpp=%d, stride=%d)",
|
|
||||||
pidName.get(), pid, gb->getWidth(), height, bpp, stride);
|
|
||||||
|
|
||||||
aHandleReport->Callback(
|
|
||||||
EmptyCString(), gpath, KIND_OTHER, UNITS_BYTES, amount,
|
|
||||||
NS_LITERAL_CSTRING(
|
|
||||||
"Special RAM that can be shared between processes and directly accessed by "
|
|
||||||
"both the CPU and GPU. Gralloc memory is usually a relatively precious "
|
|
||||||
"resource, with much less available than generic RAM. When it's exhausted, "
|
|
||||||
"graphics performance can suffer. This value can be incorrect because of race "
|
|
||||||
"conditions."),
|
|
||||||
aData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (SharedBufferManagerParent::sManagerMonitor) {
|
|
||||||
SharedBufferManagerParent::sManagerMonitor->Unlock();
|
|
||||||
}
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
~GrallocReporter() {}
|
|
||||||
};
|
|
||||||
|
|
||||||
NS_IMPL_ISUPPORTS(GrallocReporter, nsIMemoryReporter)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void InitGralloc() {
|
|
||||||
NS_ASSERTION(NS_IsMainThread(), "Should be on main thread.");
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
RegisterStrongMemoryReporter(new GrallocReporter());
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Task that deletes SharedBufferManagerParent on a specified thread.
|
|
||||||
*/
|
|
||||||
class DeleteSharedBufferManagerParentTask : public Runnable
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
explicit DeleteSharedBufferManagerParentTask(UniquePtr<SharedBufferManagerParent> aSharedBufferManager)
|
|
||||||
: mSharedBufferManager(Move(aSharedBufferManager)) {
|
|
||||||
}
|
|
||||||
NS_IMETHOD Run() override { return NS_OK; }
|
|
||||||
private:
|
|
||||||
UniquePtr<SharedBufferManagerParent> mSharedBufferManager;
|
|
||||||
};
|
|
||||||
|
|
||||||
SharedBufferManagerParent::SharedBufferManagerParent(base::ProcessId aOwner, base::Thread* aThread)
|
|
||||||
: mThread(aThread)
|
|
||||||
, mDestroyed(false)
|
|
||||||
, mLock("SharedBufferManagerParent.mLock")
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
|
||||||
if (!sManagerMonitor) {
|
|
||||||
sManagerMonitor = new Monitor("Manager Monitor");
|
|
||||||
}
|
|
||||||
|
|
||||||
MonitorAutoLock lock(*sManagerMonitor.get());
|
|
||||||
NS_ASSERTION(NS_IsMainThread(), "Should be on main thread");
|
|
||||||
if (!aThread->IsRunning()) {
|
|
||||||
aThread->Start();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sManagers.count(aOwner) != 0) {
|
|
||||||
printf_stderr("SharedBufferManagerParent already exists.");
|
|
||||||
}
|
|
||||||
mOwner = aOwner;
|
|
||||||
sManagers[aOwner] = this;
|
|
||||||
}
|
|
||||||
|
|
||||||
SharedBufferManagerParent::~SharedBufferManagerParent()
|
|
||||||
{
|
|
||||||
MonitorAutoLock lock(*sManagerMonitor.get());
|
|
||||||
sManagers.erase(mOwner);
|
|
||||||
delete mThread;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SharedBufferManagerParent::ActorDestroy(ActorDestroyReason aWhy)
|
|
||||||
{
|
|
||||||
MutexAutoLock lock(mLock);
|
|
||||||
mDestroyed = true;
|
|
||||||
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
||||||
mBuffers.clear();
|
|
||||||
#endif
|
|
||||||
RefPtr<DeleteSharedBufferManagerParentTask> task =
|
|
||||||
new DeleteSharedBufferManagerParentTask(UniquePtr<SharedBufferManagerParent>(this));
|
|
||||||
NS_DispatchToMainThread(task.forget());
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
ConnectSharedBufferManagerInParentProcess(SharedBufferManagerParent* aManager,
|
|
||||||
Transport* aTransport,
|
|
||||||
base::ProcessId aOtherPid)
|
|
||||||
{
|
|
||||||
aManager->Open(aTransport, aOtherPid, XRE_GetIOMessageLoop(), ipc::ParentSide);
|
|
||||||
}
|
|
||||||
|
|
||||||
PSharedBufferManagerParent* SharedBufferManagerParent::Create(Transport* aTransport,
|
|
||||||
ProcessId aOtherPid)
|
|
||||||
{
|
|
||||||
base::Thread* thread = nullptr;
|
|
||||||
char thrname[128];
|
|
||||||
SprintfLiteral(thrname, "BufMgrParent#%d", aOtherPid);
|
|
||||||
thread = new base::Thread(thrname);
|
|
||||||
|
|
||||||
SharedBufferManagerParent* manager = new SharedBufferManagerParent(aOtherPid, thread);
|
|
||||||
if (!thread->IsRunning()) {
|
|
||||||
thread->Start();
|
|
||||||
}
|
|
||||||
thread->message_loop()->PostTask(NewRunnableFunction(ConnectSharedBufferManagerInParentProcess,
|
|
||||||
manager, aTransport, aOtherPid));
|
|
||||||
return manager;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SharedBufferManagerParent::RecvAllocateGrallocBuffer(const IntSize& aSize, const uint32_t& aFormat, const uint32_t& aUsage, mozilla::layers::MaybeMagicGrallocBufferHandle* aHandle)
|
|
||||||
{
|
|
||||||
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
||||||
|
|
||||||
*aHandle = null_t();
|
|
||||||
|
|
||||||
if (aFormat == 0 || aUsage == 0) {
|
|
||||||
printf_stderr("SharedBufferManagerParent::RecvAllocateGrallocBuffer -- format and usage must be non-zero");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aSize.width <= 0 || aSize.height <= 0) {
|
|
||||||
printf_stderr("SharedBufferManagerParent::RecvAllocateGrallocBuffer -- requested gralloc buffer size is invalid");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the requested size is too big (i.e. exceeds the commonly used max GL texture size)
|
|
||||||
// then we risk OOMing the parent process. It's better to just deny the allocation and
|
|
||||||
// kill the child process, which is what the following code does.
|
|
||||||
// TODO: actually use GL_MAX_TEXTURE_SIZE instead of hardcoding 4096
|
|
||||||
if (aSize.width > 4096 || aSize.height > 4096) {
|
|
||||||
printf_stderr("SharedBufferManagerParent::RecvAllocateGrallocBuffer -- requested gralloc buffer is too big.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
sp<GraphicBuffer> outgoingBuffer = new GraphicBuffer(aSize.width, aSize.height, aFormat, aUsage);
|
|
||||||
if (!outgoingBuffer.get() || outgoingBuffer->initCheck() != NO_ERROR) {
|
|
||||||
printf_stderr("SharedBufferManagerParent::RecvAllocateGrallocBuffer -- gralloc buffer allocation failed");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int64_t bufferKey;
|
|
||||||
{
|
|
||||||
MonitorAutoLock lock(*sManagerMonitor.get());
|
|
||||||
bufferKey = ++sBufferKey;
|
|
||||||
}
|
|
||||||
GrallocBufferRef ref;
|
|
||||||
ref.mOwner = mOwner;
|
|
||||||
ref.mKey = bufferKey;
|
|
||||||
*aHandle = MagicGrallocBufferHandle(outgoingBuffer, ref);
|
|
||||||
|
|
||||||
{
|
|
||||||
MutexAutoLock lock(mLock);
|
|
||||||
mBuffers[bufferKey] = outgoingBuffer;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SharedBufferManagerParent::RecvDropGrallocBuffer(const mozilla::layers::MaybeMagicGrallocBufferHandle& handle)
|
|
||||||
{
|
|
||||||
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
||||||
NS_ASSERTION(handle.type() == MaybeMagicGrallocBufferHandle::TGrallocBufferRef, "We shouldn't interact with the real buffer!");
|
|
||||||
int64_t bufferKey = handle.get_GrallocBufferRef().mKey;
|
|
||||||
sp<GraphicBuffer> buf = GetGraphicBuffer(bufferKey);
|
|
||||||
MOZ_ASSERT(buf.get());
|
|
||||||
MutexAutoLock lock(mLock);
|
|
||||||
NS_ASSERTION(mBuffers.count(bufferKey) == 1, "No such buffer");
|
|
||||||
mBuffers.erase(bufferKey);
|
|
||||||
|
|
||||||
if(!buf.get()) {
|
|
||||||
printf_stderr("SharedBufferManagerParent::RecvDropGrallocBuffer -- invalid buffer key.");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*static*/
|
|
||||||
void SharedBufferManagerParent::DropGrallocBufferSync(SharedBufferManagerParent* mgr, mozilla::layers::SurfaceDescriptor aDesc)
|
|
||||||
{
|
|
||||||
mgr->DropGrallocBufferImpl(aDesc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*static*/
|
|
||||||
void SharedBufferManagerParent::DropGrallocBuffer(ProcessId id, mozilla::layers::SurfaceDescriptor aDesc)
|
|
||||||
{
|
|
||||||
if (aDesc.type() != SurfaceDescriptor::TSurfaceDescriptorGralloc) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
MonitorAutoLock lock(*sManagerMonitor.get());
|
|
||||||
SharedBufferManagerParent* mgr = SharedBufferManagerParent::GetInstance(id);
|
|
||||||
if (!mgr) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
MutexAutoLock mgrlock(mgr->mLock);
|
|
||||||
if (mgr->mDestroyed) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (PlatformThread::CurrentId() == mgr->mThread->thread_id()) {
|
|
||||||
MOZ_CRASH("GFX: SharedBufferManagerParent::DropGrallocBuffer should not be called on SharedBufferManagerParent thread");
|
|
||||||
} else {
|
|
||||||
mgr->mThread->message_loop()->PostTask(
|
|
||||||
NewRunnableFunction(&DropGrallocBufferSync, mgr, aDesc));
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SharedBufferManagerParent::DropGrallocBufferImpl(mozilla::layers::SurfaceDescriptor aDesc)
|
|
||||||
{
|
|
||||||
MutexAutoLock lock(mLock);
|
|
||||||
if (mDestroyed) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
||||||
int64_t key = -1;
|
|
||||||
MaybeMagicGrallocBufferHandle handle;
|
|
||||||
if (aDesc.type() == SurfaceDescriptor::TSurfaceDescriptorGralloc) {
|
|
||||||
handle = aDesc.get_SurfaceDescriptorGralloc().buffer();
|
|
||||||
} else {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (handle.type() == MaybeMagicGrallocBufferHandle::TGrallocBufferRef) {
|
|
||||||
key = handle.get_GrallocBufferRef().mKey;
|
|
||||||
} else if (handle.type() == MaybeMagicGrallocBufferHandle::TMagicGrallocBufferHandle) {
|
|
||||||
key = handle.get_MagicGrallocBufferHandle().mRef.mKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_ASSERTION(key != -1, "Invalid buffer key");
|
|
||||||
NS_ASSERTION(mBuffers.count(key) == 1, "No such buffer");
|
|
||||||
mBuffers.erase(key);
|
|
||||||
mozilla::Unused << SendDropGrallocBuffer(handle);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
MessageLoop* SharedBufferManagerParent::GetMessageLoop()
|
|
||||||
{
|
|
||||||
return mThread->message_loop();
|
|
||||||
}
|
|
||||||
|
|
||||||
SharedBufferManagerParent* SharedBufferManagerParent::GetInstance(ProcessId id)
|
|
||||||
{
|
|
||||||
NS_ASSERTION(sManagers.count(id) == 1, "No BufferManager for the process");
|
|
||||||
if (sManagers.count(id) == 1) {
|
|
||||||
return sManagers[id];
|
|
||||||
} else {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
||||||
android::sp<android::GraphicBuffer>
|
|
||||||
SharedBufferManagerParent::GetGraphicBuffer(int64_t key)
|
|
||||||
{
|
|
||||||
MutexAutoLock lock(mLock);
|
|
||||||
if (mBuffers.count(key) == 1) {
|
|
||||||
return mBuffers[key];
|
|
||||||
} else {
|
|
||||||
// The buffer can be dropped, or invalid
|
|
||||||
printf_stderr("SharedBufferManagerParent::GetGraphicBuffer -- invalid key");
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
android::sp<android::GraphicBuffer>
|
|
||||||
SharedBufferManagerParent::GetGraphicBuffer(GrallocBufferRef aRef)
|
|
||||||
{
|
|
||||||
MonitorAutoLock lock(*sManagerMonitor.get());
|
|
||||||
SharedBufferManagerParent* parent = GetInstance(aRef.mOwner);
|
|
||||||
if (!parent) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return parent->GetGraphicBuffer(aRef.mKey);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} /* namespace layers */
|
|
||||||
} /* namespace mozilla */
|
|
||||||
@@ -1,110 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* vim: set sw=2 ts=8 et 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 SharedBufferManagerPARENT_H_
|
|
||||||
#define SharedBufferManagerPARENT_H_
|
|
||||||
|
|
||||||
#include "mozilla/Atomics.h" // for Atomic
|
|
||||||
#include "mozilla/layers/PSharedBufferManagerParent.h"
|
|
||||||
#include "mozilla/StaticPtr.h"
|
|
||||||
|
|
||||||
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
||||||
#include "mozilla/ipc/ProtocolUtils.h"
|
|
||||||
#include "mozilla/Mutex.h" // for Mutex
|
|
||||||
|
|
||||||
namespace android {
|
|
||||||
class GraphicBuffer;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace base {
|
|
||||||
class Thread;
|
|
||||||
} // namespace base
|
|
||||||
|
|
||||||
namespace mozilla {
|
|
||||||
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
||||||
class Mutex;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace layers {
|
|
||||||
|
|
||||||
class SharedBufferManagerParent : public PSharedBufferManagerParent
|
|
||||||
{
|
|
||||||
friend class GrallocReporter;
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* Create a SharedBufferManagerParent for child process, and link to the child side before leaving
|
|
||||||
*/
|
|
||||||
static PSharedBufferManagerParent* Create(Transport* aTransport, ProcessId aOtherProcess);
|
|
||||||
|
|
||||||
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
||||||
android::sp<android::GraphicBuffer> GetGraphicBuffer(int64_t key);
|
|
||||||
static android::sp<android::GraphicBuffer> GetGraphicBuffer(GrallocBufferRef aRef);
|
|
||||||
#endif
|
|
||||||
/**
|
|
||||||
* Create a SharedBufferManagerParent but do not open the link
|
|
||||||
*/
|
|
||||||
SharedBufferManagerParent(ProcessId aOwner, base::Thread* aThread);
|
|
||||||
virtual ~SharedBufferManagerParent();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* When the IPC channel down or something bad make this Manager die, clear all the buffer reference!
|
|
||||||
*/
|
|
||||||
virtual void ActorDestroy(ActorDestroyReason aWhy) override;
|
|
||||||
|
|
||||||
virtual bool RecvAllocateGrallocBuffer(const IntSize&, const uint32_t&, const uint32_t&, mozilla::layers::MaybeMagicGrallocBufferHandle*) override;
|
|
||||||
virtual bool RecvDropGrallocBuffer(const mozilla::layers::MaybeMagicGrallocBufferHandle& handle) override;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Break the buffer's sharing state, decrease buffer reference for both side
|
|
||||||
*/
|
|
||||||
static void DropGrallocBuffer(ProcessId id, mozilla::layers::SurfaceDescriptor aDesc);
|
|
||||||
|
|
||||||
MessageLoop* GetMessageLoop();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Break the buffer's sharing state, decrease buffer reference for both side
|
|
||||||
*
|
|
||||||
* Must be called from SharedBufferManagerParent's thread
|
|
||||||
*/
|
|
||||||
void DropGrallocBufferImpl(mozilla::layers::SurfaceDescriptor aDesc);
|
|
||||||
|
|
||||||
// dispatched function
|
|
||||||
static void DropGrallocBufferSync(SharedBufferManagerParent* mgr, mozilla::layers::SurfaceDescriptor aDesc);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function for find the buffer owner, most buffer passing on IPC contains only owner/key pair.
|
|
||||||
* Use these function to access the real buffer.
|
|
||||||
* Caller needs to hold sManagerMonitor.
|
|
||||||
*/
|
|
||||||
static SharedBufferManagerParent* GetInstance(ProcessId id);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* All living SharedBufferManager instances used to find the buffer owner, and parent->child IPCs
|
|
||||||
*/
|
|
||||||
static std::map<base::ProcessId, SharedBufferManagerParent*> sManagers;
|
|
||||||
|
|
||||||
#ifdef MOZ_HAVE_SURFACEDESCRIPTORGRALLOC
|
|
||||||
/**
|
|
||||||
* Buffers owned by this SharedBufferManager pair
|
|
||||||
*/
|
|
||||||
std::map<int64_t, android::sp<android::GraphicBuffer> > mBuffers;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
base::ProcessId mOwner;
|
|
||||||
base::Thread* mThread;
|
|
||||||
bool mDestroyed;
|
|
||||||
Mutex mLock;
|
|
||||||
|
|
||||||
static uint64_t sBufferKey;
|
|
||||||
static StaticAutoPtr<Monitor> sManagerMonitor;
|
|
||||||
};
|
|
||||||
|
|
||||||
} /* namespace layers */
|
|
||||||
} /* namespace mozilla */
|
|
||||||
#endif /* SharedBufferManagerPARENT_H_ */
|
|
||||||
@@ -26,7 +26,6 @@ EXPORTS += [
|
|||||||
'FrameMetrics.h',
|
'FrameMetrics.h',
|
||||||
'GLImages.h',
|
'GLImages.h',
|
||||||
'GPUVideoImage.h',
|
'GPUVideoImage.h',
|
||||||
'GrallocImages.h',
|
|
||||||
'ImageContainer.h',
|
'ImageContainer.h',
|
||||||
'ImageLayers.h',
|
'ImageLayers.h',
|
||||||
'ImageTypes.h',
|
'ImageTypes.h',
|
||||||
@@ -186,8 +185,6 @@ EXPORTS.mozilla.layers += [
|
|||||||
'ipc/RemoteContentController.h',
|
'ipc/RemoteContentController.h',
|
||||||
'ipc/ShadowLayerChild.h',
|
'ipc/ShadowLayerChild.h',
|
||||||
'ipc/ShadowLayers.h',
|
'ipc/ShadowLayers.h',
|
||||||
'ipc/SharedBufferManagerChild.h',
|
|
||||||
'ipc/SharedBufferManagerParent.h',
|
|
||||||
'ipc/SharedPlanarYCbCrImage.h',
|
'ipc/SharedPlanarYCbCrImage.h',
|
||||||
'ipc/SharedRGBImage.h',
|
'ipc/SharedRGBImage.h',
|
||||||
'ipc/TextureForwarder.h',
|
'ipc/TextureForwarder.h',
|
||||||
@@ -197,8 +194,6 @@ EXPORTS.mozilla.layers += [
|
|||||||
'LayersTypes.h',
|
'LayersTypes.h',
|
||||||
'opengl/CompositingRenderTargetOGL.h',
|
'opengl/CompositingRenderTargetOGL.h',
|
||||||
'opengl/CompositorOGL.h',
|
'opengl/CompositorOGL.h',
|
||||||
'opengl/GrallocTextureClient.h',
|
|
||||||
'opengl/GrallocTextureHost.h',
|
|
||||||
'opengl/MacIOSurfaceTextureClientOGL.h',
|
'opengl/MacIOSurfaceTextureClientOGL.h',
|
||||||
'opengl/MacIOSurfaceTextureHostOGL.h',
|
'opengl/MacIOSurfaceTextureHostOGL.h',
|
||||||
'opengl/TextureClientOGL.h',
|
'opengl/TextureClientOGL.h',
|
||||||
@@ -243,34 +238,6 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
|
|||||||
'MacIOSurfaceImage.cpp',
|
'MacIOSurfaceImage.cpp',
|
||||||
]
|
]
|
||||||
|
|
||||||
# NB: Gralloc is available on other platforms that use the android GL
|
|
||||||
# libraries, but only Gonk is able to use it reliably because Gecko
|
|
||||||
# has full system permissions there.
|
|
||||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk':
|
|
||||||
EXPORTS.mozilla.layers += [
|
|
||||||
'basic/GrallocTextureHostBasic.h',
|
|
||||||
'ipc/ShadowLayerUtilsGralloc.h',
|
|
||||||
]
|
|
||||||
UNIFIED_SOURCES += [
|
|
||||||
'basic/GrallocTextureHostBasic.cpp',
|
|
||||||
'GrallocImages.cpp',
|
|
||||||
'opengl/EGLImageHelpers.cpp',
|
|
||||||
'opengl/GrallocTextureClient.cpp',
|
|
||||||
'opengl/GrallocTextureHost.cpp',
|
|
||||||
]
|
|
||||||
LOCAL_INCLUDES += ['/widget/gonk']
|
|
||||||
if CONFIG['ANDROID_VERSION'] >= '21':
|
|
||||||
LOCAL_INCLUDES += [
|
|
||||||
'%' + '%s/%s' % (CONFIG['ANDROID_SOURCE'], d) for d in [
|
|
||||||
'system/core/libsync/include'
|
|
||||||
]
|
|
||||||
]
|
|
||||||
SOURCES += [
|
|
||||||
'ipc/GonkNativeHandle.cpp',
|
|
||||||
'ipc/GonkNativeHandleUtils.cpp',
|
|
||||||
'ipc/ShadowLayerUtilsGralloc.cpp',
|
|
||||||
]
|
|
||||||
|
|
||||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':
|
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':
|
||||||
UNIFIED_SOURCES += [
|
UNIFIED_SOURCES += [
|
||||||
'apz/src/AndroidAPZ.cpp',
|
'apz/src/AndroidAPZ.cpp',
|
||||||
@@ -386,8 +353,6 @@ UNIFIED_SOURCES += [
|
|||||||
'ipc/ShadowLayerChild.cpp',
|
'ipc/ShadowLayerChild.cpp',
|
||||||
'ipc/ShadowLayerParent.cpp',
|
'ipc/ShadowLayerParent.cpp',
|
||||||
'ipc/ShadowLayers.cpp',
|
'ipc/ShadowLayers.cpp',
|
||||||
'ipc/SharedBufferManagerChild.cpp',
|
|
||||||
'ipc/SharedBufferManagerParent.cpp',
|
|
||||||
'ipc/SharedPlanarYCbCrImage.cpp',
|
'ipc/SharedPlanarYCbCrImage.cpp',
|
||||||
'ipc/SharedRGBImage.cpp',
|
'ipc/SharedRGBImage.cpp',
|
||||||
'ipc/VideoBridgeChild.cpp',
|
'ipc/VideoBridgeChild.cpp',
|
||||||
@@ -447,7 +412,6 @@ IPDL_SOURCES = [
|
|||||||
'ipc/PImageContainer.ipdl',
|
'ipc/PImageContainer.ipdl',
|
||||||
'ipc/PLayer.ipdl',
|
'ipc/PLayer.ipdl',
|
||||||
'ipc/PLayerTransaction.ipdl',
|
'ipc/PLayerTransaction.ipdl',
|
||||||
'ipc/PSharedBufferManager.ipdl',
|
|
||||||
'ipc/PTexture.ipdl',
|
'ipc/PTexture.ipdl',
|
||||||
'ipc/PVideoBridge.ipdl',
|
'ipc/PVideoBridge.ipdl',
|
||||||
]
|
]
|
||||||
@@ -469,22 +433,6 @@ if CONFIG['MOZ_DEBUG']:
|
|||||||
if CONFIG['MOZ_ENABLE_D3D10_LAYER']:
|
if CONFIG['MOZ_ENABLE_D3D10_LAYER']:
|
||||||
DEFINES['MOZ_ENABLE_D3D10_LAYER'] = True
|
DEFINES['MOZ_ENABLE_D3D10_LAYER'] = True
|
||||||
|
|
||||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk':
|
|
||||||
if CONFIG['ANDROID_VERSION'] >= '17':
|
|
||||||
includes = [
|
|
||||||
'frameworks/av/include/media/stagefright',
|
|
||||||
'frameworks/native/include/media/openmax',
|
|
||||||
]
|
|
||||||
else:
|
|
||||||
includes = [
|
|
||||||
'frameworks/base/include/media/stagefright',
|
|
||||||
'frameworks/base/include/media/stagefright/openmax',
|
|
||||||
]
|
|
||||||
|
|
||||||
LOCAL_INCLUDES += [
|
|
||||||
'%' + '%s/%s' % (CONFIG['ANDROID_SOURCE'], d) for d in includes
|
|
||||||
]
|
|
||||||
|
|
||||||
if CONFIG['ENABLE_TESTS']:
|
if CONFIG['ENABLE_TESTS']:
|
||||||
DIRS += ['apz/test/gtest']
|
DIRS += ['apz/test/gtest']
|
||||||
|
|
||||||
|
|||||||
@@ -148,12 +148,6 @@ CompositorOGL::CreateContext()
|
|||||||
NS_WARNING("Failed to create CompositorOGL context");
|
NS_WARNING("Failed to create CompositorOGL context");
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
MOZ_ASSERT(widget);
|
|
||||||
widget->SetNativeData(
|
|
||||||
NS_NATIVE_OPENGL_CONTEXT, reinterpret_cast<uintptr_t>(context.get()));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return context.forget();
|
return context.forget();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,11 +173,6 @@ CompositorOGL::CleanupResources()
|
|||||||
if (!mGLContext)
|
if (!mGLContext)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
mWidget->RealWidget()->SetNativeData(
|
|
||||||
NS_NATIVE_OPENGL_CONTEXT, reinterpret_cast<uintptr_t>(nullptr));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
RefPtr<GLContext> ctx = mGLContext->GetSharedContext();
|
RefPtr<GLContext> ctx = mGLContext->GetSharedContext();
|
||||||
if (!ctx) {
|
if (!ctx) {
|
||||||
ctx = mGLContext;
|
ctx = mGLContext;
|
||||||
@@ -1778,11 +1767,7 @@ GLuint
|
|||||||
CompositorOGL::GetTemporaryTexture(GLenum aTarget, GLenum aUnit)
|
CompositorOGL::GetTemporaryTexture(GLenum aTarget, GLenum aUnit)
|
||||||
{
|
{
|
||||||
if (!mTexturePool) {
|
if (!mTexturePool) {
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
mTexturePool = new PerFrameTexturePoolOGL(gl());
|
|
||||||
#else
|
|
||||||
mTexturePool = new PerUnitTexturePoolOGL(gl());
|
mTexturePool = new PerUnitTexturePoolOGL(gl());
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
return mTexturePool->GetTexture(aTarget, aUnit);
|
return mTexturePool->GetTexture(aTarget, aUnit);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,10 +33,6 @@
|
|||||||
#include "nsXULAppAPI.h" // for XRE_GetProcessType
|
#include "nsXULAppAPI.h" // for XRE_GetProcessType
|
||||||
#include "nscore.h" // for NS_IMETHOD
|
#include "nscore.h" // for NS_IMETHOD
|
||||||
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 21
|
|
||||||
#include "nsTHashtable.h" // for nsTHashtable
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class nsIWidget;
|
class nsIWidget;
|
||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
@@ -52,10 +48,6 @@ struct Effect;
|
|||||||
struct EffectChain;
|
struct EffectChain;
|
||||||
class GLBlitTextureImageHelper;
|
class GLBlitTextureImageHelper;
|
||||||
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 21
|
|
||||||
class ImageHostOverlay;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface for pools of temporary gl textures for the compositor.
|
* Interface for pools of temporary gl textures for the compositor.
|
||||||
* The textures are fully owned by the pool, so the latter is responsible
|
* The textures are fully owned by the pool, so the latter is responsible
|
||||||
@@ -259,25 +251,15 @@ public:
|
|||||||
|
|
||||||
virtual bool HasImageHostOverlays() override
|
virtual bool HasImageHostOverlays() override
|
||||||
{
|
{
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 21
|
|
||||||
return mImageHostOverlays.Count() > 0;
|
|
||||||
#else
|
|
||||||
return false;
|
return false;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void AddImageHostOverlay(ImageHostOverlay* aOverlay) override
|
virtual void AddImageHostOverlay(ImageHostOverlay* aOverlay) override
|
||||||
{
|
{
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 21
|
|
||||||
mImageHostOverlays.PutEntry(aOverlay);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void RemoveImageHostOverlay(ImageHostOverlay* aOverlay) override
|
virtual void RemoveImageHostOverlay(ImageHostOverlay* aOverlay) override
|
||||||
{
|
{
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 21
|
|
||||||
mImageHostOverlays.RemoveEntry(aOverlay);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GLContext* gl() const { return mGLContext; }
|
GLContext* gl() const { return mGLContext; }
|
||||||
@@ -509,11 +491,6 @@ private:
|
|||||||
gfx::IntSize mViewportSize;
|
gfx::IntSize mViewportSize;
|
||||||
|
|
||||||
ShaderProgramOGL *mCurrentProgram;
|
ShaderProgramOGL *mCurrentProgram;
|
||||||
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 21
|
|
||||||
nsTHashtable<nsPtrHashKey<ImageHostOverlay> > mImageHostOverlays;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace layers
|
} // namespace layers
|
||||||
|
|||||||
@@ -1,460 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
// * 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/. */
|
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
|
|
||||||
#include "mozilla/gfx/2D.h"
|
|
||||||
#include "mozilla/layers/AsyncTransactionTracker.h" // for AsyncTransactionTracker
|
|
||||||
#include "mozilla/layers/GrallocTextureClient.h"
|
|
||||||
#include "mozilla/layers/TextureForwarder.h"
|
|
||||||
#include "mozilla/layers/ISurfaceAllocator.h"
|
|
||||||
#include "mozilla/layers/ShadowLayerUtilsGralloc.h"
|
|
||||||
#include "mozilla/layers/SharedBufferManagerChild.h"
|
|
||||||
#include "gfx2DGlue.h"
|
|
||||||
#include "gfxPrefs.h" // for gfxPrefs
|
|
||||||
#include "SharedSurfaceGralloc.h"
|
|
||||||
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
|
|
||||||
#include <ui/Fence.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace mozilla {
|
|
||||||
namespace layers {
|
|
||||||
|
|
||||||
using namespace mozilla::gfx;
|
|
||||||
using namespace android;
|
|
||||||
|
|
||||||
static bool
|
|
||||||
DisableGralloc(SurfaceFormat aFormat, const gfx::IntSize& aSizeHint)
|
|
||||||
{
|
|
||||||
if (gfxPrefs::DisableGralloc()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (aFormat == gfx::SurfaceFormat::A8) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
gfx::SurfaceFormat
|
|
||||||
SurfaceFormatForPixelFormat(android::PixelFormat aFormat)
|
|
||||||
{
|
|
||||||
switch (aFormat) {
|
|
||||||
case PIXEL_FORMAT_RGBA_8888:
|
|
||||||
return gfx::SurfaceFormat::R8G8B8A8;
|
|
||||||
case PIXEL_FORMAT_BGRA_8888:
|
|
||||||
return gfx::SurfaceFormat::B8G8R8A8;
|
|
||||||
case PIXEL_FORMAT_RGBX_8888:
|
|
||||||
return gfx::SurfaceFormat::R8G8B8X8;
|
|
||||||
case PIXEL_FORMAT_RGB_565:
|
|
||||||
return gfx::SurfaceFormat::R5G6B5_UINT16;
|
|
||||||
case HAL_PIXEL_FORMAT_YV12:
|
|
||||||
return gfx::SurfaceFormat::YUV;
|
|
||||||
default:
|
|
||||||
return gfx::SurfaceFormat::UNKNOWN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
IsGrallocRBSwapped(gfx::SurfaceFormat aFormat) {
|
|
||||||
switch (aFormat) {
|
|
||||||
case gfx::SurfaceFormat::B8G8R8A8:
|
|
||||||
case gfx::SurfaceFormat::B8G8R8X8:
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t GetAndroidFormat(gfx::SurfaceFormat aFormat)
|
|
||||||
{
|
|
||||||
switch (aFormat) {
|
|
||||||
case gfx::SurfaceFormat::R8G8B8A8:
|
|
||||||
case gfx::SurfaceFormat::B8G8R8A8:
|
|
||||||
return android::PIXEL_FORMAT_RGBA_8888;
|
|
||||||
case gfx::SurfaceFormat::R8G8B8X8:
|
|
||||||
case gfx::SurfaceFormat::B8G8R8X8:
|
|
||||||
return android::PIXEL_FORMAT_RGBX_8888;
|
|
||||||
case gfx::SurfaceFormat::R5G6B5_UINT16:
|
|
||||||
return android::PIXEL_FORMAT_RGB_565;
|
|
||||||
case gfx::SurfaceFormat::YUV:
|
|
||||||
return HAL_PIXEL_FORMAT_YV12;
|
|
||||||
case gfx::SurfaceFormat::A8:
|
|
||||||
NS_WARNING("gralloc does not support SurfaceFormat::A8");
|
|
||||||
default:
|
|
||||||
NS_WARNING("Unsupported surface format");
|
|
||||||
return android::PIXEL_FORMAT_UNKNOWN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
GrallocTextureData::GrallocTextureData(MaybeMagicGrallocBufferHandle aGrallocHandle,
|
|
||||||
gfx::IntSize aSize, gfx::SurfaceFormat aFormat,
|
|
||||||
gfx::BackendType aMoz2DBackend)
|
|
||||||
: mSize(aSize)
|
|
||||||
, mFormat(aFormat)
|
|
||||||
, mMoz2DBackend(aMoz2DBackend)
|
|
||||||
, mGrallocHandle(aGrallocHandle)
|
|
||||||
, mMappedBuffer(nullptr)
|
|
||||||
, mMediaBuffer(nullptr)
|
|
||||||
{
|
|
||||||
mGraphicBuffer = GetGraphicBufferFrom(aGrallocHandle);
|
|
||||||
MOZ_COUNT_CTOR(GrallocTextureData);
|
|
||||||
}
|
|
||||||
|
|
||||||
GrallocTextureData::~GrallocTextureData()
|
|
||||||
{
|
|
||||||
MOZ_COUNT_DTOR(GrallocTextureData);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureData::Deallocate(LayersIPCChannel* aAllocator)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(aAllocator);
|
|
||||||
if (aAllocator && aAllocator->IPCOpen()) {
|
|
||||||
SharedBufferManagerChild::GetSingleton()->DeallocGrallocBuffer(mGrallocHandle);
|
|
||||||
}
|
|
||||||
|
|
||||||
mGrallocHandle = null_t();
|
|
||||||
mGraphicBuffer = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureData::Forget(LayersIPCChannel* aAllocator)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(aAllocator);
|
|
||||||
if (aAllocator && aAllocator->IPCOpen()) {
|
|
||||||
SharedBufferManagerChild::GetSingleton()->DropGrallocBuffer(mGrallocHandle);
|
|
||||||
}
|
|
||||||
|
|
||||||
mGrallocHandle = null_t();
|
|
||||||
mGraphicBuffer = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureData::FillInfo(TextureData::Info& aInfo) const
|
|
||||||
{
|
|
||||||
aInfo.size = mSize;
|
|
||||||
aInfo.format = mFormat;
|
|
||||||
aInfo.hasIntermediateBuffer = false;
|
|
||||||
aInfo.hasSynchronization = true;
|
|
||||||
aInfo.supportsMoz2D = true;
|
|
||||||
aInfo.canExposeMappedData = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
GrallocTextureData::Serialize(SurfaceDescriptor& aOutDescriptor)
|
|
||||||
{
|
|
||||||
aOutDescriptor = SurfaceDescriptorGralloc(mGrallocHandle, gfx::IsOpaque(mFormat));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureData::WaitForFence(FenceHandle* aFence)
|
|
||||||
{
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION < 21 && ANDROID_VERSION >= 17
|
|
||||||
if (aFence && aFence->IsValid()) {
|
|
||||||
RefPtr<FenceHandle::FdObj> fdObj = aFence->GetAndResetFdObj();
|
|
||||||
android::sp<Fence> fence = new Fence(fdObj->GetAndResetFd());
|
|
||||||
#if ANDROID_VERSION == 17
|
|
||||||
fence->waitForever(1000, "GrallocTextureData::Lock");
|
|
||||||
// 1000 is what Android uses. It is a warning timeout in ms.
|
|
||||||
// This timeout was removed in ANDROID_VERSION 18.
|
|
||||||
#else
|
|
||||||
fence->waitForever("GrallocTextureData::Lock");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
GrallocTextureData::Lock(OpenMode aMode, FenceHandle* aReleaseFence)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(!mMappedBuffer);
|
|
||||||
|
|
||||||
uint32_t usage = 0;
|
|
||||||
if (aMode & OpenMode::OPEN_READ) {
|
|
||||||
usage |= GRALLOC_USAGE_SW_READ_OFTEN;
|
|
||||||
}
|
|
||||||
if (aMode & OpenMode::OPEN_WRITE) {
|
|
||||||
usage |= GRALLOC_USAGE_SW_WRITE_OFTEN;
|
|
||||||
}
|
|
||||||
|
|
||||||
void** mappedBufferPtr = reinterpret_cast<void**>(&mMappedBuffer);
|
|
||||||
|
|
||||||
int32_t rv = 0;
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 21
|
|
||||||
if (aReleaseFence) {
|
|
||||||
RefPtr<FenceHandle::FdObj> fdObj = aReleaseFence->GetAndResetFdObj();
|
|
||||||
rv = mGraphicBuffer->lockAsync(usage, mappedBufferPtr,
|
|
||||||
fdObj->GetAndResetFd());
|
|
||||||
} else {
|
|
||||||
rv = mGraphicBuffer->lock(usage, mappedBufferPtr);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// older versions of android don't have lockAsync
|
|
||||||
WaitForFence(aReleaseFence);
|
|
||||||
rv = mGraphicBuffer->lock(usage, mappedBufferPtr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (rv) {
|
|
||||||
mMappedBuffer = nullptr;
|
|
||||||
NS_WARNING("Couldn't lock graphic buffer");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureData::Unlock()
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(mMappedBuffer);
|
|
||||||
mMappedBuffer = nullptr;
|
|
||||||
mGraphicBuffer->unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
already_AddRefed<gfx::DrawTarget>
|
|
||||||
GrallocTextureData::BorrowDrawTarget()
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(mMappedBuffer);
|
|
||||||
if (!mMappedBuffer) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
long byteStride = mGraphicBuffer->getStride() * BytesPerPixel(mFormat);
|
|
||||||
return gfxPlatform::CreateDrawTargetForData(mMappedBuffer, mSize,
|
|
||||||
byteStride, mFormat);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
GrallocTextureData::BorrowMappedData(MappedTextureData& aMap)
|
|
||||||
{
|
|
||||||
if (mFormat == gfx::SurfaceFormat::YUV || !mMappedBuffer) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
aMap.data = mMappedBuffer;
|
|
||||||
aMap.size = mSize;
|
|
||||||
aMap.stride = mGraphicBuffer->getStride() * BytesPerPixel(mFormat);
|
|
||||||
aMap.format = mFormat;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
GrallocTextureData::UpdateFromSurface(gfx::SourceSurface* aSurface)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(mMappedBuffer, "Calling TextureClient::BorrowDrawTarget without locking :(");
|
|
||||||
|
|
||||||
if (!mMappedBuffer) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
RefPtr<DataSourceSurface> srcSurf = aSurface->GetDataSurface();
|
|
||||||
|
|
||||||
if (!srcSurf) {
|
|
||||||
gfxCriticalError() << "Failed to GetDataSurface in UpdateFromSurface (GTC).";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
gfx::SurfaceFormat format = SurfaceFormatForPixelFormat(mGraphicBuffer->getPixelFormat());
|
|
||||||
if (mSize != srcSurf->GetSize() || mFormat != srcSurf->GetFormat()) {
|
|
||||||
gfxCriticalError() << "Attempt to update texture client from a surface with a different size or format! This: " << mSize << " " << format << " Other: " << srcSurf->GetSize() << " " << srcSurf->GetFormat();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
long pixelStride = mGraphicBuffer->getStride();
|
|
||||||
long byteStride = pixelStride * BytesPerPixel(format);
|
|
||||||
|
|
||||||
DataSourceSurface::MappedSurface sourceMap;
|
|
||||||
|
|
||||||
if (!srcSurf->Map(DataSourceSurface::READ, &sourceMap)) {
|
|
||||||
gfxCriticalError() << "Failed to map source surface for UpdateFromSurface (GTC).";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int y = 0; y < srcSurf->GetSize().height; y++) {
|
|
||||||
memcpy(mMappedBuffer + byteStride * y,
|
|
||||||
sourceMap.mData + sourceMap.mStride * y,
|
|
||||||
srcSurf->GetSize().width * BytesPerPixel(srcSurf->GetFormat()));
|
|
||||||
}
|
|
||||||
|
|
||||||
srcSurf->Unmap();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
GrallocTextureData*
|
|
||||||
GrallocTextureData::Create(gfx::IntSize aSize, AndroidFormat aAndroidFormat,
|
|
||||||
gfx::BackendType aMoz2dBackend, uint32_t aUsage,
|
|
||||||
LayersIPCChannel* aAllocator)
|
|
||||||
{
|
|
||||||
if (!aAllocator || !aAllocator->IPCOpen()) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
gfx::SurfaceFormat format;
|
|
||||||
switch (aAndroidFormat) {
|
|
||||||
case android::PIXEL_FORMAT_RGBA_8888:
|
|
||||||
format = gfx::SurfaceFormat::B8G8R8A8;
|
|
||||||
break;
|
|
||||||
case android::PIXEL_FORMAT_BGRA_8888:
|
|
||||||
format = gfx::SurfaceFormat::B8G8R8A8;
|
|
||||||
break;
|
|
||||||
case android::PIXEL_FORMAT_RGBX_8888:
|
|
||||||
format = gfx::SurfaceFormat::B8G8R8X8;
|
|
||||||
break;
|
|
||||||
case android::PIXEL_FORMAT_RGB_565:
|
|
||||||
format = gfx::SurfaceFormat::R5G6B5_UINT16;
|
|
||||||
break;
|
|
||||||
case HAL_PIXEL_FORMAT_YV12:
|
|
||||||
format = gfx::SurfaceFormat::YUV;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
format = gfx::SurfaceFormat::UNKNOWN;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (DisableGralloc(format, aSize)) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
MaybeMagicGrallocBufferHandle handle;
|
|
||||||
if (!SharedBufferManagerChild::GetSingleton()->AllocGrallocBuffer(aSize, aAndroidFormat, aUsage, &handle)) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
sp<GraphicBuffer> graphicBuffer = GetGraphicBufferFrom(handle);
|
|
||||||
if (!graphicBuffer.get()) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (graphicBuffer->initCheck() != NO_ERROR) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new GrallocTextureData(handle, aSize, format, aMoz2dBackend);
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
GrallocTextureData*
|
|
||||||
GrallocTextureData::CreateForDrawing(gfx::IntSize aSize, gfx::SurfaceFormat aFormat,
|
|
||||||
gfx::BackendType aMoz2dBackend,
|
|
||||||
LayersIPCChannel* aAllocator)
|
|
||||||
{
|
|
||||||
if (DisableGralloc(aFormat, aSize)) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if ANDROID_VERSION <= 15
|
|
||||||
// Adreno 200 has a problem of drawing gralloc buffer width less than 64 and
|
|
||||||
// drawing gralloc buffer with a height 9px-16px.
|
|
||||||
// See Bug 983971.
|
|
||||||
// We only have this restriction in TextureClients that we'll use for drawing
|
|
||||||
// (not with WebGL for instance). Not sure why that's OK, but we have tests that
|
|
||||||
// rely on being able to create 32x32 webgl canvases with gralloc, so moving
|
|
||||||
// this check in DisableGralloc will break them.
|
|
||||||
if (aSize.width < 64 || aSize.height < 32) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
uint32_t usage = android::GraphicBuffer::USAGE_SW_READ_OFTEN |
|
|
||||||
android::GraphicBuffer::USAGE_SW_WRITE_OFTEN |
|
|
||||||
android::GraphicBuffer::USAGE_HW_TEXTURE;
|
|
||||||
auto data = GrallocTextureData::Create(aSize, GetAndroidFormat(aFormat),
|
|
||||||
aMoz2dBackend, usage, aAllocator);
|
|
||||||
|
|
||||||
if (!data) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
DebugOnly<gfx::SurfaceFormat> grallocFormat =
|
|
||||||
SurfaceFormatForPixelFormat(data->mGraphicBuffer->getPixelFormat());
|
|
||||||
// mFormat may be different from the format the graphic buffer reports if we
|
|
||||||
// swap the R and B channels but we should always have at least the same bytes
|
|
||||||
// per pixel!
|
|
||||||
MOZ_ASSERT(BytesPerPixel(data->mFormat) == BytesPerPixel(grallocFormat));
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
TextureFlags
|
|
||||||
GrallocTextureData::GetTextureFlags() const
|
|
||||||
{
|
|
||||||
if (IsGrallocRBSwapped(mFormat)) {
|
|
||||||
return TextureFlags::RB_SWAPPED;
|
|
||||||
}
|
|
||||||
return TextureFlags::NO_FLAGS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// static
|
|
||||||
GrallocTextureData*
|
|
||||||
GrallocTextureData::CreateForYCbCr(gfx::IntSize aYSize, gfx::IntSize aCbCrSize,
|
|
||||||
LayersIPCChannel* aAllocator)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(aYSize.width == aCbCrSize.width * 2);
|
|
||||||
MOZ_ASSERT(aYSize.height == aCbCrSize.height * 2);
|
|
||||||
return GrallocTextureData::Create(aYSize, HAL_PIXEL_FORMAT_YV12,
|
|
||||||
gfx::BackendType::NONE,
|
|
||||||
android::GraphicBuffer::USAGE_SW_READ_OFTEN,
|
|
||||||
aAllocator);
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
GrallocTextureData*
|
|
||||||
GrallocTextureData::CreateForGLRendering(gfx::IntSize aSize, gfx::SurfaceFormat aFormat,
|
|
||||||
LayersIPCChannel* aAllocator)
|
|
||||||
{
|
|
||||||
if (aFormat == gfx::SurfaceFormat::YUV) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
uint32_t usage = android::GraphicBuffer::USAGE_HW_RENDER |
|
|
||||||
android::GraphicBuffer::USAGE_HW_TEXTURE;
|
|
||||||
return GrallocTextureData::Create(aSize, GetAndroidFormat(aFormat),
|
|
||||||
gfx::BackendType::NONE, usage, aAllocator);
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
|
||||||
already_AddRefed<TextureClient>
|
|
||||||
GrallocTextureData::TextureClientFromSharedSurface(gl::SharedSurface* abstractSurf,
|
|
||||||
TextureFlags flags)
|
|
||||||
{
|
|
||||||
auto surf = gl::SharedSurface_Gralloc::Cast(abstractSurf);
|
|
||||||
|
|
||||||
RefPtr<TextureClient> ret = surf->GetTextureClient();
|
|
||||||
|
|
||||||
TextureFlags mask = TextureFlags::ORIGIN_BOTTOM_LEFT |
|
|
||||||
TextureFlags::RB_SWAPPED |
|
|
||||||
TextureFlags::NON_PREMULTIPLIED;
|
|
||||||
TextureFlags required = flags & mask;
|
|
||||||
TextureFlags present = ret->GetFlags() & mask;
|
|
||||||
|
|
||||||
if (present != required) {
|
|
||||||
printf_stderr("Present flags: 0x%x. Required: 0x%x.\n",
|
|
||||||
(uint32_t)present,
|
|
||||||
(uint32_t)required);
|
|
||||||
MOZ_CRASH("Flag requirement mismatch.");
|
|
||||||
}
|
|
||||||
return ret.forget();
|
|
||||||
}
|
|
||||||
|
|
||||||
TextureData*
|
|
||||||
GrallocTextureData::CreateSimilar(LayersIPCChannel* aAllocator,
|
|
||||||
LayersBackend aLayersBackend,
|
|
||||||
TextureFlags aFlags,
|
|
||||||
TextureAllocationFlags aAllocFlags) const
|
|
||||||
{
|
|
||||||
if (mFormat == gfx::SurfaceFormat::YUV) {
|
|
||||||
return GrallocTextureData::CreateForYCbCr(mSize, mSize*2, aAllocator);
|
|
||||||
} else {
|
|
||||||
return GrallocTextureData::CreateForDrawing(mSize, mFormat, mMoz2DBackend, aAllocator);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namesapace layers
|
|
||||||
} // namesapace mozilla
|
|
||||||
|
|
||||||
#endif // MOZ_WIDGET_GONK
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
// * 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_GRALLOCTEXTURECLIENT_H
|
|
||||||
#define MOZILLA_GFX_GRALLOCTEXTURECLIENT_H
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
|
|
||||||
#include "mozilla/layers/TextureClient.h"
|
|
||||||
#include "mozilla/layers/FenceUtils.h" // for FenceHandle
|
|
||||||
#include "mozilla/layers/ShadowLayerUtilsGralloc.h"
|
|
||||||
#include <ui/GraphicBuffer.h>
|
|
||||||
|
|
||||||
|
|
||||||
namespace android {
|
|
||||||
class MediaBuffer;
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace mozilla {
|
|
||||||
namespace gl {
|
|
||||||
class SharedSurface;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace layers {
|
|
||||||
|
|
||||||
/// A TextureData implementation based on android::GraphicBuffer (also referred to
|
|
||||||
/// as "gralloc").
|
|
||||||
///
|
|
||||||
/// Gralloc lets us map texture data in memory (accessible through pointers)
|
|
||||||
/// and also use it directly as an OpenGL texture without the cost of texture
|
|
||||||
/// uploads.
|
|
||||||
/// Gralloc buffers can also be shared accros processes.
|
|
||||||
///
|
|
||||||
/// More info about Gralloc here: https://wiki.mozilla.org/Platform/GFX/Gralloc
|
|
||||||
///
|
|
||||||
/// This is only used in Firefox OS
|
|
||||||
class GrallocTextureData : public TextureData {
|
|
||||||
public:
|
|
||||||
typedef uint32_t AndroidFormat;
|
|
||||||
|
|
||||||
virtual bool Serialize(SurfaceDescriptor& aOutDescriptor) override;
|
|
||||||
|
|
||||||
virtual bool Lock(OpenMode aMode, FenceHandle* aFence) override;
|
|
||||||
|
|
||||||
virtual void Unlock() override;
|
|
||||||
|
|
||||||
virtual void FillInfo(TextureData::Info& aInfo) const override;
|
|
||||||
|
|
||||||
virtual already_AddRefed<gfx::DrawTarget> BorrowDrawTarget() override;
|
|
||||||
|
|
||||||
virtual bool BorrowMappedData(MappedTextureData& aMap) override;
|
|
||||||
|
|
||||||
virtual void Deallocate(LayersIPCChannel*) override;
|
|
||||||
|
|
||||||
virtual void Forget(LayersIPCChannel*) override;
|
|
||||||
|
|
||||||
static GrallocTextureData* CreateForDrawing(gfx::IntSize aSize, gfx::SurfaceFormat aFormat,
|
|
||||||
gfx::BackendType aMoz2dBackend,
|
|
||||||
LayersIPCChannel* aAllocator);
|
|
||||||
|
|
||||||
static GrallocTextureData* CreateForYCbCr(gfx::IntSize aYSize, gfx::IntSize aCbCrSize,
|
|
||||||
LayersIPCChannel* aAllocator);
|
|
||||||
|
|
||||||
static GrallocTextureData* CreateForGLRendering(gfx::IntSize aSize, gfx::SurfaceFormat aFormat,
|
|
||||||
LayersIPCChannel* aAllocator);
|
|
||||||
|
|
||||||
static GrallocTextureData* Create(gfx::IntSize aSize, AndroidFormat aFormat,
|
|
||||||
gfx::BackendType aMoz2DBackend, uint32_t aUsage,
|
|
||||||
LayersIPCChannel* aAllocator);
|
|
||||||
|
|
||||||
|
|
||||||
static already_AddRefed<TextureClient>
|
|
||||||
TextureClientFromSharedSurface(gl::SharedSurface* abstractSurf, TextureFlags flags);
|
|
||||||
|
|
||||||
virtual TextureData*
|
|
||||||
CreateSimilar(LayersIPCChannel* aAllocator,
|
|
||||||
LayersBackend aLayersBackend,
|
|
||||||
TextureFlags aFlags = TextureFlags::DEFAULT,
|
|
||||||
TextureAllocationFlags aAllocFlags = ALLOC_DEFAULT) const override;
|
|
||||||
|
|
||||||
// use TextureClient's default implementation
|
|
||||||
virtual bool UpdateFromSurface(gfx::SourceSurface* aSurface) override;
|
|
||||||
|
|
||||||
/// Hold android::MediaBuffer.
|
|
||||||
/// MediaBuffer needs to be add refed to keep MediaBuffer alive while the texture
|
|
||||||
/// is in use.
|
|
||||||
///
|
|
||||||
/// TODO - ideally we should be able to put the MediaBuffer in the texture's
|
|
||||||
/// constructor and not expose these methods.
|
|
||||||
void SetMediaBuffer(android::MediaBuffer* aMediaBuffer) { mMediaBuffer = aMediaBuffer; }
|
|
||||||
android::MediaBuffer* GetMediaBuffer() { return mMediaBuffer; }
|
|
||||||
|
|
||||||
android::sp<android::GraphicBuffer> GetGraphicBuffer() { return mGraphicBuffer; }
|
|
||||||
|
|
||||||
virtual void WaitForFence(FenceHandle* aFence) override;
|
|
||||||
|
|
||||||
~GrallocTextureData();
|
|
||||||
|
|
||||||
virtual TextureFlags GetTextureFlags() const override;
|
|
||||||
|
|
||||||
virtual GrallocTextureData* AsGrallocTextureData() { return this; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
GrallocTextureData(MaybeMagicGrallocBufferHandle aGrallocHandle,
|
|
||||||
gfx::IntSize aSize, gfx::SurfaceFormat aFormat,
|
|
||||||
gfx::BackendType aMoz2DBackend);
|
|
||||||
|
|
||||||
gfx::IntSize mSize;
|
|
||||||
gfx::SurfaceFormat mFormat;
|
|
||||||
gfx::BackendType mMoz2DBackend;
|
|
||||||
|
|
||||||
MaybeMagicGrallocBufferHandle mGrallocHandle;
|
|
||||||
android::sp<android::GraphicBuffer> mGraphicBuffer;
|
|
||||||
|
|
||||||
// Points to a mapped gralloc buffer between calls to lock and unlock.
|
|
||||||
// Should be null outside of the lock-unlock pair.
|
|
||||||
uint8_t* mMappedBuffer;
|
|
||||||
|
|
||||||
android::MediaBuffer* mMediaBuffer;
|
|
||||||
};
|
|
||||||
|
|
||||||
gfx::SurfaceFormat SurfaceFormatForPixelFormat(android::PixelFormat aFormat);
|
|
||||||
|
|
||||||
} // namespace layers
|
|
||||||
} // namespace mozilla
|
|
||||||
|
|
||||||
#endif // MOZ_WIDGET_GONK
|
|
||||||
#endif
|
|
||||||
@@ -1,480 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
// * 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/. */
|
|
||||||
|
|
||||||
#include "base/process.h"
|
|
||||||
#include "GLContext.h"
|
|
||||||
#include "gfx2DGlue.h"
|
|
||||||
#include <ui/GraphicBuffer.h>
|
|
||||||
#include "GrallocImages.h" // for GrallocImage
|
|
||||||
#include "GLLibraryEGL.h" // for GLLibraryEGL
|
|
||||||
#include "mozilla/gfx/2D.h"
|
|
||||||
#include "mozilla/gfx/DataSurfaceHelpers.h"
|
|
||||||
#include "mozilla/layers/GrallocTextureHost.h"
|
|
||||||
#include "mozilla/layers/SharedBufferManagerParent.h"
|
|
||||||
#include "EGLImageHelpers.h"
|
|
||||||
#include "GLReadTexImageHelper.h"
|
|
||||||
|
|
||||||
namespace mozilla {
|
|
||||||
namespace layers {
|
|
||||||
|
|
||||||
using namespace android;
|
|
||||||
using namespace mozilla::gl;
|
|
||||||
|
|
||||||
static gfx::SurfaceFormat
|
|
||||||
SurfaceFormatForAndroidPixelFormat(android::PixelFormat aFormat,
|
|
||||||
TextureFlags aFlags)
|
|
||||||
{
|
|
||||||
bool swapRB = bool(aFlags & TextureFlags::RB_SWAPPED);
|
|
||||||
switch (aFormat) {
|
|
||||||
case android::PIXEL_FORMAT_BGRA_8888:
|
|
||||||
return swapRB ? gfx::SurfaceFormat::R8G8B8A8 : gfx::SurfaceFormat::B8G8R8A8;
|
|
||||||
case android::PIXEL_FORMAT_RGBA_8888:
|
|
||||||
return swapRB ? gfx::SurfaceFormat::B8G8R8A8 : gfx::SurfaceFormat::R8G8B8A8;
|
|
||||||
case android::PIXEL_FORMAT_RGBX_8888:
|
|
||||||
return swapRB ? gfx::SurfaceFormat::B8G8R8X8 : gfx::SurfaceFormat::R8G8B8X8;
|
|
||||||
case android::PIXEL_FORMAT_RGB_565:
|
|
||||||
return gfx::SurfaceFormat::R5G6B5_UINT16;
|
|
||||||
case HAL_PIXEL_FORMAT_YCbCr_422_SP:
|
|
||||||
case HAL_PIXEL_FORMAT_YCrCb_420_SP:
|
|
||||||
case HAL_PIXEL_FORMAT_YCbCr_422_I:
|
|
||||||
case GrallocImage::HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
|
|
||||||
case GrallocImage::HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
|
|
||||||
case HAL_PIXEL_FORMAT_YV12:
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
|
|
||||||
case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
|
|
||||||
#endif
|
|
||||||
return gfx::SurfaceFormat::R8G8B8A8; // yup, use SurfaceFormat::R8G8B8A8 even though it's a YUV texture. This is an external texture.
|
|
||||||
default:
|
|
||||||
if (aFormat >= 0x100 && aFormat <= 0x1FF) {
|
|
||||||
// Reserved range for HAL specific formats.
|
|
||||||
return gfx::SurfaceFormat::R8G8B8A8;
|
|
||||||
} else {
|
|
||||||
// This is not super-unreachable, there's a bunch of hypothetical pixel
|
|
||||||
// formats we don't deal with.
|
|
||||||
// We only want to abort in debug builds here, since if we crash here
|
|
||||||
// we'll take down the compositor process and thus the phone. This seems
|
|
||||||
// like undesirable behaviour. We'd rather have a subtle artifact.
|
|
||||||
printf_stderr(" xxxxx unknow android format %i\n", (int)aFormat);
|
|
||||||
MOZ_ASSERT(false, "Unknown Android pixel format.");
|
|
||||||
return gfx::SurfaceFormat::UNKNOWN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static GLenum
|
|
||||||
TextureTargetForAndroidPixelFormat(android::PixelFormat aFormat)
|
|
||||||
{
|
|
||||||
switch (aFormat) {
|
|
||||||
case HAL_PIXEL_FORMAT_YCbCr_422_SP:
|
|
||||||
case HAL_PIXEL_FORMAT_YCrCb_420_SP:
|
|
||||||
case HAL_PIXEL_FORMAT_YCbCr_422_I:
|
|
||||||
case GrallocImage::HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
|
|
||||||
case GrallocImage::HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS:
|
|
||||||
case HAL_PIXEL_FORMAT_YV12:
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
|
|
||||||
case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
|
|
||||||
#endif
|
|
||||||
return LOCAL_GL_TEXTURE_EXTERNAL;
|
|
||||||
case android::PIXEL_FORMAT_BGRA_8888:
|
|
||||||
case android::PIXEL_FORMAT_RGBA_8888:
|
|
||||||
case android::PIXEL_FORMAT_RGBX_8888:
|
|
||||||
case android::PIXEL_FORMAT_RGB_565:
|
|
||||||
return LOCAL_GL_TEXTURE_2D;
|
|
||||||
default:
|
|
||||||
if (aFormat >= 0x100 && aFormat <= 0x1FF) {
|
|
||||||
// Reserved range for HAL specific formats.
|
|
||||||
return LOCAL_GL_TEXTURE_EXTERNAL;
|
|
||||||
} else {
|
|
||||||
// This is not super-unreachable, there's a bunch of hypothetical pixel
|
|
||||||
// formats we don't deal with.
|
|
||||||
// We only want to abort in debug builds here, since if we crash here
|
|
||||||
// we'll take down the compositor process and thus the phone. This seems
|
|
||||||
// like undesirable behaviour. We'd rather have a subtle artifact.
|
|
||||||
MOZ_ASSERT(false, "Unknown Android pixel format.");
|
|
||||||
return LOCAL_GL_TEXTURE_EXTERNAL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
GrallocTextureHostOGL::GrallocTextureHostOGL(TextureFlags aFlags,
|
|
||||||
const SurfaceDescriptorGralloc& aDescriptor)
|
|
||||||
: TextureHost(aFlags)
|
|
||||||
, mGrallocHandle(aDescriptor)
|
|
||||||
, mSize(0, 0)
|
|
||||||
, mCropSize(0, 0)
|
|
||||||
, mFormat(gfx::SurfaceFormat::UNKNOWN)
|
|
||||||
, mEGLImage(EGL_NO_IMAGE)
|
|
||||||
, mIsOpaque(aDescriptor.isOpaque())
|
|
||||||
{
|
|
||||||
android::GraphicBuffer* graphicBuffer = GetGraphicBufferFromDesc(mGrallocHandle).get();
|
|
||||||
MOZ_ASSERT(graphicBuffer);
|
|
||||||
|
|
||||||
if (graphicBuffer) {
|
|
||||||
mFormat =
|
|
||||||
SurfaceFormatForAndroidPixelFormat(graphicBuffer->getPixelFormat(),
|
|
||||||
aFlags & TextureFlags::RB_SWAPPED);
|
|
||||||
mSize = gfx::IntSize(graphicBuffer->getWidth(), graphicBuffer->getHeight());
|
|
||||||
mCropSize = mSize;
|
|
||||||
} else {
|
|
||||||
printf_stderr("gralloc buffer is nullptr\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
GrallocTextureHostOGL::~GrallocTextureHostOGL()
|
|
||||||
{
|
|
||||||
DestroyEGLImage();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureHostOGL::SetCompositor(Compositor* aCompositor)
|
|
||||||
{
|
|
||||||
mCompositor = AssertGLCompositor(aCompositor);
|
|
||||||
if (mGLTextureSource) {
|
|
||||||
mGLTextureSource->SetCompositor(mCompositor);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mCompositor && aCompositor != mCompositor) {
|
|
||||||
DestroyEGLImage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
GrallocTextureHostOGL::Lock()
|
|
||||||
{
|
|
||||||
return IsValid();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureHostOGL::Unlock()
|
|
||||||
{
|
|
||||||
// Unlock is done internally by binding the texture to another gralloc buffer
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
GrallocTextureHostOGL::IsValid() const
|
|
||||||
{
|
|
||||||
android::GraphicBuffer* graphicBuffer = GetGraphicBufferFromDesc(mGrallocHandle).get();
|
|
||||||
return graphicBuffer != nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
gfx::SurfaceFormat
|
|
||||||
GrallocTextureHostOGL::GetFormat() const
|
|
||||||
{
|
|
||||||
return mFormat;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureHostOGL::DeallocateSharedData()
|
|
||||||
{
|
|
||||||
if (mGLTextureSource) {
|
|
||||||
mGLTextureSource = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
DestroyEGLImage();
|
|
||||||
|
|
||||||
if (mGrallocHandle.buffer().type() != MaybeMagicGrallocBufferHandle::Tnull_t) {
|
|
||||||
MaybeMagicGrallocBufferHandle handle = mGrallocHandle.buffer();
|
|
||||||
base::ProcessId owner;
|
|
||||||
if (handle.type() == MaybeMagicGrallocBufferHandle::TGrallocBufferRef) {
|
|
||||||
owner = handle.get_GrallocBufferRef().mOwner;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
owner = handle.get_MagicGrallocBufferHandle().mRef.mOwner;
|
|
||||||
}
|
|
||||||
|
|
||||||
SharedBufferManagerParent::DropGrallocBuffer(owner, mGrallocHandle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureHostOGL::ForgetSharedData()
|
|
||||||
{
|
|
||||||
if (mGLTextureSource) {
|
|
||||||
mGLTextureSource = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureHostOGL::DeallocateDeviceData()
|
|
||||||
{
|
|
||||||
if (mGLTextureSource) {
|
|
||||||
mGLTextureSource = nullptr;
|
|
||||||
}
|
|
||||||
DestroyEGLImage();
|
|
||||||
}
|
|
||||||
|
|
||||||
LayerRenderState
|
|
||||||
GrallocTextureHostOGL::GetRenderState()
|
|
||||||
{
|
|
||||||
android::GraphicBuffer* graphicBuffer = GetGraphicBufferFromDesc(mGrallocHandle).get();
|
|
||||||
|
|
||||||
if (graphicBuffer) {
|
|
||||||
LayerRenderStateFlags flags = LayerRenderStateFlags::LAYER_RENDER_STATE_DEFAULT;
|
|
||||||
if (mIsOpaque) {
|
|
||||||
flags |= LayerRenderStateFlags::OPAQUE;
|
|
||||||
}
|
|
||||||
if (mFlags & TextureFlags::ORIGIN_BOTTOM_LEFT) {
|
|
||||||
flags |= LayerRenderStateFlags::ORIGIN_BOTTOM_LEFT;
|
|
||||||
}
|
|
||||||
if (mFlags & TextureFlags::RB_SWAPPED) {
|
|
||||||
flags |= LayerRenderStateFlags::FORMAT_RB_SWAP;
|
|
||||||
}
|
|
||||||
return LayerRenderState(graphicBuffer,
|
|
||||||
mCropSize,
|
|
||||||
flags,
|
|
||||||
this);
|
|
||||||
}
|
|
||||||
|
|
||||||
return LayerRenderState();
|
|
||||||
}
|
|
||||||
|
|
||||||
already_AddRefed<gfx::DataSourceSurface>
|
|
||||||
GrallocTextureHostOGL::GetAsSurface() {
|
|
||||||
android::GraphicBuffer* graphicBuffer = GetGraphicBufferFromDesc(mGrallocHandle).get();
|
|
||||||
if (!graphicBuffer) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
uint8_t* grallocData;
|
|
||||||
int32_t rv = graphicBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN, reinterpret_cast<void**>(&grallocData));
|
|
||||||
if (rv) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
RefPtr<gfx::DataSourceSurface> grallocTempSurf =
|
|
||||||
gfx::Factory::CreateWrappingDataSourceSurface(grallocData,
|
|
||||||
graphicBuffer->getStride() * android::bytesPerPixel(graphicBuffer->getPixelFormat()),
|
|
||||||
GetSize(), GetFormat());
|
|
||||||
if (!grallocTempSurf) {
|
|
||||||
graphicBuffer->unlock();
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
RefPtr<gfx::DataSourceSurface> surf = CreateDataSourceSurfaceByCloning(grallocTempSurf);
|
|
||||||
|
|
||||||
graphicBuffer->unlock();
|
|
||||||
|
|
||||||
return surf.forget();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureHostOGL::UnbindTextureSource()
|
|
||||||
{
|
|
||||||
TextureHost::UnbindTextureSource();
|
|
||||||
// Clear the reference to the TextureSource (if any), because we know that
|
|
||||||
// another TextureHost is being bound to the TextureSource. This means that
|
|
||||||
// we will have to re-do gl->fEGLImageTargetTexture2D next time we go through
|
|
||||||
// BindTextureSource (otherwise we would have skipped it).
|
|
||||||
// Note that this doesn't "unlock" the gralloc buffer or force it to be
|
|
||||||
// detached, Although decreasing the refcount of the TextureSource may lead
|
|
||||||
// to the gl handle being destroyed, which would unlock the gralloc buffer.
|
|
||||||
// That said, this method is called before another TextureHost attaches to the
|
|
||||||
// TextureSource, which has the effect of unlocking the gralloc buffer. So when
|
|
||||||
// this is called we know we are going to be unlocked soon.
|
|
||||||
mGLTextureSource = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
GLenum GetTextureTarget(gl::GLContext* aGL, android::PixelFormat aFormat) {
|
|
||||||
MOZ_ASSERT(aGL);
|
|
||||||
if (aGL->Renderer() == gl::GLRenderer::SGX530 ||
|
|
||||||
aGL->Renderer() == gl::GLRenderer::SGX540) {
|
|
||||||
// SGX has a quirk that only TEXTURE_EXTERNAL works and any other value will
|
|
||||||
// result in black pixels when trying to draw from bound textures.
|
|
||||||
// Unfortunately, using TEXTURE_EXTERNAL on Adreno has a terrible effect on
|
|
||||||
// performance.
|
|
||||||
// See Bug 950050.
|
|
||||||
return LOCAL_GL_TEXTURE_EXTERNAL;
|
|
||||||
} else {
|
|
||||||
return TextureTargetForAndroidPixelFormat(aFormat);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureHostOGL::DestroyEGLImage()
|
|
||||||
{
|
|
||||||
// Only called when we want to get rid of the gralloc buffer, usually
|
|
||||||
// around the end of life of the TextureHost.
|
|
||||||
if (mEGLImage != EGL_NO_IMAGE && GetGLContext()) {
|
|
||||||
EGLImageDestroy(GetGLContext(), mEGLImage);
|
|
||||||
mEGLImage = EGL_NO_IMAGE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureHostOGL::PrepareTextureSource(CompositableTextureSourceRef& aTextureSource)
|
|
||||||
{
|
|
||||||
// This happens during the layers transaction.
|
|
||||||
// All of the gralloc magic goes here. The only thing that happens externally
|
|
||||||
// and that is good to keep in mind is that when the TextureSource is deleted,
|
|
||||||
// it destroys its gl texture handle which is important for genlock.
|
|
||||||
|
|
||||||
// If this TextureHost's mGLTextureSource member is non-null, it means we are
|
|
||||||
// still bound to the TextureSource, in which case we can skip the driver
|
|
||||||
// overhead of binding the texture again (fEGLImageTargetTexture2D)
|
|
||||||
// As a result, if the TextureHost is used with several CompositableHosts,
|
|
||||||
// it will be bound to only one TextureSource, and we'll do the driver work
|
|
||||||
// only once, which is great. This means that all of the compositables that
|
|
||||||
// use this TextureHost will keep a reference to this TextureSource at least
|
|
||||||
// for the duration of this frame.
|
|
||||||
|
|
||||||
// If the compositable already has a TextureSource (the aTextureSource parameter),
|
|
||||||
// that is compatible and is not in use by several compositable, we try to
|
|
||||||
// attach to it. This has the effect of unlocking the previous TextureHost that
|
|
||||||
// we attached to the TextureSource (the previous frame)
|
|
||||||
|
|
||||||
// If the TextureSource used by the compositable is also used by other
|
|
||||||
// compositables (see NumCompositableRefs), we have to create a new TextureSource,
|
|
||||||
// because otherwise we would be modifying the content of every layer that uses
|
|
||||||
// the TextureSource in question, even thoug they don't use this TextureHost.
|
|
||||||
|
|
||||||
android::GraphicBuffer* graphicBuffer = GetGraphicBufferFromDesc(mGrallocHandle).get();
|
|
||||||
|
|
||||||
MOZ_ASSERT(graphicBuffer);
|
|
||||||
if (!graphicBuffer) {
|
|
||||||
mGLTextureSource = nullptr;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mGLTextureSource && !mGLTextureSource->IsValid()) {
|
|
||||||
mGLTextureSource = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mGLTextureSource) {
|
|
||||||
// We are already attached to a TextureSource, nothing to do except tell
|
|
||||||
// the compositable to use it.
|
|
||||||
aTextureSource = mGLTextureSource.get();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
gl::GLContext* gl = GetGLContext();
|
|
||||||
if (!gl || !gl->MakeCurrent()) {
|
|
||||||
mGLTextureSource = nullptr;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mEGLImage == EGL_NO_IMAGE) {
|
|
||||||
gfx::IntSize cropSize(0, 0);
|
|
||||||
if (mCropSize != mSize) {
|
|
||||||
cropSize = mCropSize;
|
|
||||||
}
|
|
||||||
// Should only happen the first time.
|
|
||||||
mEGLImage = EGLImageCreateFromNativeBuffer(gl, graphicBuffer->getNativeBuffer(), cropSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
GLenum textureTarget = GetTextureTarget(gl, graphicBuffer->getPixelFormat());
|
|
||||||
|
|
||||||
GLTextureSource* glSource = aTextureSource.get() ?
|
|
||||||
aTextureSource->AsSourceOGL()->AsGLTextureSource() : nullptr;
|
|
||||||
|
|
||||||
bool shouldCreateTextureSource = !glSource || !glSource->IsValid()
|
|
||||||
|| glSource->NumCompositableRefs() > 1
|
|
||||||
|| glSource->GetTextureTarget() != textureTarget;
|
|
||||||
|
|
||||||
if (shouldCreateTextureSource) {
|
|
||||||
GLuint textureHandle;
|
|
||||||
gl->fGenTextures(1, &textureHandle);
|
|
||||||
gl->fBindTexture(textureTarget, textureHandle);
|
|
||||||
gl->fTexParameteri(textureTarget, LOCAL_GL_TEXTURE_WRAP_T, LOCAL_GL_CLAMP_TO_EDGE);
|
|
||||||
gl->fTexParameteri(textureTarget, LOCAL_GL_TEXTURE_WRAP_S, LOCAL_GL_CLAMP_TO_EDGE);
|
|
||||||
gl->fEGLImageTargetTexture2D(textureTarget, mEGLImage);
|
|
||||||
|
|
||||||
mGLTextureSource = new GLTextureSource(mCompositor, textureHandle, textureTarget,
|
|
||||||
mSize, mFormat);
|
|
||||||
aTextureSource = mGLTextureSource.get();
|
|
||||||
} else {
|
|
||||||
gl->fBindTexture(textureTarget, glSource->GetTextureHandle());
|
|
||||||
|
|
||||||
gl->fEGLImageTargetTexture2D(textureTarget, mEGLImage);
|
|
||||||
glSource->SetSize(mSize);
|
|
||||||
glSource->SetFormat(mFormat);
|
|
||||||
mGLTextureSource = glSource;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureHostOGL::WaitAcquireFenceHandleSyncComplete()
|
|
||||||
{
|
|
||||||
if (!mAcquireFenceHandle.IsValid()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
RefPtr<FenceHandle::FdObj> fence = mAcquireFenceHandle.GetAndResetFdObj();
|
|
||||||
int fenceFd = fence->GetAndResetFd();
|
|
||||||
|
|
||||||
EGLint attribs[] = {
|
|
||||||
LOCAL_EGL_SYNC_NATIVE_FENCE_FD_ANDROID, fenceFd,
|
|
||||||
LOCAL_EGL_NONE
|
|
||||||
};
|
|
||||||
|
|
||||||
EGLSync sync = sEGLLibrary.fCreateSync(EGL_DISPLAY(),
|
|
||||||
LOCAL_EGL_SYNC_NATIVE_FENCE_ANDROID,
|
|
||||||
attribs);
|
|
||||||
if (!sync) {
|
|
||||||
NS_WARNING("failed to create native fence sync");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wait sync complete with timeout.
|
|
||||||
// If a source of the fence becomes invalid because of error,
|
|
||||||
// fene complete is not signaled. See Bug 1061435.
|
|
||||||
EGLint status = sEGLLibrary.fClientWaitSync(EGL_DISPLAY(),
|
|
||||||
sync,
|
|
||||||
0,
|
|
||||||
400000000 /*400 msec*/);
|
|
||||||
if (status != LOCAL_EGL_CONDITION_SATISFIED) {
|
|
||||||
NS_ERROR("failed to wait native fence sync");
|
|
||||||
}
|
|
||||||
MOZ_ALWAYS_TRUE( sEGLLibrary.fDestroySync(EGL_DISPLAY(), sync) );
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GrallocTextureHostOGL::SetCropRect(nsIntRect aCropRect)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(aCropRect.TopLeft() == gfx::IntPoint(0, 0));
|
|
||||||
MOZ_ASSERT(!aCropRect.IsEmpty());
|
|
||||||
MOZ_ASSERT(aCropRect.width <= mSize.width);
|
|
||||||
MOZ_ASSERT(aCropRect.height <= mSize.height);
|
|
||||||
|
|
||||||
gfx::IntSize cropSize(aCropRect.width, aCropRect.height);
|
|
||||||
if (mCropSize == cropSize) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mCropSize = cropSize;
|
|
||||||
mGLTextureSource = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
GrallocTextureHostOGL::BindTextureSource(CompositableTextureSourceRef& aTextureSource)
|
|
||||||
{
|
|
||||||
// This happens at composition time.
|
|
||||||
|
|
||||||
// If mGLTextureSource is null it means PrepareTextureSource failed.
|
|
||||||
if (!mGLTextureSource) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If Prepare didn't fail, we expect our TextureSource to be the same as aTextureSource,
|
|
||||||
// otherwise it means something has fiddled with the TextureSource between Prepare and
|
|
||||||
// now.
|
|
||||||
MOZ_ASSERT(mGLTextureSource == aTextureSource);
|
|
||||||
aTextureSource = mGLTextureSource.get();
|
|
||||||
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
|
|
||||||
// Wait until it's ready.
|
|
||||||
WaitAcquireFenceHandleSyncComplete();
|
|
||||||
#endif
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
FenceHandle
|
|
||||||
GrallocTextureHostOGL::GetCompositorReleaseFence()
|
|
||||||
{
|
|
||||||
if (!mCompositor) {
|
|
||||||
return FenceHandle();
|
|
||||||
}
|
|
||||||
return mCompositor->GetReleaseFence();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // namepsace layers
|
|
||||||
} // namepsace mozilla
|
|
||||||
@@ -1,98 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
||||||
// * 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_GRALLOCTEXTUREHOST_H
|
|
||||||
#define MOZILLA_GFX_GRALLOCTEXTUREHOST_H
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
|
|
||||||
#include "mozilla/layers/CompositorOGL.h"
|
|
||||||
#include "mozilla/layers/TextureHostOGL.h"
|
|
||||||
#include "mozilla/layers/ShadowLayerUtilsGralloc.h"
|
|
||||||
#include <ui/GraphicBuffer.h>
|
|
||||||
|
|
||||||
namespace mozilla {
|
|
||||||
namespace layers {
|
|
||||||
|
|
||||||
class GrallocTextureHostOGL : public TextureHost
|
|
||||||
{
|
|
||||||
friend class GrallocBufferActor;
|
|
||||||
public:
|
|
||||||
GrallocTextureHostOGL(TextureFlags aFlags,
|
|
||||||
const SurfaceDescriptorGralloc& aDescriptor);
|
|
||||||
|
|
||||||
virtual ~GrallocTextureHostOGL();
|
|
||||||
|
|
||||||
virtual bool Lock() override;
|
|
||||||
|
|
||||||
virtual void Unlock() override;
|
|
||||||
|
|
||||||
virtual void SetCompositor(Compositor* aCompositor) override;
|
|
||||||
|
|
||||||
virtual Compositor* GetCompositor() override { return mCompositor; }
|
|
||||||
|
|
||||||
virtual void DeallocateSharedData() override;
|
|
||||||
|
|
||||||
virtual void ForgetSharedData() override;
|
|
||||||
|
|
||||||
virtual void DeallocateDeviceData() override;
|
|
||||||
|
|
||||||
virtual gfx::SurfaceFormat GetFormat() const;
|
|
||||||
|
|
||||||
virtual gfx::IntSize GetSize() const override { return mCropSize; }
|
|
||||||
|
|
||||||
virtual LayerRenderState GetRenderState() override;
|
|
||||||
|
|
||||||
virtual void PrepareTextureSource(CompositableTextureSourceRef& aTextureSource) override;
|
|
||||||
|
|
||||||
virtual bool BindTextureSource(CompositableTextureSourceRef& aTextureSource) override;
|
|
||||||
|
|
||||||
virtual void UnbindTextureSource() override;
|
|
||||||
|
|
||||||
virtual already_AddRefed<gfx::DataSourceSurface> GetAsSurface() override;
|
|
||||||
|
|
||||||
virtual void WaitAcquireFenceHandleSyncComplete() override;
|
|
||||||
|
|
||||||
virtual void SetCropRect(nsIntRect aCropRect) override;
|
|
||||||
|
|
||||||
bool IsValid() const;
|
|
||||||
|
|
||||||
virtual const char* Name() override { return "GrallocTextureHostOGL"; }
|
|
||||||
|
|
||||||
gl::GLContext* GetGLContext() const { return mCompositor ? mCompositor->gl() : nullptr; }
|
|
||||||
|
|
||||||
virtual bool NeedsFenceHandle() override
|
|
||||||
{
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17
|
|
||||||
return true;
|
|
||||||
#else
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual FenceHandle GetCompositorReleaseFence() override;
|
|
||||||
|
|
||||||
virtual GrallocTextureHostOGL* AsGrallocTextureHostOGL() override { return this; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
void DestroyEGLImage();
|
|
||||||
|
|
||||||
SurfaceDescriptorGralloc mGrallocHandle;
|
|
||||||
RefPtr<GLTextureSource> mGLTextureSource;
|
|
||||||
RefPtr<CompositorOGL> mCompositor;
|
|
||||||
// Size reported by the GraphicBuffer
|
|
||||||
gfx::IntSize mSize;
|
|
||||||
// Size reported by TextureClient, can be different in some cases (video?),
|
|
||||||
// used by LayerRenderState.
|
|
||||||
gfx::IntSize mCropSize;
|
|
||||||
gfx::SurfaceFormat mFormat;
|
|
||||||
EGLImage mEGLImage;
|
|
||||||
bool mIsOpaque;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace layers
|
|
||||||
} // namespace mozilla
|
|
||||||
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
@@ -15,18 +15,12 @@
|
|||||||
#include "mozilla/gfx/BaseSize.h" // for BaseSize
|
#include "mozilla/gfx/BaseSize.h" // for BaseSize
|
||||||
#include "mozilla/gfx/Logging.h" // for gfxCriticalError
|
#include "mozilla/gfx/Logging.h" // for gfxCriticalError
|
||||||
#include "mozilla/layers/ISurfaceAllocator.h"
|
#include "mozilla/layers/ISurfaceAllocator.h"
|
||||||
#include "mozilla/layers/GrallocTextureHost.h"
|
|
||||||
#include "nsRegion.h" // for nsIntRegion
|
#include "nsRegion.h" // for nsIntRegion
|
||||||
#include "AndroidSurfaceTexture.h"
|
#include "AndroidSurfaceTexture.h"
|
||||||
#include "GfxTexturesReporter.h" // for GfxTexturesReporter
|
#include "GfxTexturesReporter.h" // for GfxTexturesReporter
|
||||||
#include "GLBlitTextureImageHelper.h"
|
#include "GLBlitTextureImageHelper.h"
|
||||||
#include "GeckoProfiler.h"
|
#include "GeckoProfiler.h"
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
# include "GrallocImages.h" // for GrallocImage
|
|
||||||
# include "EGLImageHelpers.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef XP_MACOSX
|
#ifdef XP_MACOSX
|
||||||
#include "mozilla/layers/MacIOSurfaceTextureHostOGL.h"
|
#include "mozilla/layers/MacIOSurfaceTextureHostOGL.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -85,15 +79,6 @@ CreateTextureHostOGL(const SurfaceDescriptor& aDesc,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
case SurfaceDescriptor::TSurfaceDescriptorGralloc: {
|
|
||||||
const SurfaceDescriptorGralloc& desc =
|
|
||||||
aDesc.get_SurfaceDescriptorGralloc();
|
|
||||||
result = new GrallocTextureHostOGL(aFlags, desc);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GL_PROVIDER_GLX
|
#ifdef GL_PROVIDER_GLX
|
||||||
case SurfaceDescriptor::TSurfaceDescriptorX11: {
|
case SurfaceDescriptor::TSurfaceDescriptorX11: {
|
||||||
const auto& desc = aDesc.get_SurfaceDescriptorX11();
|
const auto& desc = aDesc.get_SurfaceDescriptorX11();
|
||||||
|
|||||||
@@ -492,7 +492,7 @@ if CONFIG['MOZ_ENABLE_SKIA_GPU']:
|
|||||||
'skia/src/gpu/GrResourceCache.cpp',
|
'skia/src/gpu/GrResourceCache.cpp',
|
||||||
'skia/src/image/SkImage_Gpu.cpp',
|
'skia/src/image/SkImage_Gpu.cpp',
|
||||||
]
|
]
|
||||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('android', 'gonk'):
|
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('android'):
|
||||||
UNIFIED_SOURCES += [
|
UNIFIED_SOURCES += [
|
||||||
'skia/src/ports/SkDebug_android.cpp',
|
'skia/src/ports/SkDebug_android.cpp',
|
||||||
'skia/src/ports/SkOSFile_posix.cpp',
|
'skia/src/ports/SkOSFile_posix.cpp',
|
||||||
@@ -650,7 +650,7 @@ LOCAL_INCLUDES += [
|
|||||||
'skia/src/utils/win',
|
'skia/src/utils/win',
|
||||||
]
|
]
|
||||||
|
|
||||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('android', 'gonk'):
|
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('android'):
|
||||||
DEFINES['SK_FONTHOST_CAIRO_STANDALONE'] = 0
|
DEFINES['SK_FONTHOST_CAIRO_STANDALONE'] = 0
|
||||||
|
|
||||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] in {
|
if CONFIG['MOZ_WIDGET_TOOLKIT'] in {
|
||||||
@@ -659,7 +659,6 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] in {
|
|||||||
'gtk2',
|
'gtk2',
|
||||||
'gtk3',
|
'gtk3',
|
||||||
'uikit',
|
'uikit',
|
||||||
'gonk',
|
|
||||||
}:
|
}:
|
||||||
DEFINES['SK_FONTHOST_DOES_NOT_USE_FONTMGR'] = 1
|
DEFINES['SK_FONTHOST_DOES_NOT_USE_FONTMGR'] = 1
|
||||||
|
|
||||||
@@ -730,7 +729,7 @@ if CONFIG['CLANG_CXX'] or CONFIG['CLANG_CL']:
|
|||||||
'-Wno-unused-private-field',
|
'-Wno-unused-private-field',
|
||||||
]
|
]
|
||||||
|
|
||||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('gtk2', 'gtk3', 'android', 'gonk'):
|
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('gtk2', 'gtk3', 'android'):
|
||||||
CXXFLAGS += CONFIG['MOZ_CAIRO_CFLAGS']
|
CXXFLAGS += CONFIG['MOZ_CAIRO_CFLAGS']
|
||||||
CXXFLAGS += CONFIG['CAIRO_FT_CFLAGS']
|
CXXFLAGS += CONFIG['CAIRO_FT_CFLAGS']
|
||||||
|
|
||||||
|
|||||||
@@ -25,12 +25,6 @@
|
|||||||
#include "cairo.h"
|
#include "cairo.h"
|
||||||
#include "VsyncSource.h"
|
#include "VsyncSource.h"
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#include <cutils/properties.h>
|
|
||||||
#include "mozilla/layers/CompositorBridgeParent.h"
|
|
||||||
#include "HwcComposer2D.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "ft2build.h"
|
#include "ft2build.h"
|
||||||
#include FT_FREETYPE_H
|
#include FT_FREETYPE_H
|
||||||
#include FT_MODULE_H
|
#include FT_MODULE_H
|
||||||
@@ -105,12 +99,6 @@ gfxAndroidPlatform::gfxAndroidPlatform()
|
|||||||
if (gfxPrefs::AndroidRGB16Force()) {
|
if (gfxPrefs::AndroidRGB16Force()) {
|
||||||
mOffscreenFormat = SurfaceFormat::R5G6B5_UINT16;
|
mOffscreenFormat = SurfaceFormat::R5G6B5_UINT16;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
char propQemu[PROPERTY_VALUE_MAX];
|
|
||||||
property_get("ro.kernel.qemu", propQemu, "");
|
|
||||||
mIsInGonkEmulator = !strncmp(propQemu, "1", 1);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gfxAndroidPlatform::~gfxAndroidPlatform()
|
gfxAndroidPlatform::~gfxAndroidPlatform()
|
||||||
@@ -179,15 +167,9 @@ gfxAndroidPlatform::GetCommonFallbackFonts(uint32_t aCh, uint32_t aNextCh,
|
|||||||
static const char kMotoyaLMaru[] = "MotoyaLMaru";
|
static const char kMotoyaLMaru[] = "MotoyaLMaru";
|
||||||
static const char kNotoSansCJKJP[] = "Noto Sans CJK JP";
|
static const char kNotoSansCJKJP[] = "Noto Sans CJK JP";
|
||||||
static const char kNotoColorEmoji[] = "Noto Color Emoji";
|
static const char kNotoColorEmoji[] = "Noto Color Emoji";
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
static const char kFirefoxEmoji[] = "Firefox Emoji";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (aNextCh == 0xfe0fu) {
|
if (aNextCh == 0xfe0fu) {
|
||||||
// if char is followed by VS16, try for a color emoji glyph
|
// if char is followed by VS16, try for a color emoji glyph
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
aFontList.AppendElement(kFirefoxEmoji);
|
|
||||||
#endif
|
|
||||||
aFontList.AppendElement(kNotoColorEmoji);
|
aFontList.AppendElement(kNotoColorEmoji);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,9 +177,6 @@ gfxAndroidPlatform::GetCommonFallbackFonts(uint32_t aCh, uint32_t aNextCh,
|
|||||||
uint32_t p = aCh >> 16;
|
uint32_t p = aCh >> 16;
|
||||||
if (p == 1) { // try color emoji font, unless VS15 (text style) present
|
if (p == 1) { // try color emoji font, unless VS15 (text style) present
|
||||||
if (aNextCh != 0xfe0fu && aNextCh != 0xfe0eu) {
|
if (aNextCh != 0xfe0fu && aNextCh != 0xfe0eu) {
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
aFontList.AppendElement(kFirefoxEmoji);
|
|
||||||
#endif
|
|
||||||
aFontList.AppendElement(kNotoColorEmoji);
|
aFontList.AppendElement(kNotoColorEmoji);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -328,12 +307,6 @@ gfxAndroidPlatform::FontHintingEnabled()
|
|||||||
return false;
|
return false;
|
||||||
#endif // MOZ_WIDGET_ANDROID
|
#endif // MOZ_WIDGET_ANDROID
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
// On B2G, the UX preference is currently to keep hinting disabled
|
|
||||||
// for all text (see bug 829523).
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Currently, we don't have any other targets, but if/when we do,
|
// Currently, we don't have any other targets, but if/when we do,
|
||||||
// decide how to handle them here.
|
// decide how to handle them here.
|
||||||
|
|
||||||
@@ -354,104 +327,12 @@ gfxAndroidPlatform::RequiresLinearZoom()
|
|||||||
return true;
|
return true;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
// On B2G, we need linear zoom for the browser, but otherwise prefer
|
|
||||||
// the improved glyph spacing that results from respecting the device
|
|
||||||
// pixel resolution for glyph layout (see bug 816614).
|
|
||||||
return XRE_IsContentProcess() &&
|
|
||||||
ContentChild::GetSingleton()->IsForBrowser();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
NS_NOTREACHED("oops, what platform is this?");
|
NS_NOTREACHED("oops, what platform is this?");
|
||||||
return gfxPlatform::RequiresLinearZoom();
|
return gfxPlatform::RequiresLinearZoom();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
class GonkVsyncSource final : public VsyncSource
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
GonkVsyncSource()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual Display& GetGlobalDisplay() override
|
|
||||||
{
|
|
||||||
return mGlobalDisplay;
|
|
||||||
}
|
|
||||||
|
|
||||||
class GonkDisplay final : public VsyncSource::Display
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
GonkDisplay() : mVsyncEnabled(false)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
~GonkDisplay()
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void Shutdown() override
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
|
||||||
DisableVsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void EnableVsync() override
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
|
||||||
if (IsVsyncEnabled()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
mVsyncEnabled = HwcComposer2D::GetInstance()->EnableVsync(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void DisableVsync() override
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
|
||||||
if (!IsVsyncEnabled()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
mVsyncEnabled = HwcComposer2D::GetInstance()->EnableVsync(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual bool IsVsyncEnabled() override
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
|
||||||
return mVsyncEnabled;
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
bool mVsyncEnabled;
|
|
||||||
}; // GonkDisplay
|
|
||||||
|
|
||||||
private:
|
|
||||||
virtual ~GonkVsyncSource()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
GonkDisplay mGlobalDisplay;
|
|
||||||
}; // GonkVsyncSource
|
|
||||||
#endif
|
|
||||||
|
|
||||||
already_AddRefed<mozilla::gfx::VsyncSource>
|
already_AddRefed<mozilla::gfx::VsyncSource>
|
||||||
gfxAndroidPlatform::CreateHardwareVsyncSource()
|
gfxAndroidPlatform::CreateHardwareVsyncSource()
|
||||||
{
|
{
|
||||||
// Only enable true hardware vsync on kit-kat and L device. Jelly Bean has
|
|
||||||
// inaccurate hardware vsync so disable on JB. Android pre-JB doesn't have
|
|
||||||
// hardware vsync.
|
|
||||||
// L is android version 21, L-MR1 is 22, kit-kat is 19, 20 is kit-kat for
|
|
||||||
// wearables.
|
|
||||||
#if defined(MOZ_WIDGET_GONK) && (ANDROID_VERSION == 19 || ANDROID_VERSION >= 21)
|
|
||||||
RefPtr<GonkVsyncSource> vsyncSource = new GonkVsyncSource();
|
|
||||||
VsyncSource::Display& display = vsyncSource->GetGlobalDisplay();
|
|
||||||
display.EnableVsync();
|
|
||||||
if (!display.IsVsyncEnabled()) {
|
|
||||||
NS_WARNING("Error enabling gonk vsync. Falling back to software vsync");
|
|
||||||
return gfxPlatform::CreateHardwareVsyncSource();
|
return gfxPlatform::CreateHardwareVsyncSource();
|
||||||
}
|
|
||||||
display.DisableVsync();
|
|
||||||
return vsyncSource.forget();
|
|
||||||
#else
|
|
||||||
return gfxPlatform::CreateHardwareVsyncSource();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,10 +68,6 @@ public:
|
|||||||
|
|
||||||
virtual already_AddRefed<mozilla::gfx::VsyncSource> CreateHardwareVsyncSource() override;
|
virtual already_AddRefed<mozilla::gfx::VsyncSource> CreateHardwareVsyncSource() override;
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
virtual bool IsInGonkEmulator() const { return mIsInGonkEmulator; }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
virtual bool SupportsApzTouchInput() const override {
|
virtual bool SupportsApzTouchInput() const override {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -83,10 +79,6 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
gfxImageFormat mOffscreenFormat;
|
gfxImageFormat mOffscreenFormat;
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
bool mIsInGonkEmulator;
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* GFX_PLATFORM_ANDROID_H */
|
#endif /* GFX_PLATFORM_ANDROID_H */
|
||||||
|
|||||||
@@ -1234,13 +1234,6 @@ gfxFT2FontList::FindFonts()
|
|||||||
NS_RUNTIMEABORT("Could not read the system fonts directory");
|
NS_RUNTIMEABORT("Could not read the system fonts directory");
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
// Look for fonts in /system/fonts/hidden and preload them to the
|
|
||||||
// user-font cache as data: URIs
|
|
||||||
root.AppendLiteral("/hidden");
|
|
||||||
FindFontsInDir(root, mFontNameCache.get(), FT2FontFamily::kHidden);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Look for fonts stored in omnijar, unless we're on a low-memory
|
// Look for fonts stored in omnijar, unless we're on a low-memory
|
||||||
// device where we don't want to spend the RAM to decompress them.
|
// device where we don't want to spend the RAM to decompress them.
|
||||||
// (Prefs may disable this, or force-enable it even with low memory.)
|
// (Prefs may disable this, or force-enable it even with low memory.)
|
||||||
@@ -1564,9 +1557,7 @@ gfxFontFamily*
|
|||||||
gfxFT2FontList::GetDefaultFontForPlatform(const gfxFontStyle* aStyle)
|
gfxFT2FontList::GetDefaultFontForPlatform(const gfxFontStyle* aStyle)
|
||||||
{
|
{
|
||||||
gfxFontFamily *ff = nullptr;
|
gfxFontFamily *ff = nullptr;
|
||||||
#ifdef MOZ_WIDGET_GONK
|
#if defined(MOZ_WIDGET_ANDROID)
|
||||||
ff = FindFamily(NS_LITERAL_STRING("Fira Sans"));
|
|
||||||
#elif defined(MOZ_WIDGET_ANDROID)
|
|
||||||
ff = FindFamily(NS_LITERAL_STRING("Roboto"));
|
ff = FindFamily(NS_LITERAL_STRING("Roboto"));
|
||||||
if (!ff) {
|
if (!ff) {
|
||||||
ff = FindFamily(NS_LITERAL_STRING("Droid Sans"));
|
ff = FindFamily(NS_LITERAL_STRING("Droid Sans"));
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
#include "mozilla/layers/CompositorBridgeChild.h"
|
#include "mozilla/layers/CompositorBridgeChild.h"
|
||||||
#include "mozilla/layers/CompositorThread.h"
|
#include "mozilla/layers/CompositorThread.h"
|
||||||
#include "mozilla/layers/ImageBridgeChild.h"
|
#include "mozilla/layers/ImageBridgeChild.h"
|
||||||
#include "mozilla/layers/SharedBufferManagerChild.h"
|
|
||||||
#include "mozilla/layers/ISurfaceAllocator.h" // for GfxMemoryImageReporter
|
#include "mozilla/layers/ISurfaceAllocator.h" // for GfxMemoryImageReporter
|
||||||
#include "mozilla/gfx/gfxVars.h"
|
#include "mozilla/gfx/gfxVars.h"
|
||||||
#include "mozilla/gfx/GPUProcessManager.h"
|
#include "mozilla/gfx/GPUProcessManager.h"
|
||||||
@@ -97,10 +96,6 @@
|
|||||||
#include "TexturePoolOGL.h"
|
#include "TexturePoolOGL.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
#include "mozilla/layers/GrallocTextureHost.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_SKIA
|
#ifdef USE_SKIA
|
||||||
# ifdef __GNUC__
|
# ifdef __GNUC__
|
||||||
# pragma GCC diagnostic push
|
# pragma GCC diagnostic push
|
||||||
@@ -147,9 +142,6 @@ class mozilla::gl::SkiaGLGlue : public GenericAtomicRefCounted {
|
|||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
namespace layers {
|
namespace layers {
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
void InitGralloc();
|
|
||||||
#endif
|
|
||||||
void ShutdownTileCache();
|
void ShutdownTileCache();
|
||||||
} // namespace layers
|
} // namespace layers
|
||||||
} // namespace mozilla
|
} // namespace mozilla
|
||||||
@@ -753,10 +745,6 @@ gfxPlatform::Init()
|
|||||||
TexturePoolOGL::Init();
|
TexturePoolOGL::Init();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
mozilla::layers::InitGralloc();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Preferences::RegisterCallbackAndCall(RecordingPrefChanged, "gfx.2d.recording", nullptr);
|
Preferences::RegisterCallbackAndCall(RecordingPrefChanged, "gfx.2d.recording", nullptr);
|
||||||
|
|
||||||
CreateCMSOutputProfile();
|
CreateCMSOutputProfile();
|
||||||
@@ -919,9 +907,6 @@ gfxPlatform::InitLayersIPC()
|
|||||||
if (XRE_IsParentProcess())
|
if (XRE_IsParentProcess())
|
||||||
{
|
{
|
||||||
layers::CompositorThreadHolder::Start();
|
layers::CompositorThreadHolder::Start();
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
SharedBufferManagerChild::StartUp();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -945,10 +930,6 @@ gfxPlatform::ShutdownLayersIPC()
|
|||||||
layers::CompositorBridgeChild::ShutDown();
|
layers::CompositorBridgeChild::ShutDown();
|
||||||
layers::ImageBridgeChild::ShutDown();
|
layers::ImageBridgeChild::ShutDown();
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
layers::SharedBufferManagerChild::ShutDown();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// This has to happen after shutting down the child protocols.
|
// This has to happen after shutting down the child protocols.
|
||||||
layers::CompositorThreadHolder::Shutdown();
|
layers::CompositorThreadHolder::Shutdown();
|
||||||
} else {
|
} else {
|
||||||
@@ -1216,18 +1197,6 @@ gfxPlatform::ComputeTileSize()
|
|||||||
// but I think everything should at least support 1024
|
// but I think everything should at least support 1024
|
||||||
w = h = clamped(int32_t(RoundUpPow2(screenSize.width)) / 4, 256, 1024);
|
w = h = clamped(int32_t(RoundUpPow2(screenSize.width)) / 4, 256, 1024);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
android::sp<android::GraphicBuffer> alloc =
|
|
||||||
new android::GraphicBuffer(w, h, android::PIXEL_FORMAT_RGBA_8888,
|
|
||||||
android::GraphicBuffer::USAGE_SW_READ_OFTEN |
|
|
||||||
android::GraphicBuffer::USAGE_SW_WRITE_OFTEN |
|
|
||||||
android::GraphicBuffer::USAGE_HW_TEXTURE);
|
|
||||||
|
|
||||||
if (alloc.get()) {
|
|
||||||
w = alloc->getStride(); // We want the tiles to be gralloc stride aligned.
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't allow changing the tile size after we've set it.
|
// Don't allow changing the tile size after we've set it.
|
||||||
@@ -1393,11 +1362,6 @@ gfxPlatform::PurgeSkiaGPUCache()
|
|||||||
bool
|
bool
|
||||||
gfxPlatform::HasEnoughTotalSystemMemoryForSkiaGL()
|
gfxPlatform::HasEnoughTotalSystemMemoryForSkiaGL()
|
||||||
{
|
{
|
||||||
#ifdef MOZ_WIDGET_GONK
|
|
||||||
if (mTotalSystemMemory < 250*1024*1024) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -74,23 +74,6 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':
|
|||||||
'gfxFT2Utils.cpp',
|
'gfxFT2Utils.cpp',
|
||||||
'PrintTargetPDF.cpp',
|
'PrintTargetPDF.cpp',
|
||||||
]
|
]
|
||||||
elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk':
|
|
||||||
EXPORTS += [
|
|
||||||
'gfxAndroidPlatform.h',
|
|
||||||
'gfxFT2FontBase.h',
|
|
||||||
'gfxFT2Fonts.h',
|
|
||||||
]
|
|
||||||
EXPORTS.mozilla.gfx += [
|
|
||||||
'PrintTargetPDF.h',
|
|
||||||
]
|
|
||||||
SOURCES += [
|
|
||||||
'gfxAndroidPlatform.cpp',
|
|
||||||
'gfxFT2FontBase.cpp',
|
|
||||||
'gfxFT2FontList.cpp',
|
|
||||||
'gfxFT2Fonts.cpp',
|
|
||||||
'gfxFT2Utils.cpp',
|
|
||||||
'PrintTargetPDF.cpp',
|
|
||||||
]
|
|
||||||
elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
|
elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
|
||||||
EXPORTS += [
|
EXPORTS += [
|
||||||
'gfxPlatformMac.h',
|
'gfxPlatformMac.h',
|
||||||
@@ -261,10 +244,7 @@ LOCAL_INCLUDES += [
|
|||||||
'/dom/xml',
|
'/dom/xml',
|
||||||
]
|
]
|
||||||
|
|
||||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk':
|
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('android', 'gtk2', 'gtk3'):
|
||||||
LOCAL_INCLUDES += ['/widget/gonk']
|
|
||||||
|
|
||||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('android', 'gtk2', 'gtk3', 'gonk'):
|
|
||||||
DEFINES['MOZ_ENABLE_FREETYPE'] = True
|
DEFINES['MOZ_ENABLE_FREETYPE'] = True
|
||||||
|
|
||||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows':
|
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows':
|
||||||
@@ -277,7 +257,7 @@ CXXFLAGS += CONFIG['TK_CFLAGS']
|
|||||||
CFLAGS += CONFIG['MOZ_CAIRO_CFLAGS']
|
CFLAGS += CONFIG['MOZ_CAIRO_CFLAGS']
|
||||||
CFLAGS += CONFIG['TK_CFLAGS']
|
CFLAGS += CONFIG['TK_CFLAGS']
|
||||||
|
|
||||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('android', 'gonk'):
|
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('android'):
|
||||||
CXXFLAGS += CONFIG['CAIRO_FT_CFLAGS']
|
CXXFLAGS += CONFIG['CAIRO_FT_CFLAGS']
|
||||||
|
|
||||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('gtk2', 'gtk3'):
|
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('gtk2', 'gtk3'):
|
||||||
|
|||||||
@@ -18,7 +18,6 @@
|
|||||||
|
|
||||||
#include "mozilla/layers/ImageBridgeChild.h"
|
#include "mozilla/layers/ImageBridgeChild.h"
|
||||||
#include "mozilla/layers/CompositorBridgeParent.h"
|
#include "mozilla/layers/CompositorBridgeParent.h"
|
||||||
#include "mozilla/layers/SharedBufferManagerChild.h"
|
|
||||||
|
|
||||||
#include "prlink.h"
|
#include "prlink.h"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user