Rebased ref, commits from common ancestor: commit 9cb066601c5cda082333ef8bbe74f9489790ed5d Author: Emil Velikov <emil.veli...@collabora.com> Date: Wed Jan 18 20:12:04 2017 +0000
Update version to 17.0.0-rc1 Signed-off-by: Emil Velikov <emil.veli...@collabora.com> diff --git a/VERSION b/VERSION index 19547f8..964d0ff 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -17.0.0-devel +17.0.0-rc1 commit 45297f7e4abe152c82f43216eb473f5248fd18cd Author: Emil Velikov <emil.veli...@collabora.com> Date: Wed Jan 18 19:48:37 2017 +0000 utils: really remove the __END_DECLS macro Fixes: d1efa09d342 "util: import sha1 implementation from OpenBSD" Signed-off-by: Emil Velikov <emil.veli...@collabora.com> (cherry picked from commit ea8b2624c8da1061e93124a760cae2ffb5f027ad) diff --git a/src/util/sha1/sha1.h b/src/util/sha1/sha1.h index de07e1a..243481a 100644 --- a/src/util/sha1/sha1.h +++ b/src/util/sha1/sha1.h @@ -31,7 +31,6 @@ void SHA1Pad(SHA1_CTX *); void SHA1Transform(uint32_t [5], const uint8_t [SHA1_BLOCK_LENGTH]); void SHA1Update(SHA1_CTX *, const uint8_t *, size_t); void SHA1Final(uint8_t [SHA1_DIGEST_LENGTH], SHA1_CTX *); -__END_DECLS #define HTONDIGEST(x) do { \ x[0] = htonl(x[0]); \ commit acc78377990ba986060214466d44ea364529c363 Author: Emil Velikov <emil.veli...@collabora.com> Date: Wed Jan 18 19:40:31 2017 +0000 utils: build sha1/disk cache only with Android/Autoconf Earlier commit imported a SHA1 implementation and relaxed the SHA1 and disk cache handling, broking the Windows builds. Restrict things for now until we get to a proper fix. Fixes: d1efa09d342 "util: import sha1 implementation from OpenBSD" Signed-off-by: Emil Velikov <emil.veli...@collabora.com> (cherry picked from commit 9f8dc3bf03ec825bae7041858dda6ca2e9a34363) diff --git a/Android.common.mk b/Android.common.mk index ed5118a..a75d4e7 100644 --- a/Android.common.mk +++ b/Android.common.mk @@ -43,6 +43,7 @@ LOCAL_CFLAGS += \ -DANDROID_VERSION=0x0$(MESA_ANDROID_MAJOR_VERSION)0$(MESA_ANDROID_MINOR_VERSION) LOCAL_CFLAGS += \ + -DENABLE_SHADER_CACHE \ -D__STDC_LIMIT_MACROS \ -DHAVE___BUILTIN_EXPECT \ -DHAVE___BUILTIN_FFS \ diff --git a/configure.ac b/configure.ac index 6b07b2d..de8af87 100644 --- a/configure.ac +++ b/configure.ac @@ -1766,6 +1766,7 @@ if test -n "$with_vulkan_drivers"; then fi +DEFINES="$DEFINES -DENABLE_SHADER_CACHE" AM_CONDITIONAL(NEED_MEGADRIVER, test -n "$DRI_DIRS") AM_CONDITIONAL(NEED_LIBMESA, test "x$enable_glx" = xxlib -o \ "x$enable_osmesa" = xyes -o \ diff --git a/src/compiler/glsl/tests/cache_test.c b/src/compiler/glsl/tests/cache_test.c index f53ef0d..0ef05aa 100644 --- a/src/compiler/glsl/tests/cache_test.c +++ b/src/compiler/glsl/tests/cache_test.c @@ -37,6 +37,8 @@ bool error = false; +#ifdef ENABLE_SHADER_CACHE + static void expect_equal(uint64_t actual, uint64_t expected, const char *test) { @@ -378,10 +380,12 @@ test_put_key_and_get_key(void) disk_cache_destroy(cache); } +#endif /* ENABLE_SHADER_CACHE */ int main(void) { +#ifdef ENABLE_SHADER_CACHE int err; test_disk_cache_create(); @@ -392,6 +396,7 @@ main(void) err = rmrf_local(CACHE_TEST_TMP); expect_equal(err, 0, "Removing " CACHE_TEST_TMP " again"); +#endif /* ENABLE_SHADER_CACHE */ return error ? 1 : 0; } diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index 96a4ce0..4c67f95 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -1612,6 +1612,7 @@ _mesa_LinkProgram(GLuint programObj) "glLinkProgram")); } +#ifdef ENABLE_SHADER_CACHE /** * Generate a SHA-1 hash value string for given source string. */ @@ -1723,6 +1724,8 @@ read_shader(const gl_shader_stage stage, const char *source) return buffer; } +#endif /* ENABLE_SHADER_CACHE */ + /** * Called via glShaderSource() and glShaderSourceARB() API functions. * Basically, concatenate the source code strings into one long string @@ -1795,6 +1798,7 @@ _mesa_ShaderSource(GLuint shaderObj, GLsizei count, source[totalLength - 1] = '\0'; source[totalLength - 2] = '\0'; +#ifdef ENABLE_SHADER_CACHE /* Dump original shader source to MESA_SHADER_DUMP_PATH and replace * if corresponding entry found from MESA_SHADER_READ_PATH. */ @@ -1805,6 +1809,7 @@ _mesa_ShaderSource(GLuint shaderObj, GLsizei count, free(source); source = replacement; } +#endif /* ENABLE_SHADER_CACHE */ shader_source(sh, source); diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c index 76bdfe8..6de608c 100644 --- a/src/util/disk_cache.c +++ b/src/util/disk_cache.c @@ -21,6 +21,8 @@ * IN THE SOFTWARE. */ +#ifdef ENABLE_SHADER_CACHE + #include <ctype.h> #include <string.h> #include <stdlib.h> @@ -705,3 +707,5 @@ disk_cache_has_key(struct disk_cache *cache, cache_key key) return memcmp(entry, key, CACHE_KEY_SIZE) == 0; } + +#endif /* ENABLE_SHADER_CACHE */ diff --git a/src/util/disk_cache.h b/src/util/disk_cache.h index 0b20665..7e9cb80 100644 --- a/src/util/disk_cache.h +++ b/src/util/disk_cache.h @@ -40,6 +40,8 @@ struct disk_cache; /* Provide inlined stub functions if the shader cache is disabled. */ +#ifdef ENABLE_SHADER_CACHE + /** * Create a new cache object. * @@ -129,6 +131,46 @@ disk_cache_put_key(struct disk_cache *cache, cache_key key); bool disk_cache_has_key(struct disk_cache *cache, cache_key key); +#else + +static inline struct disk_cache * +disk_cache_create(void) +{ + return NULL; +} + +static inline void +disk_cache_destroy(struct disk_cache *cache) { + return; +} + +static inline void +disk_cache_put(struct disk_cache *cache, cache_key key, + const void *data, size_t size) +{ + return; +} + +static inline uint8_t * +disk_cache_get(struct disk_cache *cache, cache_key key, size_t *size) +{ + return NULL; +} + +static inline void +disk_cache_put_key(struct disk_cache *cache, cache_key key) +{ + return; +} + +static inline bool +disk_cache_has_key(struct disk_cache *cache, cache_key key) +{ + return false; +} + +#endif /* ENABLE_SHADER_CACHE */ + #ifdef __cplusplus } #endif commit d1efa09d342bff3e5def2978a0bef748d74f9c82 Author: Emil Velikov <emil.veli...@collabora.com> Date: Fri Jan 13 16:51:31 2017 +0000 util: import sha1 implementation from OpenBSD At the moment we support 5+ different implementations each with varying amount of bugs - from thread safely problems [1], to outright broken implementation(s) [2] In order to accommodate these we have 150+ lines of configure script and extra two configure toggles. Whist an actual implementation being ~200loc and our current compat wrapping ~250. Let's not forget that different people use different code paths, thus effectively makes it harder to test and debug since the default implementation is automatically detected. To minimise all these lovely experiences, import the "100% Public Domain" OpenBSD sha1 implementation. Clearly document any changes needed to get building correctly, since many/most of those can be upstreamed making future syncs easier. As an added bonus this will avoid all the 'fun' experiences trying to integrate it with the Android and SCons builds. v2: Manually expand __BEGIN_DECLS/__END_DECLS and document (Tapani). Furthermore it seems that some games (or surrounding runtime) static link against OpenSSL resulting in conflicts. For more information see the discussion thread [3] Bugzilla [1]: https://bugs.freedesktop.org/show_bug.cgi?id=94904 Bugzilla [2]: https://bugs.freedesktop.org/show_bug.cgi?id=97967 [3] https://lists.freedesktop.org/archives/mesa-dev/2017-January/140748.html Cc: Mark Janes <mark.a.ja...@intel.com> Cc: Vinson Lee <v...@freedesktop.org> Cc: Tapani Pälli <tapani.pa...@intel.com> Cc: Jonathan Gray <j...@jsg.id.au> Tested-by: Jonathan Gray <j...@jsg.id.au> Signed-off-by: Emil Velikov <emil.veli...@collabora.com> Acked-by: Tapani Pälli <tapani.pa...@intel.com> (v1) Acked-by: Jason Ekstrand <ja...@jlekstrand.net> (v1) diff --git a/configure.ac b/configure.ac index 33f1c42..6b07b2d 100644 --- a/configure.ac +++ b/configure.ac @@ -9,7 +9,6 @@ dnl Copyright © 2009-2014 Jon TURNEY dnl Copyright © 2011-2012 Benjamin Franzke dnl Copyright © 2008-2014 David Airlie dnl Copyright © 2009-2013 Brian Paul -dnl Copyright © 2003-2007 Keith Packard, Daniel Stone dnl dnl Permission is hereby granted, free of charge, to any person obtaining a dnl copy of this software and associated documentation files (the "Software"), @@ -1437,151 +1436,6 @@ if test "x$enable_gallium_osmesa" = xyes; then fi fi -# SHA1 hashing -AC_ARG_WITH([sha1], - [AS_HELP_STRING([--with-sha1=libc|libmd|libnettle|libgcrypt|libcrypto|libsha1|CommonCrypto|CryptoAPI], - [choose SHA1 implementation])]) -case "x$with_sha1" in -x | xlibc | xlibmd | xlibnettle | xlibgcrypt | xlibcrypto | xlibsha1 | xCommonCrypto | xCryptoAPI) - ;; -*) - AC_MSG_ERROR([Illegal value for --with-sha1: $with_sha1]) -esac - -AC_CHECK_FUNC([SHA1Init], [HAVE_SHA1_IN_LIBC=yes]) -if test "x$with_sha1" = x && test "x$HAVE_SHA1_IN_LIBC" = xyes; then - with_sha1=libc -fi -if test "x$with_sha1" = xlibc && test "x$HAVE_SHA1_IN_LIBC" != xyes; then - AC_MSG_ERROR([sha1 in libc requested but not found]) -fi -if test "x$with_sha1" = xlibc; then - AC_DEFINE([HAVE_SHA1_IN_LIBC], [1], - [Use libc SHA1 functions]) - SHA1_LIBS="" -fi -AC_CHECK_FUNC([CC_SHA1_Init], [HAVE_SHA1_IN_COMMONCRYPTO=yes]) -if test "x$with_sha1" = x && test "x$HAVE_SHA1_IN_COMMONCRYPTO" = xyes; then - with_sha1=CommonCrypto -fi -if test "x$with_sha1" = xCommonCrypto && test "x$HAVE_SHA1_IN_COMMONCRYPTO" != xyes; then - AC_MSG_ERROR([CommonCrypto requested but not found]) -fi -if test "x$with_sha1" = xCommonCrypto; then - AC_DEFINE([HAVE_SHA1_IN_COMMONCRYPTO], [1], - [Use CommonCrypto SHA1 functions]) - SHA1_LIBS="" -fi -dnl stdcall functions cannot be tested with AC_CHECK_LIB -AC_CHECK_HEADER([wincrypt.h], [HAVE_SHA1_IN_CRYPTOAPI=yes], [], [#include <windows.h>]) -if test "x$with_sha1" = x && test "x$HAVE_SHA1_IN_CRYPTOAPI" = xyes; then - with_sha1=CryptoAPI -fi -if test "x$with_sha1" = xCryptoAPI && test "x$HAVE_SHA1_IN_CRYPTOAPI" != xyes; then - AC_MSG_ERROR([CryptoAPI requested but not found]) -fi -if test "x$with_sha1" = xCryptoAPI; then - AC_DEFINE([HAVE_SHA1_IN_CRYPTOAPI], [1], - [Use CryptoAPI SHA1 functions]) - SHA1_LIBS="" -fi -AC_CHECK_LIB([md], [SHA1Init], [HAVE_LIBMD=yes]) -if test "x$with_sha1" = x && test "x$HAVE_LIBMD" = xyes; then - with_sha1=libmd -fi -if test "x$with_sha1" = xlibmd && test "x$HAVE_LIBMD" != xyes; then - AC_MSG_ERROR([libmd requested but not found]) -fi -if test "x$with_sha1" = xlibmd; then - AC_DEFINE([HAVE_SHA1_IN_LIBMD], [1], - [Use libmd SHA1 functions]) - SHA1_LIBS=-lmd -fi -PKG_CHECK_MODULES([LIBSHA1], [libsha1], [HAVE_LIBSHA1=yes], [HAVE_LIBSHA1=no]) -if test "x$with_sha1" = x && test "x$HAVE_LIBSHA1" = xyes; then - with_sha1=libsha1 -fi -if test "x$with_sha1" = xlibsha1 && test "x$HAVE_LIBSHA1" != xyes; then - AC_MSG_ERROR([libsha1 requested but not found]) -fi -if test "x$with_sha1" = xlibsha1; then - AC_DEFINE([HAVE_SHA1_IN_LIBSHA1], [1], - [Use libsha1 for SHA1]) - SHA1_LIBS=-lsha1 -fi -AC_CHECK_LIB([nettle], [nettle_sha1_init], [HAVE_LIBNETTLE=yes]) -if test "x$with_sha1" = x && test "x$HAVE_LIBNETTLE" = xyes; then - with_sha1=libnettle -fi -if test "x$with_sha1" = xlibnettle && test "x$HAVE_LIBNETTLE" != xyes; then - AC_MSG_ERROR([libnettle requested but not found]) -fi -if test "x$with_sha1" = xlibnettle; then - AC_DEFINE([HAVE_SHA1_IN_LIBNETTLE], [1], - [Use libnettle SHA1 functions]) - SHA1_LIBS=-lnettle -fi -AC_CHECK_LIB([gcrypt], [gcry_md_open], [HAVE_LIBGCRYPT=yes]) -if test "x$with_sha1" = x && test "x$HAVE_LIBGCRYPT" = xyes; then - with_sha1=libgcrypt -fi -if test "x$with_sha1" = xlibgcrypt && test "x$HAVE_LIBGCRYPT" != xyes; then - AC_MSG_ERROR([libgcrypt requested but not found]) -fi -if test "x$with_sha1" = xlibgcrypt; then - AC_DEFINE([HAVE_SHA1_IN_LIBGCRYPT], [1], - [Use libgcrypt SHA1 functions]) - SHA1_LIBS=-lgcrypt -fi -# We don't need all of the OpenSSL libraries, just libcrypto -AC_CHECK_LIB([crypto], [SHA1_Init], [HAVE_LIBCRYPTO=yes]) -PKG_CHECK_MODULES([OPENSSL], [openssl], [HAVE_OPENSSL_PKC=yes], - [HAVE_OPENSSL_PKC=no]) -if test "x$HAVE_LIBCRYPTO" = xyes || test "x$HAVE_OPENSSL_PKC" = xyes; then - if test "x$with_sha1" = x; then - with_sha1=libcrypto - fi -else - if test "x$with_sha1" = xlibcrypto; then - AC_MSG_ERROR([OpenSSL libcrypto requested but not found]) - fi -fi -if test "x$with_sha1" = xlibcrypto; then - if test "x$HAVE_LIBCRYPTO" = xyes; then - SHA1_LIBS=-lcrypto - else - SHA1_LIBS="$OPENSSL_LIBS" - SHA1_CFLAGS="$OPENSSL_CFLAGS" - fi -fi -AC_MSG_CHECKING([for SHA1 implementation]) -AC_MSG_RESULT([$with_sha1]) -AC_SUBST(SHA1_LIBS) -AC_SUBST(SHA1_CFLAGS) - -# Enable a define for SHA1 -if test "x$with_sha1" != "x"; then - DEFINES="$DEFINES -DHAVE_SHA1" -fi - -# Allow user to configure out the shader-cache feature -AC_ARG_ENABLE([shader-cache], - AS_HELP_STRING([--disable-shader-cache], [Disable binary shader cache]), - [enable_shader_cache="$enableval"], - [if test "x$with_sha1" != "x"; then - enable_shader_cache=yes - else - enable_shader_cache=no - fi]) -if test "x$with_sha1" = "x"; then - if test "x$enable_shader_cache" = "xyes"; then - AC_MSG_ERROR([Cannot enable shader cache (no SHA-1 implementation found)]) - fi -fi -if test "x$enable_shader_cache" = "xyes"; then - AC_DEFINE([ENABLE_SHADER_CACHE], [1], [Enable shader cache]) -fi - if test "x$enable_dri" = xyes; then require_dri_shared_libs_and_glapi "DRI" @@ -1895,9 +1749,6 @@ if test -n "$with_vulkan_drivers"; then if test "x$HAVE_I965_DRI" != xyes; then AC_MSG_ERROR([Intel Vulkan driver requires the i965 dri driver]) fi - if test "x$with_sha1" == "x"; then - AC_MSG_ERROR([Intel Vulkan driver requires SHA1]) - fi HAVE_INTEL_VULKAN=yes; ;; @@ -1905,10 +1756,7 @@ if test -n "$with_vulkan_drivers"; then PKG_CHECK_MODULES([AMDGPU], [libdrm_amdgpu >= $LIBDRM_AMDGPU_REQUIRED]) radeon_llvm_check $LLVM_REQUIRED_RADV "radv" HAVE_RADEON_VULKAN=yes; - if test "x$with_sha1" == "x"; then - AC_MSG_ERROR([radv vulkan driver requires SHA1]) - fi - ;; + ;; *) AC_MSG_ERROR([Vulkan driver '$driver' does not exist]) ;; @@ -2972,13 +2820,6 @@ else echo " HUD lmsensors: yes" fi -dnl Shader cache -echo "" -echo " Shader cache: $enable_shader_cache" -if test "x$enable_shader_cache" = "xyes"; then - echo " With SHA1 from: $with_sha1" -fi - dnl Libraries echo "" echo " Shared libs: $enable_shared" diff --git a/src/compiler/glsl/tests/cache_test.c b/src/compiler/glsl/tests/cache_test.c index 0ef05aa..f53ef0d 100644 --- a/src/compiler/glsl/tests/cache_test.c +++ b/src/compiler/glsl/tests/cache_test.c @@ -37,8 +37,6 @@ bool error = false; -#ifdef ENABLE_SHADER_CACHE - static void expect_equal(uint64_t actual, uint64_t expected, const char *test) { @@ -380,12 +378,10 @@ test_put_key_and_get_key(void) disk_cache_destroy(cache); } -#endif /* ENABLE_SHADER_CACHE */ int main(void) { -#ifdef ENABLE_SHADER_CACHE int err; test_disk_cache_create(); @@ -396,7 +392,6 @@ main(void) err = rmrf_local(CACHE_TEST_TMP); expect_equal(err, 0, "Removing " CACHE_TEST_TMP " again"); -#endif /* ENABLE_SHADER_CACHE */ return error ? 1 : 0; } diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c index fe4cf1b..96a4ce0 100644 --- a/src/mesa/main/shaderapi.c +++ b/src/mesa/main/shaderapi.c @@ -1612,7 +1612,6 @@ _mesa_LinkProgram(GLuint programObj) "glLinkProgram")); } -#if defined(HAVE_SHA1) /** * Generate a SHA-1 hash value string for given source string. */ @@ -1723,7 +1722,6 @@ read_shader(const gl_shader_stage stage, const char *source) return buffer; } -#endif /* HAVE_SHA1 */ /** * Called via glShaderSource() and glShaderSourceARB() API functions. @@ -1740,9 +1738,7 @@ _mesa_ShaderSource(GLuint shaderObj, GLsizei count, GLcharARB *source; struct gl_shader *sh; -#if defined(HAVE_SHA1) GLcharARB *replacement; -#endif /* HAVE_SHA1 */ sh = _mesa_lookup_shader_err(ctx, shaderObj, "glShaderSourceARB"); if (!sh) @@ -1799,7 +1795,6 @@ _mesa_ShaderSource(GLuint shaderObj, GLsizei count, source[totalLength - 1] = '\0'; source[totalLength - 2] = '\0'; -#if defined(HAVE_SHA1) /* Dump original shader source to MESA_SHADER_DUMP_PATH and replace * if corresponding entry found from MESA_SHADER_READ_PATH. */ @@ -1810,7 +1805,6 @@ _mesa_ShaderSource(GLuint shaderObj, GLsizei count, free(source); source = replacement; } -#endif /* HAVE_SHA1 */ shader_source(sh, source); diff --git a/src/util/Makefile.am b/src/util/Makefile.am index 0935891..32316b0 100644 --- a/src/util/Makefile.am +++ b/src/util/Makefile.am @@ -36,7 +36,6 @@ libmesautil_la_CPPFLAGS = \ -I$(top_srcdir)/src/mesa \ -I$(top_srcdir)/src/gallium/include \ -I$(top_srcdir)/src/gallium/auxiliary \ - $(SHA1_CFLAGS) \ $(VISIBILITY_CFLAGS) \ $(MSVC2013_COMPAT_CFLAGS) @@ -44,8 +43,6 @@ libmesautil_la_SOURCES = \ $(MESA_UTIL_FILES) \ $(MESA_UTIL_GENERATED_FILES) -libmesautil_la_LIBADD = $(SHA1_LIBS) - roundeven_test_LDADD = -lm check_PROGRAMS = u_atomic_test roundeven_test diff --git a/src/util/Makefile.sources b/src/util/Makefile.sources index d2ae5e7..a68a5fe 100644 --- a/src/util/Makefile.sources +++ b/src/util/Makefile.sources @@ -19,6 +19,8 @@ MESA_UTIL_FILES := \ macros.h \ mesa-sha1.c \ mesa-sha1.h \ + sha1/sha1.c \ + sha1/sha1.h \ ralloc.c \ ralloc.h \ register_allocate.c \ diff --git a/src/util/SConscript b/src/util/SConscript index 73f3430..7e447f6 100644 --- a/src/util/SConscript +++ b/src/util/SConscript @@ -33,11 +33,6 @@ mesautil_sources = ( source_lists['MESA_UTIL_GENERATED_FILES'] ) -# XXX We don't yet have scons support for detecting any of the various -# HAVE_SHA1_* definitions, so for now simply disable the shader cache. -if False: - mesautil_sources += source_lists['MESA_UTIL_SHADER_CACHE_FILES'] - mesautil = env.ConvenienceLibrary( target = 'mesautil', source = mesautil_sources, diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c index 80dc788..76bdfe8 100644 --- a/src/util/disk_cache.c +++ b/src/util/disk_cache.c @@ -21,8 +21,6 @@ * IN THE SOFTWARE. */ -#ifdef ENABLE_SHADER_CACHE - #include <ctype.h> #include <string.h> #include <stdlib.h> @@ -707,5 +705,3 @@ disk_cache_has_key(struct disk_cache *cache, cache_key key) return memcmp(entry, key, CACHE_KEY_SIZE) == 0; } - -#endif diff --git a/src/util/disk_cache.h b/src/util/disk_cache.h index 7e9cb80..0b20665 100644 --- a/src/util/disk_cache.h +++ b/src/util/disk_cache.h @@ -40,8 +40,6 @@ struct disk_cache; /* Provide inlined stub functions if the shader cache is disabled. */ -#ifdef ENABLE_SHADER_CACHE - /** * Create a new cache object. * @@ -131,46 +129,6 @@ disk_cache_put_key(struct disk_cache *cache, cache_key key); bool disk_cache_has_key(struct disk_cache *cache, cache_key key); -#else - -static inline struct disk_cache * -disk_cache_create(void) -{ - return NULL; -} - -static inline void -disk_cache_destroy(struct disk_cache *cache) { - return; -} - -static inline void -disk_cache_put(struct disk_cache *cache, cache_key key, - const void *data, size_t size) -{ - return; -} - -static inline uint8_t * -disk_cache_get(struct disk_cache *cache, cache_key key, size_t *size) -{ - return NULL; -} - -static inline void -disk_cache_put_key(struct disk_cache *cache, cache_key key) -{ - return; -} - -static inline bool -disk_cache_has_key(struct disk_cache *cache, cache_key key) -{ - return false; -} - -#endif /* ENABLE_SHADER_CACHE */ - #ifdef __cplusplus } #endif diff --git a/src/util/mesa-sha1.c b/src/util/mesa-sha1.c index b6a192f..e8f1bad 100644 --- a/src/util/mesa-sha1.c +++ b/src/util/mesa-sha1.c @@ -24,15 +24,9 @@ * DEALINGS IN THE SOFTWARE. */ +#include "sha1/sha1.h" #include "mesa-sha1.h" -#ifdef HAVE_SHA1 - -#if defined(HAVE_SHA1_IN_LIBMD) /* Use libmd for SHA1 */ \ - || defined(HAVE_SHA1_IN_LIBC) /* Use libc for SHA1 */ - -#include <sha1.h> - struct mesa_sha1 * _mesa_sha1_init(void) { @@ -64,238 +58,6 @@ _mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20]) return 1; } -#elif defined(HAVE_SHA1_IN_COMMONCRYPTO) /* Use CommonCrypto for SHA1 */ - -#include <CommonCrypto/CommonDigest.h> - -struct mesa_sha1 * -_mesa_sha1_init(void) -{ - CC_SHA1_CTX *ctx = malloc(sizeof(*ctx)); - - if (!ctx) - return NULL; - - CC_SHA1_Init(ctx); - return (struct mesa_sha1 *) ctx; -} - -int -_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size) -{ - CC_SHA1_CTX *sha1_ctx = (CC_SHA1_CTX *) ctx; - - CC_SHA1_Update(sha1_ctx, data, size); - return 1; -} - -int -_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20]) -{ - CC_SHA1_CTX *sha1_ctx = (CC_SHA1_CTX *) ctx; - - CC_SHA1_Final(result, sha1_ctx); - free(sha1_ctx); - return 1; -} - -#elif defined(HAVE_SHA1_IN_CRYPTOAPI) /* Use CryptoAPI for SHA1 */ - -#define WIN32_LEAN_AND_MEAN -#include <windows.h> -#include <wincrypt.h> - -static HCRYPTPROV hProv; - -struct mesa_sha1 * -_mesa_sha1_init(void) -{ - HCRYPTHASH *ctx = malloc(sizeof(*ctx)); - - if (!ctx) - return NULL; - - CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); - CryptCreateHash(hProv, CALG_SHA1, 0, 0, ctx); - return (struct mesa_sha1 *) ctx; -} - -int -_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size) -{ - HCRYPTHASH *hHash = (HCRYPTHASH *) ctx; - - CryptHashData(*hHash, data, size, 0); - return 1; -} - -int -_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20]) -{ - HCRYPTHASH *hHash = (HCRYPTHASH *) ctx; - DWORD len = 20; - - CryptGetHashParam(*hHash, HP_HASHVAL, result, &len, 0); - CryptDestroyHash(*hHash); - CryptReleaseContext(hProv, 0); - free(ctx); - return 1; -} - -#elif defined(HAVE_SHA1_IN_LIBNETTLE) /* Use libnettle for SHA1 */ - -#include <nettle/sha.h> - -struct mesa_sha1 * -_mesa_sha1_init(void) -{ - struct sha1_ctx *ctx = malloc(sizeof(*ctx)); - - if (!ctx) - return NULL; - sha1_init(ctx); - return (struct mesa_sha1 *) ctx; -} - -int -_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size) -{ - sha1_update((struct sha1_ctx *) ctx, size, data); - return 1; -} - -int -_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20]) -{ - sha1_digest((struct sha1_ctx *) ctx, 20, result); - free(ctx); - return 1; -} - -#elif defined(HAVE_SHA1_IN_LIBGCRYPT) /* Use libgcrypt for SHA1 */ - -#include <gcrypt.h> -#include "c11/threads.h" - -static void _mesa_libgcrypt_init(void) -{ - if (!gcry_check_version(NULL)) - return; - - gcry_control(GCRYCTL_DISABLE_SECMEM, 0); - gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); -} - -struct mesa_sha1 * -_mesa_sha1_init(void) -{ - static once_flag flag = ONCE_FLAG_INIT; - gcry_md_hd_t h; - gcry_error_t err; - - call_once(&flag, _mesa_libgcrypt_init); - - err = gcry_md_open(&h, GCRY_MD_SHA1, 0); - if (err) - return NULL; - return (struct mesa_sha1 *) h; -} - -int -_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size) -{ - gcry_md_hd_t h = (gcry_md_hd_t) ctx; - - gcry_md_write(h, data, size); - return 1; -} - -int -_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20]) -{ - gcry_md_hd_t h = (gcry_md_hd_t) ctx; - - memcpy(result, gcry_md_read(h, GCRY_MD_SHA1), 20); - gcry_md_close(h); - return 1; -} - -#elif defined(HAVE_SHA1_IN_LIBSHA1) /* Use libsha1 */ - -#include <libsha1.h> - -struct mesa_sha1 * -_mesa_sha1_init(void) -{ - sha1_ctx *ctx = malloc(sizeof(*ctx)); - - if (!ctx) - return NULL; - sha1_begin(ctx); - return (struct mesa_sha1 *) ctx; -} - -int -_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size) -{ - sha1_hash(data, size, (sha1_ctx *) ctx); - return 1; -} - -int -_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20]) -{ - sha1_end(result, (sha1_ctx *) ctx); - free(ctx); - return 1; -} - -#else /* Use OpenSSL's libcrypto */ - -#include <stddef.h> /* buggy openssl/sha.h wants size_t */ -#include <openssl/sha.h> - -struct mesa_sha1 * -_mesa_sha1_init(void) -{ - int ret; - SHA_CTX *ctx = malloc(sizeof(*ctx)); - - if (!ctx) - return NULL; - ret = SHA1_Init(ctx); - if (!ret) { - free(ctx); - return NULL; - } - return (struct mesa_sha1 *) ctx; -} - -int -_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size) -{ - int ret; - SHA_CTX *sha_ctx = (SHA_CTX *) ctx; - - ret = SHA1_Update(sha_ctx, data, size); - if (!ret) - free(sha_ctx); - return ret; -} - -int -_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20]) -{ - int ret; - SHA_CTX *sha_ctx = (SHA_CTX *) ctx; - - ret = SHA1_Final(result, (SHA_CTX *) sha_ctx); - free(sha_ctx); - return ret; -} - -#endif - void _mesa_sha1_compute(const void *data, size_t size, unsigned char result[20]) { @@ -320,5 +82,3 @@ _mesa_sha1_format(char *buf, const unsigned char *sha1) return buf; } - -#endif diff --git a/src/util/sha1/README b/src/util/sha1/README new file mode 100644 index 0000000..f13baf9 --- /dev/null +++ b/src/util/sha1/README @@ -0,0 +1,59 @@ +This local copy of a SHA1 implementation based on the sources below. + +Why: + - Some libraries suffer from race condition and other issues. For example see +commit ade3108bb5b0 ("util: Fix race condition on libgcrypt initialization"). + + - Fold the handling and detection of _eight_ implementations at configure +stage and _seven_ different codepaths. + + - Have a single, uniform, code used by developers, testers and users. + + - Avoid conflicts when using software which ships with it's own SHA1 library. +The latter of which conflicting with the one mesa is build against. + + + +Source: +The SHA1 implementation is copied verbatim from the following links. +At the time of checkout HEAD is 1.25 and 1.24 respectively. + +http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/lib/libc/hash/sha1.c?rev=HEAD +http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/include/sha1.h?rev=HEAD + + +Notes: + - The files should not have any local changes. If there are any they should be +clearly documented below and one should aim to upstream them where possible. + + - Files will be periodically syncronised with the respective upstream sources. +Updates will be made regularly, but since the code is _not_ aimed as a +cryptography solution any issues found should not be considered security ones. + + +Local changes: + - Removed __bounded__ attribute qualifiers. Unavailable on platforms targeted +by Mesa. Upstream status: TBD (N/A ?) + + - Pick the sha1.h header from the current folder, by using "" over <> in the +include directive. Upstream status: TBD + + - Remove unused function prototypes - SHA1End, SHA1File, SHA1FileChunk and +SHA1Data. Upstream status: TBD + + - Use stdint.h integer types - u_int{8,16,32}_t -> uint{8,16,32}_t and +u_int -> uint32_t, change header include. Upstream status: TBD