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

module mojo;

import "mojo/services/geometry/public/interfaces/geometry.mojom";
import "mojo/services/gpu/public/interfaces/command_buffer.mojom";
import "mojo/services/gpu/public/interfaces/viewport_parameter_listener.mojom";
import "mojo/services/surfaces/public/interfaces/quads.mojom";
import "mojo/services/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 SurfaceClient {
  ReturnResources(array<ReturnedResource> resources);
};

[Client=SurfaceClient]
interface Surface {
  // The id is created by the client and must be unique and contain the
  // connection's namespace in the upper 32 bits.
  CreateSurface(SurfaceId id, Size size);

  // The client can only submit frames to surfaces created with this
  // connection.  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(SurfaceId id, Frame frame) => ();
  DestroySurface(SurfaceId id);

  CreateGLES2BoundSurface(CommandBuffer gles2_client,
                          SurfaceId id,
                          Size size,
                          ViewportParameterListener& listener);
};
