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

#include "src/ui/lib/escher/paper/paper_render_queue.h"

#include "src/ui/lib/escher/paper/paper_render_queue_context.h"
#include "src/ui/lib/escher/util/trace_macros.h"

namespace escher {

PaperRenderQueue::PaperRenderQueue() = default;
PaperRenderQueue::~PaperRenderQueue() = default;

void PaperRenderQueue::Clear() {
  TRACE_DURATION("gfx", "PaperRenderQueue::Clear");
  opaque_.clear();
  translucent_.clear();
  wireframe_.clear();
}

void PaperRenderQueue::Sort() {
  TRACE_DURATION("gfx", "PaperRenderQueue::Sort");
  opaque_.Sort();
  translucent_.Sort();
  wireframe_.Sort();
}

void PaperRenderQueue::GenerateCommands(CommandBuffer* cmd_buf,
                                        const PaperRenderQueueContext* context,
                                        PaperRenderQueueFlags flags) const {
  FXL_DCHECK(context);
  if (flags & PaperRenderQueueFlagBits::kOpaque) {
    TRACE_DURATION("gfx", "PaperRenderQueue::GenerateCommands[opaque]");
    opaque_.GenerateCommands(cmd_buf, nullptr, context);
  }
  if (flags & PaperRenderQueueFlagBits::kTranslucent) {
    TRACE_DURATION("gfx", "PaperRenderQueue::GenerateCommands[translucent]");
    translucent_.GenerateCommands(cmd_buf, nullptr, context);
  }
  if (flags & PaperRenderQueueFlagBits::kWireframe) {
    TRACE_DURATION("gfx", "PaperRenderQueue::GenerateCommands[wireframe]");
    wireframe_.GenerateCommands(cmd_buf, nullptr, context);
  }
}

void PaperRenderQueue::PushDrawCall(const PaperDrawCall& draw_call) {
  TRACE_DURATION("gfx", "PaperRenderQueue::PushDrawCall");

  const auto& flags = draw_call.render_queue_flags;

#ifndef NDEBUG
  PaperRenderQueueFlags kOpaqueAndTranslucent =
      PaperRenderQueueFlagBits::kOpaque | PaperRenderQueueFlagBits::kTranslucent;
  // Can't use the same sort-key for the translucent and opaque queues.
  // TODO(ES-158): How should sort keys be handled in this situation?  This
  // relates to the question of how different shaders are specified; if the
  // solution to that problem is to enqueue multiple draw-calls, then that's
  // probably also a good solution here.  In that case, maybe we don't even
  // need RenderQueueFlags... PushDrawCalls() and GenerateCommands() could both
  // have an explicit queue-id arg.
  FXL_DCHECK(kOpaqueAndTranslucent != (flags & kOpaqueAndTranslucent))
      << "cannot push to both opaque and translucent queue.";
#endif

  if (flags & PaperRenderQueueFlagBits::kOpaque) {
    opaque_.Push(draw_call.render_queue_item);
  }
  if (flags & PaperRenderQueueFlagBits::kTranslucent) {
    translucent_.Push(draw_call.render_queue_item);
  }
  if (flags & PaperRenderQueueFlagBits::kWireframe) {
    wireframe_.Push(draw_call.render_queue_item);
  }
}

}  // namespace escher
