// Copyright 2021 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBGPU_GPU_EXTERNAL_TEXTURE_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBGPU_GPU_EXTERNAL_TEXTURE_H_ #include <atomic> #include "base/task/single_thread_task_runner.h" #include "media/base/video_frame.h" #include "third_party/blink/renderer/modules/webgpu/dawn_object.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_map.h" #include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_set.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/wtf/ref_counted.h" namespace blink { class ExceptionState; class GPUExternalTexture; class GPUExternalTextureDescriptor; class WebGPUMailboxTexture; class HTMLVideoElement; class VideoFrame; // GPUExternalTexture uses auto expiry mechanism // (https://www.w3.org/TR/webgpu/#-automatic-expiry-task-source). The // mechanism requires webgpu to expire GPUExternalTexture when current task // scope finished by posting expiration task. The expired GPUExternalTexture // is invalid to submit and needs to call importExternalTexture() to get the // refreshed GPUExternalTexture object. In implementation side, // importExternalTexture() also wraps GPUExternalTexture with underly video // frames. It is possible that multiple importExternalTexture() call with the // same source tries to wrap the same underly video frames. So a cache system // has been integrated to avoid re-creating the GPUExternalTexture again and // again with the same video frame. So importExternalTexture() tries to do: // - Search cache to see any hit. if not, create a new GPUExternalTexture and // insert it into cache. // - Refresh the external texture to un-expire it. // - Post a task to expire this external texture after finishing current task. // More details refers to // https://www.w3.org/TR/webgpu/#external-texture-creation class ExternalTextureCache : public GarbageCollected<ExternalTextureCache> { … }; class GPUExternalTexture : public DawnObject<wgpu::ExternalTexture> { … }; } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_MODULES_WEBGPU_GPU_EXTERNAL_TEXTURE_H_