include(KernelUtils)

KernelUtils_build_kernels_from_one_source(
    SOURCE isect.comp
    PARAMETERS --target-env vulkan1.0
    OUTPUTS
    "-DRR_OUTPUT_TYPE_FULL_HIT,-DRR_QUERY_TYPE_INTERSECT: flattened_bvh_trace_fh.comp.spv"
    "-DRR_OUTPUT_TYPE_FULL_HIT,-DRR_QUERY_TYPE_INTERSECT,-DRR_TRACE_FLAG_UPDATE_MAX_T: flattened_bvh_trace_fh_t.comp.spv"
    "-DRR_OUTPUT_TYPE_FULL_HIT,-DRR_QUERY_TYPE_INTERSECT,-DRR_TRACE_FLAG_UPDATE_TRUE_HITS_ONLY: flattened_bvh_trace_fh_true_hits.comp.spv"
    "-DRR_QUERY_TYPE_INTERSECT: flattened_bvh_trace_id.comp.spv"
    "-DRR_QUERY_TYPE_INTERSECT,-DRR_TRACE_FLAG_UPDATE_MAX_T: flattened_bvh_trace_id_t.comp.spv"
    "-DRR_QUERY_TYPE_INTERSECT,-DRR_TRACE_FLAG_UPDATE_TRUE_HITS_ONLY: flattened_bvh_trace_id_true_hits.comp.spv"
    "-DRR_QUERY_TYPE_OCCLUDED: flattened_bvh_occluded_id.comp.spv"
    "-DRR_QUERY_TYPE_OCCLUDED,-DRR_TRACE_FLAG_UPDATE_MAX_T: flattened_bvh_occluded_id_t.comp.spv"
    "-DRR_QUERY_TYPE_OCCLUDED,-DRR_TRACE_FLAG_UPDATE_TRUE_HITS_ONLY: flattened_bvh_occluded_id_true_hits.comp.spv"

    "-DRR_OUTPUT_TYPE_FULL_HIT,-DRR_QUERY_TYPE_INTERSECT,-DRR_INDIRECT_KERNEL: flattened_bvh_trace_fh_i.comp.spv"
    "-DRR_OUTPUT_TYPE_FULL_HIT,-DRR_QUERY_TYPE_INTERSECT,-DRR_INDIRECT_KERNEL,-DRR_TRACE_FLAG_UPDATE_MAX_T: flattened_bvh_trace_fh_t_i.comp.spv"
    "-DRR_OUTPUT_TYPE_FULL_HIT,-DRR_QUERY_TYPE_INTERSECT,-DRR_INDIRECT_KERNEL,-DRR_TRACE_FLAG_UPDATE_TRUE_HITS_ONLY: flattened_bvh_trace_fh_true_hits_i.comp.spv"
    "-DRR_QUERY_TYPE_INTERSECT,-DRR_INDIRECT_KERNEL: flattened_bvh_trace_id_i.comp.spv"
    "-DRR_QUERY_TYPE_INTERSECT,-DRR_INDIRECT_KERNEL,-DRR_TRACE_FLAG_UPDATE_MAX_T: flattened_bvh_trace_id_t_i.comp.spv"
    "-DRR_QUERY_TYPE_INTERSECT,-DRR_INDIRECT_KERNEL,-DRR_TRACE_FLAG_UPDATE_TRUE_HITS_ONLY: flattened_bvh_trace_id_true_hits_i.comp.spv"
    "-DRR_QUERY_TYPE_OCCLUDED,-DRR_INDIRECT_KERNEL: flattened_bvh_occluded_id_i.comp.spv"
    "-DRR_QUERY_TYPE_OCCLUDED,-DRR_INDIRECT_KERNEL,-DRR_TRACE_FLAG_UPDATE_MAX_T: flattened_bvh_occluded_id_t_i.comp.spv"
    "-DRR_QUERY_TYPE_OCCLUDED,-DRR_INDIRECT_KERNEL,-DRR_TRACE_FLAG_UPDATE_TRUE_HITS_ONLY: flattened_bvh_occluded_id_true_hits_i.comp.spv"
)

KernelUtils_build_kernels_from_one_source(
    SOURCE isect_2l.comp
    PARAMETERS --target-env vulkan1.0
    OUTPUTS
    "-DRR_OUTPUT_TYPE_FULL_HIT,-DRR_QUERY_TYPE_INTERSECT: scene_bvh_trace_fh.comp.spv"
    "-DRR_OUTPUT_TYPE_FULL_HIT,-DRR_QUERY_TYPE_INTERSECT,-DRR_TRACE_FLAG_UPDATE_MAX_T: scene_bvh_trace_fh_t.comp.spv"
    "-DRR_OUTPUT_TYPE_FULL_HIT,-DRR_QUERY_TYPE_INTERSECT,-DRR_TRACE_FLAG_UPDATE_TRUE_HITS_ONLY: scene_bvh_trace_fh_true_hits.comp.spv"
    "-DRR_QUERY_TYPE_INTERSECT: scene_bvh_trace_id.comp.spv"
    "-DRR_QUERY_TYPE_INTERSECT,-DRR_TRACE_FLAG_UPDATE_MAX_T: scene_bvh_trace_id_t.comp.spv"
    "-DRR_QUERY_TYPE_INTERSECT,-DRR_TRACE_FLAG_UPDATE_TRUE_HITS_ONLY: scene_bvh_trace_id_true_hits.comp.spv"
    "-DRR_QUERY_TYPE_OCCLUDED: scene_bvh_occluded_id.comp.spv"
    "-DRR_QUERY_TYPE_OCCLUDED,-DRR_TRACE_FLAG_UPDATE_MAX_T: scene_bvh_occluded_id_t.comp.spv"
    "-DRR_QUERY_TYPE_OCCLUDED,-DRR_TRACE_FLAG_UPDATE_TRUE_HITS_ONLY: scene_bvh_occluded_id_true_hits.comp.spv"

    "-DRR_OUTPUT_TYPE_FULL_HIT,-DRR_QUERY_TYPE_INTERSECT,-DRR_INDIRECT_KERNEL: scene_bvh_trace_fh_i.comp.spv"
    "-DRR_OUTPUT_TYPE_FULL_HIT,-DRR_QUERY_TYPE_INTERSECT,-DRR_INDIRECT_KERNEL,-DRR_TRACE_FLAG_UPDATE_MAX_T: scene_bvh_trace_fh_t_i.comp.spv"
    "-DRR_OUTPUT_TYPE_FULL_HIT,-DRR_QUERY_TYPE_INTERSECT,-DRR_INDIRECT_KERNEL,-DRR_TRACE_FLAG_UPDATE_TRUE_HITS_ONLY: scene_bvh_trace_fh_true_hits_i.comp.spv"
    "-DRR_QUERY_TYPE_INTERSECT,-DRR_INDIRECT_KERNEL: scene_bvh_trace_id_i.comp.spv"
    "-DRR_QUERY_TYPE_INTERSECT,-DRR_INDIRECT_KERNEL,-DRR_TRACE_FLAG_UPDATE_MAX_T: scene_bvh_trace_id_t_i.comp.spv"
    "-DRR_QUERY_TYPE_INTERSECT,-DRR_INDIRECT_KERNEL,-DRR_TRACE_FLAG_UPDATE_TRUE_HITS_ONLY: scene_bvh_trace_id_true_hits_i.comp.spv"
    "-DRR_QUERY_TYPE_OCCLUDED,-DRR_INDIRECT_KERNEL: scene_bvh_occluded_id_i.comp.spv"
    "-DRR_QUERY_TYPE_OCCLUDED,-DRR_INDIRECT_KERNEL,-DRR_TRACE_FLAG_UPDATE_MAX_T: scene_bvh_occluded_id_t_i.comp.spv"
    "-DRR_QUERY_TYPE_OCCLUDED,-DRR_INDIRECT_KERNEL,-DRR_TRACE_FLAG_UPDATE_TRUE_HITS_ONLY: scene_bvh_occluded_id_true_hits_i.comp.spv"
)
	

KernelUtils_build_kernels(
    SOURCES
    bvh2l_refit.comp
    calc_indirect_params.comp

    prepare_irrgrid_0_write_prim_counts.comp
    prepare_irrgrid_1_resolve_prim_count.comp
    prepare_irrgrid_2_write_bounds.comp
    prepare_irrgrid_3_write_voxel_config.comp

    build_irrgrid_0_write_refs.comp
    build_irrgrid_1_write_args.comp
    build_irrgrid_2_clear_bricks.comp
    build_irrgrid_3_write_bricks.comp
    build_irrgrid_5_clear_voxels.comp
    build_irrgrid_6_write_voxels.comp
    build_irrgrid_7_alloc_prims.comp
    build_irrgrid_9_write_cells.comp
    PARAMETERS --target-env vulkan1.0
)

KernelUtils_build_kernels_from_one_source(
    SOURCE build_irrgrid_4_alloc_voxels.comp
    PARAMETERS --target-env vulkan1.0
    OUTPUTS
    "build_irrgrid_4_alloc_voxels.comp.spv"
    "-DRR_IRREGULAR_GRID: build_irrgrid_4_alloc_voxels_i.comp.spv"
)

KernelUtils_build_kernels_from_one_source(
    SOURCE build_irrgrid_8_write_prims.comp
    PARAMETERS --target-env vulkan1.0
    OUTPUTS
    "build_irrgrid_8_write_prims.comp.spv"
    "-DRR_IRREGULAR_GRID: build_irrgrid_8_write_prims_i.comp.spv"
)

KernelUtils_build_kernels(
    SOURCES
    merge_irrgrid_0_clear_merge_ops.comp
    merge_irrgrid_1_compute_merge_counts.comp
    merge_irrgrid_2_compute_cell_flags.comp
    merge_irrgrid_3_compute_prim_counts.comp
    merge_irrgrid_4_merge_cells.comp
    merge_irrgrid_5_remap_cells.comp

    expand_irrgrid_0_clear_cell_flags.comp
    expand_irrgrid_1_overlap_cells.comp
    expand_irrgrid_2_overlap_prims.comp
    PARAMETERS --target-env vulkan1.0
)

KernelUtils_build_kernels_from_one_source(
    SOURCE isect_irrgrid.comp
	PARAMETERS --target-env vulkan1.0
    OUTPUTS
    "-DRR_OUTPUT_TYPE_FULL_HIT,-DRR_QUERY_TYPE_INTERSECT: grid_trace_fh.comp.spv"
    "-DRR_QUERY_TYPE_INTERSECT: grid_trace_id.comp.spv"
    "-DRR_QUERY_TYPE_OCCLUDED: grid_occluded_id.comp.spv"
    "-DRR_OUTPUT_TYPE_FULL_HIT,-DRR_QUERY_TYPE_INTERSECT,-DRR_INDIRECT_KERNEL: grid_trace_fh_i.comp.spv"
    "-DRR_QUERY_TYPE_INTERSECT,-DRR_INDIRECT_KERNEL: grid_trace_id_i.comp.spv"
    "-DRR_QUERY_TYPE_OCCLUDED,-DRR_INDIRECT_KERNEL: grid_occluded_id_i.comp.spv"

)

# Distribute work
KernelUtils_build_kernels_from_one_source(
    SOURCE isect_irrgrid.comp
    PARAMETERS -DRR_DISTRIBUTE_WORK --target-env vulkan1.0
    OUTPUTS
    "-DRR_OUTPUT_TYPE_FULL_HIT,-DRR_QUERY_TYPE_INTERSECT: grid_trace_fh_d.comp.spv"
    "-DRR_QUERY_TYPE_INTERSECT: grid_trace_id_d.comp.spv"
    "-DRR_QUERY_TYPE_OCCLUDED: grid_occluded_id_d.comp.spv"
    "-DRR_OUTPUT_TYPE_FULL_HIT,-DRR_QUERY_TYPE_INTERSECT,-DRR_INDIRECT_KERNEL: grid_trace_fh_d_i.comp.spv"
    "-DRR_QUERY_TYPE_INTERSECT,-DRR_INDIRECT_KERNEL: grid_trace_id_d_i.comp.spv"
    "-DRR_QUERY_TYPE_OCCLUDED,-DRR_INDIRECT_KERNEL: grid_occluded_id_d_i.comp.spv"

)

# Irregular grid
KernelUtils_build_kernels_from_one_source(
    SOURCE isect_irrgrid.comp
    PARAMETERS -DRR_IRREGULAR_GRID --target-env vulkan1.0
    OUTPUTS
    "-DRR_OUTPUT_TYPE_FULL_HIT,-DRR_QUERY_TYPE_INTERSECT: irrgrid_trace_fh.comp.spv"
    "-DRR_QUERY_TYPE_INTERSECT: irrgrid_trace_id.comp.spv"
    "-DRR_QUERY_TYPE_OCCLUDED: irrgrid_occluded_id.comp.spv"
    "-DRR_OUTPUT_TYPE_FULL_HIT,-DRR_QUERY_TYPE_INTERSECT,-DRR_INDIRECT_KERNEL: irrgrid_trace_fh_i.comp.spv"
    "-DRR_QUERY_TYPE_INTERSECT,-DRR_INDIRECT_KERNEL: irrgrid_trace_id_i.comp.spv"
    "-DRR_QUERY_TYPE_OCCLUDED,-DRR_INDIRECT_KERNEL: irrgrid_occluded_id_i.comp.spv"

)

# Irregular grid, distribute work
KernelUtils_build_kernels_from_one_source(
    SOURCE isect_irrgrid.comp
    PARAMETERS -DRR_IRREGULAR_GRID -DRR_DISTRIBUTE_WORK --target-env vulkan1.0
    OUTPUTS
    "-DRR_OUTPUT_TYPE_FULL_HIT,-DRR_QUERY_TYPE_INTERSECT: irrgrid_trace_fh_d.comp.spv"
    "-DRR_QUERY_TYPE_INTERSECT: irrgrid_trace_id_d.comp.spv"
    "-DRR_QUERY_TYPE_OCCLUDED: irrgrid_occluded_id_d.comp.spv"
    "-DRR_OUTPUT_TYPE_FULL_HIT,-DRR_QUERY_TYPE_INTERSECT,-DRR_INDIRECT_KERNEL: irrgrid_trace_fh_d_i.comp.spv"
    "-DRR_QUERY_TYPE_INTERSECT,-DRR_INDIRECT_KERNEL: irrgrid_trace_id_d_i.comp.spv"
    "-DRR_QUERY_TYPE_OCCLUDED,-DRR_INDIRECT_KERNEL: irrgrid_occluded_id_d_i.comp.spv"

)

# Parallel primitives
KernelUtils_build_kernels(
    SOURCES
    pprims_reduce_min.comp
    pprims_reduce_min_part.comp
    pprims_reduce_max.comp
    pprims_reduce_max_part.comp

    pprims_scan_exclusive_add.comp
    pprims_scan_exclusive_add_part.comp
    pprims_scan_exclusive_add_distribute.comp

    pprims_segsort_copy_blocks.comp
    pprims_segsort_init_op_counters.comp
    pprims_segsort_merge_blocks.comp
    pprims_segsort_partition_blocks.comp
    pprims_segsort_sort_blocks.comp
    pprims_segsort_write_num_groups.comp
    pprims_segsort_write_op_count.comp
    PARAMETERS --target-env vulkan1.0
)

# sort group histograms
KernelUtils_build_kernels_from_one_source(
    SOURCE radix_sort_group_histograms.comp
    PARAMETERS -DPP_GROUP_SIZE=128 --target-env vulkan1.0
    OUTPUTS
    "-DPP_KEYS_PER_THREAD=8: radix_sort_group_histograms.comp.spv"
    "-DPP_KEYS_PER_THREAD=4: radix_sort_group_histograms_amd.comp.spv"
    "-DPP_KEYS_PER_THREAD=8: radix_sort_group_histograms_nv.comp.spv"
)

# sort scatter keys
KernelUtils_build_kernels_from_one_source(
    SOURCE radix_sort_scatter_keys.comp
    PARAMETERS -DPP_GROUP_SIZE=128 --target-env vulkan1.0
    OUTPUTS
    "-DPP_KEYS_PER_THREAD=8,-DPP_KEYVAL_SORT: radix_sort_scatter_keys_and_values.comp.spv"
)

# sort scatter keys
KernelUtils_build_kernels_from_one_source(
    SOURCE radix_sort_scatter_keys.comp
    PARAMETERS -DPP_GROUP_SIZE=128 --target-env vulkan1.1
    OUTPUTS
    "-DPP_KEYS_PER_THREAD=4,-DPP_USE_SUBGROUP_OPS,-DPP_USE_AMD_SHADER_BALLOT: radix_sort_scatter_keys_amd.comp.spv"
    "-DPP_KEYS_PER_THREAD=4,-DPP_USE_SUBGROUP_OPS,-DPP_USE_AMD_SHADER_BALLOT,-DPP_KEYVAL_SORT: radix_sort_scatter_keys_and_values_amd.comp.spv"
    "-DPP_KEYS_PER_THREAD=8,-DPP_USE_SUBGROUP_OPS,-DPP_USE_NV_SHADER_SUBGROUP_PARTITIONED: radix_sort_scatter_keys_nv.comp.spv"
    "-DPP_KEYS_PER_THREAD=8,-DPP_USE_SUBGROUP_OPS,-DPP_USE_NV_SHADER_SUBGROUP_PARTITIONED,-DPP_KEYVAL_SORT: radix_sort_scatter_keys_and_values_nv.comp.spv"
)

# scan exlusive addgit
KernelUtils_build_kernels_from_one_source(
    SOURCE scan_exclusive_add.comp
    PARAMETERS --target-env vulkan1.1
    OUTPUTS
    "-DPP_USE_SUBGROUP_OPS,-DPP_USE_NV_SHADER_SUBGROUP_PARTITIONED,-DPP_KEYS_PER_THREAD=3,-DPP_GROUP_SIZE=128: scan_exclusive_add_nv.comp.spv"
)
# scan exlusive add
KernelUtils_build_kernels_from_one_source(
    SOURCE scan_exclusive_add.comp
    PARAMETERS --target-env vulkan1.0
    OUTPUTS
    "-DPP_KEYS_PER_THREAD=2,-DPP_GROUP_SIZE=256: scan_exclusive_add.comp.spv"
    "-DPP_USE_SUBGROUP_OPS,-DPP_USE_AMD_SHADER_BALLOT,-DPP_KEYS_PER_THREAD=5,-DPP_GROUP_SIZE=256: scan_exclusive_add_amd.comp.spv"
    "-DPP_USE_SUBGROUP_OPS,-DPP_USE_AMD_SHADER_BALLOT,-DPP_KEYS_PER_THREAD=5,-DPP_GROUP_SIZE=256: scan_exclusive_add_amd_vega.comp.spv"
    "-DPP_USE_SUBGROUP_OPS,-DPP_USE_AMD_SHADER_BALLOT,-DPP_KEYS_PER_THREAD=4,-DPP_GROUP_SIZE=128: scan_exclusive_add_amd_fiji.comp.spv"
)

# scan exclusive add group reduce
KernelUtils_build_kernels_from_one_source(
    SOURCE scan_exclusive_add_group_reduce.comp
    PARAMETERS --target-env vulkan1.0
    OUTPUTS
    "-DPP_KEYS_PER_THREAD=2,-DPP_GROUP_SIZE=256: scan_exclusive_add_group_reduce.comp.spv"
    "-DPP_USE_SUBGROUP_OPS,-DPP_USE_AMD_SHADER_BALLOT,-DPP_KEYS_PER_THREAD=5,-DPP_GROUP_SIZE=256: scan_exclusive_add_group_reduce_amd.comp.spv"
    "-DPP_USE_SUBGROUP_OPS,-DPP_USE_AMD_SHADER_BALLOT,-DPP_KEYS_PER_THREAD=5,-DPP_GROUP_SIZE=256: scan_exclusive_add_group_reduce_amd_vega.comp.spv"
    "-DPP_USE_SUBGROUP_OPS,-DPP_USE_AMD_SHADER_BALLOT,-DPP_KEYS_PER_THREAD=4,-DPP_GROUP_SIZE=128: scan_exclusive_add_group_reduce_amd_fiji.comp.spv"
)

# scan exclusive add group reduce
KernelUtils_build_kernels_from_one_source(
    SOURCE scan_exclusive_add_group_reduce.comp
    PARAMETERS --target-env vulkan1.1
    OUTPUTS
    "-DPP_USE_SUBGROUP_OPS,-DPP_USE_NV_SHADER_SUBGROUP_PARTITIONED,-DPP_KEYS_PER_THREAD=3,-DPP_GROUP_SIZE=128: scan_exclusive_add_group_reduce_nv.comp.spv"
)

# lbvh kernels
KernelUtils_build_kernels(
    SOURCES
    lbvh_calc_morton_codes.comp
    lbvh_calc_morton_codes_mesh.comp
    lbvh_emit_hierarchy.comp
    lbvh_emit_hierarchy_mesh.comp
    lbvh_fit_aabb.comp
    lbvh_fit_aabb_mesh.comp
    lbvh_mesh_optimize.comp
    lbvh_mesh_clear.comp
    lbvh_calc_mesh_aabb.comp
    lbvh_calc_flatten_aabb.comp
    lbvh_calc_morton_codes_flatten.comp
    lbvh_fit_aabb_flatten.comp
    lbvh_emit_hierarchy_flatten.comp
    PARAMETERS -DRR_GROUP_SIZE=128 --target-env vulkan1.1
)

# lbvh kernels
KernelUtils_build_kernels(
    SOURCES
    lbvh_calc_scene_aabb.comp
    PARAMETERS -DRR_GROUP_SIZE=256 --target-env vulkan1.1
)

KernelUtils_add_build_kernel_target(RadeonRaysNext)
