#ifdef UNSAFE_BUFFERS_BUILD
#pragma allow_unsafe_buffers
#endif
#include "third_party/blink/renderer/modules/webgpu/gpu_queue.h"
#include "build/build_config.h"
#include "gpu/command_buffer/client/shared_image_interface.h"
#include "gpu/command_buffer/client/webgpu_interface.h"
#include "gpu/command_buffer/common/shared_image_usage.h"
#include "gpu/config/gpu_finch_features.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_command_buffer_descriptor.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_image_copy_external_image.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_image_copy_image_bitmap.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_image_copy_texture.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_gpu_image_copy_texture_tagged.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_union_htmlcanvaselement_htmlimageelement_htmlvideoelement_imagebitmap_imagedata_offscreencanvas_videoframe.h"
#include "third_party/blink/renderer/core/dom/dom_exception.h"
#include "third_party/blink/renderer/core/frame/web_feature.h"
#include "third_party/blink/renderer/core/html/canvas/canvas_rendering_context_host.h"
#include "third_party/blink/renderer/core/html/canvas/html_canvas_element.h"
#include "third_party/blink/renderer/core/html/canvas/image_data.h"
#include "third_party/blink/renderer/core/html/canvas/predefined_color_space.h"
#include "third_party/blink/renderer/core/html/html_image_element.h"
#include "third_party/blink/renderer/core/imagebitmap/image_bitmap.h"
#include "third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.h"
#include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h"
#include "third_party/blink/renderer/modules/webcodecs/video_frame.h"
#include "third_party/blink/renderer/modules/webgpu/dawn_conversions.h"
#include "third_party/blink/renderer/modules/webgpu/external_texture_helper.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_adapter.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_buffer.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_command_buffer.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_device.h"
#include "third_party/blink/renderer/modules/webgpu/gpu_texture.h"
#include "third_party/blink/renderer/modules/webgpu/texture_utils.h"
#include "third_party/blink/renderer/platform/graphics/gpu/image_extractor.h"
#include "third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.h"
#include "third_party/blink/renderer/platform/graphics/graphics_types.h"
#include "third_party/blink/renderer/platform/graphics/skia/skia_utils.h"
#include "third_party/blink/renderer/platform/graphics/unaccelerated_static_bitmap_image.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
namespace blink {
namespace {
bool IsValidExternalImageDestinationFormat(
wgpu::TextureFormat dawn_texture_format) { … }
wgpu::TextureFormat SkColorTypeToDawnColorFormat(SkColorType sk_color_type) { … }
static constexpr uint64_t kDawnBytesPerRowAlignmentBits = …;
uint64_t AlignBytesPerRow(uint64_t bytesPerRow) { … }
struct ExternalSource { … };
struct ExternalImageDstInfo { … };
scoped_refptr<StaticBitmapImage> GetImageFromImageData(
const ImageData* image_data) { … }
ExternalSource GetExternalSourceFromExternalImage(
const V8GPUImageCopyExternalImageSource* external_image,
const ExternalImageDstInfo& external_image_dst_info,
ExceptionState& exception_state) { … }
wgpu::CopyTextureForBrowserOptions CreateCopyTextureForBrowserOptions(
const StaticBitmapImage* image,
const PaintImage* paint_image,
PredefinedColorSpace dst_color_space,
bool dst_premultiplied_alpha,
bool flipY,
ColorSpaceConversionConstants* color_space_conversion_constants) { … }
gfx::Rect GetSourceImageSubrect(StaticBitmapImage* image,
gfx::Rect source_image_rect,
const wgpu::Origin2D& origin,
const wgpu::Extent3D& copy_size) { … }
}
GPUQueue::GPUQueue(GPUDevice* device, wgpu::Queue queue, const String& label)
: … { … }
void GPUQueue::submit(ScriptState* script_state,
const HeapVector<Member<GPUCommandBuffer>>& buffers) { … }
void OnWorkDoneCallback(ScriptPromiseResolver<IDLUndefined>* resolver,
wgpu::QueueWorkDoneStatus status) { … }
ScriptPromise<IDLUndefined> GPUQueue::onSubmittedWorkDone(
ScriptState* script_state) { … }
void GPUQueue::writeBuffer(ScriptState* script_state,
GPUBuffer* buffer,
uint64_t buffer_offset,
const MaybeShared<DOMArrayBufferView>& data,
uint64_t data_element_offset,
ExceptionState& exception_state) { … }
void GPUQueue::writeBuffer(ScriptState* script_state,
GPUBuffer* buffer,
uint64_t buffer_offset,
const MaybeShared<DOMArrayBufferView>& data,
uint64_t data_element_offset,
uint64_t data_element_count,
ExceptionState& exception_state) { … }
void GPUQueue::writeBuffer(ScriptState* script_state,
GPUBuffer* buffer,
uint64_t buffer_offset,
const DOMArrayBufferBase* data,
uint64_t data_byte_offset,
ExceptionState& exception_state) { … }
void GPUQueue::writeBuffer(ScriptState* script_state,
GPUBuffer* buffer,
uint64_t buffer_offset,
const DOMArrayBufferBase* data,
uint64_t data_byte_offset,
uint64_t byte_size,
ExceptionState& exception_state) { … }
void GPUQueue::WriteBufferImpl(ScriptState* script_state,
GPUBuffer* buffer,
uint64_t buffer_offset,
uint64_t data_byte_length,
const void* data_base_ptr,
unsigned data_bytes_per_element,
uint64_t data_element_offset,
std::optional<uint64_t> data_element_count,
ExceptionState& exception_state) { … }
void GPUQueue::writeTexture(ScriptState* script_state,
GPUImageCopyTexture* destination,
const MaybeShared<DOMArrayBufferView>& data,
GPUImageDataLayout* data_layout,
const V8GPUExtent3D* write_size,
ExceptionState& exception_state) { … }
void GPUQueue::writeTexture(ScriptState* script_state,
GPUImageCopyTexture* destination,
const DOMArrayBufferBase* data,
GPUImageDataLayout* data_layout,
const V8GPUExtent3D* write_size,
ExceptionState& exception_state) { … }
void GPUQueue::WriteTextureImpl(ScriptState* script_state,
GPUImageCopyTexture* destination,
const void* data,
size_t data_size,
GPUImageDataLayout* data_layout,
const V8GPUExtent3D* write_size,
ExceptionState& exception_state) { … }
void GPUQueue::copyExternalImageToTexture(
GPUImageCopyExternalImage* copyImage,
GPUImageCopyTextureTagged* destination,
const V8GPUExtent3D* copy_size,
ExceptionState& exception_state) { … }
void GPUQueue::CopyFromVideoElement(
const ExternalTextureSource source,
const wgpu::Extent2D& video_frame_natural_size,
const wgpu::Origin2D& origin,
const wgpu::Extent3D& copy_size,
const wgpu::ImageCopyTexture& destination,
bool dst_premultiplied_alpha,
PredefinedColorSpace dst_color_space,
bool flipY) { … }
bool GPUQueue::CopyFromCanvasSourceImage(
StaticBitmapImage* image,
const wgpu::Origin2D& origin,
const wgpu::Extent3D& copy_size,
const wgpu::ImageCopyTexture& destination,
bool dst_premultiplied_alpha,
PredefinedColorSpace dst_color_space,
bool flipY) { … }
}