/*
 * Copyright (c) Advanced Micro Devices, Inc., or its affiliates.
 *
 * SPDX-License-Identifier: MIT
 */

#pragma once

#include "grid_launch.h"
#include "hc.hpp"

class grid_launch_parm_cxx : public grid_launch_parm {
 public:
  grid_launch_parm_cxx() = default;

  // customized serialization: don't need av and cf in kernel
  __attribute__((annotate("serialize"))) void __cxxamp_serialize(Kalmar::Serialize& s) const {
    s.Append(sizeof(int), &grid_dim.x);
    s.Append(sizeof(int), &grid_dim.y);
    s.Append(sizeof(int), &grid_dim.z);
    s.Append(sizeof(int), &group_dim.x);
    s.Append(sizeof(int), &group_dim.y);
    s.Append(sizeof(int), &group_dim.z);
  }

  __attribute__((annotate("user_deserialize"))) grid_launch_parm_cxx(int grid_dim_x, int grid_dim_y,
                                                                     int grid_dim_z,
                                                                     int group_dim_x,
                                                                     int group_dim_y,
                                                                     int group_dim_z) {
    grid_dim.x = grid_dim_x;
    grid_dim.y = grid_dim_y;
    grid_dim.z = grid_dim_z;
    group_dim.x = group_dim_x;
    group_dim.y = group_dim_y;
    group_dim.z = group_dim_z;
  }
};


extern inline void grid_launch_init(grid_launch_parm* lp) {
  lp->grid_dim.x = lp->grid_dim.y = lp->grid_dim.z = 1;

  lp->group_dim.x = lp->group_dim.y = lp->group_dim.z = 1;

  lp->dynamic_group_mem_bytes = 0;

  lp->barrier_bit = barrier_bit_queue_default;
  lp->launch_fence = -1;

  // TODO - set to NULL?
  static hc::accelerator_view av = hc::accelerator().get_default_view();
  lp->av = &av;
  lp->cf = NULL;
}
