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

# Common Tests - Test independent of all platforms
set(TARGETS_SUPPORTING_CLUSTERS gfx1250 gfx1251)
set(CLUSTERS_SUPPORTED -1)

function(CheckRejectedArchs OFFLOAD_ARCH_STR_LOCAL)
  string(REGEX MATCHALL "--offload-arch=gfx[0-9a-z]+" OFFLOAD_ARCH_LIST ${OFFLOAD_ARCH_STR_LOCAL})
  foreach(OFFLOAD_ARCH IN LISTS OFFLOAD_ARCH_LIST)
	string(REGEX MATCHALL "--offload-arch=(gfx[0-9a-z]+)" matches ${OFFLOAD_ARCH})
	if (CMAKE_MATCH_COUNT EQUAL 1)
	  if (CMAKE_MATCH_1 IN_LIST TARGETS_SUPPORTING_CLUSTERS)
		set(CLUSTERS_SUPPORTED 1 PARENT_SCOPE)
	  endif()         # CMAKE_MATCH_1
	endif()        # CMAKE_MATCH_COUNT
  endforeach()   # OFFLOAD_ARCH_LIST
endfunction()  # CheckAcceptedArchs

set(TEST_SRC
  hipOccupancyMaxActiveBlocksPerMultiprocessor.cc
  hipOccupancyMaxPotentialBlockSize.cc
  hipModuleOccupancyMaxPotentialBlockSize.cc
  hipModuleOccupancyMaxPotentialBlockSizeWithFlags.cc
  hipModuleOccupancyMaxActiveBlocksPerMultiprocessor.cc
  hipModuleOccupancyMaxActiveBlocksPerMultiprocessorWithFlags.cc
  hipOccupancyMaxPotentialBlockSizeVariableSMemWithFlags.cc
  hipOccupancyMaxActiveBlocksPerMultiprocessorWithFlags.cc
  hipOccupancyAvailableDynamicSMemPerBlock.cc
)

if(HIP_PLATFORM MATCHES "amd")
  if (DEFINED OFFLOAD_ARCH_STR)
    CheckRejectedArchs(${OFFLOAD_ARCH_STR})
  elseif(DEFINED $ENV{HCC_AMDGPU_TARGET})
    CheckRejectedArchs($ENV{HCC_AMDGPU_TARGET})
  endif()

  # The WGP/CU reporting is AMD specific.
  set(TEST_SRC
    ${TEST_SRC}
    hipOccupancyLdsPerMultiprocessor.cc
    )

  if(CLUSTERS_SUPPORTED EQUAL 1)
    message(STATUS "Adding clusters tests")
    set(TEST_SRC
      ${TEST_SRC}
      hipOccupancyMaxPotentialClusterSize.cc
      hipOccupancyMaxActiveClusters.cc
      )
  else()
    message(STATUS "No cluster support; clusters tests were not added")
  endif()

add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/simple_kernel.code
                   COMMAND ${CMAKE_HIP_COMPILER} ${HIP_DEVICE_BUILD_FLAGS_NO_ARCH} ${OFFLOAD_ARCH_LIST} --cuda-device-only
                     -x hip ${CMAKE_CURRENT_SOURCE_DIR}/simple_kernel.cc
                     -o simple_kernel.code
                     -I${HIP_INCLUDE_DIR} ${HIP_PATH_OPT}
                     DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/simple_kernel.cc)
else()
  add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/simple_kernel.code
                     COMMAND ${CMAKE_HIP_COMPILER} --fatbin ${OFFLOAD_ARCH_LIST}
                     -x cu ${CMAKE_CURRENT_SOURCE_DIR}/simple_kernel.cc
                     -o simple_kernel.code
                     -I${HIP_INCLUDE_DIR}
                     DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/simple_kernel.cc)
endif()
add_custom_target(simple_kernel ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/simple_kernel.code)
set_property(GLOBAL APPEND PROPERTY G_INSTALL_CUSTOM_TARGETS ${CMAKE_CURRENT_BINARY_DIR}/simple_kernel.code)
hip_add_exe_to_target(NAME OccupancyTest
                      TEST_SRC ${TEST_SRC}
                      TEST_TARGET_NAME build_tests)

add_dependencies(OccupancyTest simple_kernel)
