Bug 1322746 - Expose DXGI HANDLEs for GPU_VIDEO. - r=mattwoodrow

MozReview-Commit-ID: Aea0xGesaQi
This commit is contained in:
Jeff Gilbert 2017-04-11 22:58:47 -07:00
Родитель 57dcc284a2
Коммит e8ed9905f9
7 изменённых файлов: 81 добавлений и 13 удалений

Просмотреть файл

@ -39,9 +39,12 @@ using namespace gfx;
SurfaceDescriptorGPUVideo
VideoDecoderManagerParent::StoreImage(Image* aImage, TextureClient* aTexture)
{
mImageMap[aTexture->GetSerial()] = aImage;
mTextureMap[aTexture->GetSerial()] = aTexture;
return SurfaceDescriptorGPUVideo(aTexture->GetSerial());
SurfaceDescriptorGPUVideo ret;
aTexture->GPUVideoDesc(&ret);
mImageMap[ret.handle()] = aImage;
mTextureMap[ret.handle()] = aTexture;
return Move(ret);
}
StaticRefPtr<nsIThread> sVideoDecoderManagerThread;

Просмотреть файл

@ -199,7 +199,7 @@ VideoDecoderParent::ProcessDecodedData(
video->mDisplay,
texture ? texture->GetSize() : IntSize(),
texture ? mParent->StoreImage(video->mImage, texture)
: SurfaceDescriptorGPUVideo(0),
: SurfaceDescriptorGPUVideo(0, null_t()),
video->mFrameID);
Unused << SendOutput(output);
}

Просмотреть файл

@ -162,7 +162,7 @@ private:
// Lock tile A
// Lock tile B
// Lock tile C
// Apply drawing commands to tiles A, B and C
// Apply drawing commands to tiles A, B and C
// Unlock tile A
// Unlock tile B
// Unlock tile C
@ -1402,6 +1402,18 @@ TextureClient::PrintInfo(std::stringstream& aStream, const char* aPrefix)
#endif
}
void
TextureClient::GPUVideoDesc(SurfaceDescriptorGPUVideo* const aOutDesc)
{
const auto handle = GetSerial();
GPUVideoSubDescriptor subDesc = null_t();
MOZ_RELEASE_ASSERT(mData);
mData->GetSubDescriptor(&subDesc);
*aOutDesc = SurfaceDescriptorGPUVideo(handle, Move(subDesc));
}
class MemoryTextureReadLock : public NonBlockingTextureReadLock {
public:
MemoryTextureReadLock();

Просмотреть файл

@ -266,6 +266,7 @@ public:
virtual void Forget(LayersIPCChannel* aAllocator) {}
virtual bool Serialize(SurfaceDescriptor& aDescriptor) = 0;
virtual void GetSubDescriptor(GPUVideoSubDescriptor* aOutDesc) { }
virtual TextureData*
CreateSimilar(LayersIPCChannel* aAllocator,
@ -598,12 +599,13 @@ public:
const TextureData* GetInternalData() const { return mData; }
uint64_t GetSerial() const { return mSerial; }
void GPUVideoDesc(SurfaceDescriptorGPUVideo* aOutDesc);
void CancelWaitForRecycle();
/**
* Set last transaction id of CompositableForwarder.
*
*
* Called when TextureClient has TextureFlags::RECYCLE flag.
* When CompositableForwarder forwards the TextureClient with
* TextureFlags::RECYCLE, it holds TextureClient's ref until host side
@ -642,7 +644,7 @@ public:
private:
static void TextureClientRecycleCallback(TextureClient* aClient, void* aClosure);
// Internal helpers for creating texture clients using the actual forwarder instead
// of KnowsCompositor. TextureClientPool uses these to let it cache texture clients
// per-process instead of per ShadowLayerForwarder, but everyone else should
@ -657,7 +659,7 @@ private:
BackendSelector aSelector,
TextureFlags aTextureFlags,
TextureAllocationFlags aAllocFlags = ALLOC_DEFAULT);
static already_AddRefed<TextureClient>
CreateForRawBufferAccess(LayersIPCChannel* aAllocator,
gfx::SurfaceFormat aFormat,

Просмотреть файл

@ -373,7 +373,7 @@ D3D11TextureData::SyncWithObject(SyncObjectClient* aSyncObject)
}
bool
DXGITextureData::Serialize(SurfaceDescriptor& aOutDescriptor)
DXGITextureData::SerializeSpecific(SurfaceDescriptorD3D10* const aOutDesc)
{
RefPtr<IDXGIResource> resource;
GetDXGIResource((IDXGIResource**)getter_AddRefs(resource));
@ -387,10 +387,31 @@ DXGITextureData::Serialize(SurfaceDescriptor& aOutDescriptor)
return false;
}
aOutDescriptor = SurfaceDescriptorD3D10((WindowsHandle)sharedHandle, mFormat, mSize);
*aOutDesc = SurfaceDescriptorD3D10((WindowsHandle)sharedHandle, mFormat, mSize);
return true;
}
bool
DXGITextureData::Serialize(SurfaceDescriptor& aOutDescriptor)
{
SurfaceDescriptorD3D10 desc;
if (!SerializeSpecific(&desc))
return false;
aOutDescriptor = Move(desc);
return true;
}
void
DXGITextureData::GetSubDescriptor(GPUVideoSubDescriptor* const aOutDesc)
{
SurfaceDescriptorD3D10 ret;
if (!SerializeSpecific(&ret))
return;
*aOutDesc = Move(ret);
}
DXGITextureData*
DXGITextureData::Create(IntSize aSize, SurfaceFormat aFormat, TextureAllocationFlags aFlags)
{
@ -659,16 +680,34 @@ DXGIYCbCrTextureData::FillInfo(TextureData::Info& aInfo) const
aInfo.hasSynchronization = false;
}
bool
DXGIYCbCrTextureData::Serialize(SurfaceDescriptor& aOutDescriptor)
void
DXGIYCbCrTextureData::SerializeSpecific(SurfaceDescriptorDXGIYCbCr* const aOutDesc)
{
aOutDescriptor = SurfaceDescriptorDXGIYCbCr(
*aOutDesc = SurfaceDescriptorDXGIYCbCr(
(WindowsHandle)mHandles[0], (WindowsHandle)mHandles[1], (WindowsHandle)mHandles[2],
mSize, mSizeY, mSizeCbCr
);
}
bool
DXGIYCbCrTextureData::Serialize(SurfaceDescriptor& aOutDescriptor)
{
SurfaceDescriptorDXGIYCbCr desc;
SerializeSpecific(&desc);
aOutDescriptor = Move(desc);
return true;
}
void
DXGIYCbCrTextureData::GetSubDescriptor(GPUVideoSubDescriptor* const aOutDesc)
{
SurfaceDescriptorDXGIYCbCr desc;
SerializeSpecific(&desc);
*aOutDesc = Move(desc);
}
void
DXGIYCbCrTextureData::Deallocate(LayersIPCChannel*)
{

Просмотреть файл

@ -39,7 +39,9 @@ class DXGITextureData : public TextureData
public:
virtual void FillInfo(TextureData::Info& aInfo) const override;
bool SerializeSpecific(SurfaceDescriptorD3D10* aOutDesc);
virtual bool Serialize(SurfaceDescriptor& aOutDescrptor) override;
virtual void GetSubDescriptor(GPUVideoSubDescriptor* aOutDesc) override;
static DXGITextureData*
Create(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, TextureAllocationFlags aFlags);
@ -152,7 +154,9 @@ public:
virtual void FillInfo(TextureData::Info& aInfo) const override;
void SerializeSpecific(SurfaceDescriptorDXGIYCbCr* aOutDesc);
virtual bool Serialize(SurfaceDescriptor& aOutDescriptor) override;
virtual void GetSubDescriptor(GPUVideoSubDescriptor* aOutDesc) override;
virtual already_AddRefed<gfx::DrawTarget> BorrowDrawTarget() override { return nullptr; }

Просмотреть файл

@ -80,8 +80,16 @@ struct SurfaceDescriptorSharedGLTexture {
bool hasAlpha;
};
union GPUVideoSubDescriptor {
SurfaceDescriptorD3D10;
SurfaceDescriptorDXGIYCbCr;
null_t;
};
struct SurfaceDescriptorGPUVideo {
uint64_t handle;
GPUVideoSubDescriptor desc;
};
struct RGBDescriptor {