зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1322746 - Expose DXGI HANDLEs for GPU_VIDEO. - r=mattwoodrow
MozReview-Commit-ID: Aea0xGesaQi
This commit is contained in:
Родитель
57dcc284a2
Коммит
e8ed9905f9
|
@ -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 {
|
||||
|
|
Загрузка…
Ссылка в новой задаче