Add Android host build support

... as Cuttlefish would like to move SwiftShader out of the guest
Android virtual machine and onto the host to avoid the need for
sepolicy hacks to enable executable memory.

Bug: b/242184599
Test: lunch aosp_cf_x86_64_phone-userdebug && m
Test: Android presubmit on aosp/2528699
Change-Id: Ic04f421fea68d2f0a1f96486076ec3e781db78e0
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/71369
Reviewed-by: Chris Forbes <chrisforbes@google.com>
Tested-by: Jason Macnak <natsu@google.com>
Commit-Queue: Jason Macnak <natsu@google.com>
Kokoro-Result: kokoro <noreply+kokoro@google.com>
diff --git a/Android.bp b/Android.bp
index 6931936..6a0d6ff 100644
--- a/Android.bp
+++ b/Android.bp
@@ -63,7 +63,6 @@
 
     cppflags: [
         "-Woverloaded-virtual",
-        "-DVK_USE_PLATFORM_ANDROID_KHR",
         "-DVK_EXPORT= ",
     ],
     cpp_std: "c++17",
@@ -82,6 +81,11 @@
     },
 
     target: {
+        android: {
+            cppflags: [
+                "-DVK_USE_PLATFORM_ANDROID_KHR",
+            ],
+        },
         host: {
             cppflags: [
                 "-fno-rtti",
diff --git a/src/Android.bp b/src/Android.bp
index 023157c..7bf68f7 100644
--- a/src/Android.bp
+++ b/src/Android.bp
@@ -26,6 +26,8 @@
 cc_defaults {
     name: "libswiftshadervk_llvm_defaults",
 
+    host_supported: true,
+
     header_libs: [
         "swiftshader_platform_headers",
     ],
@@ -82,6 +84,7 @@
 
 cc_defaults {
     name: "libvk_swiftshader_defaults",
+    host_supported: true,
     vendor: true,
 
     defaults: [ "swiftshader_common" ],
@@ -91,11 +94,6 @@
         "-D__STDC_LIMIT_MACROS",
         "-D__STDC_CONSTANT_MACROS",
         "-D__STDC_FORMAT_MACROS",
-        "-DHAVE_GRALLOC1",
-        "-DHAVE_GRALLOC3",
-        "-DHAVE_GRALLOC4",
-        // FIXME: Use <android/api-level.h> instead?
-        "-DANDROID_PLATFORM_SDK_VERSION=10000",
         "-Wno-implicit-fallthrough",
         "-Wno-unused-parameter",
         "-Wno-unused-local-typedef",
@@ -117,8 +115,6 @@
 
     local_include_dirs: [ "Vulkan" ],
 
-    version_script: "Vulkan/android_vk_swiftshader.lds",
-
     generated_headers: [ "commit_header" ],
 
     target: {
@@ -143,6 +139,17 @@
             static_libs: [
                 "libarect",
             ],
+            cflags: [
+                "-DHAVE_GRALLOC1",
+                "-DHAVE_GRALLOC3",
+                "-DHAVE_GRALLOC4",
+                // FIXME: Use <android/api-level.h> instead?
+                "-DANDROID_PLATFORM_SDK_VERSION=10000",
+            ],
+            version_script: "Vulkan/android_vk_swiftshader.lds",
+        },
+        host: {
+            version_script: "Vulkan/android_host_vk_swiftshader.lds",
         },
     },
 }
@@ -150,6 +157,8 @@
 cc_library_static {
     name: "swiftshader_debug",
 
+    host_supported: true,
+
     vendor_available: true,
 
     cflags: [
@@ -174,7 +183,6 @@
 
     cflags: [
         "-DLOG_TAG=\"swiftshader\"",
-        "-DSWIFTSHADER_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER",
         "-DSWIFTSHADER_ENABLE_ASTC",  // TODO(b/150130101)
         //"-DSWIFTSHADER_DEVICE_MEMORY_REPORT",
     ],
@@ -183,7 +191,6 @@
         "System/Build.cpp",
         "System/Configurator.cpp",
         "System/CPUID.cpp",
-        "System/GrallocAndroid.cpp",
         "System/Half.cpp",
         "System/Linux/MemFd.cpp",
         "System/Math.cpp",
@@ -193,7 +200,41 @@
         "System/Timer.cpp",
         "Device/*.cpp",
         "Pipeline/*.cpp",
-        "Vulkan/*.cpp",
+        "Vulkan/libVulkan.cpp",
+        "Vulkan/main.cpp",
+        "Vulkan/VkBuffer.cpp",
+        "Vulkan/VkBufferView.cpp",
+        "Vulkan/VkCommandBuffer.cpp",
+        "Vulkan/VkCommandPool.cpp",
+        "Vulkan/VkDebugUtilsMessenger.cpp",
+        "Vulkan/VkDescriptorPool.cpp",
+        "Vulkan/VkDescriptorSet.cpp",
+        "Vulkan/VkDescriptorSetLayout.cpp",
+        "Vulkan/VkDescriptorUpdateTemplate.cpp",
+        "Vulkan/VkDevice.cpp",
+        "Vulkan/VkDeviceMemory.cpp",
+        "Vulkan/VkDeviceMemoryExternalHost.cpp",
+        "Vulkan/VkFormat.cpp",
+        "Vulkan/VkFramebuffer.cpp",
+        "Vulkan/VkGetProcAddress.cpp",
+        "Vulkan/VkImage.cpp",
+        "Vulkan/VkImageView.cpp",
+        "Vulkan/VkInstance.cpp",
+        "Vulkan/VkMemory.cpp",
+        "Vulkan/VkPhysicalDevice.cpp",
+        "Vulkan/VkPipelineCache.cpp",
+        "Vulkan/VkPipeline.cpp",
+        "Vulkan/VkPipelineLayout.cpp",
+        "Vulkan/VkPromotedExtensions.cpp",
+        "Vulkan/VkQueryPool.cpp",
+        "Vulkan/VkQueue.cpp",
+        "Vulkan/VkRenderPass.cpp",
+        "Vulkan/VkSampler.cpp",
+        "Vulkan/VkSemaphore.cpp",
+        "Vulkan/VkShaderModule.cpp",
+        "Vulkan/VkSpecializationInfo.cpp",
+        "Vulkan/VkStringify.cpp",
+        "Vulkan/VkTimelineSemaphore.cpp",
         "WSI/HeadlessSurfaceKHR.cpp",
         "WSI/VkSurfaceKHR.cpp",
     ],
@@ -209,6 +250,26 @@
         "external/swiftshader/third_party/SPIRV-Headers/include",
         "external/swiftshader/include",
     ],
+
+    target: {
+        android: {
+            srcs: [
+                "System/GrallocAndroid.cpp",
+                "Vulkan/VkDeviceMemoryExternalAndroid.cpp",
+            ],
+            cflags: [
+                "-DSWIFTSHADER_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER",
+            ],
+        },
+        host: {
+            srcs: [
+                "WSI/VkSwapchainKHR.cpp",
+            ],
+            cflags: [
+                "-DSWIFTSHADER_EXTERNAL_MEMORY_OPAQUE_FD",
+            ],
+        },
+    },
 }
 
 cc_library_shared {
@@ -245,3 +306,10 @@
         "libvk_swiftshader_defaults",
     ],
 }
+
+filegroup {
+    name: "swiftshader_icd_json_template",
+    srcs: [
+        "Vulkan/vk_swiftshader_icd.json.tmpl",
+    ],
+}
diff --git a/src/Vulkan/android_host_vk_swiftshader.lds b/src/Vulkan/android_host_vk_swiftshader.lds
new file mode 100644
index 0000000..d9663ed
--- /dev/null
+++ b/src/Vulkan/android_host_vk_swiftshader.lds
@@ -0,0 +1,274 @@
+{
+global:
+	# Loader-ICD interface functions
+	vk_icdGetInstanceProcAddr;
+	vk_icdNegotiateLoaderICDInterfaceVersion;
+
+	# Vulkan 1.0 API entry functions
+	vkCreateInstance;
+	vkDestroyInstance;
+	vkEnumeratePhysicalDevices;
+	vkGetPhysicalDeviceFeatures;
+	vkGetPhysicalDeviceFormatProperties;
+	vkGetPhysicalDeviceImageFormatProperties;
+	vkGetPhysicalDeviceProperties;
+	vkGetPhysicalDeviceQueueFamilyProperties;
+	vkGetPhysicalDeviceMemoryProperties;
+	vkGetInstanceProcAddr;
+	vkGetDeviceProcAddr;
+	vkCreateDevice;
+	vkDestroyDevice;
+	vkEnumerateInstanceExtensionProperties;
+	vkEnumerateDeviceExtensionProperties;
+	vkEnumerateInstanceLayerProperties;
+	vkEnumerateDeviceLayerProperties;
+	vkGetDeviceQueue;
+	vkQueueSubmit;
+	vkQueueWaitIdle;
+	vkDeviceWaitIdle;
+	vkAllocateMemory;
+	vkFreeMemory;
+	vkMapMemory;
+	vkUnmapMemory;
+	vkFlushMappedMemoryRanges;
+	vkInvalidateMappedMemoryRanges;
+	vkGetDeviceMemoryCommitment;
+	vkBindBufferMemory;
+	vkBindImageMemory;
+	vkGetBufferMemoryRequirements;
+	vkGetImageMemoryRequirements;
+	vkGetImageSparseMemoryRequirements;
+	vkGetPhysicalDeviceSparseImageFormatProperties;
+	vkQueueBindSparse;
+	vkCreateFence;
+	vkDestroyFence;
+	vkResetFences;
+	vkGetFenceStatus;
+	vkWaitForFences;
+	vkCreateSemaphore;
+	vkDestroySemaphore;
+	vkCreateEvent;
+	vkDestroyEvent;
+	vkGetEventStatus;
+	vkSetEvent;
+	vkResetEvent;
+	vkCreateQueryPool;
+	vkDestroyQueryPool;
+	vkGetQueryPoolResults;
+	vkCreateBuffer;
+	vkDestroyBuffer;
+	vkCreateBufferView;
+	vkDestroyBufferView;
+	vkCreateImage;
+	vkDestroyImage;
+	vkGetImageSubresourceLayout;
+	vkCreateImageView;
+	vkDestroyImageView;
+	vkCreateShaderModule;
+	vkDestroyShaderModule;
+	vkCreatePipelineCache;
+	vkDestroyPipelineCache;
+	vkGetPipelineCacheData;
+	vkMergePipelineCaches;
+	vkCreateGraphicsPipelines;
+	vkCreateComputePipelines;
+	vkDestroyPipeline;
+	vkCreatePipelineLayout;
+	vkDestroyPipelineLayout;
+	vkCreateSampler;
+	vkDestroySampler;
+	vkCreateDescriptorSetLayout;
+	vkDestroyDescriptorSetLayout;
+	vkCreateDescriptorPool;
+	vkDestroyDescriptorPool;
+	vkResetDescriptorPool;
+	vkAllocateDescriptorSets;
+	vkFreeDescriptorSets;
+	vkUpdateDescriptorSets;
+	vkCreateFramebuffer;
+	vkDestroyFramebuffer;
+	vkCreateRenderPass;
+	vkDestroyRenderPass;
+	vkGetRenderAreaGranularity;
+	vkCreateCommandPool;
+	vkDestroyCommandPool;
+	vkResetCommandPool;
+	vkAllocateCommandBuffers;
+	vkFreeCommandBuffers;
+	vkBeginCommandBuffer;
+	vkEndCommandBuffer;
+	vkResetCommandBuffer;
+	vkCmdBindPipeline;
+	vkCmdSetViewport;
+	vkCmdSetScissor;
+	vkCmdSetLineWidth;
+	vkCmdSetDepthBias;
+	vkCmdSetBlendConstants;
+	vkCmdSetDepthBounds;
+	vkCmdSetStencilCompareMask;
+	vkCmdSetStencilWriteMask;
+	vkCmdSetStencilReference;
+	vkCmdBindDescriptorSets;
+	vkCmdBindIndexBuffer;
+	vkCmdBindVertexBuffers;
+	vkCmdDraw;
+	vkCmdDrawIndexed;
+	vkCmdDrawIndirect;
+	vkCmdDrawIndexedIndirect;
+	vkCmdDispatch;
+	vkCmdDispatchIndirect;
+	vkCmdCopyBuffer;
+	vkCmdCopyImage;
+	vkCmdBlitImage;
+	vkCmdCopyBufferToImage;
+	vkCmdCopyImageToBuffer;
+	vkCmdUpdateBuffer;
+	vkCmdFillBuffer;
+	vkCmdClearColorImage;
+	vkCmdClearDepthStencilImage;
+	vkCmdClearAttachments;
+	vkCmdResolveImage;
+	vkCmdSetEvent;
+	vkCmdResetEvent;
+	vkCmdWaitEvents;
+	vkCmdPipelineBarrier;
+	vkCmdBeginQuery;
+	vkCmdEndQuery;
+	vkCmdResetQueryPool;
+	vkCmdWriteTimestamp;
+	vkCmdCopyQueryPoolResults;
+	vkCmdPushConstants;
+	vkCmdBeginRenderPass;
+	vkCmdNextSubpass;
+	vkCmdEndRenderPass;
+	vkCmdExecuteCommands;
+	vkDestroySurfaceKHR;
+	vkGetPhysicalDeviceSurfaceSupportKHR;
+	vkGetPhysicalDeviceSurfaceCapabilitiesKHR;
+	vkGetPhysicalDeviceSurfaceFormatsKHR;
+
+	# VK_KHR_get_surface_capabilities2
+	vkGetPhysicalDeviceSurfaceCapabilities2KHR;
+	vkGetPhysicalDeviceSurfaceFormats2KHR;
+
+	# VK_EXT_swapchain_maintenance1
+	vkReleaseSwapchainImagesEXT;
+
+	# VK_KHR_surface
+	vkGetPhysicalDeviceSurfacePresentModesKHR;
+	vkCreateSwapchainKHR;
+	vkDestroySwapchainKHR;
+	vkGetSwapchainImagesKHR;
+	vkAcquireNextImageKHR;
+	vkQueuePresentKHR;
+
+	# VK_KHR_display
+	#vkGetPhysicalDeviceDisplayPropertiesKHR;
+	#vkGetPhysicalDeviceDisplayPlanePropertiesKHR;
+	#vkGetDisplayPlaneSupportedDisplaysKHR;
+	#vkGetDisplayModePropertiesKHR;
+	#vkCreateDisplayModeKHR;
+	#vkGetDisplayPlaneCapabilitiesKHR;
+	#vkCreateDisplayPlaneSurfaceKHR;
+
+	# VK_KHR_display_swapchain
+	#vkCreateSharedSwapchainsKHR;
+
+	# Vulkan 1.1 API entry functions
+	vkEnumerateInstanceVersion;
+	vkEnumeratePhysicalDeviceGroups;
+	vkGetPhysicalDeviceFeatures2;
+	vkGetPhysicalDeviceProperties2;
+	vkGetPhysicalDeviceFormatProperties2;
+	vkGetPhysicalDeviceQueueFamilyProperties2;
+	vkGetPhysicalDeviceMemoryProperties2;
+	vkGetPhysicalDeviceSparseImageFormatProperties2;
+	vkGetPhysicalDeviceExternalBufferProperties;
+	vkGetPhysicalDeviceExternalSemaphoreProperties;
+	vkGetPhysicalDeviceExternalFenceProperties;
+	vkBindBufferMemory2;
+	vkBindImageMemory2;
+	vkGetDeviceGroupPeerMemoryFeatures;
+	vkCmdSetDeviceMask;
+	vkCmdDispatchBase;
+	vkGetImageMemoryRequirements2;
+	vkGetBufferMemoryRequirements2;
+	vkTrimCommandPool;
+	vkGetDeviceQueue2;
+	vkCreateSamplerYcbcrConversion;
+	vkDestroySamplerYcbcrConversion;
+	vkGetDescriptorSetLayoutSupport;
+	vkGetDeviceGroupPresentCapabilitiesKHR;
+	vkGetDeviceGroupSurfacePresentModesKHR;
+	vkGetPhysicalDevicePresentRectanglesKHR;
+	vkAcquireNextImage2KHR;
+	vkCreateDescriptorUpdateTemplate;
+	vkDestroyDescriptorUpdateTemplate;
+	vkUpdateDescriptorSetWithTemplate;
+
+	# VK_KHR_get_display_properties2
+	#vkGetPhysicalDeviceDisplayProperties2KHR;
+	#vkGetPhysicalDeviceDisplayPlaneProperties2KHR;
+	#vkGetDisplayModeProperties2KHR;
+	#vkGetDisplayPlaneCapabilities2KHR;
+
+	# Vulkan 1.2 API entry functions
+	vkGetImageSparseMemoryRequirements2;
+	vkGetPhysicalDeviceImageFormatProperties2;
+
+	vkCreateRenderPass2;
+	vkCmdBeginRenderPass2;
+	vkCmdNextSubpass2;
+	vkCmdEndRenderPass2;
+	vkCmdDrawIndirectCount;
+	vkCmdDrawIndexedIndirectCount;
+	vkGetSemaphoreCounterValue;
+	vkWaitSemaphores;
+	vkSignalSemaphore;
+	vkGetBufferDeviceAddress;
+	vkGetBufferOpaqueCaptureAddress;
+	vkGetDeviceMemoryOpaqueCaptureAddress;
+	vkResetQueryPool;
+
+	# Vulkan 1.3 API entry functions
+	vkCmdBeginRendering;
+	vkCmdBindVertexBuffers2;
+	vkCmdBlitImage2;
+	vkCmdCopyBuffer2;
+	vkCmdCopyBufferToImage2;
+	vkCmdCopyImage2;
+	vkCmdCopyImageToBuffer2;
+	vkCmdEndRendering;
+	vkCmdPipelineBarrier2;
+	vkCmdResetEvent2;
+	vkCmdResolveImage2;
+	vkCmdSetCullMode;
+	vkCmdSetDepthBiasEnable;
+	vkCmdSetDepthBoundsTestEnable;
+	vkCmdSetDepthCompareOp;
+	vkCmdSetDepthTestEnable;
+	vkCmdSetDepthWriteEnable;
+	vkCmdSetEvent2;
+	vkCmdSetFrontFace;
+	vkCmdSetPrimitiveRestartEnable;
+	vkCmdSetPrimitiveTopology;
+	vkCmdSetRasterizerDiscardEnable;
+	vkCmdSetScissorWithCount;
+	vkCmdSetStencilOp;
+	vkCmdSetStencilTestEnable;
+	vkCmdSetViewportWithCount;
+	vkCmdWaitEvents2;
+	vkCmdWriteTimestamp2;
+	vkCreatePrivateDataSlot;
+	vkDestroyPrivateDataSlot;
+	vkGetDeviceBufferMemoryRequirements;
+	vkGetDeviceImageMemoryRequirements;
+	vkGetDeviceImageSparseMemoryRequirements;
+	vkGetPhysicalDeviceToolProperties;
+	vkGetPrivateData;
+	vkQueueSubmit2;
+	vkSetPrivateData;
+
+local:
+	*;
+};
diff --git a/third_party/SPIRV-Tools/Android.bp b/third_party/SPIRV-Tools/Android.bp
index 3739ae0..a760d5d 100644
--- a/third_party/SPIRV-Tools/Android.bp
+++ b/third_party/SPIRV-Tools/Android.bp
@@ -125,6 +125,7 @@
 
 cc_library_static {
     name: "swiftshader_spirv-tools",
+    host_supported: true,
     vendor_available: true,
     srcs: [
         "source/*.cpp",
diff --git a/third_party/astc-encoder/Android.bp b/third_party/astc-encoder/Android.bp
index 9139f28..5767809 100644
--- a/third_party/astc-encoder/Android.bp
+++ b/third_party/astc-encoder/Android.bp
@@ -36,6 +36,8 @@
 cc_library_static {
     name: "swiftshader_astc",
 
+    host_supported:true,
+
     vendor_available: true,
 
     cflags: [
diff --git a/third_party/marl/Android.bp b/third_party/marl/Android.bp
index 139efaf..38c5643 100644
--- a/third_party/marl/Android.bp
+++ b/third_party/marl/Android.bp
@@ -35,6 +35,7 @@
 
 cc_library_static {
     name: "swiftshader_marl",
+    host_supported: true,
     vendor_available: true,
     srcs: [
         "src/debug.cpp",