Skip to content

Commit 3d15f1a

Browse files
Fix SwiftShader build failures in Termux cross-compilation (#3)
* Initial plan * Fix SwiftShader build: add vk_android_native_buffer.h stub and suppress -Wnewline-eof The GitHub Actions build was failing at SwiftShader compilation (~9521/12515 ninja steps) with two errors: 1. '-Werror,-Wnewline-eof': SwiftShader headers lack trailing newlines. The engine.patch removed -Wno-newline-eof from no_chromium_code for Termux, so the suppression was absent for third-party libraries. 2. 'vk_android_native_buffer.h' not found: SwiftShader's VkImage.hpp includes this AOSP platform-internal header inside #ifdef __ANDROID__. The macro is defined because the build uses --target=aarch64-linux-androidXX, but this header is NOT part of the public NDK. Fix: - Add stubs/vulkan/vk_android_native_buffer.h: minimal stub providing the types needed by SwiftShader (buffer_handle_t, VkNativeBufferANDROID, etc.) based on AOSP spec version 11. Uses void* for buffer_handle_t since cutils/native_handle.h is also absent from the NDK. - Update build.py configure() to include -I{stubs} (so the stub is found via #include <vulkan/vk_android_native_buffer.h>) and -Wno-newline-eof (to suppress the warning for third-party code without trailing newlines) via the extra_cflags_cc GN argument. Co-authored-by: GeneralKaos666 <161671171+GeneralKaos666@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: GeneralKaos666 <161671171+GeneralKaos666@users.noreply.github.com>
1 parent 7a54223 commit 3d15f1a

File tree

2 files changed

+134
-1
lines changed

2 files changed

+134
-1
lines changed

build.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,9 @@ def configure(
134134
root = root or self.root
135135
sysroot = os.path.abspath(sysroot or self.sysroot.path)
136136
toolchain = os.path.abspath(toolchain or self.toolchain)
137+
# Stub headers for platform-internal Android headers not shipped with
138+
# the public NDK (e.g. vk_android_native_buffer.h used by SwiftShader).
139+
stubs = os.path.abspath(Path(__file__).parent / 'stubs')
137140
cmd = [
138141
'vpython3',
139142
'engine/src/flutter/tools/gn',
@@ -164,7 +167,12 @@ def configure(
164167
'--gn-args', f'is_termux_host={utils.__TERMUX__}',
165168
'--gn-args', f'termux_api_level={api}',
166169
'--gn-args', 'extra_ldflags=["-lEGL", "-lGLESv2"]',
167-
'--gn-args', f'extra_cflags_cc=["-I{toolchain}/../../../sources/third_party/vulkan/include"]',
170+
# Provide stub headers for Android platform-internal APIs that are
171+
# not part of the public NDK (e.g. vk_android_native_buffer.h).
172+
# Also suppress -Wnewline-eof which fires on third-party headers
173+
# (SwiftShader) that legitimately lack a trailing newline.
174+
'--gn-args',
175+
f'extra_cflags_cc=["-I{toolchain}/../../../sources/third_party/vulkan/include", "-I{stubs}", "-Wno-newline-eof"]',
168176
]
169177
subprocess.run(cmd, cwd=root, check=True, stdout=True, stderr=True)
170178

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
/*
2+
* Stub header for Termux/cross-compilation builds.
3+
*
4+
* vk_android_native_buffer.h is an Android platform-internal header not
5+
* included in the public NDK. SwiftShader includes it when __ANDROID__ is
6+
* defined (which happens because we cross-compile with
7+
* --target=aarch64-linux-androidXX). This stub provides the minimum type
8+
* definitions needed so that SwiftShader compiles cleanly on a Termux/Linux
9+
* host where the real AOSP gralloc headers are unavailable.
10+
*
11+
* Based on the AOSP vk_android_native_buffer.h spec version 11 and the Mesa
12+
* project's equivalent stub.
13+
*/
14+
15+
#ifndef __VK_ANDROID_NATIVE_BUFFER_H__
16+
#define __VK_ANDROID_NATIVE_BUFFER_H__
17+
18+
#include <vulkan/vulkan.h>
19+
#include <stdint.h>
20+
21+
#ifdef __cplusplus
22+
extern "C" {
23+
#endif
24+
25+
/* buffer_handle_t: opaque handle to an Android gralloc buffer.
26+
* On non-AOSP builds (like Termux) we use void* as a neutral placeholder. */
27+
typedef void* buffer_handle_t;
28+
29+
/* AHardwareBuffer forward declaration */
30+
struct AHardwareBuffer;
31+
32+
#define VK_ANDROID_native_buffer 1
33+
34+
#define VK_ANDROID_NATIVE_BUFFER_EXTENSION_NUMBER 11
35+
#define VK_ANDROID_NATIVE_BUFFER_SPEC_VERSION 11
36+
#define VK_ANDROID_NATIVE_BUFFER_EXTENSION_NAME "VK_ANDROID_native_buffer"
37+
38+
#define VK_ANDROID_NATIVE_BUFFER_ENUM(type, id) \
39+
((type)(1000000000 + (1000 * (VK_ANDROID_NATIVE_BUFFER_EXTENSION_NUMBER - 1)) + (id)))
40+
41+
#define VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID \
42+
VK_ANDROID_NATIVE_BUFFER_ENUM(VkStructureType, 0)
43+
#define VK_STRUCTURE_TYPE_SWAPCHAIN_IMAGE_CREATE_INFO_ANDROID \
44+
VK_ANDROID_NATIVE_BUFFER_ENUM(VkStructureType, 1)
45+
#define VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENTATION_PROPERTIES_ANDROID \
46+
VK_ANDROID_NATIVE_BUFFER_ENUM(VkStructureType, 2)
47+
#define VK_STRUCTURE_TYPE_GRALLOC_USAGE_INFO_ANDROID \
48+
VK_ANDROID_NATIVE_BUFFER_ENUM(VkStructureType, 3)
49+
#define VK_STRUCTURE_TYPE_GRALLOC_USAGE_INFO_2_ANDROID \
50+
VK_ANDROID_NATIVE_BUFFER_ENUM(VkStructureType, 4)
51+
52+
typedef enum VkSwapchainImageUsageFlagBitsANDROID {
53+
VK_SWAPCHAIN_IMAGE_USAGE_SHARED_BIT_ANDROID = 0x00000001,
54+
VK_SWAPCHAIN_IMAGE_USAGE_FLAG_BITS_MAX_ENUM_ANDROID = 0x7FFFFFFF
55+
} VkSwapchainImageUsageFlagBitsANDROID;
56+
typedef VkFlags VkSwapchainImageUsageFlagsANDROID;
57+
58+
typedef struct {
59+
uint64_t consumer;
60+
uint64_t producer;
61+
} VkNativeBufferUsage2ANDROID;
62+
63+
typedef struct {
64+
VkStructureType sType;
65+
const void* pNext;
66+
buffer_handle_t handle;
67+
int stride;
68+
int format;
69+
int usage; /* DEPRECATED in SPEC_VERSION 6 */
70+
VkNativeBufferUsage2ANDROID usage2; /* DEPRECATED in SPEC_VERSION 9 */
71+
uint64_t usage3; /* ADDED in SPEC_VERSION 9 */
72+
struct AHardwareBuffer* ahb; /* ADDED in SPEC_VERSION 11 */
73+
} VkNativeBufferANDROID;
74+
75+
typedef struct {
76+
VkStructureType sType;
77+
const void* pNext;
78+
VkSwapchainImageUsageFlagsANDROID usage;
79+
} VkSwapchainImageCreateInfoANDROID;
80+
81+
typedef struct {
82+
VkStructureType sType;
83+
const void* pNext;
84+
VkBool32 sharedImage;
85+
} VkPhysicalDevicePresentationPropertiesANDROID;
86+
87+
typedef struct {
88+
VkStructureType sType;
89+
const void* pNext;
90+
VkFormat format;
91+
VkImageUsageFlags imageUsage;
92+
} VkGrallocUsageInfoANDROID;
93+
94+
typedef struct {
95+
VkStructureType sType;
96+
const void* pNext;
97+
VkFormat format;
98+
VkImageUsageFlags imageUsage;
99+
VkSwapchainImageUsageFlagsANDROID swapchainImageUsage;
100+
} VkGrallocUsageInfo2ANDROID;
101+
102+
/* Function pointer types for the extension entry points */
103+
typedef VkResult (VKAPI_PTR *PFN_vkGetSwapchainGrallocUsageANDROID)(
104+
VkDevice device, VkFormat format, VkImageUsageFlags imageUsage,
105+
int* grallocUsage);
106+
typedef VkResult (VKAPI_PTR *PFN_vkGetSwapchainGrallocUsage2ANDROID)(
107+
VkDevice device, VkFormat format, VkImageUsageFlags imageUsage,
108+
VkSwapchainImageUsageFlagsANDROID swapchainImageUsage,
109+
uint64_t* grallocConsumerUsage, uint64_t* grallocProducerUsage);
110+
typedef VkResult (VKAPI_PTR *PFN_vkGetSwapchainGrallocUsage3ANDROID)(
111+
VkDevice device, const VkGrallocUsageInfo2ANDROID* grallocUsageInfo,
112+
uint64_t* grallocConsumerUsage, uint64_t* grallocProducerUsage);
113+
typedef VkResult (VKAPI_PTR *PFN_vkAcquireImageANDROID)(
114+
VkDevice device, VkImage image, int nativeFenceFd,
115+
VkSemaphore semaphore, VkFence fence);
116+
typedef VkResult (VKAPI_PTR *PFN_vkQueueSignalReleaseImageANDROID)(
117+
VkQueue queue, uint32_t waitSemaphoreCount,
118+
const VkSemaphore* pWaitSemaphores, VkImage image,
119+
int* pNativeFenceFd);
120+
121+
#ifdef __cplusplus
122+
}
123+
#endif
124+
125+
#endif /* __VK_ANDROID_NATIVE_BUFFER_H__ */

0 commit comments

Comments
 (0)