| # 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" |
| ) |