summaryrefslogtreecommitdiffstats
path: root/gfx
diff options
context:
space:
mode:
Diffstat (limited to 'gfx')
-rw-r--r--gfx/gl/GLContext.cpp13
-rw-r--r--gfx/gl/GLContext.h6
-rw-r--r--gfx/gl/GLContextCGL.h2
-rw-r--r--gfx/gl/GLContextGLX.h1
-rw-r--r--gfx/gl/GLContextProviderCGL.mm22
-rw-r--r--gfx/gl/GLContextProviderEAGL.mm41
-rw-r--r--gfx/gl/GLContextProviderEGL.cpp47
-rw-r--r--gfx/gl/GLContextProviderGLX.cpp24
-rw-r--r--gfx/gl/GLContextProviderWGL.cpp13
-rw-r--r--gfx/thebes/gfxAndroidPlatform.h5
-rw-r--r--gfx/thebes/gfxPlatform.cpp47
-rw-r--r--gfx/thebes/gfxPlatform.h2
-rw-r--r--gfx/thebes/gfxPlatformGtk.h4
-rw-r--r--gfx/thebes/gfxPlatformMac.cpp6
-rw-r--r--gfx/thebes/gfxPlatformMac.h3
-rw-r--r--gfx/thebes/gfxPrefs.h4
-rw-r--r--gfx/thebes/gfxWindowsPlatform.h3
17 files changed, 86 insertions, 157 deletions
diff --git a/gfx/gl/GLContext.cpp b/gfx/gl/GLContext.cpp
index 1515b8627..3fb87822d 100644
--- a/gfx/gl/GLContext.cpp
+++ b/gfx/gl/GLContext.cpp
@@ -578,6 +578,10 @@ GLContext::LoadFeatureSymbols(const char* prefix, bool trygl, const SymLoadStruc
bool
GLContext::InitWithPrefixImpl(const char* prefix, bool trygl)
{
+ // wglGetProcAddress requires a current context.
+ if (!MakeCurrent(true))
+ return false;
+
mWorkAroundDriverBugs = gfxPrefs::WorkAroundDriverBugs();
const SymLoadStruct coreSymbols[] = {
@@ -714,7 +718,6 @@ GLContext::InitWithPrefixImpl(const char* prefix, bool trygl)
////////////////
- MakeCurrent();
MOZ_ASSERT(mProfile != ContextProfile::Unknown);
uint32_t version = 0;
@@ -2253,13 +2256,11 @@ GLContext::MarkDestroyed()
mBlitHelper = nullptr;
mReadTexImageHelper = nullptr;
- if (MakeCurrent()) {
+ mIsDestroyed = true;
+ mSymbols.Zero();
+ if (MakeCurrent(true)) {
mTexGarbageBin->GLContextTeardown();
- } else {
- NS_WARNING("MakeCurrent() failed during MarkDestroyed! Skipping GL object teardown.");
}
-
- mSymbols.Zero();
}
#ifdef MOZ_GL_DEBUG
diff --git a/gfx/gl/GLContext.h b/gfx/gl/GLContext.h
index 6e3e22207..4c1f4f55c 100644
--- a/gfx/gl/GLContext.h
+++ b/gfx/gl/GLContext.h
@@ -353,6 +353,7 @@ public:
protected:
bool mIsOffscreen;
bool mContextLost;
+ bool mIsDestroyed = false;
/**
* mVersion store the OpenGL's version, multiplied by 100. For example, if
@@ -3265,7 +3266,7 @@ public:
#endif
return MakeCurrentImpl(aForce);
}
-
+
virtual bool Init() = 0;
virtual bool SetupLookupFunction() = 0;
@@ -3273,8 +3274,7 @@ public:
virtual void ReleaseSurface() {}
bool IsDestroyed() {
- // MarkDestroyed will mark all these as null.
- return mSymbols.fUseProgram == nullptr;
+ return mIsDestroyed;
}
GLContext* GetSharedContext() { return mSharedContext; }
diff --git a/gfx/gl/GLContextCGL.h b/gfx/gl/GLContextCGL.h
index 1a29f3d15..23616d861 100644
--- a/gfx/gl/GLContextCGL.h
+++ b/gfx/gl/GLContextCGL.h
@@ -24,7 +24,7 @@ class GLContextCGL : public GLContext
{
friend class GLContextProviderCGL;
- NSOpenGLContext* mContext;
+ NSOpenGLContext* const mContext;
public:
MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(GLContextCGL, override)
diff --git a/gfx/gl/GLContextGLX.h b/gfx/gl/GLContextGLX.h
index 1f2cee08d..0463669e9 100644
--- a/gfx/gl/GLContextGLX.h
+++ b/gfx/gl/GLContextGLX.h
@@ -86,6 +86,7 @@ private:
GLXContext mContext;
Display* mDisplay;
GLXDrawable mDrawable;
+ Maybe<GLXDrawable> mOverrideDrawable;
bool mDeleteDrawable;
bool mDoubleBuffered;
diff --git a/gfx/gl/GLContextProviderCGL.mm b/gfx/gl/GLContextProviderCGL.mm
index ceab3046c..7cc89eac9 100644
--- a/gfx/gl/GLContextProviderCGL.mm
+++ b/gfx/gl/GLContextProviderCGL.mm
@@ -83,26 +83,13 @@ GLContextCGL::GLContextCGL(CreateContextFlags flags, const SurfaceCaps& caps,
GLContextCGL::~GLContextCGL()
{
MarkDestroyed();
-
- if (mContext) {
- if ([NSOpenGLContext currentContext] == mContext) {
- // Clear the current context before releasing. If we don't do
- // this, the next time we call [NSOpenGLContext currentContext],
- // "invalid context" will be printed to the console.
- [NSOpenGLContext clearCurrentContext];
- }
- [mContext release];
- }
-
+ [mContext release];
}
bool
GLContextCGL::Init()
{
- if (!InitWithPrefix("gl", true))
- return false;
-
- return true;
+ return InitWithPrefix("gl", true);
}
CGLContextObj
@@ -114,6 +101,11 @@ GLContextCGL::GetCGLContext() const
bool
GLContextCGL::MakeCurrentImpl(bool aForce)
{
+ if (IsDestroyed()) {
+ [NSOpenGLContext clearCurrentContext];
+ return false;
+ }
+
if (!aForce && [NSOpenGLContext currentContext] == mContext) {
return true;
}
diff --git a/gfx/gl/GLContextProviderEAGL.mm b/gfx/gl/GLContextProviderEAGL.mm
index 507616e2f..11c7cce77 100644
--- a/gfx/gl/GLContextProviderEAGL.mm
+++ b/gfx/gl/GLContextProviderEAGL.mm
@@ -36,35 +36,24 @@ GLContextEAGL::GLContextEAGL(CreateContextFlags flags, const SurfaceCaps& caps,
GLContextEAGL::~GLContextEAGL()
{
- MakeCurrent();
-
- if (mBackbufferFB) {
- fDeleteFramebuffers(1, &mBackbufferFB);
- }
-
- if (mBackbufferRB) {
- fDeleteRenderbuffers(1, &mBackbufferRB);
+ if (MakeCurrent()) {
+ if (mBackbufferFB) {
+ fDeleteFramebuffers(1, &mBackbufferFB);
+ }
+ if (mBackbufferRB) {
+ fDeleteRenderbuffers(1, &mBackbufferRB);
+ }
}
+ mLayer = nil;
MarkDestroyed();
-
- if (mLayer) {
- mLayer = nil;
- }
-
- if (mContext) {
- [EAGLContext setCurrentContext:nil];
- [mContext release];
- }
+ [mContext release];
}
bool
GLContextEAGL::Init()
{
- if (!InitWithPrefix("gl", true))
- return false;
-
- return true;
+ return InitWithPrefix("gl", true);
}
bool
@@ -120,12 +109,12 @@ GLContextEAGL::MakeCurrentImpl(bool aForce)
return true;
}
- if (mContext) {
- if(![EAGLContext setCurrentContext:mContext]) {
- return false;
- }
+ if (IsDestroyed()) {
+ [EAGLContext setCurrentContext:nil];
+ return false;
}
- return true;
+
+ return [EAGLContext setCurrentContext:mContext];
}
bool
diff --git a/gfx/gl/GLContextProviderEGL.cpp b/gfx/gl/GLContextProviderEGL.cpp
index 7979f3bf0..23fc3472d 100644
--- a/gfx/gl/GLContextProviderEGL.cpp
+++ b/gfx/gl/GLContextProviderEGL.cpp
@@ -150,13 +150,12 @@ is_power_of_two(int v)
}
static void
-DestroySurface(EGLSurface oldSurface) {
- if (oldSurface != EGL_NO_SURFACE) {
- sEGLLibrary.fMakeCurrent(EGL_DISPLAY(),
- EGL_NO_SURFACE, EGL_NO_SURFACE,
- EGL_NO_CONTEXT);
- sEGLLibrary.fDestroySurface(EGL_DISPLAY(), oldSurface);
+DestroySurface(const EGLSurface surf) {
+ if (!surf) {
+ // Nothing to do.
+ return;
}
+ sEGLLibrary.fDestroySurface(EGL_DISPLAY(), surf);
}
static EGLSurface
@@ -223,7 +222,7 @@ GLContextEGL::~GLContextEGL()
sEGLLibrary.fDestroyContext(EGL_DISPLAY(), mContext);
sEGLLibrary.UnsetCachedCurrentContext();
- mozilla::gl::DestroySurface(mSurface);
+ DestroySurface(mSurface);
}
bool
@@ -247,12 +246,7 @@ GLContextEGL::Init()
if (!InitWithPrefix("gl", true))
return false;
- bool current = MakeCurrent();
- if (!current) {
- gfx::LogFailure(NS_LITERAL_CSTRING(
- "Couldn't get device attachments for device."));
- return false;
- }
+ MOZ_ASSERT(IsCurrent());
static_assert(sizeof(GLint) >= sizeof(int32_t), "GLint is smaller than int32_t");
mMaxTextureImageSize = INT32_MAX;
@@ -303,7 +297,10 @@ GLContextEGL::ReleaseTexImage()
}
void
-GLContextEGL::SetEGLSurfaceOverride(EGLSurface surf) {
+GLContextEGL::SetEGLSurfaceOverride(const EGLSurface surf) {
+
+ MOZ_ASSERT(!surf || surf != mSurface);
+
if (Screen()) {
/* Blit `draw` to `read` if we need to, before we potentially juggle
* `read` around. If we don't, we might attach a different `read`,
@@ -314,12 +311,17 @@ GLContextEGL::SetEGLSurfaceOverride(EGLSurface surf) {
}
mSurfaceOverride = surf;
- DebugOnly<bool> ok = MakeCurrent(true);
- MOZ_ASSERT(ok);
+ MOZ_ALWAYS_TRUE(MakeCurrent(true));
}
bool
GLContextEGL::MakeCurrentImpl(bool aForce) {
+ if (IsDestroyed()) {
+ //Clear and exit
+ sEGLLibrary.fMakeCurrent(EGL_DISPLAY(), nullptr, nullptr, nullptr);
+ return false;
+ }
+
bool succeeded = true;
// Assume that EGL has the same problem as WGL does,
@@ -373,7 +375,7 @@ GLContextEGL::IsCurrent() {
}
bool
-GLContextEGL::RenewSurface(nsIWidget* aWidget) {
+GLContextEGL::RenewSurface(nsIWidget* const aWidget) {
if (!mOwnsContext) {
return false;
}
@@ -389,13 +391,12 @@ GLContextEGL::RenewSurface(nsIWidget* aWidget) {
void
GLContextEGL::ReleaseSurface() {
- if (mOwnsContext) {
- mozilla::gl::DestroySurface(mSurface);
- }
- if (mSurface == mSurfaceOverride) {
- mSurfaceOverride = EGL_NO_SURFACE;
+ if (!mOwnsContext) {
+ return;
}
- mSurface = EGL_NO_SURFACE;
+
+ DestroySurface(mSurface);
+ mSurface = nullptr;
}
bool
diff --git a/gfx/gl/GLContextProviderGLX.cpp b/gfx/gl/GLContextProviderGLX.cpp
index 539520a8c..c44b1a9f0 100644
--- a/gfx/gl/GLContextProviderGLX.cpp
+++ b/gfx/gl/GLContextProviderGLX.cpp
@@ -894,20 +894,12 @@ GLContextGLX::~GLContextGLX()
return;
}
- // see bug 659842 comment 76
-#ifdef DEBUG
- bool success =
-#endif
- mGLX->xMakeCurrent(mDisplay, X11None, nullptr);
- MOZ_ASSERT(success,
- "glXMakeCurrent failed to release GL context before we call "
- "glXDestroyContext!");
-
mGLX->xDestroyContext(mDisplay, mContext);
if (mDeleteDrawable) {
mGLX->xDestroyPixmap(mDisplay, mDrawable);
}
+ MOZ_ASSERT(!mOverrideDrawable);
}
@@ -944,6 +936,10 @@ GLContextGLX::MakeCurrentImpl(bool aForce)
// DRI2InvalidateBuffers event before drawing. See bug 1280653.
Unused << XPending(mDisplay);
}
+ if (IsDestroyed()) {
+ MOZ_ALWAYS_TRUE(mGLX->xMakeCurrent(mDisplay, X11None, nullptr));
+ return false; // We did not MakeCurrent mContext, but that's what we wanted!
+ }
succeeded = mGLX->xMakeCurrent(mDisplay, mDrawable, mContext);
NS_ASSERTION(succeeded, "Failed to make GL context current!");
@@ -1017,16 +1013,18 @@ GLContextGLX::GetWSIInfo(nsCString* const out) const
bool
GLContextGLX::OverrideDrawable(GLXDrawable drawable)
{
- if (Screen())
+ if (Screen()) {
Screen()->AssureBlitted();
- Bool result = mGLX->xMakeCurrent(mDisplay, drawable, mContext);
- return result;
+ }
+ mOverrideDrawable = Some(drawable);
+ return MakeCurrent(true);
}
bool
GLContextGLX::RestoreDrawable()
{
- return mGLX->xMakeCurrent(mDisplay, mDrawable, mContext);
+ mOverrideDrawable = Nothing();
+ return MakeCurrent(true);
}
GLContextGLX::GLContextGLX(
diff --git a/gfx/gl/GLContextProviderWGL.cpp b/gfx/gl/GLContextProviderWGL.cpp
index 35957259d..da8c93d10 100644
--- a/gfx/gl/GLContextProviderWGL.cpp
+++ b/gfx/gl/GLContextProviderWGL.cpp
@@ -314,20 +314,17 @@ GLContextWGL::Init()
if (!mDC || !mContext)
return false;
- // see bug 929506 comment 29. wglGetProcAddress requires a current context.
- if (!sWGLLib.fMakeCurrent(mDC, mContext))
- return false;
-
SetupLookupFunction();
- if (!InitWithPrefix("gl", true))
- return false;
-
- return true;
+ return InitWithPrefix("gl", true);
}
bool
GLContextWGL::MakeCurrentImpl(bool aForce)
{
+ if (IsDestroyed()) {
+ MOZ_ALWAYS_TRUE(sWGLLib.fMakeCurrent(0, 0));
+ }
+
BOOL succeeded = true;
// wglGetCurrentContext seems to just pull the HGLRC out
diff --git a/gfx/thebes/gfxAndroidPlatform.h b/gfx/thebes/gfxAndroidPlatform.h
index 30e7c89ba..8975d0ab9 100644
--- a/gfx/thebes/gfxAndroidPlatform.h
+++ b/gfx/thebes/gfxAndroidPlatform.h
@@ -72,11 +72,6 @@ public:
return true;
}
-protected:
- bool AccelerateLayersByDefault() override {
- return true;
- }
-
private:
gfxImageFormat mOffscreenFormat;
};
diff --git a/gfx/thebes/gfxPlatform.cpp b/gfx/thebes/gfxPlatform.cpp
index 50d1fcb46..ae4336060 100644
--- a/gfx/thebes/gfxPlatform.cpp
+++ b/gfx/thebes/gfxPlatform.cpp
@@ -571,40 +571,6 @@ gfxPlatform::Init()
}
}
- // Drop a note in the crash report if we end up forcing an option that could
- // destabilize things. New items should be appended at the end (of an existing
- // or in a new section), so that we don't have to know the version to interpret
- // these cryptic strings.
- {
- nsAutoCString forcedPrefs;
- // D2D prefs
- forcedPrefs.AppendPrintf("FP(D%d%d",
- gfxPrefs::Direct2DDisabled(),
- gfxPrefs::Direct2DForceEnabled());
- // Layers prefs
- forcedPrefs.AppendPrintf("-L%d%d%d%d",
- gfxPrefs::LayersAMDSwitchableGfxEnabled(),
- gfxPrefs::LayersAccelerationDisabledDoNotUseDirectly(),
- gfxPrefs::LayersAccelerationForceEnabledDoNotUseDirectly(),
- gfxPrefs::LayersD3D11ForceWARP());
- // WebGL prefs
- forcedPrefs.AppendPrintf("-W%d%d%d%d%d%d%d%d",
- gfxPrefs::WebGLANGLEForceD3D11(),
- gfxPrefs::WebGLANGLEForceWARP(),
- gfxPrefs::WebGLDisabled(),
- gfxPrefs::WebGLDisableANGLE(),
- gfxPrefs::WebGLDXGLEnabled(),
- gfxPrefs::WebGLForceEnabled(),
- gfxPrefs::WebGLForceLayersReadback(),
- gfxPrefs::WebGLForceMSAA());
- // Prefs that don't fit into any of the other sections
- forcedPrefs.AppendPrintf("-T%d%d%d%d) ",
- gfxPrefs::AndroidRGB16Force(),
- gfxPrefs::CanvasAzureAccelerated(),
- gfxPrefs::DisableGralloc(),
- gfxPrefs::ForceShmemTiles());
- }
-
InitMoz2DLogging();
gGfxPlatformPrefsLock = new Mutex("gfxPlatform::gGfxPlatformPrefsLock");
@@ -2171,7 +2137,7 @@ gfxPlatform::InitCompositorAccelerationPrefs()
FeatureStatus::Blocked,
"Acceleration blocked by platform"))
{
- if (gfxPrefs::LayersAccelerationDisabledDoNotUseDirectly()) {
+ if (!gfxPrefs::LayersAccelerationEnabledDoNotUseDirectly()) {
feature.UserDisable("Disabled by pref",
NS_LITERAL_CSTRING("FEATURE_FAILURE_COMP_PREF"));
} else if (acceleratedEnv && *acceleratedEnv == '0') {
@@ -2185,8 +2151,9 @@ gfxPlatform::InitCompositorAccelerationPrefs()
}
// This has specific meaning elsewhere, so we always record it.
- if (gfxPrefs::LayersAccelerationForceEnabledDoNotUseDirectly()) {
- feature.UserForceEnable("Force-enabled by pref");
+ if (gfxPrefs::LayersAccelerationEnabledDoNotUseDirectly() &&
+ gfxPrefs::LayersAccelerationForceEnabledDoNotUseDirectly()) {
+ feature.UserForceEnable("Force-enabled by prefs");
}
// Safe mode trumps everything.
@@ -2208,7 +2175,11 @@ gfxPlatform::CanUseHardwareVideoDecoding()
bool
gfxPlatform::AccelerateLayersByDefault()
{
-#if defined(MOZ_GL_PROVIDER) || defined(MOZ_WIDGET_UIKIT)
+ // Note: add any new platform defines here that should get HWA by default.
+#if defined(XP_WIN) || defined(XP_MACOSX) || defined(MOZ_WIDGET_GTK) || defined(MOZ_WIDGET_UIKIT)
+ return true;
+#elif defined(MOZ_GL_PROVIDER)
+ // GL provider manually declared
return true;
#else
return false;
diff --git a/gfx/thebes/gfxPlatform.h b/gfx/thebes/gfxPlatform.h
index 68bb99ea4..642cf909f 100644
--- a/gfx/thebes/gfxPlatform.h
+++ b/gfx/thebes/gfxPlatform.h
@@ -698,7 +698,7 @@ protected:
virtual already_AddRefed<mozilla::gfx::VsyncSource> CreateHardwareVsyncSource();
// Returns whether or not layers should be accelerated by default on this platform.
- virtual bool AccelerateLayersByDefault();
+ bool AccelerateLayersByDefault();
// Returns a prioritized list of available compositor backends for acceleration.
virtual void GetAcceleratedCompositorBackends(nsTArray<mozilla::layers::LayersBackend>& aBackends);
diff --git a/gfx/thebes/gfxPlatformGtk.h b/gfx/thebes/gfxPlatformGtk.h
index 9959c0e13..22ed4b08f 100644
--- a/gfx/thebes/gfxPlatformGtk.h
+++ b/gfx/thebes/gfxPlatformGtk.h
@@ -132,10 +132,6 @@ public:
return true;
}
- bool AccelerateLayersByDefault() override {
- return true;
- }
-
#ifdef GL_PROVIDER_GLX
already_AddRefed<mozilla::gfx::VsyncSource> CreateHardwareVsyncSource() override;
#endif
diff --git a/gfx/thebes/gfxPlatformMac.cpp b/gfx/thebes/gfxPlatformMac.cpp
index 79684dd19..75c5236a8 100644
--- a/gfx/thebes/gfxPlatformMac.cpp
+++ b/gfx/thebes/gfxPlatformMac.cpp
@@ -372,12 +372,6 @@ gfxPlatformMac::ReadAntiAliasingThreshold()
return threshold;
}
-bool
-gfxPlatformMac::AccelerateLayersByDefault()
-{
- return true;
-}
-
// This is the renderer output callback function, called on the vsync thread
static CVReturn VsyncCallback(CVDisplayLinkRef aDisplayLink,
const CVTimeStamp* aNow,
diff --git a/gfx/thebes/gfxPlatformMac.h b/gfx/thebes/gfxPlatformMac.h
index 0807614f6..ea4c1a101 100644
--- a/gfx/thebes/gfxPlatformMac.h
+++ b/gfx/thebes/gfxPlatformMac.h
@@ -81,9 +81,6 @@ public:
// lower threshold on font anti-aliasing
uint32_t GetAntiAliasingThreshold() { return mFontAntiAliasingThreshold; }
-protected:
- bool AccelerateLayersByDefault() override;
-
private:
virtual void GetPlatformCMSOutputProfile(void* &mem, size_t &size) override;
diff --git a/gfx/thebes/gfxPrefs.h b/gfx/thebes/gfxPrefs.h
index 1253fdb48..d02f15699 100644
--- a/gfx/thebes/gfxPrefs.h
+++ b/gfx/thebes/gfxPrefs.h
@@ -448,11 +448,11 @@ private:
DECL_GFX_PREF(Once, "image.multithreaded_decoding.limit", ImageMTDecodingLimit, int32_t, -1);
DECL_GFX_PREF(Live, "image.webp.enabled", ImageWebPEnabled, bool, true);
- DECL_GFX_PREF(Once, "layers.acceleration.disabled", LayersAccelerationDisabledDoNotUseDirectly, bool, false);
+ DECL_GFX_PREF(Once, "layers.acceleration.enabled", LayersAccelerationEnabledDoNotUseDirectly, bool, true);
DECL_GFX_PREF(Live, "layers.acceleration.draw-fps", LayersDrawFPS, bool, false);
DECL_GFX_PREF(Live, "layers.acceleration.draw-fps.print-histogram", FPSPrintHistogram, bool, false);
DECL_GFX_PREF(Live, "layers.acceleration.draw-fps.write-to-file", WriteFPSToFile, bool, false);
- DECL_GFX_PREF(Once, "layers.acceleration.force-enabled", LayersAccelerationForceEnabledDoNotUseDirectly, bool, false);
+ DECL_GFX_PREF(Once, "layers.acceleration.force", LayersAccelerationForceEnabledDoNotUseDirectly, bool, false);
DECL_GFX_PREF(Once, "layers.allow-d3d9-fallback", LayersAllowD3D9Fallback, bool, false);
DECL_GFX_PREF(Once, "layers.amd-switchable-gfx.enabled", LayersAMDSwitchableGfxEnabled, bool, false);
DECL_GFX_PREF(Once, "layers.async-pan-zoom.enabled", AsyncPanZoomEnabledDoNotUseDirectly, bool, true);
diff --git a/gfx/thebes/gfxWindowsPlatform.h b/gfx/thebes/gfxWindowsPlatform.h
index 129365f82..b56dab338 100644
--- a/gfx/thebes/gfxWindowsPlatform.h
+++ b/gfx/thebes/gfxWindowsPlatform.h
@@ -226,9 +226,6 @@ public:
bool SupportsPluginDirectDXGIDrawing();
protected:
- bool AccelerateLayersByDefault() override {
- return true;
- }
void GetAcceleratedCompositorBackends(nsTArray<mozilla::layers::LayersBackend>& aBackends) override;
virtual void GetPlatformCMSOutputProfile(void* &mem, size_t &size) override;