mesa: guard better when building with sse4.1 optimisations
authorEmil Velikov <emil.l.velikov@gmail.com>
Fri, 1 Aug 2014 16:06:10 +0000 (17:06 +0100)
committerEmil Velikov <emil.l.velikov@gmail.com>
Tue, 12 Aug 2014 23:46:55 +0000 (00:46 +0100)
When the compiler is not capable/does not accept -msse4.1 while the target
has the instruction set we'll blow up as _mesa_streaming_load_memcpy is
going to be undefined.

To make sure that never happens, wrap the runtime cpu check+caller in an
ifdef thus do not compile that hunk of the code.

Fix the android build by enabling the optimisation and adding the define
where applicable.

v2: autoconf conditionals end with "fi" rather than endif.
v3: Wrap the definition and call to intel_miptree_{un,}map_movntdqa in
if defined(USE_SSE41). Spotted by Matt.

Cc: Matt Turner <mattst88@gmail.com>
Cc: Adrian Negreanu <adrian.m.negreanu@intel.com>
Cc: "10.1 10.2" <mesa-stable@lists.freedesktop.org>
Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
configure.ac
src/mesa/Android.libmesa_dricore.mk
src/mesa/drivers/dri/i965/Android.mk
src/mesa/drivers/dri/i965/intel_mipmap_tree.c

index 9aeebdf148e01e7b7ab1f68a16cdfc3045bc0d40..4ff87ebaa9dd9d718746370eea146e8141e543d1 100644 (file)
@@ -235,6 +235,9 @@ dnl
 dnl Optional flags, check for compiler support
 dnl
 AX_CHECK_COMPILE_FLAG([-msse4.1], [SSE41_SUPPORTED=1], [SSE41_SUPPORTED=0])
+if test "x$SSE41_SUPPORTED" = x1; then
+    DEFINES="$DEFINES -DUSE_SSE41"
+fi
 AM_CONDITIONAL([SSE41_SUPPORTED], [test x$SSE41_SUPPORTED = x1])
 
 dnl
index 217f6498a79f1a8155f43f05a2c33c2627f43180..28d6feb359f139b557de15f5fdbb5edd889bb5f4 100644 (file)
@@ -50,6 +50,7 @@ endif # MESA_ENABLE_ASM
 ifeq ($(ARCH_X86_HAVE_SSE4_1),true)
 LOCAL_SRC_FILES += \
        $(SRCDIR)main/streaming-load-memcpy.c
+LOCAL_CFLAGS := -msse4.1
 endif
 
 LOCAL_C_INCLUDES := \
index 7e3fd65e880a6c061b606e951097f887d9f3a03e..2c6446f8b385aac1a8265fe15ca782824f3ea6c2 100644 (file)
@@ -35,6 +35,11 @@ include $(LOCAL_PATH)/Makefile.sources
 LOCAL_CFLAGS := \
        $(MESA_DRI_CFLAGS)
 
+ifeq ($(ARCH_X86_HAVE_SSE4_1),true)
+LOCAL_CFLAGS += \
+       -DUSE_SSE41
+endif
+
 LOCAL_C_INCLUDES := \
        $(i965_INCLUDES) \
        $(MESA_DRI_C_INCLUDES) \
index 38396d7e3e6a81ceaa248069706507c0e29c03cc..84a6718be925c12ae648f6145420420d9a832371 100644 (file)
@@ -1843,6 +1843,7 @@ intel_miptree_unmap_blit(struct brw_context *brw,
 /**
  * "Map" a buffer by copying it to an untiled temporary using MOVNTDQA.
  */
+#if defined(USE_SSE41)
 static void
 intel_miptree_map_movntdqa(struct brw_context *brw,
                            struct intel_mipmap_tree *mt,
@@ -1910,6 +1911,7 @@ intel_miptree_unmap_movntdqa(struct brw_context *brw,
    map->buffer = NULL;
    map->ptr = NULL;
 }
+#endif
 
 static void
 intel_miptree_map_s8(struct brw_context *brw,
@@ -2290,8 +2292,10 @@ intel_miptree_map(struct brw_context *brw,
               mt->bo->size >= brw->max_gtt_map_object_size) {
       assert(can_blit_slice(mt, level, slice));
       intel_miptree_map_blit(brw, mt, map, level, slice);
+#if defined(USE_SSE41)
    } else if (!(mode & GL_MAP_WRITE_BIT) && !mt->compressed && cpu_has_sse4_1) {
       intel_miptree_map_movntdqa(brw, mt, map, level, slice);
+#endif
    } else {
       intel_miptree_map_gtt(brw, mt, map, level, slice);
    }
@@ -2328,8 +2332,10 @@ intel_miptree_unmap(struct brw_context *brw,
       intel_miptree_unmap_depthstencil(brw, mt, map, level, slice);
    } else if (map->mt) {
       intel_miptree_unmap_blit(brw, mt, map, level, slice);
+#if defined(USE_SSE41)
    } else if (map->buffer && cpu_has_sse4_1) {
       intel_miptree_unmap_movntdqa(brw, mt, map, level, slice);
+#endif
    } else {
       intel_miptree_unmap_gtt(brw, mt, map, level, slice);
    }