Browse Source

Improved aligned types support

Christophe Riccio 9 years ago
parent
commit
b3d57f2cc9

+ 4 - 0
glm/detail/setup.hpp

@@ -647,6 +647,10 @@
 #	define GLM_EXPLICIT
 #endif
 
+///////////////////////////////////////////////////////////////////////////////////
+
+#define GLM_HAS_ALIGNED_TYPE GLM_HAS_UNRESTRICTED_UNIONS
+
 ///////////////////////////////////////////////////////////////////////////////////
 // Length type
 

+ 27 - 2
glm/detail/type_vec.hpp

@@ -16,7 +16,7 @@ namespace detail
 			uint8 data[size];
 		} type;
 	};
-/*
+
 	template <typename T, std::size_t size>
 	struct storage<T, size, true>
 	{
@@ -24,7 +24,7 @@ namespace detail
 			uint8 data[size];
 		} type;
 	};
-*/
+
 #	if GLM_ARCH & GLM_ARCH_SSE2_BIT
 		template <>
 		struct storage<float, 16, true>
@@ -43,6 +43,31 @@ namespace detail
 		{
 			typedef glm_uvec4 type;
 		};
+/*
+#	else
+		typedef union __declspec(align(16)) glm_128
+		{
+			unsigned __int8 data[16];
+		} glm_128;
+
+		template <>
+		struct storage<float, 16, true>
+		{
+			typedef glm_128 type;
+		};
+
+		template <>
+		struct storage<int, 16, true>
+		{
+			typedef glm_128 type;
+		};
+
+		template <>
+		struct storage<unsigned int, 16, true>
+		{
+			typedef glm_128 type;
+		};
+*/
 #	endif
 
 #	if (GLM_ARCH & GLM_ARCH_AVX_BIT)

+ 1 - 1
glm/detail/type_vec1.hpp

@@ -27,7 +27,7 @@ namespace glm
 
 		// -- Data --
 
-#		if GLM_HAS_UNRESTRICTED_UNIONS && (defined(GLM_SWIZZLE) || (GLM_ARCH & (GLM_ARCH_SSE2_BIT | GLM_ARCH_NEON_BIT)))
+#		if GLM_HAS_ALIGNED_TYPE
 #			if GLM_COMPILER & GLM_COMPILER_GCC
 #				pragma GCC diagnostic push
 #				pragma GCC diagnostic ignored "-Wpedantic"

+ 1 - 1
glm/detail/type_vec2.hpp

@@ -26,7 +26,7 @@ namespace glm
 
 		// -- Data --
 
-#		if GLM_HAS_UNRESTRICTED_UNIONS && (defined(GLM_SWIZZLE) || (GLM_ARCH & (GLM_ARCH_SSE2_BIT | GLM_ARCH_NEON_BIT)))
+#		if GLM_HAS_ALIGNED_TYPE
 #			if GLM_COMPILER & GLM_COMPILER_GCC
 #				pragma GCC diagnostic push
 #				pragma GCC diagnostic ignored "-Wpedantic"

+ 1 - 1
glm/detail/type_vec3.hpp

@@ -26,7 +26,7 @@ namespace glm
 
 		// -- Data --
 
-#		if GLM_HAS_UNRESTRICTED_UNIONS && (defined(GLM_SWIZZLE) || (GLM_ARCH & (GLM_ARCH_SSE2_BIT | GLM_ARCH_NEON_BIT)))
+#		if GLM_HAS_ALIGNED_TYPE
 #			if GLM_COMPILER & GLM_COMPILER_GCC
 #				pragma GCC diagnostic push
 #				pragma GCC diagnostic ignored "-Wpedantic"

+ 1 - 1
glm/detail/type_vec4.hpp

@@ -27,7 +27,7 @@ namespace glm
 
 		// -- Data --
 
-#		if GLM_HAS_UNRESTRICTED_UNIONS && (defined(GLM_SWIZZLE) || (GLM_ARCH & (GLM_ARCH_SSE2_BIT | GLM_ARCH_NEON_BIT)))
+#		if GLM_HAS_ALIGNED_TYPE
 #			if GLM_COMPILER & GLM_COMPILER_GCC
 #				pragma GCC diagnostic push
 #				pragma GCC diagnostic ignored "-Wpedantic"

+ 1 - 1
glm/gtc/quaternion.hpp

@@ -40,7 +40,7 @@ namespace glm
 
 		// -- Data --
 
-#		if GLM_HAS_UNRESTRICTED_UNIONS && (defined(GLM_SWIZZLE) || (GLM_ARCH & (GLM_ARCH_SSE2_BIT | GLM_ARCH_NEON_BIT)))
+#		if GLM_HAS_ALIGNED_TYPE
 #			if GLM_COMPILER & GLM_COMPILER_GCC
 #				pragma GCC diagnostic push
 #				pragma GCC diagnostic ignored "-Wpedantic"

+ 6 - 3
test/gtc/gtc_type_aligned.cpp

@@ -21,7 +21,9 @@ struct my_vec4_aligned
 	glm::uint32 a;
 	glm::aligned_vec4 b;
 };
-GLM_STATIC_ASSERT(sizeof(my_vec4_aligned) == sizeof(glm::aligned_vec4) * 2, "glm::vec4 aligned is not correct");
+#if GLM_HAS_ALIGNED_TYPE
+	GLM_STATIC_ASSERT(sizeof(my_vec4_aligned) == sizeof(glm::aligned_vec4) * 2, "glm::vec4 aligned is not correct");
+#endif
 
 struct my_dvec4_packed
 {
@@ -35,7 +37,6 @@ struct my_dvec4_aligned
 	glm::uint64 a;
 	glm::aligned_dvec4 b;
 };
-//FIXME
 //GLM_STATIC_ASSERT(sizeof(my_dvec4_aligned) == sizeof(glm::aligned_dvec4) * 2, "glm::dvec4 aligned is not correct");
 
 struct my_ivec4_packed
@@ -50,7 +51,9 @@ struct my_ivec4_aligned
 	glm::uint32 a;
 	glm::aligned_ivec4 b;
 };
-GLM_STATIC_ASSERT(sizeof(my_ivec4_aligned) == sizeof(glm::aligned_ivec4) * 2, "glm::ivec4 aligned is not correct");
+#if GLM_HAS_ALIGNED_TYPE
+	GLM_STATIC_ASSERT(sizeof(my_ivec4_aligned) == sizeof(glm::aligned_ivec4) * 2, "glm::ivec4 aligned is not correct");
+#endif
 
 struct my_u8vec4_packed
 {