mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-17 07:15:46 +00:00
52c022a178
This patch adds reporting the surface types used by the image frame in a bit mask (such if it is a CAPTURE including a DATA_SHARED, the mask will be 1 << CAPTURE | 1 << DATA_SHARED), as well as an estimated size included in the report as decoded-unknown for when we do not know if the surface is on the heap or the non-heap specifically. This is the default implementation for a SourceSurface as well, so we should no longer have the case where surfaces appear empty despite being in the cache. It also makes requests being validated as always notable for reporting purposes. Differential Revision: https://phabricator.services.mozilla.com/D61458 --HG-- extra : moz-landing-system : lando
92 lines
2.7 KiB
C++
92 lines
2.7 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=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 "SourceSurfaceRawData.h"
|
|
|
|
#include "DataSurfaceHelpers.h"
|
|
#include "Logging.h"
|
|
#include "mozilla/Types.h" // for decltype
|
|
|
|
namespace mozilla {
|
|
namespace gfx {
|
|
|
|
void SourceSurfaceRawData::InitWrappingData(
|
|
uint8_t* aData, const IntSize& aSize, int32_t aStride,
|
|
SurfaceFormat aFormat, Factory::SourceSurfaceDeallocator aDeallocator,
|
|
void* aClosure) {
|
|
mRawData = aData;
|
|
mSize = aSize;
|
|
mStride = aStride;
|
|
mFormat = aFormat;
|
|
|
|
if (aDeallocator) {
|
|
mOwnData = true;
|
|
}
|
|
mDeallocator = aDeallocator;
|
|
mClosure = aClosure;
|
|
}
|
|
|
|
void SourceSurfaceRawData::GuaranteePersistance() {
|
|
if (mOwnData) {
|
|
return;
|
|
}
|
|
|
|
MOZ_ASSERT(!mDeallocator);
|
|
uint8_t* oldData = mRawData;
|
|
mRawData = new uint8_t[mStride * mSize.height];
|
|
|
|
memcpy(mRawData, oldData, mStride * mSize.height);
|
|
mOwnData = true;
|
|
}
|
|
|
|
void SourceSurfaceRawData::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf,
|
|
SizeOfInfo& aInfo) const {
|
|
aInfo.AddType(SurfaceType::DATA);
|
|
if (mDeallocator) {
|
|
aInfo.mUnknownBytes = mStride * mSize.height;
|
|
} else if (mOwnData) {
|
|
aInfo.mHeapBytes = mStride * mSize.height;
|
|
}
|
|
}
|
|
|
|
bool SourceSurfaceAlignedRawData::Init(const IntSize& aSize,
|
|
SurfaceFormat aFormat, bool aClearMem,
|
|
uint8_t aClearValue, int32_t aStride) {
|
|
mFormat = aFormat;
|
|
mStride = aStride ? aStride
|
|
: GetAlignedStride<16>(aSize.width, BytesPerPixel(aFormat));
|
|
|
|
size_t bufLen = BufferSizeFromStrideAndHeight(mStride, aSize.height);
|
|
if (bufLen > 0) {
|
|
bool zeroMem = aClearMem && !aClearValue;
|
|
static_assert(sizeof(decltype(mArray[0])) == 1,
|
|
"mArray.Realloc() takes an object count, so its objects must "
|
|
"be 1-byte sized if we use bufLen");
|
|
|
|
// AlignedArray uses cmalloc to zero mem for a fast path.
|
|
mArray.Realloc(/* actually an object count */ bufLen, zeroMem);
|
|
mSize = aSize;
|
|
|
|
if (mArray && aClearMem && aClearValue) {
|
|
memset(mArray, aClearValue, mStride * aSize.height);
|
|
}
|
|
} else {
|
|
mArray.Dealloc();
|
|
mSize.SizeTo(0, 0);
|
|
}
|
|
|
|
return mArray != nullptr;
|
|
}
|
|
|
|
void SourceSurfaceAlignedRawData::SizeOfExcludingThis(
|
|
MallocSizeOf aMallocSizeOf, SizeOfInfo& aInfo) const {
|
|
aInfo.AddType(SurfaceType::DATA_ALIGNED);
|
|
aInfo.mHeapBytes = mArray.HeapSizeOfExcludingThis(aMallocSizeOf);
|
|
}
|
|
|
|
} // namespace gfx
|
|
} // namespace mozilla
|