Browse Source

Make more things build

Panagiotis Christopoulos Charitos 4 years ago
parent
commit
5b3c1b58aa

+ 1 - 1
AnKi/Config.h.cmake

@@ -124,7 +124,7 @@
 #endif
 #endif
 
 
 // SIMD
 // SIMD
-#define ANKI_ENABLE_SIMD (${_ANKI_ENABLE_SIMD} && ANKI_CPU_ARCH_X86)
+#define ANKI_ENABLE_SIMD ${_ANKI_ENABLE_SIMD}
 
 
 #if !ANKI_ENABLE_SIMD
 #if !ANKI_ENABLE_SIMD
 #	define ANKI_SIMD_NONE 1
 #	define ANKI_SIMD_NONE 1

+ 5 - 24
AnKi/Core/App.cpp

@@ -38,7 +38,7 @@ namespace anki
 
 
 #if ANKI_OS_ANDROID
 #if ANKI_OS_ANDROID
 /// The one and only android hack
 /// The one and only android hack
-android_app* gAndroidApp = nullptr;
+android_app* g_androidApp = nullptr;
 #endif
 #endif
 
 
 class App::StatsUi
 class App::StatsUi
@@ -504,12 +504,15 @@ Error App::initInternal(const ConfigSet& config_, AllocAlignedCallback allocCb,
 
 
 Error App::initDirs(const ConfigSet& cfg)
 Error App::initDirs(const ConfigSet& cfg)
 {
 {
-#if !ANKI_OS_ANDROID
 	// Settings path
 	// Settings path
+#if !ANKI_OS_ANDROID
 	StringAuto home(m_heapAlloc);
 	StringAuto home(m_heapAlloc);
 	ANKI_CHECK(getHomeDirectory(home));
 	ANKI_CHECK(getHomeDirectory(home));
 
 
 	m_settingsDir.sprintf(m_heapAlloc, "%s/.anki", &home[0]);
 	m_settingsDir.sprintf(m_heapAlloc, "%s/.anki", &home[0]);
+#else
+	m_settingsDir.sprintf(m_heapAlloc, "%s/.anki", "/sdcard");
+#endif
 
 
 	if(!directoryExists(m_settingsDir.toCString()))
 	if(!directoryExists(m_settingsDir.toCString()))
 	{
 	{
@@ -537,28 +540,6 @@ Error App::initDirs(const ConfigSet& cfg)
 		ANKI_CHECK(createDirectory(m_cacheDir.toCString()));
 		ANKI_CHECK(createDirectory(m_cacheDir.toCString()));
 	}
 	}
 
 
-#else
-	// ANKI_ASSERT(gAndroidApp);
-	// ANativeActivity* activity = gAndroidApp->activity;
-
-	// Settings path
-	// settingsDir = String(activity->internalDataDir, alloc);
-	settingsDir = String("/sdcard/.anki/");
-	if(!directoryExists(settingsDir.c_str()))
-	{
-		createDirectory(settingsDir.c_str());
-	}
-
-	// Cache
-	cacheDir = settingsDir + "/cache";
-	if(directoryExists(cacheDir.c_str()))
-	{
-		removeDirectory(cacheDir.c_str());
-	}
-
-	createDirectory(cacheDir.c_str());
-#endif
-
 	return Error::NONE;
 	return Error::NONE;
 }
 }
 
 

+ 59 - 9
AnKi/Gr/CMakeLists.txt

@@ -1,12 +1,62 @@
-file(GLOB SOURCES *.cpp Utils/*.cpp)
+set(COMMON
+	"Common.cpp"
+	"GrObject.cpp"
+	"RenderGraph.cpp"
+	"ShaderProgram.cpp"
+	"Utils/ClassGpuAllocator.cpp"
+	"Utils/FrameGpuAllocator.cpp"
+	"Utils/Functions.cpp"
+	"Utils/StackGpuAllocator.cpp")
 
 
-if(GL)
-	set(GR_BACKEND "Gl")
-else()
-	set(GR_BACKEND "Vulkan")
-endif()
+foreach(S ${COMMON})
+	addAnkiSourceFiles("${CMAKE_CURRENT_SOURCE_DIR}/${S}")
+endforeach()
+
+if(VULKAN)
+	set(VKCPP
+		"Vulkan/AccelerationStructure.cpp"
+		"Vulkan/AccelerationStructureImpl.cpp"
+		"Vulkan/Buffer.cpp"
+		"Vulkan/BufferImpl.cpp"
+		"Vulkan/CommandBuffer.cpp"
+		"Vulkan/CommandBufferFactory.cpp"
+		"Vulkan/CommandBufferImpl.cpp"
+		"Vulkan/Common.cpp"
+		"Vulkan/DescriptorSet.cpp"
+		"Vulkan/Fence.cpp"
+		"Vulkan/FenceFactory.cpp"
+		"Vulkan/Framebuffer.cpp"
+		"Vulkan/FramebufferImpl.cpp"
+		"Vulkan/GpuMemoryManager.cpp"
+		"Vulkan/GrManager.cpp"
+		"Vulkan/GrManagerImpl.cpp"
+		"Vulkan/OcclusionQuery.cpp"
+		"Vulkan/OcclusionQueryImpl.cpp"
+		"Vulkan/PipelineCache.cpp"
+		"Vulkan/Pipeline.cpp"
+		"Vulkan/PipelineLayout.cpp"
+		"Vulkan/QueryFactory.cpp"
+		"Vulkan/Sampler.cpp"
+		"Vulkan/SamplerFactory.cpp"
+		"Vulkan/SamplerImpl.cpp"
+		"Vulkan/Shader.cpp"
+		"Vulkan/ShaderImpl.cpp"
+		"Vulkan/ShaderProgram.cpp"
+		"Vulkan/ShaderProgramImpl.cpp"
+		"Vulkan/SwapchainFactory.cpp"
+		"Vulkan/Texture.cpp"
+		"Vulkan/TextureImpl.cpp"
+		"Vulkan/TextureView.cpp"
+		"Vulkan/TextureViewImpl.cpp"
+		"Vulkan/TimestampQuery.cpp"
+		"Vulkan/TimestampQueryImpl.cpp"
+		"Vulkan/VulkanObject.cpp")
 
 
-file(GLOB GR_BACKEND_SOURCES ${GR_BACKEND}/*.cpp)
+	if(SDL)
+		set(VKCPP ${VKCPP} "Vulkan/GrManagerImplSdl.cpp")
+	endif()
 
 
-addAnkiSourceFiles(${SOURCES})
-addAnkiSourceFiles(${GR_BACKEND_SOURCES})
+	foreach(S ${VKCPP})
+		addAnkiSourceFiles("${CMAKE_CURRENT_SOURCE_DIR}/${S}")
+	endforeach()
+endif()

+ 3 - 1
AnKi/Gr/Vulkan/Common.h

@@ -12,8 +12,10 @@
 #	define VK_USE_PLATFORM_XLIB_KHR 1
 #	define VK_USE_PLATFORM_XLIB_KHR 1
 #elif ANKI_OS_WINDOWS
 #elif ANKI_OS_WINDOWS
 #	define VK_USE_PLATFORM_WIN32_KHR 1
 #	define VK_USE_PLATFORM_WIN32_KHR 1
+#elif ANKI_OS_ANDROID
+#	define VK_USE_PLATFORM_ANDROID_KHR 1
 #else
 #else
-#	error TODO
+#	error Not implemented
 #endif
 #endif
 #include <Volk/volk.h>
 #include <Volk/volk.h>
 
 

+ 9 - 7
AnKi/Input/InputDummy.cpp

@@ -8,24 +8,26 @@
 namespace anki
 namespace anki
 {
 {
 
 
-void Input::handleEvents()
+Error Input::initInternal(NativeWindow* nativeWindow)
 {
 {
-	// You are dummy... do nothing
+	return Error::NONE;
 }
 }
 
 
-void Input::init(NativeWindow* nativeWindow)
+void Input::destroy()
 {
 {
-	// You are dummy... do nothing
 }
 }
 
 
-void Input::moveCursor(const Vec2& posNdc)
+Error Input::handleEvents()
+{
+	return Error::NONE;
+}
+
+void Input::moveCursor(const Vec2& pos)
 {
 {
-	// You are dummy... do nothing
 }
 }
 
 
 void Input::hideCursor(Bool hide)
 void Input::hideCursor(Bool hide)
 {
 {
-	// You are dummy... do nothing
 }
 }
 
 
 } // end namespace anki
 } // end namespace anki

+ 23 - 3
AnKi/Math/Mat.h

@@ -31,9 +31,9 @@ public:
 	static constexpr U ROW_SIZE = J; ///< Number of rows
 	static constexpr U ROW_SIZE = J; ///< Number of rows
 	static constexpr U COLUMN_SIZE = I; ///< Number of columns
 	static constexpr U COLUMN_SIZE = I; ///< Number of columns
 	static constexpr U SIZE = J * I; ///< Number of total elements
 	static constexpr U SIZE = J * I; ///< Number of total elements
-	static constexpr Bool HAS_SIMD = I == 4 && std::is_same<T, F32>::value && ANKI_SIMD_SSE;
-	static constexpr Bool HAS_MAT4_SIMD = J == 4 && I == 4 && std::is_same<T, F32>::value && ANKI_SIMD_SSE;
-	static constexpr Bool HAS_MAT3X4_SIMD = J == 3 && I == 4 && std::is_same<T, F32>::value && ANKI_SIMD_SSE;
+	static constexpr Bool HAS_SIMD = I == 4 && std::is_same<T, F32>::value && ANKI_ENABLE_SIMD;
+	static constexpr Bool HAS_MAT4_SIMD = J == 4 && I == 4 && std::is_same<T, F32>::value && ANKI_ENABLE_SIMD;
+	static constexpr Bool HAS_MAT3X4_SIMD = J == 3 && I == 4 && std::is_same<T, F32>::value && ANKI_ENABLE_SIMD;
 
 
 	/// @name Constructors
 	/// @name Constructors
 	/// @{
 	/// @{
@@ -73,7 +73,11 @@ public:
 	{
 	{
 		for(U i = 0; i < J; i++)
 		for(U i = 0; i < J; i++)
 		{
 		{
+#if ANKI_SIMD_SSE
 			m_simd[i] = _mm_set1_ps(f);
 			m_simd[i] = _mm_set1_ps(f);
+#else
+			m_simd[i] = {f, f, f, f};
+#endif
 		}
 		}
 	}
 	}
 
 
@@ -399,6 +403,7 @@ public:
 	TMat operator*(const TMat& b) const
 	TMat operator*(const TMat& b) const
 	{
 	{
 		TMat out;
 		TMat out;
+#if ANKI_SIMD_SSE
 		const auto& m = *this;
 		const auto& m = *this;
 
 
 		for(U i = 0; i < 4; i++)
 		for(U i = 0; i < 4; i++)
@@ -416,6 +421,9 @@ public:
 
 
 			out.m_simd[i] = t2;
 			out.m_simd[i] = t2;
 		}
 		}
+#else
+		ANKI_ASSERT(!"TODO");
+#endif
 
 
 		return out;
 		return out;
 	}
 	}
@@ -555,10 +563,14 @@ public:
 	ColumnVec operator*(const RowVec& v) const
 	ColumnVec operator*(const RowVec& v) const
 	{
 	{
 		ColumnVec out;
 		ColumnVec out;
+#if ANKI_SIMD_SSE
 		for(U i = 0; i < J; i++)
 		for(U i = 0; i < J; i++)
 		{
 		{
 			_mm_store_ss(&out[i], _mm_dp_ps(m_simd[i], v.getSimd(), 0xF1));
 			_mm_store_ss(&out[i], _mm_dp_ps(m_simd[i], v.getSimd(), 0xF1));
 		}
 		}
+#else
+		ANKI_ASSERT(!"TODO");
+#endif
 		return out;
 		return out;
 	}
 	}
 	/// @}
 	/// @}
@@ -991,7 +1003,11 @@ public:
 	ANKI_ENABLE_METHOD(J == I && HAS_SIMD)
 	ANKI_ENABLE_METHOD(J == I && HAS_SIMD)
 	void transpose()
 	void transpose()
 	{
 	{
+#if ANKI_SIMD_SSE
 		_MM_TRANSPOSE4_PS(m_simd[0], m_simd[1], m_simd[2], m_simd[3]);
 		_MM_TRANSPOSE4_PS(m_simd[0], m_simd[1], m_simd[2], m_simd[3]);
+#else
+		ANKI_ASSERT(!"TODO");
+#endif
 	}
 	}
 
 
 	void transposeRotationPart()
 	void transposeRotationPart()
@@ -1227,6 +1243,7 @@ public:
 	TMat combineTransformations(const TMat& b) const
 	TMat combineTransformations(const TMat& b) const
 	{
 	{
 		TMat c;
 		TMat c;
+#if ANKI_SIMD_SSE
 		const auto& a = *this;
 		const auto& a = *this;
 
 
 		for(U i = 0; i < 3; i++)
 		for(U i = 0; i < 3; i++)
@@ -1245,6 +1262,9 @@ public:
 
 
 			c.m_simd[i] = t2;
 			c.m_simd[i] = t2;
 		}
 		}
+#else
+		ANKI_ASSERT(!"TODO");
+#endif
 
 
 		return c;
 		return c;
 	}
 	}

+ 102 - 3
AnKi/Math/Vec.h

@@ -25,7 +25,7 @@ public:
 	using Simd = typename MathSimd<T, N>::Type;
 	using Simd = typename MathSimd<T, N>::Type;
 	static constexpr U COMPONENT_COUNT = N;
 	static constexpr U COMPONENT_COUNT = N;
 	static constexpr Bool IS_INTEGER = std::is_integral<T>::value;
 	static constexpr Bool IS_INTEGER = std::is_integral<T>::value;
-	static constexpr Bool HAS_VEC4_SIMD = N == 4 && std::is_same<T, F32>::value && ANKI_SIMD_SSE;
+	static constexpr Bool HAS_VEC4_SIMD = N == 4 && std::is_same<T, F32>::value && ANKI_ENABLE_SIMD;
 
 
 	/// @name Constructors
 	/// @name Constructors
 	/// @{
 	/// @{
@@ -72,7 +72,11 @@ public:
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	explicit TVec(const T f)
 	explicit TVec(const T f)
 	{
 	{
+#if ANKI_SIMD_SSE
 		m_simd = _mm_set1_ps(f);
 		m_simd = _mm_set1_ps(f);
+#else
+		m_simd = vdupq_n_f32(f);
+#endif
 	}
 	}
 
 
 	ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
@@ -142,7 +146,11 @@ public:
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	TVec(const T x_, const T y_, const T z_, const T w_)
 	TVec(const T x_, const T y_, const T z_, const T w_)
 	{
 	{
+#if ANKI_SIMD_SSE
 		m_simd = _mm_set_ps(w_, z_, y_, x_);
 		m_simd = _mm_set_ps(w_, z_, y_, x_);
+#else
+		m_simd = {w_, z_, y_, x_};
+#endif
 	}
 	}
 
 
 	ANKI_ENABLE_METHOD(N == 4)
 	ANKI_ENABLE_METHOD(N == 4)
@@ -2331,7 +2339,11 @@ public:
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	TVec operator+(const TVec& b) const
 	TVec operator+(const TVec& b) const
 	{
 	{
+#if ANKI_SIMD_SSE
 		return TVec(_mm_add_ps(m_simd, b.m_simd));
 		return TVec(_mm_add_ps(m_simd, b.m_simd));
+#else
+		return TVec(m_simd + b.m_simd);
+#endif
 	}
 	}
 
 
 	ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
@@ -2347,7 +2359,11 @@ public:
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	TVec& operator+=(const TVec& b)
 	TVec& operator+=(const TVec& b)
 	{
 	{
+#if ANKI_SIMD_SSE
 		m_simd = _mm_add_ps(m_simd, b.m_simd);
 		m_simd = _mm_add_ps(m_simd, b.m_simd);
+#else
+		m_simd += b.m_simd;
+#endif
 		return *this;
 		return *this;
 	}
 	}
 
 
@@ -2365,7 +2381,11 @@ public:
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	TVec operator-(const TVec& b) const
 	TVec operator-(const TVec& b) const
 	{
 	{
+#if ANKI_SIMD_SSE
 		return TVec(_mm_sub_ps(m_simd, b.m_simd));
 		return TVec(_mm_sub_ps(m_simd, b.m_simd));
+#else
+		return TVec(m_simd - b.m_simd);
+#endif
 	}
 	}
 
 
 	ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
@@ -2381,7 +2401,11 @@ public:
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	TVec& operator-=(const TVec& b)
 	TVec& operator-=(const TVec& b)
 	{
 	{
+#if ANKI_SIMD_SSE
 		m_simd = _mm_sub_ps(m_simd, b.m_simd);
 		m_simd = _mm_sub_ps(m_simd, b.m_simd);
+#else
+		m_simd -= b.m_simd;
+#endif
 		return *this;
 		return *this;
 	}
 	}
 
 
@@ -2399,7 +2423,11 @@ public:
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	TVec operator*(const TVec& b) const
 	TVec operator*(const TVec& b) const
 	{
 	{
+#if ANKI_SIMD_SSE
 		return TVec(_mm_mul_ps(m_simd, b.m_simd));
 		return TVec(_mm_mul_ps(m_simd, b.m_simd));
+#else
+		return TVec(m_simd * b.m_simd);
+#endif
 	}
 	}
 
 
 	ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
@@ -2415,7 +2443,11 @@ public:
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	TVec& operator*=(const TVec& b)
 	TVec& operator*=(const TVec& b)
 	{
 	{
+#if ANKI_SIMD_SSE
 		m_simd = _mm_mul_ps(m_simd, b.m_simd);
 		m_simd = _mm_mul_ps(m_simd, b.m_simd);
+#else
+		m_simd *= b.m_simd;
+#endif
 		return *this;
 		return *this;
 	}
 	}
 
 
@@ -2434,7 +2466,11 @@ public:
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	TVec operator/(const TVec& b) const
 	TVec operator/(const TVec& b) const
 	{
 	{
+#if ANKI_SIMD_SSE
 		return TVec(_mm_div_ps(m_simd, b.m_simd));
 		return TVec(_mm_div_ps(m_simd, b.m_simd));
+#else
+		return TVec(m_simd / b.m_simd);
+#endif
 	}
 	}
 
 
 	ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
@@ -2451,7 +2487,11 @@ public:
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	TVec& operator/=(const TVec& b)
 	TVec& operator/=(const TVec& b)
 	{
 	{
+#if ANKI_SIMD_SSE
 		m_simd = _mm_div_ps(m_simd, b.m_simd);
 		m_simd = _mm_div_ps(m_simd, b.m_simd);
+#else
+		m_simd /= b.m_simd;
+#endif
 		return *this;
 		return *this;
 	}
 	}
 
 
@@ -2469,7 +2509,11 @@ public:
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	TVec operator-() const
 	TVec operator-() const
 	{
 	{
+#if ANKI_SIMD_SSE
 		return TVec(_mm_xor_ps(m_simd, _mm_set1_ps(-0.0)));
 		return TVec(_mm_xor_ps(m_simd, _mm_set1_ps(-0.0)));
+#else
+		return TVec(-m_simd);
+#endif
 	}
 	}
 
 
 	ANKI_ENABLE_METHOD(IS_INTEGER)
 	ANKI_ENABLE_METHOD(IS_INTEGER)
@@ -2816,7 +2860,11 @@ public:
 	T dot(const TVec& b) const
 	T dot(const TVec& b) const
 	{
 	{
 		T o;
 		T o;
+#if ANKI_SIMD_SSE
 		_mm_store_ss(&o, _mm_dp_ps(m_simd, b.m_simd, 0xF1));
 		_mm_store_ss(&o, _mm_dp_ps(m_simd, b.m_simd, 0xF1));
+#else
+		ANKI_ASSERT(!"TODO");
+#endif
 		return o;
 		return o;
 	}
 	}
 
 
@@ -2841,6 +2889,7 @@ public:
 	{
 	{
 		ANKI_ASSERT(w() == T(0));
 		ANKI_ASSERT(w() == T(0));
 		ANKI_ASSERT(b.w() == T(0));
 		ANKI_ASSERT(b.w() == T(0));
+#if ANKI_SIMD_SSE
 		const auto& a = *this;
 		const auto& a = *this;
 		constexpr unsigned int mask0 = _MM_SHUFFLE(3, 0, 2, 1);
 		constexpr unsigned int mask0 = _MM_SHUFFLE(3, 0, 2, 1);
 		constexpr unsigned int mask1 = _MM_SHUFFLE(3, 1, 0, 2);
 		constexpr unsigned int mask1 = _MM_SHUFFLE(3, 1, 0, 2);
@@ -2851,6 +2900,18 @@ public:
 			_mm_mul_ps(_mm_shuffle_ps(a.m_simd, a.m_simd, U8(mask1)), _mm_shuffle_ps(b.m_simd, b.m_simd, U8(mask0)));
 			_mm_mul_ps(_mm_shuffle_ps(a.m_simd, a.m_simd, U8(mask1)), _mm_shuffle_ps(b.m_simd, b.m_simd, U8(mask0)));
 
 
 		return TVec(_mm_sub_ps(tmp0, tmp1));
 		return TVec(_mm_sub_ps(tmp0, tmp1));
+#else
+		TVec out;
+		float32x4_t& c = out.m_simd;
+		const float32x4_t& v0 = m_simd;
+		const float32x4_t& v1 = b.m_simd;
+
+		c = vmulq_f32(v0, __builtin_shufflevector(v1, v1, 1, 2, 0, 3));
+		c = vfmsq_f32(__builtin_shufflevector(v0, v0, 1, 2, 0, 3), v1, c);
+		c = __builtin_shufflevector(c, c, 1, 2, 0, 3);
+
+		return out;
+#endif
 	}
 	}
 
 
 	ANKI_ENABLE_METHOD(N == 3)
 	ANKI_ENABLE_METHOD(N == 3)
@@ -2908,7 +2969,11 @@ public:
 	T getLengthSquared() const
 	T getLengthSquared() const
 	{
 	{
 		T o;
 		T o;
+#if ANKI_SIMD_SSE
 		_mm_store_ss(&o, _mm_dp_ps(m_simd, m_simd, 0xF1));
 		_mm_store_ss(&o, _mm_dp_ps(m_simd, m_simd, 0xF1));
+#else
+		ANKI_ASSERT(!"TODO");
+#endif
 		return o;
 		return o;
 	}
 	}
 
 
@@ -2936,8 +3001,22 @@ public:
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	void normalize()
 	void normalize()
 	{
 	{
-		__m128 inverseNorm = _mm_rsqrt_ps(_mm_dp_ps(m_simd, m_simd, 0xFF));
+#if ANKI_SIMD_SSE
+		const __m128 inverseNorm = _mm_rsqrt_ps(_mm_dp_ps(m_simd, m_simd, 0xFF));
 		m_simd = _mm_mul_ps(m_simd, inverseNorm);
 		m_simd = _mm_mul_ps(m_simd, inverseNorm);
+#else
+		// Dot (len squared)
+		float32x4_t tmp = m_simd * m_simd;
+		float32x2_t sum = vpadd_f32(vget_low_f32(tmp), vget_high_f32(tmp));
+		sum = vpadd_f32(sum, sum);
+		float32x4_t lensq = vdupq_lane_f32(sum, 0);
+
+		// 1/sqrt(lensq)
+		float32x4_t mul = vrsqrteq_f32(lensq);
+
+		// Multiply
+		m_simd *= mul;
+#endif
 	}
 	}
 
 
 	ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(!HAS_VEC4_SIMD)
@@ -2949,8 +3028,13 @@ public:
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	TVec getNormalized() const
 	TVec getNormalized() const
 	{
 	{
-		__m128 inverse_norm = _mm_rsqrt_ps(_mm_dp_ps(m_simd, m_simd, 0xFF));
+#if ANKI_SIMD_SSE
+		const __m128 inverse_norm = _mm_rsqrt_ps(_mm_dp_ps(m_simd, m_simd, 0xFF));
 		return TVec(_mm_mul_ps(m_simd, inverse_norm));
 		return TVec(_mm_mul_ps(m_simd, inverse_norm));
+#else
+		ANKI_ASSERT(!"TODO");
+		return TVec(T(0));
+#endif
 	}
 	}
 
 
 	/// Return lerp(this, v1, t)
 	/// Return lerp(this, v1, t)
@@ -2973,8 +3057,13 @@ public:
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	TVec abs() const
 	TVec abs() const
 	{
 	{
+#if ANKI_SIMD_SSE
 		const __m128 signMask = _mm_set1_ps(-0.0f);
 		const __m128 signMask = _mm_set1_ps(-0.0f);
 		return TVec(_mm_andnot_ps(signMask, m_simd));
 		return TVec(_mm_andnot_ps(signMask, m_simd));
+#else
+		ANKI_ASSERT(!"TODO");
+		return TVec(T(0));
+#endif
 	}
 	}
 
 
 	/// Get clamped between two values.
 	/// Get clamped between two values.
@@ -3005,7 +3094,12 @@ public:
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	TVec min(const TVec& b) const
 	TVec min(const TVec& b) const
 	{
 	{
+#if ANKI_SIMD_SSE
 		return TVec(_mm_min_ps(m_simd, b.m_simd));
 		return TVec(_mm_min_ps(m_simd, b.m_simd));
+#else
+		ANKI_ASSERT(!"TODO");
+		return TVec(T(0));
+#endif
 	}
 	}
 
 
 	/// Get the min of all components.
 	/// Get the min of all components.
@@ -3030,7 +3124,12 @@ public:
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	ANKI_ENABLE_METHOD(HAS_VEC4_SIMD)
 	TVec max(const TVec& b) const
 	TVec max(const TVec& b) const
 	{
 	{
+#if ANKI_SIMD_SSE
 		return TVec(_mm_max_ps(m_simd, b.m_simd));
 		return TVec(_mm_max_ps(m_simd, b.m_simd));
+#else
+		ANKI_ASSERT(!"TODO");
+		return TVec(T(0));
+#endif
 	}
 	}
 
 
 	/// Get the max of all components.
 	/// Get the max of all components.

+ 1 - 1
AnKi/Util/SparseArray.inl.h

@@ -165,7 +165,7 @@ void SparseArray<T, TIndex>::grow(TAlloc& alloc)
 	ANKI_ASSERT(startPos != ~Index(0));
 	ANKI_ASSERT(startPos != ~Index(0));
 
 
 	// Start re-inserting
 	// Start re-inserting
-	U count = oldCapacity;
+	Index count = oldCapacity;
 	Index pos = startPos;
 	Index pos = startPos;
 	while(count--)
 	while(count--)
 	{
 	{

+ 0 - 2
CMakeLists.txt

@@ -156,8 +156,6 @@ if(NOT MSVC)
 
 
 	if(LINUX OR MACOS OR WINDOWS)
 	if(LINUX OR MACOS OR WINDOWS)
 		add_definitions("-msse4")
 		add_definitions("-msse4")
-	else()
-		add_definitions("-mfpu=neon")
 	endif()
 	endif()
 
 
 	if(ANKI_LTO)
 	if(ANKI_LTO)

+ 2 - 2
Tests/Gr/ClassGpuAllocator.cpp

@@ -145,8 +145,8 @@ ANKI_TEST(Gr, ClassGpuAllocator)
 
 
 			std::shuffle(handles.begin(), handles.end(), gen);
 			std::shuffle(handles.begin(), handles.end(), gen);
 
 
-			U halfSize = (handles.size() * 3) / 4;
-			for(U i = halfSize; i < handles.size(); ++i)
+			PtrSize halfSize = (handles.size() * 3) / 4;
+			for(PtrSize i = halfSize; i < handles.size(); ++i)
 			{
 			{
 				calloc.free(handles[i]);
 				calloc.free(handles[i]);
 			}
 			}

+ 3 - 2
Tools/Android/app/build.gradle

@@ -12,10 +12,11 @@ android {
 
 
         externalNativeBuild {
         externalNativeBuild {
             cmake {
             cmake {
-                version "3.12+"
                 // armeabi is not supported, not building for mips in samples
                 // armeabi is not supported, not building for mips in samples
                 abiFilters 'arm64-v8a', 'x86_64'
                 abiFilters 'arm64-v8a', 'x86_64'
-                arguments '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=c++_static'
+                arguments '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=c++_static'//, "-DPYTHON_EXECUTABLE:FILEPATH=C:\\Users\\pancha01\\AppData\\Local\\Programs\\Python\\Python39\\python.exe"
+                version "3.12+"
+                targets "Sponza"
             }
             }
         }
         }
     }
     }