зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1176363
- Part 2: Allow mapping of SourceSurfaceRawData from multiple threads. r=bas
This commit is contained in:
Родитель
b30cbfe6ca
Коммит
01e653f66e
|
@ -8,6 +8,7 @@
|
|||
|
||||
#include "2D.h"
|
||||
#include "Tools.h"
|
||||
#include "mozilla/Atomics.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace gfx {
|
||||
|
@ -16,8 +17,14 @@ class SourceSurfaceRawData : public DataSourceSurface
|
|||
{
|
||||
public:
|
||||
MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(DataSourceSurfaceRawData)
|
||||
SourceSurfaceRawData() {}
|
||||
~SourceSurfaceRawData() { if(mOwnData) delete [] mRawData; }
|
||||
SourceSurfaceRawData()
|
||||
: mMapCount(0)
|
||||
{}
|
||||
~SourceSurfaceRawData()
|
||||
{
|
||||
if(mOwnData) delete [] mRawData;
|
||||
MOZ_ASSERT(mMapCount == 0);
|
||||
}
|
||||
|
||||
virtual uint8_t *GetData() { return mRawData; }
|
||||
virtual int32_t Stride() { return mStride; }
|
||||
|
@ -34,11 +41,38 @@ public:
|
|||
|
||||
virtual void GuaranteePersistance();
|
||||
|
||||
// Althought Map (and Moz2D in general) isn't normally threadsafe,
|
||||
// we want to allow it for SourceSurfaceRawData since it should
|
||||
// always be fine (for reading at least).
|
||||
//
|
||||
// This is the same as the base class implementation except using
|
||||
// mMapCount instead of mIsMapped since that breaks for multithread.
|
||||
//
|
||||
// Once mfbt supports Monitors we should implement proper read/write
|
||||
// locking to prevent write races.
|
||||
virtual bool Map(MapType, MappedSurface *aMappedSurface) override
|
||||
{
|
||||
aMappedSurface->mData = GetData();
|
||||
aMappedSurface->mStride = Stride();
|
||||
bool success = !!aMappedSurface->mData;
|
||||
if (success) {
|
||||
mMapCount++;
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
virtual void Unmap() override
|
||||
{
|
||||
mMapCount--;
|
||||
MOZ_ASSERT(mMapCount >= 0);
|
||||
}
|
||||
|
||||
private:
|
||||
uint8_t *mRawData;
|
||||
int32_t mStride;
|
||||
SurfaceFormat mFormat;
|
||||
IntSize mSize;
|
||||
Atomic<int32_t> mMapCount;
|
||||
bool mOwnData;
|
||||
};
|
||||
|
||||
|
@ -46,7 +80,13 @@ class SourceSurfaceAlignedRawData : public DataSourceSurface
|
|||
{
|
||||
public:
|
||||
MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(DataSourceSurfaceAlignedRawData)
|
||||
SourceSurfaceAlignedRawData() {}
|
||||
SourceSurfaceAlignedRawData()
|
||||
: mMapCount(0)
|
||||
{}
|
||||
~SourceSurfaceAlignedRawData()
|
||||
{
|
||||
MOZ_ASSERT(mMapCount == 0);
|
||||
}
|
||||
|
||||
virtual uint8_t *GetData() { return mArray; }
|
||||
virtual int32_t Stride() { return mStride; }
|
||||
|
@ -63,11 +103,29 @@ public:
|
|||
int32_t aStride,
|
||||
bool aZero);
|
||||
|
||||
virtual bool Map(MapType, MappedSurface *aMappedSurface) override
|
||||
{
|
||||
aMappedSurface->mData = GetData();
|
||||
aMappedSurface->mStride = Stride();
|
||||
bool success = !!aMappedSurface->mData;
|
||||
if (success) {
|
||||
mMapCount++;
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
virtual void Unmap() override
|
||||
{
|
||||
mMapCount--;
|
||||
MOZ_ASSERT(mMapCount >= 0);
|
||||
}
|
||||
|
||||
private:
|
||||
AlignedArray<uint8_t> mArray;
|
||||
int32_t mStride;
|
||||
SurfaceFormat mFormat;
|
||||
IntSize mSize;
|
||||
Atomic<int32_t> mMapCount;
|
||||
};
|
||||
|
||||
} // namespace gfx
|
||||
|
|
Загрузка…
Ссылка в новой задаче