chromium/gpu/ipc/common/gpu_channel.mojom

// 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.

module gpu.mojom;

import "gpu/ipc/common/capabilities.mojom";
import "gpu/ipc/common/context_result.mojom";
import "gpu/ipc/common/mailbox.mojom";
import "gpu/ipc/common/shared_image_metadata.mojom";
import "gpu/ipc/common/surface_handle.mojom";
import "gpu/ipc/common/sync_token.mojom";
import "gpu/ipc/common/vulkan_ycbcr_info.mojom";
import "mojo/public/mojom/base/shared_memory.mojom";
import "mojo/public/mojom/base/unguessable_token.mojom";
import "services/viz/public/mojom/compositing/shared_image_format.mojom";
import "skia/public/mojom/image_info.mojom";
import "skia/public/mojom/surface_origin.mojom";
import "ui/gfx/geometry/mojom/geometry.mojom";
import "ui/gfx/mojom/buffer_types.mojom";
import "ui/gfx/mojom/color_space.mojom";
import "ui/gfx/mojom/gpu_fence_handle.mojom";
import "ui/gfx/mojom/native_handle_types.mojom";
import "ui/gfx/mojom/presentation_feedback.mojom";
import "ui/gl/mojom/gpu_preference.mojom";
import "url/mojom/url.mojom";

// Maps to its namesake in gpu/command_buffer/common/context_creation_attribs.h.
enum ContextType {
  kWebGL1,
  kWebGL2,
  kOpenGLES2,
  kOpenGLES3,
  kOpenGLES31ForTesting,
  kWebGPU,
};

// Maps to its namesake in gpu/command_buffer/common/context_creation_attribs.h.
enum ContextColorSpace {
  kUnspecified,
  kSRGB,
  kDisplayP3,
};

// Maps to its namesake in gpu/command_buffer/common/scheduling_priority.h.
enum SchedulingPriority {
  kHigh,
  kNormal,
  kLow,
};

// Maps to its namesake in gpu/command_buffer/common/context_creation_attribs.h.
struct ContextCreationAttribs {
  gl.mojom.GpuPreference gpu_preference = kLowPower;

  bool bind_generates_resource = true;
  bool fail_if_major_perf_caveat = false;
  bool lose_context_when_out_of_memory = false;
  bool enable_gles2_interface = true;
  bool enable_grcontext = false;
  bool enable_raster_interface = false;
  bool enable_oop_rasterization = false;

  ContextType context_type = kOpenGLES2;
};

struct CreateCommandBufferParams {
  [EnableIf=is_android] SurfaceHandle surface_handle;
  int32 share_group_id;
  int32 stream_id;
  SchedulingPriority stream_priority;
  ContextCreationAttribs attribs;
  url.mojom.Url active_url;
};

// Corresponds to the definition in gpu/command_buffer/common/constants.h.
[Native]
enum Error;

// Corresponds to the definition in gpu/command_buffer/common/constants.h.
[Native]
enum ContextLostReason;

// Information used by the GPU service to convey the current state of a specific
// CommandBuffer instance. Corresponds to gpu::CommandBuffer::State. See
// gpu/command_buffer/common/command_buffer.h.
struct CommandBufferState {
  int32 get_offset;
  int32 token;
  uint64 release_count;
  Error error;
  ContextLostReason context_lost_reason;
  uint32 generation;
  uint32 set_get_buffer_count;
};

struct ScheduleImageDecodeParams {
  array<uint8> encoded_data;
  gfx.mojom.Size output_size;
  int32 raster_decoder_route_id;
  uint32 transfer_cache_entry_id;
  int32 discardable_handle_shm_id;
  uint32 discardable_handle_shm_offset;
  uint64 discardable_handle_release_count;
  gfx.mojom.ColorSpace target_color_space;
  bool needs_mips;
};

// Main control interface for a GPU process connection. For now an instance of
// this interface is associated with each C++ GpuChannel/Host's underlying
// IPC::Channel interface. Eventually it will replace the IPC::Channel.
interface GpuChannel {
  // Crashes the GPU process in a similar way to how chrome://gpucrash does.
  // This is only supported in testing environments with the GPU benchmarking
  // extension enabled and is otherwise ignored.
  //
  // NOTE: It's important to handle this message early, on the IO thread, in
  // case the main thread is hung. This is the purpose of this message:
  // generating minidumps on the bots, which are symbolized later by the test
  // harness.
  CrashForTesting();

  // Terminates the GPU process with an exit code of 0. This message is handled
  // only in tests when the GPU benchmarking extension is enabled. Its purpose
  // is to enable test coverage of scenarios where the GPU process is
  // intentionally terminated with an exit code of 0.
  TerminateForTesting();

  // Returns a globally unique token which can be used by other interfaces to
  // securely identify this GpuChannel endpoint within the GPU process.
  [Sync] GetChannelToken() => (mojo_base.mojom.UnguessableToken token);

  // A simple no-op message used as a fence to ensure all previously sent
  // messages have been received.
  //
  // NoInterrupt is safe on this message because it's handled immediately on the
  // GPU IO thread, which is never allowed to block.
  [Sync, NoInterrupt] Flush() => ();

  // `version_buffer` is a handle to a shared memory region that only
  // contains a single 64 bit atomic integer used as a flushed message id.
  // The number is read from renderers and updated from the
  // gpu process on FlushDeferredRequests.
  [Sync, NoInterrupt] GetSharedMemoryForFlushId() =>
    (mojo_base.mojom.ReadOnlySharedMemoryRegion? version_buffer);

  // Tells the GPU process to create a new command buffer. A corresponding
  // CommandBufferStub is created.  If `params` provides a non-null
  // SurfaceHandle, |size| is ignored and it will render directly to the native
  // surface (only the browser process is allowed to create those). Otherwise it
  // will create an offscreen backbuffer of dimensions `size`.
  [Sync, NoInterrupt] CreateCommandBuffer(
      CreateCommandBufferParams params, int32 routing_id,
      mojo_base.mojom.UnsafeSharedMemoryRegion shared_state,
      pending_associated_receiver<CommandBuffer> receiver,
      pending_associated_remote<CommandBufferClient> client)
      => (ContextResult result, Capabilities capabilties,
          GLCapabilities gl_capabilities);

  // The CommandBufferProxy sends this to the CommandBufferStub in its
  // destructor, so that the stub deletes the actual CommandBufferService
  // object that it's hosting.
  [Sync, NoInterrupt] DestroyCommandBuffer(int32 routing_id) => ();

  // Schedules a hardware-accelerated image decode in the GPU process. Renderers
  // should use gpu::ImageDecodeAcceleratorProxy to schedule decode requests
  // which are processed by gpu::ImageDecodeAcceleratorStub on the service side.
  ScheduleImageDecode(ScheduleImageDecodeParams params,
                      uint64 decode_release_count);

  // Sends a batch of DeferredRequests to be executed by the service.
  // `flushed_deferred_message_id` is used to update the per-channel id of
  // messages confirmed to be flushed that's read on the client side through
  // shared memory obtained by GetSharedMemoryForFlushId().
  FlushDeferredRequests(array<DeferredRequest> requests,
      uint32 flushed_deferred_message_id);

  // Create a GpuMemoryBuffer on IO thread. Note that this needs to be a
  // blocking call on calling client's thread in order to return the
  // GpuMemoryBufferHandle before it's used to create a mailbox from it.
  [Sync] CreateGpuMemoryBuffer(gfx.mojom.Size size,
  viz.mojom.SharedImageFormat format, gfx.mojom.BufferUsage buffer_usage)
  => (gfx.mojom.GpuMemoryBufferHandle buffer_handle);

  // Gets the GpuMemoryBufferHandle for the corresponding `mailbox` from
  // service side. Note that this needs to be a blocking call on calling
  // client's thread in order to return the GpuMemoryBufferHandle and other
  // metadata required by client to map the mailbox to CPU memory before it can
  // read/write from/to it.
  [Sync] GetGpuMemoryBufferHandleInfo(gpu.mojom.Mailbox mailbox)
  => (gfx.mojom.GpuMemoryBufferHandle buffer_handle,
      viz.mojom.SharedImageFormat format, gfx.mojom.Size size,
      gfx.mojom.BufferUsage buffer_usage);

  // Creates a StreamTexture associated with the given `stream_id`.
  [Sync, EnableIf=is_android] CreateStreamTexture(
      int32 stream_id,
      pending_associated_receiver<StreamTexture> receiver) => (bool success);

  // Creates a DCOMPTexture and attaches to the provided `route_id`.
  // Note: this `route_id` must not conflict with the routing ids for command
  // buffers or shared image stub. Otherwise, unexpected behaviour can happen
  // if `Add/RemoveRoute()` is called with a pre-existing routing id.
  [Sync, EnableIf=is_win] CreateDCOMPTexture(
      int32 route_id,
      pending_associated_receiver<DCOMPTexture> receiver) => (bool success);

  // This interface is used by MediaFoundationRendererClient to subscribe
  // to overlay state information from the Viz layer (as provided by the
  // DCOverlayProcessor). The MediaFoundationRendererClient uses the overlay
  // state associated with a Video Frame texture (correlated via 'mailbox') as
  // a heuristic to determine the best video presentation mode to use.
  [Sync, EnableIf=is_win] RegisterOverlayStateObserver(
    pending_remote<OverlayStateObserver> promotion_hint_observer,
    gpu.mojom.Mailbox mailbox) => (bool success);

  // Instructs the command buffer to wait asynchronously until its State is
  // changed by the reader to have a current token value within the (inclusive)
  // range [start, end]. Once in range, the command buffer will reply and
  // unblock the caller.
  //
  // TODO(rockot): This should move to the CommandBuffer interface, but it has
  // unique dispatching constraints which require it to be processed
  // out-of-order from other scheduled messages targeting the command buffer.
  // For now we use a GpuChannel message with a `routing_id` to target a
  // specific CommandBuffer.
  [Sync, NoInterrupt] WaitForTokenInRange(
      int32 routing_id, int32 start, int32 end) => (CommandBufferState state);

  // Instructs the command buffer to wait asynchronously until its State is
  // changed by the reader to have a current get offset within the (inclusive)
  // range [start, end], on the get buffer identified by `set_get_buffer_count`.
  // Once in range, the command buffer will reply and unblock the caller.
  //
  // TODO(rockot): This should move to the CommandBuffer interface, but it has
  // unique dispatching constraints which require it to be processed
  // out-of-order from other scheduled messages targeting the command buffer.
  // For now we use a GpuChannel message with a `routing_id` to target a
  // specific CommandBuffer.
  [Sync, NoInterrupt] WaitForGetOffsetInRange(
      int32 routing_id, uint32 set_get_buffer_count, int32 start, int32 end)
      => (CommandBufferState state);

  [EnableIf=is_fuchsia]
  RegisterSysmemBufferCollection(
      handle<platform> service_handle, handle<platform> sysmem_token,
      viz.mojom.SharedImageFormat format, gfx.mojom.BufferUsage usage,
      bool register_with_image_pipe);

  // Updates the contents of the GpuMemoryBuffer associated with the shared
  // image. Necessary on platforms like Windows where we use shared memory GMBs
  // for readback from D3D texture shared images. The copy, if successful, is
  // complete when the callback runs.
  [EnableIf=is_win]
  CopyToGpuMemoryBufferAsync(
      Mailbox mailbox, array<SyncToken> sync_token_dependencies,
      uint64 release_count) => (bool success);
};

// Interface used to issue commands to a specific CommandBuffer instance in the
// GPU process.
interface CommandBuffer {
  // Sets the shared memory buffer to use for commands. The ID given here must
  // correspond to one registered by a prior RegisterTransferBuffer IPC to the
  // same CommandBuffer.
  SetGetBuffer(int32 shm_id);

  // Registers an existing shared memory transfer buffer with an `id` that can
  // be used to identify it within a command buffer.
  RegisterTransferBuffer(int32 id,
                         mojo_base.mojom.UnsafeSharedMemoryRegion buffer);

  // Sends a GPU fence handle and store it for the specified gpu fence ID.
  CreateGpuFenceFromHandle(uint32 gpu_fence_id,
                           gfx.mojom.GpuFenceHandle fence_handle);

  // Requests retrieval of a GpuFenceHandle by ID.
  GetGpuFenceHandle(uint32 id) => (gfx.mojom.GpuFenceHandle? fence_handle);

  // Asynchronously waits until the SyncToken is signaled, then sends a
  // corresponding SignalAck on the CommandBufferClient interface, using
  // `signal_id` to identify this request.
  SignalSyncToken(SyncToken sync_token, uint32 signal_id);

  // Asynchronously waits until a given query is reached in the command buffer,
  // then sends a corresponding SignalAck on the CommandBufferClient interface,
  // using `signal_id` to identify this request.
  SignalQuery(uint32 query, uint32 signal_id);
};

// Corresponds to gpu::SwapBuffersCompleteParams.
[Native]
struct SwapBuffersCompleteParams;

// Interface used by the GPU process to send the client messages from a specific
// CommandBuffer instance.
interface CommandBufferClient {
  // Notifies the client about a console message emitted on behalf of the
  // command buffer. These messages are intended to be exposed by
  // developer-facing UI such as the DevTools console.
  OnConsoleMessage(string message);

  // Notifies the client of a GPU switch.
  OnGpuSwitched(gl.mojom.GpuPreference active_gpu_heuristic);

  // Tells the proxy that there was an error and the command buffer had to be
  // destroyed for some reason.
  OnDestroyed(ContextLostReason reason, Error error);

  // Returns a block of data from the GPU process to the client.
  // This contains server->client messages produced by dawn_wire and is used to
  // remote WebGPU.
  OnReturnData(array<uint8> data);

  // Signals the completion of an asynchronous wait initiated by SignalSyncToken
  // or SignalQuery on the corresponding CommandBuffer interface. `signal_id`
  // identifies the specific request being acknowledged.
  OnSignalAck(uint32 signal_id, CommandBufferState state);
};

// Interface to control a single StreamTexture instance. Implemented in the GPU
// process and called by renderer clients.
//
// NOTE: Due to limitations of Channel-associated interfaces, message replies on
// this interface must not be used to pass other associated interface remotes or
// receivers.
[EnableIf=is_android]
interface StreamTexture {
  // Tells the StreamTexture to send its SurfaceTexture to the browser process,
  // via the ScopedSurfaceRequestConduit. `token` is used to uniquely identify
  // the surface request to the browser, and therefore must be a token already
  // minted by the browser and somehow procured by the caller.
  ForwardForSurfaceRequest(mojo_base.mojom.UnguessableToken token);

  // Tells the service-side instance to start sending frame available
  // notifications.
  StartListening(pending_associated_remote<StreamTextureClient> client);

  // Updates the visible size from MediaPlayer. The size includes rotation of
  // video.
  UpdateRotatedVisibleSize(gfx.mojom.Size rotated_visible_size);
};

// Interface used by GPU to notify the client of a StreamTexture instance about
// new frame availability. Implemented by renderer clients and called by
// StreamTexture instances in the GPU process.
//
// NOTE: Due to limitations of Channel-associated interfaces, messages on this
// interface must not be used to pass other associated interface remotes or
// receivers.
[EnableIf=is_android]
interface StreamTextureClient {
  // Informs the client that a new frame is available.
  OnFrameAvailable();

  // Informs the client that a new frame with VulkanYcbcrInfo is available.
  OnFrameWithInfoAvailable(Mailbox mailbox, gfx.mojom.Size coded_size,
                           gfx.mojom.Rect visible_rect,
                           VulkanYCbCrInfo? info);
};

// Interface to control a single DCOMPTexture instance. Implemented in the GPU
// process and called by renderer clients.
[EnableIf=is_win]
interface DCOMPTexture {
  // Starts sending DCOMP surface notifications via the `client`. Follows the
  // pattern in `StreamTexture::StartListening()` to delay notifications until
  // the client side is ready.
  //
  // TODO(crbug.com/40642952): Investigate if we can remove this by having the
  // `client` as a parameter to `CreateDCOMPTexture()`.
  StartListening(pending_associated_remote<DCOMPTextureClient> client);

  // Sets the size of DCOMPTexture.
  SetTextureSize(gfx.mojom.Size size);

  // Binds the DCOMPTexture to a DCOMP surface handle and returns whether the
  // operation succeeded or not. The surface handle is provided as `token`
  // registered with the DCOMP surface handle registry in the GPU process.
  SetDCOMPSurfaceHandle(mojo_base.mojom.UnguessableToken token)
      => (bool success);
};

// Interface used by GPU to notify the client of a DCOMPTexture instance about
// SharedImage mailbox and DCOMP Surface Handle have been bound to the
// DCOMPTexture instance. It also notifies client about the change in compositon
// on-screen output video rectangle. Implemented by renderer clients and called
// by DCOMPTexture instances in the GPU process.
[EnableIf=is_win]
interface DCOMPTextureClient {
  // Informs the client that a SharedImage mailbox has been bound to the
  // DCOMPTexture instance.
  OnSharedImageMailboxBound(Mailbox mailbox);

  // Informs the client of a change in video composition parameter.
  OnOutputRectChange(gfx.mojom.Rect output_rect);
};

// Interface used by GPU to notify clients when the overlay promotion hint state
// has changed.
[EnableIf=is_win]
interface OverlayStateObserver {
  // Called when the texture associated with the specified mailbox has had a
  // change in promotion state. If promoted is true then the texture is
  // currently using a DC Layer Overlay. If promoted is false then the texture
  // is not using a DC Layer Overlay.
  OnStateChanged(bool promoted);
};

// DeferredRequests are batched locally by clients and sent to the service only
// when flushing the channel via GpuChannelHost's EnsureFlush or VerifyFlush.
struct DeferredRequest {
  // Parameters for the specific type of request.
  DeferredRequestParams params;

  // A list of SyncTokens which must be released before the request can be
  // processed.
  array<SyncToken> sync_token_fences;

  // The sync point release count that is expected to be reached after execution
  // of this request.
  // 0 means this request doesn't release.
  uint64 release_count;
};

// Details of a batched request.
union DeferredRequestParams {
  // This request targets a specific command buffer instance.
  DeferredCommandBufferRequest command_buffer_request;

  // This request pertains to shared image management.
  DeferredSharedImageRequest shared_image_request;

  // Sent to indicate the client wants to destroy the StreamTexture identified
  // by this ID.
  [EnableIf=is_android]
  int32 destroy_stream_texture;

  // Sent to indicate the client wants to destroy the DCOMPTexture identified
  // by this ID.
  [EnableIf=is_win]
  int32 destroy_dcomp_texture;
};

// Details of a batched request targeting a specific command buffer.
struct DeferredCommandBufferRequest {
  // Identifies the command buffer targeted by this request.
  int32 routing_id;

  // The specific request parameters.
  DeferredCommandBufferRequestParams params;
};

// Details of a batched request targeting a specific command buffer.
union DeferredCommandBufferRequestParams {
  // See AsyncFlushParams.
  AsyncFlushParams async_flush;

  // Destroys a transfer buffer identified by this ID.
  int32 destroy_transfer_buffer;

  // Allows to attach SharedImage to default framebuffer of this context.
  // NOTE: Used only for PNaCL.
  SetDefaultFramebufferSharedImageParams set_default_framebuffer_shared_image;
};

// Details of a batched request pertaining to shared image management.
union DeferredSharedImageRequest {
  // Sent by clients to record a point in the sequence of pending deferred
  // messages. Actual value is ignored.
  uint8 nop;

  // See CreateSharedImageParams.
  CreateSharedImageParams create_shared_image;

  // See CreateSharedImageWithDataParams.
  CreateSharedImageWithDataParams create_shared_image_with_data;

  // See CreateSharedImageWithBufferParams.
  CreateSharedImageWithBufferParams create_shared_image_with_buffer;

  // Registers a new shared memory region to share with the GPU process for
  // uploading shared image data.
  mojo_base.mojom.ReadOnlySharedMemoryRegion register_upload_buffer;

  // See UpdateSharedImageParams.
  UpdateSharedImageParams update_shared_image;

  // See CopyToGpuMemoryBufferParams.
  CopyToGpuMemoryBufferParams copy_to_gpu_memory_buffer;

  // Destroys the shared image identified by this Mailbox.
  Mailbox destroy_shared_image;

  AddReferenceToSharedImageParams add_reference_to_shared_image;

  // See CreateSwapChainParams.
  [EnableIf=is_win]
  CreateSwapChainParams create_swap_chain;

  // See PresentSwapChainParams.
  [EnableIf=is_win]
  PresentSwapChainParams present_swap_chain;

  // See RegisterDxgiFenceParams.
  [EnableIf=is_win]
  RegisterDxgiFenceParams register_dxgi_fence;

  // See UpdateDxgiFenceParams.
  [EnableIf=is_win]
  UpdateDxgiFenceParams update_dxgi_fence;

  // See UnregisterDxgiFenceParams.
  [EnableIf=is_win]
  UnregisterDxgiFenceParams unregister_dxgi_fence;
};

// Asynchronously synchronize the put and get offsets of both processes.
// Caller passes its current put offset. Current state (including get offset)
// is returned in shared memory.
// TODO(sunnyps): This is an internal implementation detail of the gpu service
// and is not sent by the client. Remove this once the non-scheduler code path
// is removed.
struct AsyncFlushParams {
  int32 put_offset;
  uint32 flush_id;
  array<SyncToken> sync_token_fences;
};

// Sets SharedImage mailbox and other framebuffer params to the default
// framebuffer. NOTE: This exists only to support PNaCl.
struct SetDefaultFramebufferSharedImageParams {
  // The mailbox of the shared image. Can be empty if client wants to detach
  // SharedImage from the color buffer.
  Mailbox mailbox;

  // Number of samples for the multisampling.
  uint32 samples_count;

  // If default framebuffer needs to presevre contents across the frames.
  bool preserve;

  // If this framebuffer needs depth buffer.
  bool needs_depth;

  // If this framebuffer needs stencil buffer.
  bool needs_stencil;
};

// Common params used when creating a new shared image.
struct SharedImageInfo {
  // Metadata about the shared image being created.
  SharedImageMetadata meta;

  // Retained for heap dumps and passed to graphics APIs for tracing tools.
  // Pick a name that is unique to the allocation site.
  string debug_label;
};

// Creates a new shared image.
struct CreateSharedImageParams {
  // The mailbox used to identify the shared image.
  Mailbox mailbox;

  // Information about the shared image.
  SharedImageInfo si_info;
};

// Creates a new shared image and populates it with pixel data from a shared
// memory region previously configured by the client.
struct CreateSharedImageWithDataParams {
  // The mailbox used to identify the shared image.
  Mailbox mailbox;

  // Information about the shared image.
  SharedImageInfo si_info;

  // Offset from which to copy data out of the current image upload shared
  // memory region.
  uint32 pixel_data_offset;

  // Size of data to copy out of the current image upload shared memory region.
  uint32 pixel_data_size;

  // If `true`, this is the last usage of the current image upload shared memory
  // region, so the region can be discarded after servicing this request.
  bool done_with_shm;
};

// Creates a new shared image with an existing GPU memory buffer.
// If format is multi-planar then `buffer_handle` contains all the planes.
struct CreateSharedImageWithBufferParams {
  // The mailbox used to identify the shared image.
  Mailbox mailbox;

  // Information about the shared image.
  SharedImageInfo si_info;

  // A handle to the existing GPU memory buffer.
  gfx.mojom.GpuMemoryBufferHandle buffer_handle;
};

// Updates the contents of a shared image from whatever is backing it, if
// applicable.
struct UpdateSharedImageParams {
  // The mailbox identifying the shared image to update.
  Mailbox mailbox;

  // An optional GpuFenceHandle for the server to wait on before updating the
  // image from whatever backs it.
  gfx.mojom.GpuFenceHandle? in_fence_handle;
};

// Adds reference to the shared image that was created on a different
// GpuChannel. This allows SharedImage that is shared across processes to
// outlive original client.
struct AddReferenceToSharedImageParams {
  // The mailbox identifying the shared image to add ref.
  Mailbox mailbox;
};

// Updates the contents of the GpuMemoryBuffer associated with the shared image.
// Necessary on platforms like Windows and Linux where renderer cannot create
// native GMBs. The command performs synchronization with the GPU so the copy is
// complete after the command runs.
struct CopyToGpuMemoryBufferParams {
  // The mailbox identifying the shared image which should update its GMB.
  Mailbox mailbox;
};

[EnableIf=is_win]
struct CreateSwapChainParams {
  // Mailbox identifying the front buffer of the swap chain.
  Mailbox front_buffer_mailbox;

  // Mailbox identifying the back buffer of the swap chain.
  Mailbox back_buffer_mailbox;

  // Pixel format of the front and back buffers.
  viz.mojom.SharedImageFormat format;

  // Size of the buffers.
  gfx.mojom.Size size;

  // Color space of the buffers.
  gfx.mojom.ColorSpace color_space;

  // Usage flags corresponding to values defined in
  // gpu/command_buffer/common/shared_image_usage.h.
  uint32 usage;

  // Which corner is considered the origin of the swap chain's buffers.
  skia.mojom.SurfaceOrigin surface_origin;

  // Indicates how the alpha component of each pixel is interpreted.
  skia.mojom.AlphaType alpha_type;
};

[EnableIf=is_win]
struct PresentSwapChainParams {
  // Mailbox identifying the swap chain to present.
  Mailbox mailbox;
};

[EnableIf=is_win]
struct RegisterDxgiFenceParams {
  // Mailbox identifying the shared image backing to register fence.
  Mailbox mailbox;

  // The DXGIHandleToken to identifying the registered gpu fence handle.
  // Use this token to update fence after registration.
  gfx.mojom.DXGIHandleToken dxgi_token;

  // The fence handle to register.
  gfx.mojom.GpuFenceHandle fence_handle;
};

[EnableIf=is_win]
struct UpdateDxgiFenceParams {
  // Mailbox identifying the shared image backing to update the fence.
  Mailbox mailbox;

  // The DXGIHandleToken to identifying the fence to update.
  gfx.mojom.DXGIHandleToken dxgi_token;

  // The fence value to signal.
  uint64 fence_value;
};

[EnableIf=is_win]
struct UnregisterDxgiFenceParams {
  // Mailbox identifying the shared image backing to clear the fence.
  Mailbox mailbox;

  // The DXGIHandleToken to identifying the fence needs to be cleared.
  gfx.mojom.DXGIHandleToken dxgi_token;
};