# 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 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 . 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=" $<$:"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}) 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 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" )