# Copyright 2020 The SwiftShader Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

set(ROOT_PROJECT_COMPILE_OPTIONS
    ${SWIFTSHADER_COMPILE_OPTIONS}
    ${WARNINGS_AS_ERRORS}
)

set(VULKAN_SRC_FILES
    libVulkan.cpp
    main.cpp
    resource.h
    Version.hpp
    VkBuffer.cpp
    VkBuffer.hpp
    VkBufferView.cpp
    VkBufferView.hpp
    VkCommandBuffer.cpp
    VkCommandBuffer.hpp
    VkCommandPool.cpp
    VkCommandPool.hpp
    VkConfig.hpp
    VkDebugUtilsMessenger.cpp
    VkDebugUtilsMessenger.hpp
    VkDescriptorPool.cpp
    VkDescriptorPool.hpp
    VkDescriptorSet.cpp
    VkDescriptorSet.hpp
    VkDescriptorSetLayout.cpp
    VkDescriptorSetLayout.hpp
    VkDescriptorUpdateTemplate.cpp
    VkDescriptorUpdateTemplate.hpp
    VkDestroy.hpp
    VkDevice.cpp
    VkDevice.hpp
    VkDeviceMemory.cpp
    VkDeviceMemory.hpp
    VkDeviceMemoryExternalHost.cpp
    VkDeviceMemoryExternalHost.hpp
    VkDeviceMemoryExternalLinux.hpp
    VkEvent.hpp
    VkFence.hpp
    VkFormat.cpp
    VkFormat.hpp
    VkFramebuffer.cpp
    VkFramebuffer.hpp
    VkGetProcAddress.cpp
    VkGetProcAddress.hpp
    VkImage.cpp
    VkImage.hpp
    VkImageView.cpp
    VkImageView.hpp
    VkInstance.cpp
    VkInstance.hpp
    VkMemory.cpp
    VkMemory.hpp
    VkObject.hpp
    VkPhysicalDevice.cpp
    VkPhysicalDevice.hpp
    VkPipeline.cpp
    VkPipeline.hpp
    VkPipelineCache.cpp
    VkPipelineCache.hpp
    VkSpecializationInfo.cpp
    VkSpecializationInfo.hpp
    VkPipelineLayout.cpp
    VkPipelineLayout.hpp
    VkPromotedExtensions.cpp
    VkQueryPool.cpp
    VkQueryPool.hpp
    VkQueue.cpp
    VkQueue.hpp
    VkRenderPass.cpp
    VkRenderPass.hpp
    VkSampler.cpp
    VkSampler.hpp
    VkSemaphore.cpp
    VkSemaphore.hpp
    VkSemaphoreExternalFuchsia.hpp
    VkSemaphoreExternalLinux.hpp
    VkShaderModule.cpp
    VkShaderModule.hpp
    VkStringify.cpp
    VkStringify.hpp
    VkTimelineSemaphore.cpp
    VkTimelineSemaphore.hpp
    VulkanPlatform.hpp
)

if(WIN32)
    list(APPEND VULKAN_SRC_FILES
        Vulkan.rc
    )
endif()

if(SWIFTSHADER_ENABLE_VULKAN_DEBUGGER)
    list(APPEND VULKAN_SRC_FILES
        Debug/Context.cpp
        Debug/Context.hpp
        Debug/Debug.cpp
        Debug/EventListener.cpp
        Debug/EventListener.hpp
        Debug/File.cpp
        Debug/File.hpp
        Debug/ID.hpp
        Debug/Location.hpp
        Debug/Server.cpp
        Debug/Server.hpp
        Debug/Thread.cpp
        Debug/Thread.hpp
        Debug/TypeOf.cpp
        Debug/TypeOf.hpp
        Debug/Value.cpp
        Debug/Value.hpp
        Debug/Variable.cpp
        Debug/Variable.hpp
        Debug/WeakMap.hpp
    )
endif()

set(VULKAN_COMPILE_OPTIONS "")
if(FUCHSIA)
    # At the moment, the Fuchsia build uses unofficial VK_STRUCTURE_TYPE_XX
    # constants that are defined as macros in <vulkan/fuchsia_extras.h>. When
    # these appear in switch() cases, the compiler complains that the values
    # are not part of the VkStructureType enum. Silence this warning, until
    # the constants are upstreamed to the official Vulkan headers.
    list(APPEND VULKAN_COMPILE_OPTIONS "-Wno-switch")
endif()

set(VULKAN_LINKER_FLAGS "")
if(FUCHSIA)
    # On Fuchsia, the Vulkan ICD is loaded into a process sandbox that doesn't
    # have system libraries available, so ensure it does not depend on libc++.so.
    list(APPEND VULKAN_LINKER_FLAGS "-static-libstdc++")
endif()

add_library(vk_swiftshader SHARED
    ${VULKAN_SRC_FILES}
)

set_target_properties(vk_swiftshader PROPERTIES
    POSITION_INDEPENDENT_CODE 1
    FOLDER "SwiftShader VK"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
    LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
)

target_include_directories(vk_swiftshader
    PRIVATE
        ".."
)

target_compile_options(vk_swiftshader
    PRIVATE
        ${ROOT_PROJECT_COMPILE_OPTIONS}
        ${VULKAN_COMPILE_OPTIONS}
)

target_compile_definitions(vk_swiftshader
    PRIVATE
        "VK_EXPORT="
        $<$<CONFIG:Debug>:"DEBUGGER_WAIT_DIALOG">
)

target_link_options(vk_swiftshader
    PRIVATE
        ${SWIFTSHADER_LINK_FLAGS}
        ${VULKAN_LINKER_FLAGS}
)

target_link_libraries(vk_swiftshader
    PRIVATE
        vk_system
        vk_pipeline
        vk_device
        vk_wsi
        ${Reactor}
        marl
        ${OS_LIBS}
        ${SWIFTSHADER_LIBS}
        $<$<BOOL:${SWIFTSHADER_ENABLE_VULKAN_DEBUGGER}>:cppdap>
)

set_shared_library_export_map(vk_swiftshader ${CMAKE_CURRENT_SOURCE_DIR})

# The name of the application-facing library. Usually this would be the Vulkan Loader,
# which then loads the Installable Client Driver (ICD), see:
# https://www.lunarg.com/tutorial-overview-of-vulkan-loader-layers/
# But SwiftShader can also be loaded directlty by the application. This enables using
# SwiftShader without requiring a Loader to be installed, and simplifies testing and
# debugging. ${VULKAN_API_LIBRARY_NAME} is the name of this drop-in API library.
if(WIN32)
    set(VULKAN_API_LIBRARY_NAME "vulkan-1.dll")
elseif(LINUX)
    set(VULKAN_API_LIBRARY_NAME "libvulkan.so.1")
elseif(APPLE)
    set(VULKAN_API_LIBRARY_NAME "libvulkan.dylib")
elseif(FUCHSIA)
    set(VULKAN_API_LIBRARY_NAME "libvulkan.so")
else()
    message(FATAL_ERROR "Platform does not support Vulkan yet")
endif()

add_custom_command(
    TARGET vk_swiftshader
    POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}/
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:vk_swiftshader> ${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}/
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:vk_swiftshader> ${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}/${VULKAN_API_LIBRARY_NAME}

    # Copy to ${CMAKE_BINARY_DIR}/bin so the library sits next to the PVR samples.
    COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/bin
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:vk_swiftshader> ${CMAKE_BINARY_DIR}/bin/${VULKAN_API_LIBRARY_NAME}
)

# The SWIFTSHADER_VULKAN_API_LIBRARY_INSTALL_PATH environment variable can be set to a path
# where we'd like the drop-in API library to be installed. For example for testing with dEQP
# this could be something like C:/src/deqp/build/external/vulkancts/modules/vulkan/Debug/
if(DEFINED ENV{SWIFTSHADER_VULKAN_API_LIBRARY_INSTALL_PATH})
    add_custom_command(
        TARGET vk_swiftshader
        POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:vk_swiftshader> $ENV{SWIFTSHADER_VULKAN_API_LIBRARY_INSTALL_PATH}${VULKAN_API_LIBRARY_NAME}
    )
endif()

# The vk_swiftshader_icd.json manifest file will point to ICD_LIBRARY_PATH.
# Set ICD_LIBRARY_PATH to be a relative path similar to "./libvk_swiftshader.so", so both files can be moved.
# A relative path is relative to the manifest file.
set(ICD_LIBRARY_PATH "${CMAKE_SHARED_LIBRARY_PREFIX}vk_swiftshader${CMAKE_SHARED_LIBRARY_SUFFIX}")
if(WIN32)
    # The path is output to a JSON file, which requires backslashes to be escaped.
    set(ICD_LIBRARY_PATH ".\\\\${ICD_LIBRARY_PATH}")
else()
    set(ICD_LIBRARY_PATH "./${ICD_LIBRARY_PATH}")
endif()
configure_file(
    "vk_swiftshader_icd.json.tmpl"
    "${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}/vk_swiftshader_icd.json"
)
