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

[DartPackage="mojo_services"]
module mojo;

import "geometry/public/interfaces/geometry.mojom";
import "surfaces/public/interfaces/quads.mojom";
import "surfaces/public/interfaces/surface_id.mojom";

enum ResourceFormat {
  RGBA_8888,
  RGBA_4444,
  BGRA_8888,
  ALPHA_8,
  LUMINANCE_8,
  RGB_565,
  ETC1,
};

struct Mailbox {
  array<int8, 64> name;
};

struct MailboxHolder {
  Mailbox mailbox;
  uint32 texture_target;
  uint32 sync_point;
};

struct TransferableResource {
  uint32 id;
  ResourceFormat format;
  uint32 filter;
  Size size;
  MailboxHolder mailbox_holder;
  bool is_repeated;
  bool is_software;
};

struct ReturnedResource {
  uint32 id;
  uint32 sync_point;
  int32 count;
  bool lost;
};

struct Frame {
  array<TransferableResource> resources;
  array<Pass> passes;
};

interface ResourceReturner {
  ReturnResources(array<ReturnedResource> resources);
};

interface Surface {
  // Request the id namespace for this connection. Fully qualified surface ids
  // are the combination of the id_namespace for the connection that created the
  // surface and the id_local component allocated by the caller.
  GetIdNamespace() => (uint32 id_namespace);

  // Sets a ResourceReturner that will receive unused resources.
  SetResourceReturner(ResourceReturner returner);

  // Creates a new surface with the given local identifier. Once a surface is
  // created the caller may submit frames to it or destroy it using the local
  // identifier. The caller can also produce a fully qualified surface id that
  // can be embedded in frames produces by different connections.
  CreateSurface(uint32 id_local);

  // After the submitted frame is drawn for the first time, the surface will
  // respond to the SubmitFrame message. Clients should use this acknowledgement
  // to ratelimit frame submissions.
  SubmitFrame(uint32 id_local, Frame frame) => ();
  DestroySurface(uint32 id_local);
};
