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

#ifndef SRC_UI_LIB_ESCHER_RENDERER_RENDER_QUEUE_ITEM_H_
#define SRC_UI_LIB_ESCHER_RENDERER_RENDER_QUEUE_ITEM_H_

#include <array>
#include <cstddef>

namespace escher {

class CommandBuffer;
struct RenderQueueContext;

// RenderQueueItem is a sortable item stored in a RenderQueue.  It contains
// pointers to object/instance data as well as a RenderFunc: a function that
// knows how to interpret the object/instance data in order to emit commands
// into a Vulkan command buffer.
struct RenderQueueItem {
  static constexpr uint8_t kNumRenderQueueFuncChoiceBits = 1U;
  static constexpr size_t kNumRenderQueueFuncs = 1U << kNumRenderQueueFuncChoiceBits;

  // Render callback that knows how to interpret the |object_data| and
  // |instance_data| fields of a RenderQueueItem.  The number of instances to be
  // rendered is given by |instance_count|, which is guaranteed to be >= 1.  If
  // there are multiple instances:
  //   - the instance-specific data for the i-th instance is given by:
  //     "items[i].instance_data".
  //   - each of the items "items[0]" to "items[instance_count - 1]" are
  //     guaranteed to have the same |object_data| and |render| function.
  typedef void (*Func)(CommandBuffer* cmd_buf, const RenderQueueContext* context,
                       const RenderQueueItem* instances, uint32_t instance_count);
  using Funcs = std::array<Func, kNumRenderQueueFuncs>;

  uint64_t sort_key;

  const void* object_data;
  const void* instance_data;

  Funcs render_queue_funcs;
};

}  // namespace escher

#endif  // SRC_UI_LIB_ESCHER_RENDERER_RENDER_QUEUE_ITEM_H_
