blob: 159f3b56dea6b7f087bc67e329781d009923a61d [file] [log] [blame]
# 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
VkStructConversion.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()
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
list(APPEND VULKAN_COMPILE_OPTIONS
# TODO(b/208256248): Avoid exit-time destructor.
#"-Wexit-time-destructors" # declaration requires an exit-time destructor
)
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"
)