mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Support MacIOSurface textures in the basic compositor (bug 942358, r=mattwoodrow).
This commit is contained in:
parent
96ba33c70c
commit
2170305c2f
@ -4,6 +4,7 @@
|
|||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
#include "BasicCompositor.h"
|
#include "BasicCompositor.h"
|
||||||
|
#include "TextureHostBasic.h"
|
||||||
#include "ipc/AutoOpenSurface.h"
|
#include "ipc/AutoOpenSurface.h"
|
||||||
#include "mozilla/layers/Effects.h"
|
#include "mozilla/layers/Effects.h"
|
||||||
#include "mozilla/layers/YCbCrImageDataSerializer.h"
|
#include "mozilla/layers/YCbCrImageDataSerializer.h"
|
||||||
@ -22,16 +23,6 @@ using namespace mozilla::gfx;
|
|||||||
|
|
||||||
namespace layers {
|
namespace layers {
|
||||||
|
|
||||||
/**
|
|
||||||
* A texture source interface that can be used by the software Compositor.
|
|
||||||
*/
|
|
||||||
class TextureSourceBasic
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual ~TextureSourceBasic() {}
|
|
||||||
virtual gfx::SourceSurface* GetSurface() = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
class DataTextureSourceBasic : public DataTextureSource
|
class DataTextureSourceBasic : public DataTextureSource
|
||||||
, public TextureSourceBasic
|
, public TextureSourceBasic
|
||||||
{
|
{
|
||||||
@ -89,7 +80,7 @@ public:
|
|||||||
|
|
||||||
virtual TextureSourceBasic* AsSourceBasic() MOZ_OVERRIDE { return this; }
|
virtual TextureSourceBasic* AsSourceBasic() MOZ_OVERRIDE { return this; }
|
||||||
|
|
||||||
SourceSurface *GetSurface() { return mSurface; }
|
SourceSurface *GetSurface() MOZ_OVERRIDE { return mSurface; }
|
||||||
|
|
||||||
virtual void SetCompositor(Compositor* aCompositor)
|
virtual void SetCompositor(Compositor* aCompositor)
|
||||||
{
|
{
|
||||||
|
94
gfx/layers/basic/MacIOSurfaceTextureHostBasic.cpp
Normal file
94
gfx/layers/basic/MacIOSurfaceTextureHostBasic.cpp
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
/* -*- 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 "MacIOSurfaceTextureHostBasic.h"
|
||||||
|
#include "mozilla/layers/BasicCompositor.h"
|
||||||
|
#include "mozilla/gfx/MacIOSurface.h"
|
||||||
|
|
||||||
|
namespace mozilla {
|
||||||
|
namespace layers {
|
||||||
|
|
||||||
|
MacIOSurfaceTextureSourceBasic::MacIOSurfaceTextureSourceBasic(
|
||||||
|
BasicCompositor* aCompositor,
|
||||||
|
MacIOSurface* aSurface)
|
||||||
|
: mCompositor(aCompositor)
|
||||||
|
, mSurface(aSurface)
|
||||||
|
{}
|
||||||
|
|
||||||
|
MacIOSurfaceTextureSourceBasic::~MacIOSurfaceTextureSourceBasic()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
gfx::IntSize
|
||||||
|
MacIOSurfaceTextureSourceBasic::GetSize() const
|
||||||
|
{
|
||||||
|
return gfx::IntSize(mSurface->GetDevicePixelWidth(),
|
||||||
|
mSurface->GetDevicePixelHeight());
|
||||||
|
}
|
||||||
|
|
||||||
|
gfx::SurfaceFormat
|
||||||
|
MacIOSurfaceTextureSourceBasic::GetFormat() const
|
||||||
|
{
|
||||||
|
return mSurface->HasAlpha() ? gfx::FORMAT_R8G8B8A8 : gfx::FORMAT_B8G8R8X8;
|
||||||
|
}
|
||||||
|
|
||||||
|
MacIOSurfaceTextureHostBasic::MacIOSurfaceTextureHostBasic(
|
||||||
|
uint64_t aID,
|
||||||
|
TextureFlags aFlags,
|
||||||
|
const SurfaceDescriptorMacIOSurface& aDescriptor
|
||||||
|
)
|
||||||
|
: TextureHost(aID, aFlags)
|
||||||
|
{
|
||||||
|
mSurface = MacIOSurface::LookupSurface(aDescriptor.surface(),
|
||||||
|
aDescriptor.scaleFactor(),
|
||||||
|
aDescriptor.hasAlpha());
|
||||||
|
}
|
||||||
|
|
||||||
|
gfx::SourceSurface*
|
||||||
|
MacIOSurfaceTextureSourceBasic::GetSurface()
|
||||||
|
{
|
||||||
|
if (!mSourceSurface) {
|
||||||
|
mSourceSurface = mSurface->GetAsSurface();
|
||||||
|
}
|
||||||
|
return mSourceSurface;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
MacIOSurfaceTextureHostBasic::Lock()
|
||||||
|
{
|
||||||
|
if (!mCompositor) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mTextureSource) {
|
||||||
|
mTextureSource = new MacIOSurfaceTextureSourceBasic(mCompositor, mSurface);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MacIOSurfaceTextureHostBasic::SetCompositor(Compositor* aCompositor)
|
||||||
|
{
|
||||||
|
BasicCompositor* compositor = static_cast<BasicCompositor*>(aCompositor);
|
||||||
|
mCompositor = compositor;
|
||||||
|
if (mTextureSource) {
|
||||||
|
mTextureSource->SetCompositor(compositor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gfx::SurfaceFormat
|
||||||
|
MacIOSurfaceTextureHostBasic::GetFormat() const {
|
||||||
|
return mSurface->HasAlpha() ? gfx::FORMAT_R8G8B8A8 : gfx::FORMAT_B8G8R8X8;
|
||||||
|
}
|
||||||
|
|
||||||
|
gfx::IntSize
|
||||||
|
MacIOSurfaceTextureHostBasic::GetSize() const {
|
||||||
|
return gfx::IntSize(mSurface->GetDevicePixelWidth(),
|
||||||
|
mSurface->GetDevicePixelHeight());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
94
gfx/layers/basic/MacIOSurfaceTextureHostBasic.h
Normal file
94
gfx/layers/basic/MacIOSurfaceTextureHostBasic.h
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
/* -*- 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_MACIOSURFACETEXTUREHOST_BASIC_H
|
||||||
|
#define MOZILLA_GFX_MACIOSURFACETEXTUREHOST_BASIC_H
|
||||||
|
|
||||||
|
#include "mozilla/layers/TextureHostBasic.h"
|
||||||
|
|
||||||
|
class MacIOSurface;
|
||||||
|
|
||||||
|
namespace mozilla {
|
||||||
|
namespace layers {
|
||||||
|
|
||||||
|
class BasicCompositor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A texture source meant for use with BasicCompositor.
|
||||||
|
*
|
||||||
|
* It does not own any GL texture, and attaches its shared handle to one of
|
||||||
|
* the compositor's temporary textures when binding.
|
||||||
|
*/
|
||||||
|
class MacIOSurfaceTextureSourceBasic
|
||||||
|
: public TextureSourceBasic,
|
||||||
|
public NewTextureSource
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MacIOSurfaceTextureSourceBasic(BasicCompositor* aCompositor,
|
||||||
|
MacIOSurface* aSurface);
|
||||||
|
virtual ~MacIOSurfaceTextureSourceBasic();
|
||||||
|
|
||||||
|
virtual TextureSourceBasic* AsSourceBasic() MOZ_OVERRIDE { return this; }
|
||||||
|
|
||||||
|
virtual gfx::IntSize GetSize() const MOZ_OVERRIDE;
|
||||||
|
virtual gfx::SurfaceFormat GetFormat() const MOZ_OVERRIDE;
|
||||||
|
virtual gfx::SourceSurface* GetSurface() MOZ_OVERRIDE;
|
||||||
|
|
||||||
|
virtual void DeallocateDeviceData() MOZ_OVERRIDE { }
|
||||||
|
|
||||||
|
void SetCompositor(BasicCompositor* aCompositor) {
|
||||||
|
mCompositor = aCompositor;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
BasicCompositor* mCompositor;
|
||||||
|
RefPtr<MacIOSurface> mSurface;
|
||||||
|
RefPtr<gfx::SourceSurface> mSourceSurface;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A TextureHost for shared MacIOSurface
|
||||||
|
*
|
||||||
|
* Most of the logic actually happens in MacIOSurfaceTextureSourceBasic.
|
||||||
|
*/
|
||||||
|
class MacIOSurfaceTextureHostBasic : public TextureHost
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MacIOSurfaceTextureHostBasic(uint64_t aID,
|
||||||
|
TextureFlags aFlags,
|
||||||
|
const SurfaceDescriptorMacIOSurface& aDescriptor);
|
||||||
|
|
||||||
|
virtual void SetCompositor(Compositor* aCompositor) MOZ_OVERRIDE;
|
||||||
|
|
||||||
|
virtual bool Lock() MOZ_OVERRIDE;
|
||||||
|
|
||||||
|
virtual gfx::SurfaceFormat GetFormat() const MOZ_OVERRIDE;
|
||||||
|
|
||||||
|
virtual NewTextureSource* GetTextureSources() MOZ_OVERRIDE
|
||||||
|
{
|
||||||
|
return mTextureSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual TemporaryRef<gfx::DataSourceSurface> GetAsSurface() MOZ_OVERRIDE
|
||||||
|
{
|
||||||
|
return nullptr; // XXX - implement this (for MOZ_DUMP_PAINTING)
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual gfx::IntSize GetSize() const MOZ_OVERRIDE;
|
||||||
|
|
||||||
|
#ifdef MOZ_LAYERS_HAVE_LOG
|
||||||
|
virtual const char* Name() { return "MacIOSurfaceTextureHostBasic"; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
protected:
|
||||||
|
BasicCompositor* mCompositor;
|
||||||
|
RefPtr<MacIOSurfaceTextureSourceBasic> mTextureSource;
|
||||||
|
RefPtr<MacIOSurface> mSurface;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // MOZILLA_GFX_MACIOSURFACETEXTUREHOSTOGL_BASIC_H
|
41
gfx/layers/basic/TextureHostBasic.cpp
Normal file
41
gfx/layers/basic/TextureHostBasic.cpp
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/* -*- 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 "TextureHostBasic.h"
|
||||||
|
#include "MacIOSurfaceTextureHostBasic.h"
|
||||||
|
|
||||||
|
using namespace mozilla::gl;
|
||||||
|
using namespace mozilla::gfx;
|
||||||
|
|
||||||
|
namespace mozilla {
|
||||||
|
namespace layers {
|
||||||
|
|
||||||
|
TemporaryRef<TextureHost>
|
||||||
|
CreateTextureHostBasic(uint64_t aID,
|
||||||
|
const SurfaceDescriptor& aDesc,
|
||||||
|
ISurfaceAllocator* aDeallocator,
|
||||||
|
TextureFlags aFlags)
|
||||||
|
{
|
||||||
|
RefPtr<TextureHost> result;
|
||||||
|
switch (aDesc.type()) {
|
||||||
|
#ifdef XP_MACOSX
|
||||||
|
case SurfaceDescriptor::TSurfaceDescriptorMacIOSurface: {
|
||||||
|
const SurfaceDescriptorMacIOSurface& desc =
|
||||||
|
aDesc.get_SurfaceDescriptorMacIOSurface();
|
||||||
|
result = new MacIOSurfaceTextureHostBasic(aID, aFlags, desc);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
default: {
|
||||||
|
result = CreateBackendIndependentTextureHost(aID, aDesc, aDeallocator, aFlags);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace layers
|
||||||
|
} // namespace gfx
|
31
gfx/layers/basic/TextureHostBasic.h
Normal file
31
gfx/layers/basic/TextureHostBasic.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
|
||||||
|
/* -*- 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_TEXTUREHOSTBASIC_H_
|
||||||
|
#define MOZILLA_GFX_TEXTUREHOSTBASIC_H_
|
||||||
|
|
||||||
|
#include "CompositableHost.h"
|
||||||
|
#include "mozilla/layers/LayersSurfaces.h"
|
||||||
|
#include "mozilla/layers/TextureHost.h"
|
||||||
|
#include "mozilla/gfx/2D.h"
|
||||||
|
|
||||||
|
namespace mozilla {
|
||||||
|
namespace layers {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A texture source interface that can be used by the software Compositor.
|
||||||
|
*/
|
||||||
|
class TextureSourceBasic
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~TextureSourceBasic() {}
|
||||||
|
virtual gfx::SourceSurface* GetSurface() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace layers
|
||||||
|
} // namespace mozilla
|
||||||
|
|
||||||
|
#endif // MOZILLA_GFX_TEXTUREHOSTBASIC_H_
|
@ -80,12 +80,18 @@ DeprecatedTextureHost::CreateDeprecatedTextureHost(SurfaceDescriptorType aDescri
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// implemented in TextureOGL.cpp
|
// implemented in TextureHostOGL.cpp
|
||||||
TemporaryRef<TextureHost> CreateTextureHostOGL(uint64_t aID,
|
TemporaryRef<TextureHost> CreateTextureHostOGL(uint64_t aID,
|
||||||
const SurfaceDescriptor& aDesc,
|
const SurfaceDescriptor& aDesc,
|
||||||
ISurfaceAllocator* aDeallocator,
|
ISurfaceAllocator* aDeallocator,
|
||||||
TextureFlags aFlags);
|
TextureFlags aFlags);
|
||||||
|
|
||||||
|
// implemented in TextureHostBasic.cpp
|
||||||
|
TemporaryRef<TextureHost> CreateTextureHostBasic(uint64_t aID,
|
||||||
|
const SurfaceDescriptor& aDesc,
|
||||||
|
ISurfaceAllocator* aDeallocator,
|
||||||
|
TextureFlags aFlags);
|
||||||
|
|
||||||
// static
|
// static
|
||||||
TemporaryRef<TextureHost>
|
TemporaryRef<TextureHost>
|
||||||
TextureHost::Create(uint64_t aID,
|
TextureHost::Create(uint64_t aID,
|
||||||
@ -97,10 +103,7 @@ TextureHost::Create(uint64_t aID,
|
|||||||
case LAYERS_OPENGL:
|
case LAYERS_OPENGL:
|
||||||
return CreateTextureHostOGL(aID, aDesc, aDeallocator, aFlags);
|
return CreateTextureHostOGL(aID, aDesc, aDeallocator, aFlags);
|
||||||
case LAYERS_BASIC:
|
case LAYERS_BASIC:
|
||||||
return CreateBackendIndependentTextureHost(aID,
|
return CreateTextureHostBasic(aID, aDesc, aDeallocator, aFlags);
|
||||||
aDesc,
|
|
||||||
aDeallocator,
|
|
||||||
aFlags);
|
|
||||||
#ifdef XP_WIN
|
#ifdef XP_WIN
|
||||||
case LAYERS_D3D11:
|
case LAYERS_D3D11:
|
||||||
case LAYERS_D3D9:
|
case LAYERS_D3D9:
|
||||||
|
@ -99,6 +99,8 @@ EXPORTS.gfxipc += [
|
|||||||
|
|
||||||
EXPORTS.mozilla.layers += [
|
EXPORTS.mozilla.layers += [
|
||||||
'basic/BasicCompositor.h',
|
'basic/BasicCompositor.h',
|
||||||
|
'basic/MacIOSurfaceTextureHostBasic.h',
|
||||||
|
'basic/TextureHostBasic.h',
|
||||||
'client/CanvasClient.h',
|
'client/CanvasClient.h',
|
||||||
'client/CompositableClient.h',
|
'client/CompositableClient.h',
|
||||||
'client/ContentClient.h',
|
'client/ContentClient.h',
|
||||||
@ -201,6 +203,7 @@ UNIFIED_SOURCES += [
|
|||||||
'basic/BasicLayerManager.cpp',
|
'basic/BasicLayerManager.cpp',
|
||||||
'basic/BasicLayersImpl.cpp',
|
'basic/BasicLayersImpl.cpp',
|
||||||
'basic/BasicThebesLayer.cpp',
|
'basic/BasicThebesLayer.cpp',
|
||||||
|
'basic/TextureHostBasic.cpp',
|
||||||
'BufferUnrotate.cpp',
|
'BufferUnrotate.cpp',
|
||||||
'client/CanvasClient.cpp',
|
'client/CanvasClient.cpp',
|
||||||
'client/ClientCanvasLayer.cpp',
|
'client/ClientCanvasLayer.cpp',
|
||||||
@ -275,6 +278,7 @@ SOURCES += [
|
|||||||
|
|
||||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
|
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
|
||||||
SOURCES += [
|
SOURCES += [
|
||||||
|
'basic/MacIOSurfaceTextureHostBasic.cpp',
|
||||||
'opengl/MacIOSurfaceTextureClientOGL.cpp',
|
'opengl/MacIOSurfaceTextureClientOGL.cpp',
|
||||||
'opengl/MacIOSurfaceTextureHostOGL.cpp',
|
'opengl/MacIOSurfaceTextureHostOGL.cpp',
|
||||||
]
|
]
|
||||||
|
Loading…
Reference in New Issue
Block a user