# 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 VkPrivateData.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 . 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=" $<$:"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} $<$: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 $ ${CMAKE_BINARY_DIR}/${CMAKE_SYSTEM_NAME}/ COMMAND ${CMAKE_COMMAND} -E copy $ ${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 $ ${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 $ $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" )