// 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 "gpu/interfaces/gpu_capabilities.mojom";

struct CommandBufferState {
  int32 num_entries;
  int32 get_offset;
  int32 put_offset;
  int32 token;
  int32 error;  // TODO(piman): enum
  int32 context_lost_reason;  // TODO(piman): enum
  uint32 generation;
};

interface CommandBufferSyncClient {
  DidInitialize(bool success, GpuCapabilities capabilities);
  DidMakeProgress(CommandBufferState state);
};

interface CommandBufferSyncPointClient {
  DidInsertSyncPoint(uint32 sync_point);
};

interface CommandBufferLostContextObserver {
  DidLoseContext(int32 context_lost_reason);
};

interface CommandBuffer {
  // Initialize attempts to initialize the command buffer. Success or failure
  // will be communicated via the CommandBufferSyncClient DidInitialize() call.
  // If the context is lost after creation the LostContext method on the
  // CommandBufferLostContextObserver's will be called then this pipe will be
  // closed.
  Initialize(CommandBufferSyncClient sync_client,
             CommandBufferSyncPointClient sync_point_client,
             CommandBufferLostContextObserver lost_observer,
             handle<shared_buffer> shared_state);
  SetGetBuffer(int32 buffer);
  Flush(int32 put_offset);
  MakeProgress(int32 last_get_offset);
  RegisterTransferBuffer(int32 id,
                         handle<shared_buffer> transfer_buffer,
                         uint32 size);
  DestroyTransferBuffer(int32 id);

  // InsertSyncPoint returns the sync point returned via DidInsertSyncPoint.
  // If |retire| is true, the sync point is retired on insertion. Otherwise,
  // explicitly call RetireSyncPoint to retire it.
  InsertSyncPoint(bool retire);
  RetireSyncPoint(uint32 sync_point);
  Echo() => ();
};
