mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-04-02 12:32:55 +00:00
Bug 960254: Implement the new Map/Unmap API for Direct2D. r=jrmuizel
This commit is contained in:
parent
aad0b985e1
commit
5b4524918c
@ -174,7 +174,7 @@ DataSourceSurfaceD2D::DataSourceSurfaceD2D(SourceSurfaceD2D* aSourceSurface)
|
|||||||
Float(mSize.height)));
|
Float(mSize.height)));
|
||||||
renderTarget->EndDraw();
|
renderTarget->EndDraw();
|
||||||
|
|
||||||
desc.CPUAccessFlags = D3D10_CPU_ACCESS_READ;
|
desc.CPUAccessFlags = D3D10_CPU_ACCESS_READ | D3D10_CPU_ACCESS_WRITE;
|
||||||
desc.Usage = D3D10_USAGE_STAGING;
|
desc.Usage = D3D10_USAGE_STAGING;
|
||||||
desc.BindFlags = 0;
|
desc.BindFlags = 0;
|
||||||
hr = aSourceSurface->mDevice->CreateTexture2D(&desc, nullptr, byRef(mTexture));
|
hr = aSourceSurface->mDevice->CreateTexture2D(&desc, nullptr, byRef(mTexture));
|
||||||
@ -228,9 +228,56 @@ DataSourceSurfaceD2D::GetFormat() const
|
|||||||
return mFormat;
|
return mFormat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
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);
|
||||||
|
|
||||||
|
if (!mTexture) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D10_MAP mapType;
|
||||||
|
|
||||||
|
if (aMapType == MapType::READ) {
|
||||||
|
mapType = D3D10_MAP_READ;
|
||||||
|
} else if (aMapType == MapType::WRITE) {
|
||||||
|
mapType = D3D10_MAP_WRITE;
|
||||||
|
} else {
|
||||||
|
mapType = D3D10_MAP_READ_WRITE;
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D10_MAPPED_TEXTURE2D map;
|
||||||
|
|
||||||
|
HRESULT hr = mTexture->Map(0, mapType, 0, &map);
|
||||||
|
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
gfxWarning() << "Texture map failed with code: " << hr;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
aMappedSurface->mData = (uint8_t*)map.pData;
|
||||||
|
aMappedSurface->mStride = map.RowPitch;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DataSourceSurfaceD2D::Unmap()
|
||||||
|
{
|
||||||
|
MOZ_ASSERT(mIsMapped);
|
||||||
|
|
||||||
|
mTexture->Unmap(0);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
DataSourceSurfaceD2D::EnsureMappedTexture()
|
DataSourceSurfaceD2D::EnsureMappedTexture()
|
||||||
{
|
{
|
||||||
|
// Do not use GetData() after having used Map!
|
||||||
|
MOZ_ASSERT(!mIsMapped);
|
||||||
|
|
||||||
if (mMapped ||
|
if (mMapped ||
|
||||||
!mTexture) {
|
!mTexture) {
|
||||||
return;
|
return;
|
||||||
|
@ -62,6 +62,8 @@ public:
|
|||||||
virtual int32_t Stride();
|
virtual int32_t Stride();
|
||||||
virtual IntSize GetSize() const;
|
virtual IntSize GetSize() const;
|
||||||
virtual SurfaceFormat GetFormat() const;
|
virtual SurfaceFormat GetFormat() const;
|
||||||
|
virtual bool Map(MapType, MappedSurface *aMappedSurface);
|
||||||
|
virtual void Unmap();
|
||||||
|
|
||||||
bool IsValid()
|
bool IsValid()
|
||||||
{
|
{
|
||||||
|
@ -141,6 +141,35 @@ DataSourceSurfaceD2D1::GetData()
|
|||||||
return mMap.bits;
|
return mMap.bits;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
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);
|
||||||
|
|
||||||
|
D2D1_MAP_OPTIONS options;
|
||||||
|
if (aMapType == MapType::READ) {
|
||||||
|
options = D2D1_MAP_OPTIONS_READ;
|
||||||
|
} else {
|
||||||
|
MOZ_CRASH("No support for Write maps on D2D1 DataSourceSurfaces yet!");
|
||||||
|
}
|
||||||
|
|
||||||
|
D2D1_MAPPED_RECT map;
|
||||||
|
mBitmap->Map(D2D1_MAP_OPTIONS_READ, &map);
|
||||||
|
aMappedSurface->mData = map.bits;
|
||||||
|
aMappedSurface->mStride = map.pitch;
|
||||||
|
|
||||||
|
mIsMapped = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DataSourceSurfaceD2D1::Unmap()
|
||||||
|
{
|
||||||
|
mBitmap->Unmap();
|
||||||
|
}
|
||||||
|
|
||||||
int32_t
|
int32_t
|
||||||
DataSourceSurfaceD2D1::Stride()
|
DataSourceSurfaceD2D1::Stride()
|
||||||
{
|
{
|
||||||
@ -152,6 +181,8 @@ DataSourceSurfaceD2D1::Stride()
|
|||||||
void
|
void
|
||||||
DataSourceSurfaceD2D1::EnsureMapped()
|
DataSourceSurfaceD2D1::EnsureMapped()
|
||||||
{
|
{
|
||||||
|
// Do not use GetData() after having used Map!
|
||||||
|
MOZ_ASSERT(!mIsMapped);
|
||||||
if (mMapped) {
|
if (mMapped) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -70,6 +70,8 @@ public:
|
|||||||
virtual SurfaceFormat GetFormat() const { return mFormat; }
|
virtual SurfaceFormat GetFormat() const { return mFormat; }
|
||||||
virtual uint8_t *GetData();
|
virtual uint8_t *GetData();
|
||||||
virtual int32_t Stride();
|
virtual int32_t Stride();
|
||||||
|
virtual bool Map(MapType, MappedSurface *aMappedSurface);
|
||||||
|
virtual void Unmap();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class SourceSurfaceD2DTarget;
|
friend class SourceSurfaceD2DTarget;
|
||||||
|
@ -236,9 +236,55 @@ DataSourceSurfaceD2DTarget::Stride()
|
|||||||
return mMap.RowPitch;
|
return mMap.RowPitch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
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);
|
||||||
|
|
||||||
|
if (!mTexture) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D10_MAP mapType;
|
||||||
|
|
||||||
|
if (aMapType == MapType::READ) {
|
||||||
|
mapType = D3D10_MAP_READ;
|
||||||
|
} else if (aMapType == MapType::WRITE) {
|
||||||
|
mapType = D3D10_MAP_WRITE;
|
||||||
|
} else {
|
||||||
|
mapType = D3D10_MAP_READ_WRITE;
|
||||||
|
}
|
||||||
|
|
||||||
|
D3D10_MAPPED_TEXTURE2D map;
|
||||||
|
|
||||||
|
HRESULT hr = mTexture->Map(0, mapType, 0, &map);
|
||||||
|
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
gfxWarning() << "Texture map failed with code: " << hr;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
aMappedSurface->mData = (uint8_t*)map.pData;
|
||||||
|
aMappedSurface->mStride = map.RowPitch;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DataSourceSurfaceD2DTarget::Unmap()
|
||||||
|
{
|
||||||
|
MOZ_ASSERT(mIsMapped);
|
||||||
|
|
||||||
|
mTexture->Unmap(0);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
DataSourceSurfaceD2DTarget::EnsureMapped()
|
DataSourceSurfaceD2DTarget::EnsureMapped()
|
||||||
{
|
{
|
||||||
|
// Do not use GetData() after having used Map!
|
||||||
|
MOZ_ASSERT(!mIsMapped);
|
||||||
if (!mMapped) {
|
if (!mMapped) {
|
||||||
HRESULT hr = mTexture->Map(0, D3D10_MAP_READ, 0, &mMap);
|
HRESULT hr = mTexture->Map(0, D3D10_MAP_READ, 0, &mMap);
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
|
@ -68,6 +68,8 @@ public:
|
|||||||
virtual SurfaceFormat GetFormat() const;
|
virtual SurfaceFormat GetFormat() const;
|
||||||
virtual uint8_t *GetData();
|
virtual uint8_t *GetData();
|
||||||
virtual int32_t Stride();
|
virtual int32_t Stride();
|
||||||
|
virtual bool Map(MapType, MappedSurface *aMappedSurface);
|
||||||
|
virtual void Unmap();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class SourceSurfaceD2DTarget;
|
friend class SourceSurfaceD2DTarget;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user