# This file is part of the FidelityFX SDK.
# 
# Copyright (C) 2024 Advanced Micro Devices, Inc.
# 
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files(the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and /or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions :
# 
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
# 
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.

if(NOT ${FFX_API_VK})
    return()
endif()

#include CMake custom command generator functions for compiling shaders.
include("${FFX_GPU_PATH}/CMakeCompileShaders.txt")

function (CheckVulkanSDKVersion)
    # set the desired version
    set(vulkan_min_version "1.3.250")

    if (${Vulkan_VERSION} VERSION_LESS ${vulkan_min_version})
        message(FATAL_ERROR "Vulkan SDK ${vulkan_min_version} or above is required. Found Vulkan SDK ${Vulkan_VERSION}")
    endif()
endfunction()

find_package(Vulkan REQUIRED)
CheckVulkanSDKVersion()

set(PUBLIC_SHADERS "")
set(PRIVATE_SHADERS "")

file(GLOB PRIVATE_SOURCE
    "${FFX_SHARED_PATH}/ffx_assert.cpp"
	"${FFX_SHARED_PATH}/ffx_message.cpp"
    "${FFX_SHARED_PATH}/ffx_breadcrumbs_list.h"
    "${FFX_SHARED_PATH}/ffx_breadcrumbs_list.cpp"
	"${FFX_SRC_BACKENDS_PATH}/shared/*.h"
	"${FFX_SRC_BACKENDS_PATH}/shared/*.cpp"
	"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/"
	"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/"
    "${CMAKE_CURRENT_SOURCE_DIR}/*.h"
    "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp"
    "${CMAKE_CURRENT_SOURCE_DIR}/FrameInterpolationSwapchain/*.h"
    "${CMAKE_CURRENT_SOURCE_DIR}/FrameInterpolationSwapchain/*.cpp"
)

if (FFX_FSR1 OR FFX_ALL)
	set(FFX_FSR1_PRIVATE_SOURCE
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_fsr1_shaderblobs.h"
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_fsr1_shaderblobs.cpp")
	list(APPEND PRIVATE_SOURCE ${FFX_FSR1_PRIVATE_SOURCE})
	
	# Add shaders for FSR1
	
	file(GLOB FFX_FSR1_PRIVATE_SHADERS
		"${CMAKE_CURRENT_SOURCE_DIR}/shaders/fsr1/*.glsl")
	list(APPEND PRIVATE_SHADERS ${FFX_FSR1_PRIVATE_SHADERS})
	
	file(GLOB FFX_FSR1_PUBLIC_SHADERS
		"${FFX_GPU_PATH}/fsr1/*.h"
		"${FFX_GPU_PATH}/fsr1/*.glsl")
	list(APPEND PUBLIC_SHADERS ${FFX_FSR1_PUBLIC_SHADERS})
endif()

if (FFX_FSR2 OR FFX_ALL)
	set(FFX_FSR2_PRIVATE_SOURCE
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_fsr2_shaderblobs.h"
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_fsr2_shaderblobs.cpp")
	list(APPEND PRIVATE_SOURCE ${FFX_FSR2_PRIVATE_SOURCE})
	
	# Add shaders for FSR2
	
	file(GLOB FFX_FSR2_PRIVATE_SHADERS
		"${CMAKE_CURRENT_SOURCE_DIR}/shaders/fsr2/*.glsl")
	list(APPEND PRIVATE_SHADERS ${FFX_FSR2_PRIVATE_SHADERS})
	
	file(GLOB FFX_FSR2_PUBLIC_SHADERS
		"${FFX_GPU_PATH}/fsr2/*.h"
		"${FFX_GPU_PATH}/fsr2/*.glsl")
	list(APPEND PUBLIC_SHADERS ${FFX_FSR2_PUBLIC_SHADERS})
endif()

if (FFX_FSR3UPSCALER OR FFX_ALL)
	set(FFX_FSR3UPSCALER_PRIVATE_SOURCE
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_fsr3upscaler_shaderblobs.h"
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_fsr3upscaler_shaderblobs.cpp")
	list(APPEND PRIVATE_SOURCE ${FFX_FSR3UPSCALER_PRIVATE_SOURCE})
	
	# Add shaders for FSR3UPSCALER
	
	file(GLOB FFX_FSR3UPSCALER_PRIVATE_SHADERS
		"${CMAKE_CURRENT_SOURCE_DIR}/shaders/fsr3upscaler/*.glsl")
	list(APPEND PRIVATE_SHADERS ${FFX_FSR3UPSCALER_PRIVATE_SHADERS})
	
	file(GLOB FFX_FSR3UPSCALER_PUBLIC_SHADERS
		"${FFX_GPU_PATH}/fsr3upscaler/*.h"
		"${FFX_GPU_PATH}/fsr3upscaler/*.glsl")
	list(APPEND PUBLIC_SHADERS ${FFX_FSR3UPSCALER_PUBLIC_SHADERS})
endif()

if (FFX_FI OR FFX_ALL)
	set(FFX_FI_PRIVATE_SOURCE
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_frameinterpolation_shaderblobs.h"
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_frameinterpolation_shaderblobs.cpp")
	list(APPEND PRIVATE_SOURCE ${FFX_FI_PRIVATE_SOURCE})
	
	# Add shaders for Frame Interpolation
	
	file(GLOB FFX_FI_PRIVATE_SHADERS
		"${CMAKE_CURRENT_SOURCE_DIR}/shaders/frameinterpolation/*.glsl")
	list(APPEND PRIVATE_SHADERS ${FFX_FI_PRIVATE_SHADERS})
	
	file(GLOB FFX_FI_PUBLIC_SHADERS
		"${FFX_GPU_PATH}/frameinterpolation/*.h"
		"${FFX_GPU_PATH}/frameinterpolation/*.glsl")
	list(APPEND PUBLIC_SHADERS ${FFX_FI_PUBLIC_SHADERS})
endif()

if (FFX_OF OR FFX_ALL)
	set(FFX_OF_PRIVATE_SOURCE
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_opticalflow_shaderblobs.h"
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_opticalflow_shaderblobs.cpp")
	list(APPEND PRIVATE_SOURCE ${FFX_OF_PRIVATE_SOURCE})
	
	# Add shaders for Optical Flow
	
	file(GLOB FFX_OF_PRIVATE_SHADERS
		"${CMAKE_CURRENT_SOURCE_DIR}/shaders/opticalflow/*.glsl")
	list(APPEND PRIVATE_SHADERS ${FFX_OF_PRIVATE_SHADERS})
	
	file(GLOB FFX_OF_PUBLIC_SHADERS
		"${FFX_GPU_PATH}/opticalflow/*.h"
		"${FFX_GPU_PATH}/opticalflow/*.glsl")
	list(APPEND PUBLIC_SHADERS ${FFX_OF_PUBLIC_SHADERS})
endif()

if (FFX_SPD OR FFX_ALL)
	set(FFX_SPD_PRIVATE_SOURCE
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_spd_shaderblobs.h"
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_spd_shaderblobs.cpp")
	list(APPEND PRIVATE_SOURCE ${FFX_SPD_PRIVATE_SOURCE})
	
	# Add shaders for SPD
	
	file(GLOB FFX_SPD_PRIVATE_SHADERS
		"${CMAKE_CURRENT_SOURCE_DIR}/shaders/spd/*.glsl")
	list(APPEND PRIVATE_SHADERS ${FFX_SPD_PRIVATE_SHADERS})
	
	file(GLOB FFX_SPD_PUBLIC_SHADERS
		"${FFX_GPU_PATH}/spd/*.h"
		"${FFX_GPU_PATH}/spd/*.glsl")
	list(APPEND PUBLIC_SHADERS ${FFX_SPD_PUBLIC_SHADERS})	
endif()

if (FFX_CACAO OR FFX_ALL)
	set(FFX_CACAO_PRIVATE_SOURCE
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_cacao_shaderblobs.h"
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_cacao_shaderblobs.cpp")
	list(APPEND PRIVATE_SOURCE ${FFX_CACAO_PRIVATE_SOURCE})
	
	# Add shaders for CACAO
	
	file(GLOB FFX_CACAO_PRIVATE_SHADERS
		"${CMAKE_CURRENT_SOURCE_DIR}/shaders/cacao/*.glsl")
	list(APPEND PRIVATE_SHADERS ${FFX_CACAO_PRIVATE_SHADERS})
	
	file(GLOB FFX_CACAO_PUBLIC_SHADERS
		"${FFX_GPU_PATH}/cacao/*.h"
		"${FFX_GPU_PATH}/cacao/*.glsl")
	list(APPEND PUBLIC_SHADERS ${FFX_CACAO_PUBLIC_SHADERS})
endif()

if (FFX_LPM OR FFX_ALL)
	set(FFX_LPM_PRIVATE_SOURCE
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_lpm_shaderblobs.h"
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_lpm_shaderblobs.cpp")
	list(APPEND PRIVATE_SOURCE ${FFX_LPM_PRIVATE_SOURCE})
	
	# Add shaders for LPM
	
	file(GLOB FFX_LPM_PRIVATE_SHADERS
		"${CMAKE_CURRENT_SOURCE_DIR}/shaders/lpm/*.glsl")
	list(APPEND PRIVATE_SHADERS ${FFX_LPM_PRIVATE_SHADERS})
	
	file(GLOB FFX_LPM_PUBLIC_SHADERS
		"${FFX_GPU_PATH}/lpm/*.h"
		"${FFX_GPU_PATH}/lpm/*.glsl")
	list(APPEND PUBLIC_SHADERS ${FFX_LPM_PUBLIC_SHADERS})
endif()

if (FFX_BLUR OR FFX_ALL)
	set(FFX_BLUR_PRIVATE_SOURCE
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_blur_shaderblobs.h"
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_blur_shaderblobs.cpp")
	list(APPEND PRIVATE_SOURCE ${FFX_BLUR_PRIVATE_SOURCE})
	
	# Add shaders for BLUR
	
	file(GLOB FFX_BLUR_PRIVATE_SHADERS
		"${CMAKE_CURRENT_SOURCE_DIR}/shaders/blur/*.glsl")
	list(APPEND PRIVATE_SHADERS ${FFX_BLUR_PRIVATE_SHADERS})
	
	file(GLOB FFX_BLUR_PUBLIC_SHADERS
		"${FFX_GPU_PATH}/blur/*.h"
		"${FFX_GPU_PATH}/blur/*.glsl")
	list(APPEND PUBLIC_SHADERS ${FFX_BLUR_PUBLIC_SHADERS})
endif()

if (FFX_VRS OR FFX_ALL)
	set(FFX_VRS_PRIVATE_SOURCE
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_vrs_shaderblobs.h"
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_vrs_shaderblobs.cpp")
	list(APPEND PRIVATE_SOURCE ${FFX_VRS_PRIVATE_SOURCE})
	
	# Add shaders for VRS
	
	file(GLOB FFX_VRS_PRIVATE_SHADERS
		"${CMAKE_CURRENT_SOURCE_DIR}/shaders/vrs/*.glsl")
	list(APPEND PRIVATE_SHADERS ${FFX_VRS_PRIVATE_SHADERS})
	
	file(GLOB FFX_VRS_PUBLIC_SHADERS
		"${FFX_GPU_PATH}/vrs/*.h"
		"${FFX_GPU_PATH}/vrs/*.glsl")
	list(APPEND PUBLIC_SHADERS ${FFX_VRS_PUBLIC_SHADERS})
endif()

if (FFX_CAS OR FFX_ALL)
	set(FFX_CAS_PRIVATE_SOURCE
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_cas_shaderblobs.h"
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_cas_shaderblobs.cpp")
	list(APPEND PRIVATE_SOURCE ${FFX_CAS_PRIVATE_SOURCE})
	
	# Add shaders for CAS
	
	file(GLOB FFX_CAS_PRIVATE_SHADERS
		"${CMAKE_CURRENT_SOURCE_DIR}/shaders/cas/*.glsl")
	list(APPEND PRIVATE_SHADERS ${FFX_CAS_PRIVATE_SHADERS})
	
	file(GLOB FFX_CAS_PUBLIC_SHADERS
		"${FFX_GPU_PATH}/cas/*.h"
		"${FFX_GPU_PATH}/cas/*.glsl")
	list(APPEND PUBLIC_SHADERS ${FFX_CAS_PUBLIC_SHADERS})
endif()

if (FFX_DOF OR FFX_ALL)
	set(FFX_DOF_PRIVATE_SOURCE
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_dof_shaderblobs.h"
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_dof_shaderblobs.cpp")
	list(APPEND PRIVATE_SOURCE ${FFX_DOF_PRIVATE_SOURCE})
	
	# Add shaders for DOF
	
	file(GLOB FFX_DOF_PRIVATE_SHADERS
		"${CMAKE_CURRENT_SOURCE_DIR}/shaders/dof/*.glsl")
	list(APPEND PRIVATE_SHADERS ${FFX_DOF_PRIVATE_SHADERS})
	
	file(GLOB FFX_DOF_PUBLIC_SHADERS
		"${FFX_GPU_PATH}/dof/*.h"
		"${FFX_GPU_PATH}/dof/*.glsl")
	list(APPEND PUBLIC_SHADERS ${FFX_DOF_PUBLIC_SHADERS})
endif()

if (FFX_LENS OR FFX_ALL)
	set(FFX_LENS_PRIVATE_SOURCE
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_lens_shaderblobs.h"
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_lens_shaderblobs.cpp")
	list(APPEND PRIVATE_SOURCE ${FFX_LENS_PRIVATE_SOURCE})
	
	# Add shaders for LENS
	
	file(GLOB FFX_LENS_PRIVATE_SHADERS
		"${CMAKE_CURRENT_SOURCE_DIR}/shaders/lens/*.glsl")
	list(APPEND PRIVATE_SHADERS ${FFX_LENS_PRIVATE_SHADERS})
	
	file(GLOB FFX_LENS_PUBLIC_SHADERS
		"${FFX_GPU_PATH}/lens/*.h"
		"${FFX_GPU_PATH}/lens/*.glsl")
	list(APPEND PUBLIC_SHADERS ${FFX_LENS_PUBLIC_SHADERS})
endif()

if (FFX_PARALLEL_SORT OR FFX_ALL)
	set(FFX_PARALLEL_SORT_PRIVATE_SOURCE
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_parallelsort_shaderblobs.h"
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_parallelsort_shaderblobs.cpp")
	list(APPEND PRIVATE_SOURCE ${FFX_PARALLEL_SORT_PRIVATE_SOURCE})
	
	# Add shaders for PARALLEL_SORT
	
	file(GLOB FFX_PARALLEL_SORT_PRIVATE_SHADERS
		"${CMAKE_CURRENT_SOURCE_DIR}/shaders/parallelsort/*.glsl")
	list(APPEND PRIVATE_SHADERS ${FFX_PARALLEL_SORT_PRIVATE_SHADERS})
	
	file(GLOB FFX_PARALLEL_SORT_PUBLIC_SHADERS
		"${FFX_GPU_PATH}/parallelsort/*.h"
		"${FFX_GPU_PATH}/parallelsort/*.glsl")
	list(APPEND PUBLIC_SHADERS ${FFX_PARALLEL_SORT_PUBLIC_SHADERS})
endif()

if (FFX_DENOISER OR FFX_ALL)
	set(FFX_DENOISER_PRIVATE_SOURCE
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_denoiser_shaderblobs.h"
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_denoiser_shaderblobs.cpp")
	list(APPEND PRIVATE_SOURCE ${FFX_DENOISER_PRIVATE_SOURCE})
	
	# Add shaders for DENOISER
	
	file(GLOB FFX_DENOISER_PRIVATE_SHADERS
		"${CMAKE_CURRENT_SOURCE_DIR}/shaders/denoiser/*.glsl")
	list(APPEND PRIVATE_SHADERS ${FFX_DENOISER_PRIVATE_SHADERS})
	
	file(GLOB FFX_DENOISER_SORT_PUBLIC_SHADERS
		"${FFX_GPU_PATH}/denoiser/*.h"
		"${FFX_GPU_PATH}/denoiser/*.glsl")
	list(APPEND PUBLIC_SHADERS ${FFX_DENOISER_SORT_PUBLIC_SHADERS})
endif()

if (FFX_CLASSIFIER OR FFX_ALL)
	set(FFX_CLASSIFIER_PRIVATE_SOURCE
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_classifier_shaderblobs.h"
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_classifier_shaderblobs.cpp")
	list(APPEND PRIVATE_SOURCE ${FFX_CLASSIFIER_PRIVATE_SOURCE})
	
	# Add shaders for CLASSIFIER
	
	file(GLOB FFX_CLASSIFIER_PRIVATE_SHADERS
		"${CMAKE_CURRENT_SOURCE_DIR}/shaders/classifier/*.glsl")
	list(APPEND PRIVATE_SHADERS ${FFX_CLASSIFIER_PRIVATE_SHADERS})
	
	file(GLOB FFX_CLASSIFIER_PUBLIC_SHADERS
		"${FFX_GPU_PATH}/classifier/*.h"
		"${FFX_GPU_PATH}/classifier/*.glsl")
	list(APPEND PUBLIC_SHADERS ${FFX_CLASSIFIER_PUBLIC_SHADERS})
endif()

if (FFX_SSSR OR FFX_ALL)
	set(FFX_SSSR_PRIVATE_SOURCE
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_sssr_shaderblobs.h"
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_sssr_shaderblobs.cpp"
	)
	list(APPEND PRIVATE_SOURCE ${FFX_SSSR_PRIVATE_SOURCE})
	
	# Add shaders for SSSR
	
	file(GLOB FFX_SSSR_PRIVATE_SHADERS
		"${CMAKE_CURRENT_SOURCE_DIR}/shaders/sssr/*.glsl")
	list(APPEND PRIVATE_SHADERS ${FFX_SSSR_PRIVATE_SHADERS})
	
	file(GLOB FFX_SSSR_PUBLIC_SHADERS
		"${FFX_GPU_PATH}/sssr/*.h"
		"${FFX_GPU_PATH}/sssr/*.glsl")
	list(APPEND PUBLIC_SHADERS ${FFX_SSSR_PUBLIC_SHADERS})
endif()

if (FFX_BRIXELIZER OR FFX_ALL)
	set(FFX_BRIXELIZER_PRIVATE_SOURCE
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_brixelizer_shaderblobs.h"
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_brixelizer_shaderblobs.cpp")
	list(APPEND PRIVATE_SOURCE ${FFX_BRIXELIZER_PRIVATE_SOURCE})

	# Add shaders for Brixelizer

	file(GLOB FFX_BRIXELIZER_PRIVATE_SHADERS
		"${CMAKE_CURRENT_SOURCE_DIR}/shaders/brixelizer/*.glsl")
	list(APPEND PRIVATE_SHADERS ${FFX_BRIXELIZER_PRIVATE_SHADERS})

	file(GLOB FFX_BRIXELIZER_PUBLIC_SHADERS
		"${FFX_GPU_PATH}/brixelizer/*.h"
		"${FFX_GPU_PATH}/brixelizer/*.glsl")
	list(APPEND PUBLIC_SHADERS ${FFX_BRIXELIZER_PUBLIC_SHADERS})
endif()

if (FFX_BRIXELIZER_GI OR FFX_ALL)
	set(FFX_BRIXELIZER_GI_PRIVATE_SOURCE
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_brixelizergi_shaderblobs.h"
		"${FFX_SRC_BACKENDS_PATH}/shared/blob_accessors/ffx_brixelizergi_shaderblobs.cpp")
	list(APPEND PRIVATE_SOURCE ${FFX_BRIXELIZER_GI_PRIVATE_SOURCE})

	# Add shaders for Brixelizer GI

	file(GLOB FFX_BRIXELIZER_GI_PRIVATE_SHADERS
		"${CMAKE_CURRENT_SOURCE_DIR}/shaders/brixelizergi/*.glsl")
	list(APPEND PRIVATE_SHADERS ${FFX_BRIXELIZER_GI_PRIVATE_SHADERS})

	file(GLOB FFX_BRIXELIZER_GI_PUBLIC_SHADERS
		"${FFX_GPU_PATH}/brixelizergi/*.h"
		"${FFX_GPU_PATH}/brixelizergi/*.glsl")
	list(APPEND PUBLIC_SHADERS ${FFX_BRIXELIZER_GI_PUBLIC_SHADERS})
endif()

file(GLOB_RECURSE PUBLIC_SOURCE
    "${FFX_HOST_BACKENDS_PATH}/vk/*.h")

if (FFX_BUILD_AS_DLL)
    add_library(ffx_backend_vk_${FFX_PLATFORM_NAME} SHARED ${PRIVATE_SOURCE} ${PUBLIC_SOURCE} ${PRIVATE_SHADERS} ${PUBLIC_SHADERS})
else()
    add_library(ffx_backend_vk_${FFX_PLATFORM_NAME} STATIC ${PRIVATE_SOURCE} ${PUBLIC_SOURCE} ${PRIVATE_SHADERS} ${PUBLIC_SHADERS})
endif()

# vk backend source
source_group("private_source"  FILES ${PRIVATE_SOURCE})
source_group("public_source"   FILES ${PUBLIC_SOURCE})
source_group("private_shaders" FILES ${PRIVATE_SHADERS})
source_group("public_shaders"  FILES ${PUBLIC_SHADERS})

get_filename_component(FFX_PASS_SHADER_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/../shaders/vk ABSOLUTE)

target_include_directories(ffx_backend_vk_${FFX_PLATFORM_NAME} PUBLIC ${FFX_INCLUDE_PATH})
target_include_directories(ffx_backend_vk_${FFX_PLATFORM_NAME} PUBLIC ${FFX_LIB_PATH})
target_include_directories(ffx_backend_vk_${FFX_PLATFORM_NAME} PUBLIC ${FFX_PASS_SHADER_OUTPUT_PATH})
target_include_directories(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE ${FFX_COMPONENTS_PATH})
target_include_directories(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE ${FFX_SHARED_PATH})
target_include_directories(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE "${FFX_SRC_BACKENDS_PATH}/shared")
target_include_directories(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE ${FFX_PASS_SHADER_OUTPUT_PATH})

target_link_libraries(ffx_backend_vk_${FFX_PLATFORM_NAME} "Vulkan::Vulkan")

set_source_files_properties(${PRIVATE_SHADERS} PROPERTIES HEADER_FILE_ONLY TRUE)
set_source_files_properties(${PUBLIC_SHADERS} PROPERTIES HEADER_FILE_ONLY TRUE)

file(MAKE_DIRECTORY ${FFX_PASS_SHADER_OUTPUT_PATH})

if (FFX_AUTO_COMPILE_SHADERS)
    set(FFX_SC_DEPENDENT_TARGET ffx_backend_vk_${FFX_PLATFORM_NAME})
else()
    set(FFX_SC_DEPENDENT_TARGET ffx_backend_vk_shaders_${FFX_PLATFORM_NAME})
    add_custom_target(${FFX_SC_DEPENDENT_TARGET})
    #add_dependencies(ffx_backend_vk_${FFX_PLATFORM_NAME} ${FFX_SC_DEPENDENT_TARGET})
endif()

if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.20.0")
	cmake_policy(SET CMP0116 OLD)
endif()

# add pass shaders for all the components
if (FFX_FSR1 OR FFX_ALL)
	target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_FSR1)
    include (CMakeShadersFSR1.txt)
endif()

if (FFX_FSR2 OR FFX_ALL)
	target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_FSR2)
	include (CMakeShadersFSR2.txt)
endif()

if (FFX_FSR3 OR FFX_ALL)
	target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_FSR3)
endif()

if (FFX_FSR3UPSCALER OR FFX_ALL)
	target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_FSR3UPSCALER)
	include (CMakeShadersFSR3Upscaler.txt)
endif()

if (FFX_FI OR FFX_ALL)
	target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_FI)
	include (CMakeShadersFrameinterpolation.txt)
endif()

if (FFX_OF OR FFX_ALL)
	target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_OF)
	include (CMakeShadersOpticalflow.txt)
endif()

if (FFX_SPD OR FFX_ALL)
	target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_SPD)
	include (CMakeShadersSPD.txt)
endif()

if (FFX_CACAO OR FFX_ALL)
	target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_CACAO)
	include (CMakeShadersCACAO.txt)
endif()

if (FFX_LPM OR FFX_ALL)
target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_LPM)
	include (CMakeShadersLPM.txt)
endif()

if (FFX_BLUR OR FFX_ALL)
	target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_BLUR)
	include (CMakeShadersBlur.txt)
endif()

if (FFX_VRS OR FFX_ALL)
	target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_VRS)
	include (CMakeShadersVRS.txt)
endif()

if (FFX_CAS OR FFX_ALL)
	target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_CAS)
	include (CMakeShadersCAS.txt)
endif()

if (FFX_DOF OR FFX_ALL)
	target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_DOF)
	include (CMakeShadersDOF.txt)
endif()

if (FFX_LENS OR FFX_ALL)
	target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_LENS)
	include (CMakeShadersLENS.txt)
endif()

if (FFX_PARALLEL_SORT OR FFX_ALL)
	target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_PARALLEL_SORT)
	include (CMakeShadersParallelSort.txt)
endif()

if (FFX_DENOISER OR FFX_ALL)
	target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_DENOISER)
	include (CMakeShadersDenoiser.txt)
endif()

if (FFX_CLASSIFIER OR FFX_ALL)
	target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_CLASSIFIER)
	include (CMakeShadersClassifier.txt)
endif()

if (FFX_SSSR OR FFX_ALL)
	target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_SSSR)
	include (CMakeShadersSSSR.txt)
endif()

if (FFX_BREADCRUMBS OR FFX_ALL)
	target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_BREADCRUMBS)
endif()

if (FFX_BRIXELIZER OR FFX_ALL)
	target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_BRIXELIZER)
	include (CMakeShadersBrixelizer.txt)
endif()

if (FFX_BRIXELIZER_GI OR FFX_ALL)
	target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_BRIXELIZER_GI)
	include (CMakeShadersBrixelizerGI.txt)
endif()

if (FFX_CLASSIFIER OR FFX_ALL)
    target_compile_definitions(ffx_backend_vk_${FFX_PLATFORM_NAME} PRIVATE FFX_CLASSIFIER)
    include (CMakeShadersClassifier.txt)
endif()

add_custom_target(ffx_shader_permutations_vk DEPENDS ${FFX_SC_PERMUTATION_OUTPUTS})
add_dependencies(${FFX_SC_DEPENDENT_TARGET} ffx_shader_permutations_vk)

# Make sure shader builds are a dependency of the backend
add_dependencies(ffx_backend_vk_${FFX_PLATFORM_NAME} ffx_shader_permutations_vk)

# Add to solution folder.
set_target_properties(ffx_backend_vk_${FFX_PLATFORM_NAME} PROPERTIES FOLDER Backends)
set_target_properties(ffx_shader_permutations_vk PROPERTIES FOLDER Backends)
