summaryrefslogtreecommitdiffstats
path: root/gfx/layers/ipc/CanvasTranslator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/layers/ipc/CanvasTranslator.cpp')
-rw-r--r--gfx/layers/ipc/CanvasTranslator.cpp47
1 files changed, 38 insertions, 9 deletions
diff --git a/gfx/layers/ipc/CanvasTranslator.cpp b/gfx/layers/ipc/CanvasTranslator.cpp
index 3fd7a4c4c4..46cab838de 100644
--- a/gfx/layers/ipc/CanvasTranslator.cpp
+++ b/gfx/layers/ipc/CanvasTranslator.cpp
@@ -1190,23 +1190,42 @@ already_AddRefed<gfx::SourceSurface> CanvasTranslator::LookupExternalSurface(
// Check if the surface descriptor describes a GPUVideo texture for which we
// only have an opaque source/handle from SurfaceDescriptorRemoteDecoder to
// derive the actual texture from.
-static bool SDIsNullRemoteDecoder(const SurfaceDescriptor& sd) {
- return sd.type() == SurfaceDescriptor::TSurfaceDescriptorGPUVideo &&
- sd.get_SurfaceDescriptorGPUVideo()
- .get_SurfaceDescriptorRemoteDecoder()
- .subdesc()
- .type() == RemoteDecoderVideoSubDescriptor::Tnull_t;
+static bool SDIsSupportedRemoteDecoder(const SurfaceDescriptor& sd) {
+ if (sd.type() != SurfaceDescriptor::TSurfaceDescriptorGPUVideo) {
+ return false;
+ }
+
+ const auto& sdv = sd.get_SurfaceDescriptorGPUVideo();
+ const auto& sdvType = sdv.type();
+ if (sdvType != SurfaceDescriptorGPUVideo::TSurfaceDescriptorRemoteDecoder) {
+ return false;
+ }
+
+ const auto& sdrd = sdv.get_SurfaceDescriptorRemoteDecoder();
+ const auto& subdesc = sdrd.subdesc();
+ const auto& subdescType = subdesc.type();
+
+ if (subdescType == RemoteDecoderVideoSubDescriptor::Tnull_t ||
+ subdescType ==
+ RemoteDecoderVideoSubDescriptor::TSurfaceDescriptorMacIOSurface) {
+ return true;
+ }
+
+ return false;
}
already_AddRefed<gfx::SourceSurface>
CanvasTranslator::LookupSourceSurfaceFromSurfaceDescriptor(
const SurfaceDescriptor& aDesc) {
- if (!SDIsNullRemoteDecoder(aDesc)) {
+ if (!SDIsSupportedRemoteDecoder(aDesc)) {
return nullptr;
}
const auto& sdrd = aDesc.get_SurfaceDescriptorGPUVideo()
.get_SurfaceDescriptorRemoteDecoder();
+ const auto& subdesc = sdrd.subdesc();
+ const auto& subdescType = subdesc.type();
+
RefPtr<VideoBridgeParent> parent =
VideoBridgeParent::GetSingleton(sdrd.source());
if (!parent) {
@@ -1222,9 +1241,19 @@ CanvasTranslator::LookupSourceSurfaceFromSurfaceDescriptor(
return nullptr;
}
- RefPtr<gfx::DataSourceSurface> surf = texture->GetAsSurface();
+ if (subdescType ==
+ RemoteDecoderVideoSubDescriptor::TSurfaceDescriptorMacIOSurface) {
+ MOZ_ASSERT(texture->AsMacIOSurfaceTextureHost());
+ return texture->GetAsSurface();
+ }
+
+ if (subdescType == RemoteDecoderVideoSubDescriptor::Tnull_t) {
+ RefPtr<gfx::DataSourceSurface> surf = texture->GetAsSurface();
+ return surf.forget();
+ }
- return surf.forget();
+ MOZ_ASSERT_UNREACHABLE("unexpected to be called");
+ return nullptr;
}
void CanvasTranslator::CheckpointReached() { CheckAndSignalWriter(); }