зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1685183 Part 1: Make MacIOSurface always use 1.0 scale, and update callsites. r=jgilbert
This change makes callsites that use SurfaceDescriptor structures to ignore scale factors. All surfaces are 1.0 scale, no matter what. Differential Revision: https://phabricator.services.mozilla.com/D101213
This commit is contained in:
Родитель
8d90cf4b42
Коммит
acdd1a887d
|
@ -19,10 +19,8 @@
|
|||
using namespace mozilla;
|
||||
|
||||
MacIOSurface::MacIOSurface(CFTypeRefPtr<IOSurfaceRef> aIOSurfaceRef,
|
||||
double aContentsScaleFactor, bool aHasAlpha,
|
||||
gfx::YUVColorSpace aColorSpace)
|
||||
bool aHasAlpha, gfx::YUVColorSpace aColorSpace)
|
||||
: mIOSurfaceRef(std::move(aIOSurfaceRef)),
|
||||
mContentsScaleFactor(aContentsScaleFactor),
|
||||
mHasAlpha(aHasAlpha),
|
||||
mColorSpace(aColorSpace) {
|
||||
IncrementUseCount();
|
||||
|
@ -59,10 +57,9 @@ void SetSizeProperties(const CFTypeRefPtr<CFMutableDictionaryRef>& aDict,
|
|||
}
|
||||
|
||||
/* static */
|
||||
already_AddRefed<MacIOSurface> MacIOSurface::CreateIOSurface(
|
||||
int aWidth, int aHeight, double aContentsScaleFactor, bool aHasAlpha) {
|
||||
if (aContentsScaleFactor <= 0) return nullptr;
|
||||
|
||||
already_AddRefed<MacIOSurface> MacIOSurface::CreateIOSurface(int aWidth,
|
||||
int aHeight,
|
||||
bool aHasAlpha) {
|
||||
auto props = CFTypeRefPtr<CFMutableDictionaryRef>::WrapUnderCreateRule(
|
||||
::CFDictionaryCreateMutable(kCFAllocatorDefault, 4,
|
||||
&kCFTypeDictionaryKeyCallBacks,
|
||||
|
@ -73,9 +70,6 @@ already_AddRefed<MacIOSurface> MacIOSurface::CreateIOSurface(
|
|||
MOZ_ASSERT((size_t)aHeight <= GetMaxHeight());
|
||||
|
||||
int32_t bytesPerElem = 4;
|
||||
size_t intScaleFactor = ceil(aContentsScaleFactor);
|
||||
aWidth *= intScaleFactor;
|
||||
aHeight *= intScaleFactor;
|
||||
SetSizeProperties(props, aWidth, aHeight, bytesPerElem);
|
||||
|
||||
AddDictionaryInt(props, kIOSurfacePixelFormat,
|
||||
|
@ -95,7 +89,7 @@ already_AddRefed<MacIOSurface> MacIOSurface::CreateIOSurface(
|
|||
}
|
||||
|
||||
RefPtr<MacIOSurface> ioSurface =
|
||||
new MacIOSurface(std::move(surfaceRef), aContentsScaleFactor, aHasAlpha);
|
||||
new MacIOSurface(std::move(surfaceRef), aHasAlpha);
|
||||
|
||||
return ioSurface.forget();
|
||||
}
|
||||
|
@ -197,7 +191,7 @@ already_AddRefed<MacIOSurface> MacIOSurface::CreateNV12Surface(
|
|||
colorData.get());
|
||||
|
||||
RefPtr<MacIOSurface> ioSurface =
|
||||
new MacIOSurface(std::move(surfaceRef), 1.0, false, aColorSpace);
|
||||
new MacIOSurface(std::move(surfaceRef), false, aColorSpace);
|
||||
|
||||
return ioSurface.forget();
|
||||
}
|
||||
|
@ -259,24 +253,21 @@ already_AddRefed<MacIOSurface> MacIOSurface::CreateYUV422Surface(
|
|||
colorData.get());
|
||||
|
||||
RefPtr<MacIOSurface> ioSurface =
|
||||
new MacIOSurface(std::move(surfaceRef), 1.0, false, aColorSpace);
|
||||
new MacIOSurface(std::move(surfaceRef), false, aColorSpace);
|
||||
|
||||
return ioSurface.forget();
|
||||
}
|
||||
|
||||
/* static */
|
||||
already_AddRefed<MacIOSurface> MacIOSurface::LookupSurface(
|
||||
IOSurfaceID aIOSurfaceID, double aContentsScaleFactor, bool aHasAlpha,
|
||||
gfx::YUVColorSpace aColorSpace) {
|
||||
if (aContentsScaleFactor <= 0) return nullptr;
|
||||
|
||||
IOSurfaceID aIOSurfaceID, bool aHasAlpha, gfx::YUVColorSpace aColorSpace) {
|
||||
CFTypeRefPtr<IOSurfaceRef> surfaceRef =
|
||||
CFTypeRefPtr<IOSurfaceRef>::WrapUnderCreateRule(
|
||||
::IOSurfaceLookup(aIOSurfaceID));
|
||||
if (!surfaceRef) return nullptr;
|
||||
|
||||
RefPtr<MacIOSurface> ioSurface = new MacIOSurface(
|
||||
std::move(surfaceRef), aContentsScaleFactor, aHasAlpha, aColorSpace);
|
||||
RefPtr<MacIOSurface> ioSurface =
|
||||
new MacIOSurface(std::move(surfaceRef), aHasAlpha, aColorSpace);
|
||||
|
||||
return ioSurface.forget();
|
||||
}
|
||||
|
@ -294,13 +285,11 @@ void* MacIOSurface::GetBaseAddressOfPlane(size_t aPlaneIndex) const {
|
|||
}
|
||||
|
||||
size_t MacIOSurface::GetWidth(size_t plane) const {
|
||||
size_t intScaleFactor = ceil(mContentsScaleFactor);
|
||||
return GetDevicePixelWidth(plane) / intScaleFactor;
|
||||
return GetDevicePixelWidth(plane);
|
||||
}
|
||||
|
||||
size_t MacIOSurface::GetHeight(size_t plane) const {
|
||||
size_t intScaleFactor = ceil(mContentsScaleFactor);
|
||||
return GetDevicePixelHeight(plane) / intScaleFactor;
|
||||
return GetDevicePixelHeight(plane);
|
||||
}
|
||||
|
||||
size_t MacIOSurface::GetPlaneCount() const {
|
||||
|
|
|
@ -56,9 +56,8 @@ class MacIOSurface final
|
|||
// of the MacIOSurface instance.
|
||||
// MacIOSurface holds a reference to the corresponding IOSurface.
|
||||
|
||||
static already_AddRefed<MacIOSurface> CreateIOSurface(
|
||||
int aWidth, int aHeight, double aContentsScaleFactor = 1.0,
|
||||
bool aHasAlpha = true);
|
||||
static already_AddRefed<MacIOSurface> CreateIOSurface(int aWidth, int aHeight,
|
||||
bool aHasAlpha = true);
|
||||
static already_AddRefed<MacIOSurface> CreateNV12Surface(
|
||||
const IntSize& aYSize, const IntSize& aCbCrSize,
|
||||
YUVColorSpace aColorSpace, ColorRange aColorRange);
|
||||
|
@ -66,13 +65,11 @@ class MacIOSurface final
|
|||
const IntSize& aSize, YUVColorSpace aColorSpace, ColorRange aColorRange);
|
||||
static void ReleaseIOSurface(MacIOSurface* aIOSurface);
|
||||
static already_AddRefed<MacIOSurface> LookupSurface(
|
||||
IOSurfaceID aSurfaceID, double aContentsScaleFactor = 1.0,
|
||||
bool aHasAlpha = true,
|
||||
IOSurfaceID aSurfaceID, bool aHasAlpha = true,
|
||||
mozilla::gfx::YUVColorSpace aColorSpace =
|
||||
mozilla::gfx::YUVColorSpace::Identity);
|
||||
|
||||
explicit MacIOSurface(CFTypeRefPtr<IOSurfaceRef> aIOSurfaceRef,
|
||||
double aContentsScaleFactor = 1.0,
|
||||
bool aHasAlpha = true,
|
||||
mozilla::gfx::YUVColorSpace aColorSpace =
|
||||
mozilla::gfx::YUVColorSpace::Identity);
|
||||
|
@ -92,7 +89,6 @@ class MacIOSurface final
|
|||
IntSize GetSize(size_t plane = 0) const {
|
||||
return IntSize(GetWidth(plane), GetHeight(plane));
|
||||
}
|
||||
double GetContentsScaleFactor() const { return mContentsScaleFactor; }
|
||||
size_t GetDevicePixelWidth(size_t plane = 0) const;
|
||||
size_t GetDevicePixelHeight(size_t plane = 0) const;
|
||||
size_t GetBytesPerRow(size_t plane = 0) const;
|
||||
|
@ -142,7 +138,6 @@ class MacIOSurface final
|
|||
|
||||
private:
|
||||
CFTypeRefPtr<IOSurfaceRef> mIOSurfaceRef;
|
||||
const double mContentsScaleFactor;
|
||||
const bool mHasAlpha;
|
||||
YUVColorSpace mColorSpace = YUVColorSpace::Identity;
|
||||
bool mIsLocked = false;
|
||||
|
|
|
@ -475,28 +475,24 @@ nsresult nsCARenderer::DrawSurfaceToCGContext(CGContextRef aContext, MacIOSurfac
|
|||
}
|
||||
|
||||
void* ioData = surf->GetBaseAddress();
|
||||
double scaleFactor = surf->GetContentsScaleFactor();
|
||||
size_t intScaleFactor = ceil(surf->GetContentsScaleFactor());
|
||||
CGDataProviderRef dataProvider =
|
||||
::CGDataProviderCreateWithData(ioData, ioData, ioHeight * intScaleFactor * (bytesPerRow)*4,
|
||||
::CGDataProviderCreateWithData(ioData, ioData, ioHeight * (bytesPerRow)*4,
|
||||
nullptr); // No release callback
|
||||
if (!dataProvider) {
|
||||
surf->Unlock();
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
CGImageRef cgImage =
|
||||
::CGImageCreate(ioWidth * intScaleFactor, ioHeight * intScaleFactor, 8, 32, bytesPerRow,
|
||||
aColorSpace, kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host,
|
||||
dataProvider, nullptr, true, kCGRenderingIntentDefault);
|
||||
CGImageRef cgImage = ::CGImageCreate(ioWidth, ioHeight, 8, 32, bytesPerRow, aColorSpace,
|
||||
kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host,
|
||||
dataProvider, nullptr, true, kCGRenderingIntentDefault);
|
||||
::CGDataProviderRelease(dataProvider);
|
||||
if (!cgImage) {
|
||||
surf->Unlock();
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
CGImageRef subImage = ::CGImageCreateWithImageInRect(
|
||||
cgImage, ::CGRectMake(aX * scaleFactor, aY * scaleFactor, aWidth * scaleFactor,
|
||||
aHeight * scaleFactor));
|
||||
CGImageRef subImage =
|
||||
::CGImageCreateWithImageInRect(cgImage, ::CGRectMake(aX, aY, aWidth, aHeight));
|
||||
if (!subImage) {
|
||||
::CGImageRelease(cgImage);
|
||||
surf->Unlock();
|
||||
|
@ -504,9 +500,7 @@ nsresult nsCARenderer::DrawSurfaceToCGContext(CGContextRef aContext, MacIOSurfac
|
|||
}
|
||||
|
||||
::CGContextScaleCTM(aContext, 1.0f, -1.0f);
|
||||
::CGContextDrawImage(aContext,
|
||||
CGRectMake(aX * scaleFactor, (-(CGFloat)aY - (CGFloat)aHeight) * scaleFactor,
|
||||
aWidth * scaleFactor, aHeight * scaleFactor),
|
||||
::CGContextDrawImage(aContext, CGRectMake(aX, -(CGFloat)aY - (CGFloat)aHeight, aWidth, aHeight),
|
||||
subImage);
|
||||
|
||||
::CGImageRelease(subImage);
|
||||
|
|
|
@ -682,8 +682,8 @@ const DrawBlitProg* GLBlitHelper::CreateDrawBlitProg(
|
|||
#ifdef XP_MACOSX
|
||||
static RefPtr<MacIOSurface> LookupSurface(
|
||||
const layers::SurfaceDescriptorMacIOSurface& sd) {
|
||||
return MacIOSurface::LookupSurface(sd.surfaceId(), sd.scaleFactor(),
|
||||
!sd.isOpaque(), sd.yUVColorSpace());
|
||||
return MacIOSurface::LookupSurface(sd.surfaceId(), !sd.isOpaque(),
|
||||
sd.yUVColorSpace());
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -1266,8 +1266,7 @@ bool GLBlitHelper::BlitImage(layers::GPUVideoImage* const srcImage,
|
|||
TSurfaceDescriptorMacIOSurface: {
|
||||
const auto& subdesc = subdescUnion.get_SurfaceDescriptorMacIOSurface();
|
||||
RefPtr<MacIOSurface> surface = MacIOSurface::LookupSurface(
|
||||
subdesc.surfaceId(), subdesc.scaleFactor(), !subdesc.isOpaque(),
|
||||
subdesc.yUVColorSpace());
|
||||
subdesc.surfaceId(), !subdesc.isOpaque(), subdesc.yUVColorSpace());
|
||||
MOZ_ASSERT(surface);
|
||||
if (!surface) {
|
||||
return false;
|
||||
|
|
|
@ -54,7 +54,7 @@ UniquePtr<SharedSurface_IOSurface> SharedSurface_IOSurface::Create(
|
|||
const SharedSurfaceDesc& desc) {
|
||||
const auto& size = desc.size;
|
||||
const RefPtr<MacIOSurface> ioSurf =
|
||||
MacIOSurface::CreateIOSurface(size.width, size.height, 1.0, true);
|
||||
MacIOSurface::CreateIOSurface(size.width, size.height, true);
|
||||
if (!ioSurf) {
|
||||
NS_WARNING("Failed to create MacIOSurface.");
|
||||
return nullptr;
|
||||
|
|
|
@ -130,7 +130,7 @@ already_AddRefed<MacIOSurface> MacIOSurfaceRecycleAllocator::Allocate(
|
|||
// Only construct a MacIOSurface object when we find one that isn't
|
||||
// in-use, since the constructor adds a usage ref.
|
||||
if (!result && !::IOSurfaceIsInUse(surf.get())) {
|
||||
result = new MacIOSurface(surf, 1.0, false, aYUVColorSpace);
|
||||
result = new MacIOSurface(surf, false, aYUVColorSpace);
|
||||
}
|
||||
|
||||
mSurfaces.AppendElement(surf);
|
||||
|
|
|
@ -36,9 +36,9 @@ gfx::SurfaceFormat MacIOSurfaceTextureSourceBasic::GetFormat() const {
|
|||
MacIOSurfaceTextureHostBasic::MacIOSurfaceTextureHostBasic(
|
||||
TextureFlags aFlags, const SurfaceDescriptorMacIOSurface& aDescriptor)
|
||||
: TextureHost(aFlags) {
|
||||
mSurface = MacIOSurface::LookupSurface(
|
||||
aDescriptor.surfaceId(), aDescriptor.scaleFactor(),
|
||||
!aDescriptor.isOpaque(), aDescriptor.yUVColorSpace());
|
||||
mSurface = MacIOSurface::LookupSurface(aDescriptor.surfaceId(),
|
||||
!aDescriptor.isOpaque(),
|
||||
aDescriptor.yUVColorSpace());
|
||||
}
|
||||
|
||||
gfx::SourceSurface* MacIOSurfaceTextureSourceBasic::GetSurface(
|
||||
|
|
|
@ -41,7 +41,7 @@ MacIOSurfaceTextureData* MacIOSurfaceTextureData::Create(const IntSize& aSize,
|
|||
}
|
||||
|
||||
RefPtr<MacIOSurface> surf = MacIOSurface::CreateIOSurface(
|
||||
aSize.width, aSize.height, 1.0, aFormat == SurfaceFormat::B8G8R8A8);
|
||||
aSize.width, aSize.height, aFormat == SurfaceFormat::B8G8R8A8);
|
||||
if (!surf) {
|
||||
return nullptr;
|
||||
}
|
||||
|
|
|
@ -1396,9 +1396,8 @@ bool VRManager::SubmitFrame(const layers::SurfaceDescriptor& aTexture,
|
|||
const auto& desc = aTexture.get_SurfaceDescriptorMacIOSurface();
|
||||
layer.textureType = VRLayerTextureType::LayerTextureType_MacIOSurface;
|
||||
layer.textureHandle = desc.surfaceId();
|
||||
RefPtr<MacIOSurface> surf =
|
||||
MacIOSurface::LookupSurface(desc.surfaceId(), desc.scaleFactor(),
|
||||
!desc.isOpaque(), desc.yUVColorSpace());
|
||||
RefPtr<MacIOSurface> surf = MacIOSurface::LookupSurface(
|
||||
desc.surfaceId(), !desc.isOpaque(), desc.yUVColorSpace());
|
||||
if (surf) {
|
||||
layer.textureSize.width = surf->GetDevicePixelWidth();
|
||||
layer.textureSize.height = surf->GetDevicePixelHeight();
|
||||
|
|
Загрузка…
Ссылка в новой задаче