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:
Brad Werth 2021-04-08 01:39:04 +00:00
Родитель 8d90cf4b42
Коммит acdd1a887d
9 изменённых файлов: 33 добавлений и 57 удалений

Просмотреть файл

@ -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();