function(add_compute_shaders target)
	cmake_parse_arguments(PARSE_ARGV 1 arg "" "" "SOURCES")

	set(spvfiles "")

	foreach(source ${arg_SOURCES})
		get_filename_component(base ${source} NAME_WE)

		set(outfile ${CMAKE_CURRENT_BINARY_DIR}/${base}.spv)
		set(spvfiles ${spvfiles} ${outfile})

		add_custom_command(
			OUTPUT ${outfile}
			DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${source}
			COMMENT "Compile shader ${base}"
			COMMAND ${Vulkan_GLSLC_EXECUTABLE} --target-env=vulkan1.0 -c ${CMAKE_CURRENT_SOURCE_DIR}/${source} -g -o ${outfile})

		install(FILES ${outfile} DESTINATION share/ngscopeclient/shaders)

	endforeach()

	add_custom_target(${target}
		COMMAND ${CMAKE_COMMAND} -E true
		SOURCES ${spvfiles}
	)

endfunction()

add_compute_shaders(
	protocolshaders
	SOURCES
		ACRMS.glsl
		ACRMS_Trend.glsl
		AddFilter.glsl
		BaseMeasurement_FirstPass.glsl
		BaseMeasurement_FinalPass.glsl
		BlackmanHarrisWindow.glsl
		ClipFilter.glsl
		ClockRecoveryPLL_FirstPass.glsl
		ClockRecoveryPLL_SecondPass.glsl
		ClockRecoveryPLL_FinalPass.glsl
		ComplexBlackmanHarrisWindow.glsl
		ComplexCosineSumWindow.glsl
		ComplexRectangularWindow.glsl
		ComplexSpectrogramPostprocess.glsl
		ComplexToLogMagnitude.glsl
		ComplexToMagnitude.glsl
		ConstellationFilter.glsl
		CouplerDeEmbedFilter_ForwardPath.glsl
		CosineSumWindow.glsl
		DDJMeasurement.glsl
		DeEmbedNormalization.glsl
		Downconvert.glsl
		DownsampleNoAAFilter.glsl
		DownsampleWithAAFilter.glsl
		DutyCycleMeasurement.glsl
		EmphasisFilter.glsl
		EnvelopeFilter.glsl
		Ethernet100BaseT1_PAM3Decoder.glsl
		Ethernet100BaseT1_Descrambler.glsl
		Ethernet100BaseT1_Decoder.glsl
		Ethernet100BaseT1_MergePackets.glsl
		Ethernet100BaseTX_4b5bDecode.glsl
		Ethernet100BaseTX_Descrambler.glsl
		Ethernet100BaseTX_FindSSD.glsl
		Ethernet100BaseTX_MLT3Decoder.glsl
		Ethernet100BaseTX_TrySync.glsl
		ExponentialMovingAverage.glsl
		EyePattern.glsl
		EyePattern_IndexSearch.glsl
		FallMeasurement_Uniform.glsl
		FallMeasurement_FinalPass.glsl
		FillSquarewaveAndDurations.glsl
		FIRFilter.glsl
		FrequencyMeasurement.glsl
		InvertFilter.glsl
		InvertFilterDigital.glsl
		IQDemuxFilter.glsl
		IQDemuxFilterAlignment.glsl
		Magnitude.glsl
		MovingAverageFilter_Sparse.glsl
		MovingAverageFilter_Uniform.glsl
		MultiplyByConstant.glsl
		MultiplyVectorVector.glsl
		NoiseFilter.glsl
		PAMEdgeDetector_InitialMerge.glsl
		PAMEdgeDetector_LevelCrossings.glsl
		PAMEdgeDetector_MergeCrossings.glsl
		PAMEdgeDetector_FinalMerge.glsl
		PRBS7.glsl
		PRBS7Checker.glsl
		PRBS9.glsl
		PRBS9Checker.glsl
		PRBS11.glsl
		PRBS11Checker.glsl
		PRBS15.glsl
		PRBS15Checker.glsl
		PRBS23.glsl
		PRBS23Checker.glsl
		PRBS31.glsl
		PRBS31Checker.glsl
		SpectrogramPostprocess.glsl
		SubtractFilter.glsl
		SubtractOutOfPlace.glsl
		SubtractVectorScalar.glsl
		TIEMeasurement_FirstPass.glsl
		TIEMeasurement_SecondPass.glsl
		Threshold.glsl
		ToneGeneratorFilter.glsl
		UpsampleFilter.glsl
		VectorFrequency.glsl
		VectorPhase.glsl
		WaterfallFilter.glsl
	)

add_dependencies(scopeprotocols protocolshaders)
