diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c63a6b35..7c2038eaa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,6 +37,10 @@ if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") list(APPEND warning_flags -Wno-unused-but-set-variable) endif() + if(CMAKE_CROSSCOMPILING) + list(APPEND warning_flags -Wno-error) + endif() + string(REPLACE ";" " " warning_flags "${warning_flags}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${warning_flags}") endif() diff --git a/renderdoc/CMakeLists.txt b/renderdoc/CMakeLists.txt index 0a7eed3b9..b3d267373 100644 --- a/renderdoc/CMakeLists.txt +++ b/renderdoc/CMakeLists.txt @@ -14,7 +14,16 @@ string(STRIP ${GIT_COMMIT_HASH} GIT_COMMIT_HASH) list(APPEND RDOC_DEFINITIONS PRIVATE -DGIT_COMMIT_HASH="${GIT_COMMIT_HASH}") -if(UNIX) +if(ANDROID) + list(APPEND RDOC_DEFINITIONS + PUBLIC -DRENDERDOC_PLATFORM=linux + PRIVATE -DLINUX) + + list(APPEND RDOC_LIBRARIES + PRIVATE m + PRIVATE dl + PRIVATE ${CMAKE_THREAD_LIBS_INIT}) +elseif(UNIX) find_package(PkgConfig REQUIRED) find_package(Threads REQUIRED) find_package(X11 REQUIRED) @@ -190,6 +199,12 @@ if(UNIX) elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "i686") set(bfdarch "i386") set(bfdtarget "elf32-i386") + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") + set(bfdarch "aarch64") + set(bfdtarget "elf64-littleaarch64") + elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm") + set(bfdarch "arm") + set(bfdtarget "elf32-littlearm") else() message(FATAL_ERROR "Unknown target architecture") endif() diff --git a/renderdoc/core/core.cpp b/renderdoc/core/core.cpp index 9cdbb235d..e641c42dd 100644 --- a/renderdoc/core/core.cpp +++ b/renderdoc/core/core.cpp @@ -220,7 +220,11 @@ void RenderDoc::Initialise() m_RemoteIdent = port; m_RemoteServerThreadShutdown = false; +#ifdef ANDROID + // TODO shutdown the thread on dlclose() +#else m_RemoteThread = Threading::CreateThread(RemoteAccessServerThread, (void *)sock); +#endif } } diff --git a/renderdoc/driver/vulkan/CMakeLists.txt b/renderdoc/driver/vulkan/CMakeLists.txt index eebd33948..463aae96b 100644 --- a/renderdoc/driver/vulkan/CMakeLists.txt +++ b/renderdoc/driver/vulkan/CMakeLists.txt @@ -40,7 +40,10 @@ set(sources set(definitions ${RDOC_DEFINITIONS}) -if(UNIX) +if(ANDROID) + list(APPEND sources vk_linux.cpp) + list(APPEND definitions PRIVATE -DVK_USE_PLATFORM_ANDROID_KHR) +elseif(UNIX) list(APPEND sources vk_linux.cpp) list(APPEND definitions diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index dc028168a..da9079772 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -1543,6 +1543,14 @@ public: uint32_t queueFamilyIndex); #endif +#if defined(VK_USE_PLATFORM_ANDROID_KHR) + VkResult vkCreateAndroidSurfaceKHR( + VkInstance instance, + const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSurfaceKHR* pSurface); +#endif + #if defined(VK_USE_PLATFORM_XCB_KHR) VkResult vkCreateXcbSurfaceKHR( VkInstance instance, diff --git a/renderdoc/driver/vulkan/vk_dispatchtables.cpp b/renderdoc/driver/vulkan/vk_dispatchtables.cpp index 055361ef2..98e15a5aa 100644 --- a/renderdoc/driver/vulkan/vk_dispatchtables.cpp +++ b/renderdoc/driver/vulkan/vk_dispatchtables.cpp @@ -84,6 +84,10 @@ void InitInstanceReplayTables(VkInstance instance) InstanceGPA(CreateWin32SurfaceKHR) #endif +#ifdef VK_USE_PLATFORM_ANDROID_KHR + InstanceGPA(CreateAndroidSurfaceKHR) +#endif + #ifdef VK_USE_PLATFORM_XCB_KHR InstanceGPA(CreateXcbSurfaceKHR) #endif diff --git a/renderdoc/driver/vulkan/vk_hookset_defs.h b/renderdoc/driver/vulkan/vk_hookset_defs.h index ad663fed4..36b2de433 100644 --- a/renderdoc/driver/vulkan/vk_hookset_defs.h +++ b/renderdoc/driver/vulkan/vk_hookset_defs.h @@ -29,6 +29,7 @@ #undef VK_KHR_xlib_surface #undef VK_KHR_xcb_surface #undef VK_KHR_win32_surface +#undef VK_KHR_android_surface #undef VK_KHR_surface #undef VK_KHR_swapchain #undef VK_EXT_debug_report @@ -44,6 +45,14 @@ HookDefine4(VkResult, vkCreateWin32SurfaceKHR, VkInstance, instance, const VkWin32SurfaceCreateInfoKHR*, pCreateInfo, const VkAllocationCallbacks*, pAllocator, VkSurfaceKHR*, pSurface); \ HookDefine2(VkBool32, vkGetPhysicalDeviceWin32PresentationSupportKHR, VkPhysicalDevice, physicalDevice, uint32_t, queueFamilyIndex); \ +#elif defined(VK_USE_PLATFORM_ANDROID_KHR) + +#define HookInitInstance_PlatformSpecific() \ + HookInitExtension(VK_KHR_android_surface, CreateAndroidSurfaceKHR); + +#define HookDefine_PlatformSpecific() \ + HookDefine4(VkResult, vkCreateAndroidSurfaceKHR, VkInstance, instance, const VkAndroidSurfaceCreateInfoKHR*, pCreateInfo, const VkAllocationCallbacks*, pAllocator, VkSurfaceKHR*, pSurface); + #elif defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR) #if defined(VK_USE_PLATFORM_XCB_KHR) @@ -226,6 +235,7 @@ CheckExt(VK_KHR_xlib_surface) \ CheckExt(VK_KHR_xcb_surface) \ CheckExt(VK_KHR_win32_surface) \ + CheckExt(VK_KHR_android_surface) \ CheckExt(VK_KHR_surface) \ CheckExt(VK_EXT_debug_report) diff --git a/renderdoc/driver/vulkan/vk_linux.cpp b/renderdoc/driver/vulkan/vk_linux.cpp index 954052d74..e0f6dd6ee 100644 --- a/renderdoc/driver/vulkan/vk_linux.cpp +++ b/renderdoc/driver/vulkan/vk_linux.cpp @@ -33,6 +33,9 @@ namespace Keyboard void VulkanReplay::OutputWindow::SetWindowHandle(void *wn) { +#ifdef ANDROID + wnd = (ANativeWindow*) wn; +#else void **connectionScreenWindow = (void **)wn; connection = (xcb_connection_t *)connectionScreenWindow[0]; @@ -44,10 +47,22 @@ void VulkanReplay::OutputWindow::SetWindowHandle(void *wn) while (scr-- > 0) xcb_screen_next(&iter); screen = iter.data; +#endif } void VulkanReplay::OutputWindow::CreateSurface(VkInstance inst) { +#ifdef ANDROID + VkAndroidSurfaceCreateInfoKHR createInfo; + + createInfo.sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR; + createInfo.pNext = NULL; + createInfo.flags = 0; + createInfo.window = wnd; + + VkResult vkr = ObjDisp(inst)->CreateAndroidSurfaceKHR(Unwrap(inst), &createInfo, NULL, &surface); + RDCASSERTEQUAL(vkr, VK_SUCCESS); +#else VkXcbSurfaceCreateInfoKHR createInfo; createInfo.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR; @@ -58,10 +73,13 @@ void VulkanReplay::OutputWindow::CreateSurface(VkInstance inst) VkResult vkr = ObjDisp(inst)->CreateXcbSurfaceKHR(Unwrap(inst), &createInfo, NULL, &surface); RDCASSERTEQUAL(vkr, VK_SUCCESS); +#endif } void VulkanReplay::GetOutputWindowDimensions(uint64_t id, int32_t &w, int32_t &h) { +#ifdef ANDROID +#else if(id == 0 || m_OutputWindows.find(id) == m_OutputWindows.end()) return; @@ -74,6 +92,7 @@ void VulkanReplay::GetOutputWindowDimensions(uint64_t id, int32_t &w, int32_t &h h = (int32_t)geom->height; free(geom); +#endif } bool VulkanReplay::IsOutputWindowVisible(uint64_t id) @@ -191,4 +210,31 @@ VkResult WrappedVulkan::vkCreateXlibSurfaceKHR( #endif +#if defined(VK_USE_PLATFORM_ANDROID_KHR) +VkResult WrappedVulkan::vkCreateAndroidSurfaceKHR( + VkInstance instance, + const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSurfaceKHR* pSurface) +{ + // should not come in here at all on replay + RDCASSERT(m_State >= WRITING); + + VkResult ret = ObjDisp(instance)->CreateAndroidSurfaceKHR(Unwrap(instance), pCreateInfo, pAllocator, pSurface); + + if(ret == VK_SUCCESS) + { + GetResourceManager()->WrapResource(Unwrap(instance), *pSurface); + + WrappedVkSurfaceKHR *wrapped = GetWrapped(*pSurface); + + // since there's no point in allocating a full resource record and storing the window + // handle under there somewhere, we just cast. We won't use the resource record for anything + wrapped->record = (VkResourceRecord *)(uintptr_t)pCreateInfo->window; + } + + return ret; +} +#endif + const char *VulkanLibraryName = "libvulkan.so"; diff --git a/renderdoc/driver/vulkan/vk_replay.h b/renderdoc/driver/vulkan/vk_replay.h index 23699ac86..3c6268ed0 100644 --- a/renderdoc/driver/vulkan/vk_replay.h +++ b/renderdoc/driver/vulkan/vk_replay.h @@ -36,6 +36,11 @@ #define WINDOW_HANDLE_DECL HWND wnd; #define NULL_WND_HANDLE NULL +#elif defined(ANDROID) + +#define WINDOW_HANDLE_DECL ANativeWindow *wnd; +#define NULL_WND_HANDLE NULL + #elif defined(RENDERDOC_PLATFORM_LINUX) #include diff --git a/renderdoc/os/linux/linux_callstack.cpp b/renderdoc/os/linux/linux_callstack.cpp index f0c26c0bc..b95b2645a 100644 --- a/renderdoc/os/linux/linux_callstack.cpp +++ b/renderdoc/os/linux/linux_callstack.cpp @@ -25,7 +25,10 @@ #include "os/os_specific.h" +#ifdef ANDROID +#else #include +#endif #include #include @@ -66,7 +69,11 @@ class LinuxCallstack : public Callstack::Stackwalk { void *addrs_ptr[ARRAY_COUNT(addrs)]; +#ifdef ANDROID + numLevels = 0; +#else numLevels = backtrace(addrs_ptr, ARRAY_COUNT(addrs)); +#endif int offs = 0; // if we want to trim levels of the stack, we can do that here diff --git a/renderdoc/os/linux/linux_stringio.cpp b/renderdoc/os/linux/linux_stringio.cpp index a9b552ed0..7f87762ab 100644 --- a/renderdoc/os/linux/linux_stringio.cpp +++ b/renderdoc/os/linux/linux_stringio.cpp @@ -36,12 +36,21 @@ #include #include +#ifdef ANDROID +typedef int Display; +typedef int xcb_connection_t; +typedef int xcb_key_symbols_t; +typedef int KeySym; +typedef int xcb_keycode_t; +typedef int *iconv_t; +#else #include #include #include #include +#endif // for dladdr #include @@ -67,7 +76,11 @@ namespace Keyboard void UseConnection(xcb_connection_t *conn) { connection = conn; +#ifdef ANDROID + symbols = NULL; +#else symbols = xcb_key_symbols_alloc(conn); +#endif } void AddInputWindow(void *wnd) @@ -81,6 +94,9 @@ namespace Keyboard bool GetKeyState(int key) { +#ifdef ANDROID + return false; +#else KeySym ks = 0; if(symbols == NULL) return false; @@ -145,6 +161,7 @@ namespace Keyboard free(keys); return ret; +#endif } } @@ -427,6 +444,9 @@ namespace StringFormat { SCOPED_LOCK(lockWide2UTF8); +#ifdef ANDROID + ret = -1; +#else if(iconvWide2UTF8 == (iconv_t)-1) iconvWide2UTF8 = iconv_open("UTF-8", "WCHAR_T"); @@ -442,6 +462,7 @@ namespace StringFormat size_t outsize = len; ret = iconv(iconvWide2UTF8, &inbuf, &insize, &outbuf, &outsize); +#endif } if(ret == (size_t)-1)