blob: 3ff6ec5f2d23160b7e6bfc54e2fca9a4ab6e56c4 [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.h
VkBuffer.cpp
VkBuffer.hpp
VkBufferView.cpp
VkBufferView.hpp
VkCommandBuffer.cpp
VkCommandBuffer.hpp
VkCommandPool.cpp
VkCommandPool.hpp
VkConfig.h
VkDescriptorPool.cpp
VkDescriptorPool.hpp
VkDescriptorSet.hpp
VkDescriptorSetLayout.cpp
VkDescriptorSetLayout.hpp
VkDescriptorUpdateTemplate.cpp
VkDescriptorUpdateTemplate.hpp
VkDestroy.h
VkDevice.cpp
VkDevice.hpp
VkDeviceMemory.cpp
VkDeviceMemory.hpp
VkDeviceMemoryExternalAndroid.hpp
VkDeviceMemoryExternalLinux.hpp
VkEvent.hpp
VkFence.hpp
VkFormat.cpp
VkFormat.h
VkFramebuffer.cpp
VkFramebuffer.hpp
VkGetProcAddress.cpp
VkGetProcAddress.h
VkImage.cpp
VkImage.hpp
VkImageView.cpp
VkImageView.hpp
VkInstance.cpp
VkInstance.hpp
VkMemory.cpp
VkMemory.h
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
VulkanPlatform.h
)
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.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/Type.cpp
Debug/Type.hpp
Debug/Value.cpp
Debug/Value.hpp
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()
# Convert list to space-delimited string for LINK_FLAGS
string(REPLACE ";" " " VULKAN_LINKER_FLAGS "${VULKAN_LINKER_FLAGS}")
add_library(vk_swiftshader SHARED
${VULKAN_SRC_FILES}
)
set_target_properties(vk_swiftshader PROPERTIES
POSITION_INDEPENDENT_CODE 1
FOLDER "SwiftShader VK"
LINK_FLAGS "${SWIFTSHADER_LINK_FLAGS} ${VULKAN_LINKER_FLAGS}"
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_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})
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 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"
)