//===------- Offload API tests - olLaunchKernel Cooperative ---------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "../common/Fixtures.hpp"
#include <OffloadAPI.h>
#include <gtest/gtest.h>

struct olLaunchKernelCooperativeTest : LaunchSingleKernelTestBase {
  void SetUp() override {
    SetUpKernel("noargs");

    bool SupportsCooperative = false;
    auto Result =
        olGetDeviceInfo(Device, OL_DEVICE_INFO_COOPERATIVE_LAUNCH_SUPPORT,
                        sizeof(bool), &SupportsCooperative);

    if (Result) {
      if (Result->Code == OL_ERRC_UNIMPLEMENTED) {
        GTEST_SKIP()
            << "Device does not provide cooperative launch support information";
      }
      if (Result->Code != OL_ERRC_SUCCESS) {
        GTEST_FAIL() << "olGetDeviceInfo failed with unexpected error: "
                     << Result->Code << ": " << Result->Details;
      }
    }

    if (!SupportsCooperative) {
      GTEST_SKIP() << "Device does not support cooperative kernel launch";
    }
  }
};
OFFLOAD_TESTS_INSTANTIATE_DEVICE_FIXTURE(olLaunchKernelCooperativeTest);

TEST_P(olLaunchKernelCooperativeTest, GetMaxCooperativeGroupCount) {
  uint32_t MaxGroupCount = 0;
  ASSERT_SUCCESS(olGetKernelMaxCooperativeGroupCount(
      Device, Kernel, &LaunchArgs, &MaxGroupCount));
  ASSERT_GT(MaxGroupCount, 0u);
}

TEST_P(olLaunchKernelCooperativeTest, SuccessCooperative) {
  uint32_t MaxGroupCount = 0;
  ASSERT_SUCCESS(olGetKernelMaxCooperativeGroupCount(
      Device, Kernel, &LaunchArgs, &MaxGroupCount));

  LaunchArgs.NumGroups.x = MaxGroupCount;

  bool IsCooperative = true;
  ol_kernel_launch_prop_t Props[] = {
      {OL_KERNEL_LAUNCH_PROP_TYPE_IS_COOPERATIVE, &IsCooperative},
      OL_KERNEL_LAUNCH_PROP_END};

  ASSERT_SUCCESS(olLaunchKernel(Queue, Device, Kernel, &LaunchArgs, Props, 0,
                                nullptr, nullptr));
  ASSERT_SUCCESS(olSyncQueue(Queue));
}

TEST_P(olLaunchKernelCooperativeTest, SuccessNonCooperative) {
  ASSERT_SUCCESS(olLaunchKernel(Queue, Device, Kernel, &LaunchArgs, nullptr, 0,
                                nullptr, nullptr));
  ASSERT_SUCCESS(olSyncQueue(Queue));
}

TEST_P(olLaunchKernelCooperativeTest, TooManyGroups) {
  uint32_t MaxGroupCount = 0;
  ASSERT_SUCCESS(olGetKernelMaxCooperativeGroupCount(
      Device, Kernel, &LaunchArgs, &MaxGroupCount));

  LaunchArgs.NumGroups.x = MaxGroupCount * 2;

  bool IsCooperative = true;
  ol_kernel_launch_prop_t Props[] = {
      {OL_KERNEL_LAUNCH_PROP_TYPE_IS_COOPERATIVE, &IsCooperative},
      OL_KERNEL_LAUNCH_PROP_END};

  ASSERT_ANY_ERROR(olLaunchKernel(Queue, Device, Kernel, &LaunchArgs, Props, 0,
                                  nullptr, nullptr));
}

TEST_P(olLaunchKernelCooperativeTest, SynchronousLaunch) {
  uint32_t MaxGroupCount = 0;
  ASSERT_SUCCESS(olGetKernelMaxCooperativeGroupCount(
      Device, Kernel, &LaunchArgs, &MaxGroupCount));

  LaunchArgs.NumGroups.x = std::min(MaxGroupCount, 2u);

  bool IsCooperative = true;
  ol_kernel_launch_prop_t Props[] = {
      {OL_KERNEL_LAUNCH_PROP_TYPE_IS_COOPERATIVE, &IsCooperative},
      OL_KERNEL_LAUNCH_PROP_END};

  ASSERT_SUCCESS(olLaunchKernel(nullptr, Device, Kernel, &LaunchArgs, Props, 0,
                                nullptr, nullptr));
}

TEST_P(olLaunchKernelCooperativeTest, InvalidNullHandleKernel) {
  uint32_t MaxGroupCount = 0;
  ASSERT_ERROR(OL_ERRC_INVALID_NULL_HANDLE,
               olGetKernelMaxCooperativeGroupCount(Device, nullptr, &LaunchArgs,
                                                   &MaxGroupCount));
}

TEST_P(olLaunchKernelCooperativeTest, InvalidNullHandleDevice) {
  uint32_t MaxGroupCount = 0;
  ASSERT_ERROR(OL_ERRC_INVALID_NULL_HANDLE,
               olGetKernelMaxCooperativeGroupCount(nullptr, Kernel, &LaunchArgs,
                                                   &MaxGroupCount));
}

TEST_P(olLaunchKernelCooperativeTest, InvalidNullPointerGroupCountRet) {
  ASSERT_ERROR(OL_ERRC_INVALID_NULL_POINTER,
               olGetKernelMaxCooperativeGroupCount(Device, Kernel, &LaunchArgs,
                                                   nullptr));
}
