Bug 1083101 - Part 1: Allow multiple read maps on DataSourceSurfaces. r=jrmuizel

This commit is contained in:
Nicolas Silva 2015-06-10 19:56:06 +02:00
parent affa1067e6
commit d5bdbaae47
4 changed files with 55 additions and 28 deletions

View File

@ -19,6 +19,8 @@
// to be able to hold on to a GLContext.
#include "mozilla/GenericRefCounted.h"
#include "mozilla/Atomics.h"
// This RefPtr class isn't ideal for usage in Azure, as it doesn't allow T**
// outparams using the &-operator. But it will have to do as there's no easy
// solution.
@ -373,14 +375,15 @@ class DataSourceSurface : public SourceSurface
public:
MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(DataSourceSurface, override)
DataSourceSurface()
: mIsMapped(false)
: mMapCount(0)
, mIsReadMap(false)
{
}
#ifdef DEBUG
virtual ~DataSourceSurface()
{
MOZ_ASSERT(!mIsMapped, "Someone forgot to call Unmap()");
MOZ_ASSERT(mMapCount == 0, "Someone forgot to call Unmap()");
}
#endif
@ -458,18 +461,22 @@ public:
/**
* The caller is responsible for ensuring aMappedSurface is not null.
*/
virtual bool Map(MapType, MappedSurface *aMappedSurface)
virtual bool Map(MapType aMapType, MappedSurface *aMappedSurface)
{
aMappedSurface->mData = GetData();
aMappedSurface->mStride = Stride();
mIsMapped = !!aMappedSurface->mData;
return mIsMapped;
if (!aMappedSurface->mData) {
return false;
}
mMapCount++;
mIsReadMap = aMapType == MapType::READ;
return true;
}
virtual void Unmap()
{
MOZ_ASSERT(mIsMapped);
mIsMapped = false;
MOZ_ASSERT(mMapCount > 0);
mMapCount--;
}
/**
@ -479,7 +486,8 @@ public:
virtual already_AddRefed<DataSourceSurface> GetDataSurface() override;
protected:
bool mIsMapped;
Atomic<int32_t> mMapCount;
DebugOnly<bool> mIsReadMap;
};
/** This is an abstract object that accepts path segments. */

View File

@ -252,7 +252,8 @@ DataSourceSurfaceD2D::Map(MapType aMapType, MappedSurface *aMappedSurface)
{
// DataSourceSurfaces used with the new Map API should not be used with GetData!!
MOZ_ASSERT(!mMapped);
MOZ_ASSERT(!mIsMapped);
// Add support for multiple read locks here!
MOZ_ASSERT(mMapCount == 0);
if (!mTexture) {
return false;
@ -277,19 +278,24 @@ DataSourceSurfaceD2D::Map(MapType aMapType, MappedSurface *aMappedSurface)
return false;
}
if (!map.pData) {
return false;
}
aMappedSurface->mData = (uint8_t*)map.pData;
aMappedSurface->mStride = map.RowPitch;
mIsMapped = !!aMappedSurface->mData;
return mIsMapped;
mMapCount++;
mIsReadMap = aMapType == MapType::READ;
return true;
}
void
DataSourceSurfaceD2D::Unmap()
{
MOZ_ASSERT(mIsMapped);
MOZ_ASSERT(mMapCount > 0);
mIsMapped = false;
mMapCount--;
mTexture->Unmap(0);
}
@ -297,10 +303,9 @@ void
DataSourceSurfaceD2D::EnsureMappedTexture()
{
// Do not use GetData() after having used Map!
MOZ_ASSERT(!mIsMapped);
MOZ_ASSERT(mMapCount == 0);
if (mMapped ||
!mTexture) {
if (mMapped || !mTexture) {
return;
}

View File

@ -183,7 +183,8 @@ DataSourceSurfaceD2D1::Map(MapType aMapType, MappedSurface *aMappedSurface)
{
// DataSourceSurfaces used with the new Map API should not be used with GetData!!
MOZ_ASSERT(!mMapped);
MOZ_ASSERT(!mIsMapped);
// XXX - Add support for multiple read maps here!
MOZ_ASSERT(mMapCount == 0);
D2D1_MAP_OPTIONS options;
if (aMapType == MapType::READ) {
@ -200,16 +201,22 @@ DataSourceSurfaceD2D1::Map(MapType aMapType, MappedSurface *aMappedSurface)
aMappedSurface->mData = map.bits;
aMappedSurface->mStride = map.pitch;
mIsMapped = !!aMappedSurface->mData;
return mIsMapped;
if (!aMappedSurface->mData) {
return false;
}
mMapCount++;
mIsReadMap = aMapType == MapType::READ;
return true;
}
void
DataSourceSurfaceD2D1::Unmap()
{
MOZ_ASSERT(mIsMapped);
MOZ_ASSERT(mMapCount > 0);
mIsMapped = false;
mMapCount--;
mBitmap->Unmap();
}
@ -225,7 +232,7 @@ void
DataSourceSurfaceD2D1::EnsureMapped()
{
// Do not use GetData() after having used Map!
MOZ_ASSERT(!mIsMapped);
MOZ_ASSERT(mMapCount == 0);
if (mMapped) {
return;
}

View File

@ -255,7 +255,8 @@ DataSourceSurfaceD2DTarget::Map(MapType aMapType, MappedSurface *aMappedSurface)
{
// DataSourceSurfaces used with the new Map API should not be used with GetData!!
MOZ_ASSERT(!mMapped);
MOZ_ASSERT(!mIsMapped);
// XXX - Add support for multiple readmaps here!
MOZ_ASSERT(mMapCount == 0);
if (!mTexture) {
return false;
@ -280,19 +281,25 @@ DataSourceSurfaceD2DTarget::Map(MapType aMapType, MappedSurface *aMappedSurface)
return false;
}
if (!aMappedSurface->mData) {
return false;
}
aMappedSurface->mData = (uint8_t*)map.pData;
aMappedSurface->mStride = map.RowPitch;
mIsMapped = !!aMappedSurface->mData;
return mIsMapped;
mMapCount++;
mIsReadMap = aMapType == MapType::READ;
return true;
}
void
DataSourceSurfaceD2DTarget::Unmap()
{
MOZ_ASSERT(mIsMapped);
MOZ_ASSERT(mMapCount > 0);
mIsMapped = false;
mMapCount--;
mTexture->Unmap(0);
}
@ -300,7 +307,7 @@ void
DataSourceSurfaceD2DTarget::EnsureMapped()
{
// Do not use GetData() after having used Map!
MOZ_ASSERT(!mIsMapped);
MOZ_ASSERT(mMapCount == 0);
if (!mMapped) {
HRESULT hr = mTexture->Map(0, D3D10_MAP_READ, 0, &mMap);
if (FAILED(hr)) {