mirror of
				https://git.code.sf.net/p/libpng/code.git
				synced 2025-07-10 18:04:09 +02:00 
			
		
		
		
	[libpng16] Allow run-time ARM NEON checking to be disabled. A new configure
option:
    --enable-arm-neon=always will stop the run-time checks. New checks
    within arm/arm_init.c will cause the code not to be compiled unless
    __ARM_NEON__ is set. This should make it fail safe (if someone asks
    for it on then the build will fail if it can't be done.)
Fixed ALIGNED_MEMORY support.
			
			
This commit is contained in:
		
							parent
							
								
									0cc3e9e38c
								
							
						
					
					
						commit
						09a5ca72ac
					
				
							
								
								
									
										6
									
								
								ANNOUNCE
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								ANNOUNCE
									
									
									
									
									
								
							@ -50,6 +50,12 @@ Version 1.6.1beta02 [February 19, 2013]
 | 
			
		||||
  Reenabled code to allow zero length PLTE chunks for MNG.
 | 
			
		||||
 | 
			
		||||
Version 1.6.1beta03 [February 19, 2013]
 | 
			
		||||
  Fixed ALIGNED_MEMORY support.
 | 
			
		||||
  Allow run-time ARM NEON checking to be disabled. A new configure option:
 | 
			
		||||
    --enable-arm-neon=always will stop the run-time checks. New checks
 | 
			
		||||
    within arm/arm_init.c will cause the code not to be compiled unless
 | 
			
		||||
    __ARM_NEON__ is set. This should make it fail safe (if someone asks
 | 
			
		||||
    for it on then the build will fail if it can't be done.)
 | 
			
		||||
 | 
			
		||||
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
 | 
			
		||||
(subscription required; visit
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										6
									
								
								CHANGES
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								CHANGES
									
									
									
									
									
								
							@ -4407,6 +4407,12 @@ Version 1.6.1beta02 [February 19, 2013]
 | 
			
		||||
  Reenabled code to allow zero length PLTE chunks for MNG.
 | 
			
		||||
 | 
			
		||||
Version 1.6.1beta03 [February 19, 2013]
 | 
			
		||||
  Fixed ALIGNED_MEMORY support.
 | 
			
		||||
  Allow run-time ARM NEON checking to be disabled. A new configure option:
 | 
			
		||||
    --enable-arm-neon=always will stop the run-time checks. New checks
 | 
			
		||||
    within arm/arm_init.c will cause the code not to be compiled unless
 | 
			
		||||
    __ARM_NEON__ is set. This should make it fail safe (if someone asks
 | 
			
		||||
    for it on then the build will fail if it can't be done.)
 | 
			
		||||
 | 
			
		||||
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
 | 
			
		||||
(subscription required; visit
 | 
			
		||||
 | 
			
		||||
@ -16,12 +16,17 @@
 | 
			
		||||
 | 
			
		||||
#include "../pngpriv.h"
 | 
			
		||||
 | 
			
		||||
#if defined(PNG_FILTER_OPTIMIZATIONS) && defined(__arm__) && \
 | 
			
		||||
   defined(__ARM_NEON__)
 | 
			
		||||
/* __arm__ is defined by GCC, MSVC defines _M_ARM to the ARM version number,
 | 
			
		||||
 * Andoid intends to define __ANDROID__, however there are bugs in their
 | 
			
		||||
 * toolchain; use -D__ANDROID__ to work round this.
 | 
			
		||||
 *
 | 
			
		||||
 * __ARM_NEON__ is used to ensure that the compiler has the appropriate ARM
 | 
			
		||||
 * NEON support
 | 
			
		||||
 */
 | 
			
		||||
#if defined(__linux__) && defined(__arm__)
 | 
			
		||||
#define CHECK_NEON
 | 
			
		||||
 | 
			
		||||
#ifdef PNG_ARM_NEON_CHECK_SUPPORTED /* Do run-time checks */
 | 
			
		||||
#include <signal.h> /* for sig_atomic_t */
 | 
			
		||||
 | 
			
		||||
#ifdef __ANDROID__
 | 
			
		||||
@ -43,7 +48,7 @@ png_have_neon(png_structp png_ptr)
 | 
			
		||||
   return andoid_getCpuFamily() == ANDROID_CPU_FAMILY_ARM &&
 | 
			
		||||
      (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0;
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
#elif defined(__linux__)
 | 
			
		||||
/* The generic __linux__ implementation requires reading /proc/self/auxv and
 | 
			
		||||
 * looking at each element for one that records NEON capabilities.
 | 
			
		||||
 */
 | 
			
		||||
@ -143,14 +148,20 @@ png_have_neon(png_structp png_ptr)
 | 
			
		||||
   close(fd);
 | 
			
		||||
   return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif /* !__ANDROID__ */
 | 
			
		||||
#endif /* __linux__ && __arm__ */
 | 
			
		||||
#else
 | 
			
		||||
   /* We don't know how to do a run-time check on this system */
 | 
			
		||||
#  error "no support for run-time ARM NEON checks"
 | 
			
		||||
#endif /* OS checks */
 | 
			
		||||
#endif /* PNG_ARM_NEON_CHECK_SUPPORTED */
 | 
			
		||||
 | 
			
		||||
#ifndef PNG_ALIGNED_MEMORY_SUPPORTED
 | 
			
		||||
#  error "ALIGNED_MEMORY is required; set: -DPNG_ALIGNED_MEMORY_SUPPORTED"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
png_init_filter_functions_neon(png_structp pp, unsigned int bpp)
 | 
			
		||||
{
 | 
			
		||||
#ifdef __arm__
 | 
			
		||||
#ifdef CHECK_NEON
 | 
			
		||||
#ifdef PNG_ARM_NEON_CHECK_SUPPORTED
 | 
			
		||||
   static volatile sig_atomic_t no_neon = -1; /* not checked */
 | 
			
		||||
 | 
			
		||||
   if (no_neon < 0)
 | 
			
		||||
@ -158,7 +169,7 @@ png_init_filter_functions_neon(png_structp pp, unsigned int bpp)
 | 
			
		||||
 | 
			
		||||
   if (no_neon)
 | 
			
		||||
      return;
 | 
			
		||||
#endif
 | 
			
		||||
#endif /* PNG_ARM_NEON_CHECK_SUPPORTED */
 | 
			
		||||
 | 
			
		||||
   /* IMPORTANT: any new external functions used here must be declared using
 | 
			
		||||
    * PNG_INTERNAL_FUNCTION in ../pngpriv.h.  This is required so that the
 | 
			
		||||
@ -188,8 +199,5 @@ png_init_filter_functions_neon(png_structp pp, unsigned int bpp)
 | 
			
		||||
      pp->read_filter[PNG_FILTER_VALUE_PAETH-1] =
 | 
			
		||||
          png_read_filter_row_paeth4_neon;
 | 
			
		||||
   }
 | 
			
		||||
#else
 | 
			
		||||
   PNG_UNUSED(pp)
 | 
			
		||||
   PNG_UNUSED(bpp)
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
#endif /* FILTER_OPTIMIZATIONS && __arm__ && __ARM_NEON__ */
 | 
			
		||||
 | 
			
		||||
@ -10,11 +10,14 @@
 | 
			
		||||
 * and license in png.h
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* This is required to get the symbol renames, which are #defines */
 | 
			
		||||
/* This is required to get the symbol renames, which are #defines, and also
 | 
			
		||||
 * includes the value of PNG_FILTER_OPTIMIZATIONS.
 | 
			
		||||
 */
 | 
			
		||||
#define PNG_VERSION_INFO_ONLY
 | 
			
		||||
#include "../pngpriv.h"
 | 
			
		||||
 | 
			
		||||
#ifdef __arm__
 | 
			
		||||
#if defined(PNG_FILTER_OPTIMIZATIONS) && defined(__arm__) && \
 | 
			
		||||
   defined(__ARM_NEON__)
 | 
			
		||||
#if defined(__linux__) && defined(__ELF__)
 | 
			
		||||
.section .note.GNU-stack,"",%progbits /* mark stack as non-executable */
 | 
			
		||||
#endif
 | 
			
		||||
@ -229,4 +232,4 @@ func    png_read_filter_row_paeth3_neon, export=1
 | 
			
		||||
 | 
			
		||||
        pop             {r4,pc}
 | 
			
		||||
endfunc
 | 
			
		||||
#endif
 | 
			
		||||
#endif /* FILTER_OPTIMIZATIONS && __arm__ && __ARM_NEON__ */
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										13
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								configure.ac
									
									
									
									
									
								
							@ -232,15 +232,20 @@ AM_CONDITIONAL([DO_PNG_PREFIX], [test "${with_libpng_prefix:-no}" != "no"])
 | 
			
		||||
AC_SUBST([AM_CCASFLAGS], [-Wa,--noexecstack])
 | 
			
		||||
 | 
			
		||||
AC_ARG_ENABLE([arm-neon],
 | 
			
		||||
   AS_HELP_STRING([[[--enable-arm-neon]]], [Enable ARM NEON optimizations]),
 | 
			
		||||
   [if test "${enableval}" = "yes"; then
 | 
			
		||||
   AS_HELP_STRING([[[--enable-arm-neon]]],
 | 
			
		||||
      [Enable ARM NEON optimizations: use 'always' to turn off run-time checks]),
 | 
			
		||||
   [if test "${enableval}" = "yes" -o "${enableval}" = "always"; then
 | 
			
		||||
      AC_DEFINE([PNG_FILTER_OPTIMIZATIONS],
 | 
			
		||||
                [png_init_filter_functions_neon],
 | 
			
		||||
                [ARM NEON filter initialization function])
 | 
			
		||||
      AC_DEFINE([PNG_ALIGNED_MEMORY_SUPPORTED], [1],
 | 
			
		||||
      AC_DEFINE([PNG_ALIGNED_MEMORY_SUPPORTED], [],
 | 
			
		||||
                [Align row buffers])
 | 
			
		||||
      if test "${enableval}" = "always"; then
 | 
			
		||||
         AC_DEFINE([PNG_NO_ARM_NEON_CHECK], [],
 | 
			
		||||
                   [Turn off run-time checking for ARM NEON support])
 | 
			
		||||
      fi
 | 
			
		||||
    fi])
 | 
			
		||||
AM_CONDITIONAL([PNG_ARM_NEON], [test "${enable_arm_neon:-no}" = yes])
 | 
			
		||||
AM_CONDITIONAL([PNG_ARM_NEON], [test "${enable_arm_neon:-no}" != "no"])
 | 
			
		||||
 | 
			
		||||
AC_MSG_NOTICE([[Extra options for compiler: $PNG_COPTS]])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -136,6 +136,12 @@ logunsupported = 1
 | 
			
		||||
# - PNG_USER_VERSIONINFO_COMPANYNAME
 | 
			
		||||
# - PNG_USER_VERSIONINFO_LEGALTRADEMARKS
 | 
			
		||||
 | 
			
		||||
# It is necessary to include configures definitions here so that AC_DEFINE
 | 
			
		||||
# in configure.ac works in a comprehensible way
 | 
			
		||||
@#if defined(HAVE_CONFIG_H) && !defined(PNG_NO_CONFIG_H)
 | 
			
		||||
@#  include "config.h"
 | 
			
		||||
@#endif
 | 
			
		||||
 | 
			
		||||
@#ifdef PNG_USER_CONFIG
 | 
			
		||||
@#  include "pngusr.h"
 | 
			
		||||
@#endif
 | 
			
		||||
@ -187,6 +193,18 @@ setting PREFIX
 | 
			
		||||
 | 
			
		||||
setting DEFAULT_READ_MACROS default 1
 | 
			
		||||
 | 
			
		||||
# This setting allows a hardware or configuration specific filter optimization
 | 
			
		||||
# function to be specified, the argument is the name of the filter initializaion
 | 
			
		||||
# function to use.
 | 
			
		||||
 | 
			
		||||
setting FILTER_OPTIMIZATIONS
 | 
			
		||||
 | 
			
		||||
# This option turns on runtime checks for ARM NEON support, it is irrelevant
 | 
			
		||||
# on other platforms and it is irrelevant unless NEON code is turned on.  Checks
 | 
			
		||||
# are on by default
 | 
			
		||||
 | 
			
		||||
option ARM_NEON_CHECK
 | 
			
		||||
 | 
			
		||||
# These settings configure the default compression level (0-9) and 'strategy';
 | 
			
		||||
# strategy is as defined by the implementors of zlib, it describes the input
 | 
			
		||||
# data and modifies the zlib parameters in an attempt to optimize the balance
 | 
			
		||||
@ -577,7 +595,7 @@ setting sRGB_PROFILE_CHECKS default 2
 | 
			
		||||
# but can help (in theory) on some architectures.  Only affects
 | 
			
		||||
# internal structures.  Added at libpng 1.4.0
 | 
			
		||||
 | 
			
		||||
option ALIGN_MEMORY
 | 
			
		||||
option ALIGNED_MEMORY
 | 
			
		||||
 | 
			
		||||
# Buggy compilers (e.g., gcc 2.7.2.2) need PNG_NO_POINTER_INDEXING
 | 
			
		||||
# See png[wr]util.c, normally this should always be *on*
 | 
			
		||||
 | 
			
		||||
@ -44,7 +44,7 @@
 | 
			
		||||
/* end of settings */
 | 
			
		||||
/* options */
 | 
			
		||||
#define PNG_16BIT_SUPPORTED
 | 
			
		||||
#define PNG_ALIGN_MEMORY_SUPPORTED
 | 
			
		||||
#define PNG_ALIGNED_MEMORY_SUPPORTED
 | 
			
		||||
#define PNG_BENIGN_ERRORS_SUPPORTED
 | 
			
		||||
#define PNG_BENIGN_READ_ERRORS_SUPPORTED
 | 
			
		||||
/*#undef PNG_BENIGN_WRITE_ERRORS_SUPPORTED*/
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user