mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1083101 - Part 1: Allow multiple read maps on DataSourceSurfaces. r=jrmuizel
This commit is contained in:
parent
affa1067e6
commit
d5bdbaae47
24
gfx/2d/2D.h
24
gfx/2d/2D.h
@ -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. */
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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)) {
|
||||
|
Loading…
Reference in New Issue
Block a user