// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

module viz.mojom;

import "components/arc/common/protected_buffer_manager.mojom";
import "components/arc/common/video_decode_accelerator.mojom";
import "components/arc/common/video_encode_accelerator.mojom";
import "components/arc/common/video_protected_buffer_allocator.mojom";
import "gpu/ipc/common/gpu_info.mojom";
import "gpu/ipc/common/memory_stats.mojom";
import "gpu/ipc/common/surface_handle.mojom";
import "gpu/ipc/common/sync_token.mojom";
import "media/mojo/interfaces/jpeg_decode_accelerator.mojom";
import "media/mojo/interfaces/jpeg_encode_accelerator.mojom";
import "media/mojo/interfaces/video_encode_accelerator.mojom";
import "ui/gfx/geometry/mojo/geometry.mojom";
import "ui/gfx/mojo/buffer_types.mojom";

interface GpuService {
  // Tells the GPU service to create a new channel for communication with a
  // client. The GPU service responds with an IPC handle.
  EstablishGpuChannel(int32 client_id,
                      uint64 client_tracing_id,
                      bool is_gpu_host)
      => (handle<message_pipe>? channel_handle);

  // Tells the GPU process to close the channel identified by |client_id|.
  // If no channel can be identified, do nothing.
  CloseChannel(int32 client_id);

  // Create a new ARC VideoDecodeAccelerator and binds it to |vda|.
  [EnableIf=is_chromeos]
  CreateArcVideoDecodeAccelerator(arc.mojom.VideoDecodeAccelerator& vda);

  // Create a new ARC VideoEncodeAccelerator and binds it to |vea|.
  [EnableIf=is_chromeos]
  CreateArcVideoEncodeAccelerator(arc.mojom.VideoEncodeAccelerator& vea);

  // Create a new ARC VideoProtectedBufferAllocator and binds it to |pba|.
  [EnableIf=is_chromeos]
  CreateArcVideoProtectedBufferAllocator(
      arc.mojom.VideoProtectedBufferAllocator& pba);

  // Create a new ARC ProtectedBufferManager and binds it to |pbm|.
  [EnableIf=is_chromeos]
  CreateArcProtectedBufferManager(arc.mojom.ProtectedBufferManager& pbm);

  // Creates a new JpegDecodeAccelerator and binds it to |jda|.
  CreateJpegDecodeAccelerator(media.mojom.JpegDecodeAccelerator& jda);

  // Creates a new JpegEncodeAccelerator and binds it to |jea|.
  CreateJpegEncodeAccelerator(media.mojom.JpegEncodeAccelerator& jea);

  // Creates a VideoEncodeAcceleratorProvider and binds it to |vea_provider|.
  CreateVideoEncodeAcceleratorProvider(
      media.mojom.VideoEncodeAcceleratorProvider& vea_provider);

  CreateGpuMemoryBuffer(gfx.mojom.GpuMemoryBufferId id,
                        gfx.mojom.Size size,
                        gfx.mojom.BufferFormat format,
                        gfx.mojom.BufferUsage usage,
                        int32 client_id,
                        gpu.mojom.SurfaceHandle surface_handle)
      => (gfx.mojom.GpuMemoryBufferHandle buffer_handle);

  DestroyGpuMemoryBuffer(gfx.mojom.GpuMemoryBufferId id,
                         int32 client_id,
                         gpu.mojom.SyncToken sync_token);

  GetVideoMemoryUsageStats() => (gpu.mojom.VideoMemoryUsageStats stats);

  RequestCompleteGpuInfo() => (gpu.mojom.GpuInfo gpu_info);
  GetGpuSupportedRuntimeVersion() => (gpu.mojom.GpuInfo gpu_info);

  // Requests that the GPU process query system availability of HDR output and
  // return it.
  RequestHDRStatus() => (bool hdr_enabled);

  // Notify GPU that a shader program was loaded from disk. Key is an
  // SHA-1 hash, and data a binary blob with serialized program info.
  // Note that this method is used only from a trusted process.
  LoadedShader(string key, string data);

  // Tells GPU to release the surface because it's being destroyed.
  DestroyingVideoSurface(int32 surface_id) => ();

  // Tells GPU to wake up the GPU because we're about to draw.
  WakeUpGpu();

  // Tells GPU that host has seen a GPU switch. This can happen when the display
  // is reconfigured, for example.
  GpuSwitched();

  DestroyAllChannels();

  // Called by the browser shortly after the application is backgrounded. The
  // GPU can use this message to perform appropriate cleanup. Sent with a
  // slight delay to prevent thrashing if the app is rapidly backgrounded
  // foregrounded.
  OnBackgroundCleanup();

  // Called by the browser immediately after the application is backgrounded.
  OnBackgrounded();
  // Called by the browser immediately after the application is foregrounded.
  OnForegrounded();

  Crash();
  Hang();
  ThrowJavaException();
  Stop() => ();
};