On 23.03.2017 05:53, Jonathan Gray wrote:
On Thu, Mar 23, 2017 at 03:24:16PM +1100, Jonathan Gray wrote:
Instead of using using /dev/urandom on Linux and time(NULL) elsewhere
for a seed first use getentropy() for systems that have a kernel
interface to get a seed such as OpenBSD.  This interface is also
present in other systems such as Solaris and even Linux with a recent
version of glibc.

v2: check for/use the different header Solaris and glibc use

Signed-off-by: Jonathan Gray <j...@jsg.id.au>

The functions should really be split for random and deterministic
as well, but that is hard to cleanup without being able to assume
arc4random or equivalent is present.

NAK on this idea. The name "rand_xorshift128plus_deterministic" is nonsensical, because xorshift128+ is the name of a PRNG which is deterministic by definition. Conversely, providing anything but a xorshift128+ PRNG under that name would be bad style.

Furthermore, Mesa simply doesn't need cryptographically secure random bits, so going to such lengths is simply unnecessary. PRNGs that are good enough for basic Monte Carlo simulation purposes are good enough for Mesa.

Having a truly random _seed_ is valuable for the purposes of the disk cache, but anything more than that is overkill.

Cheers,
Nicolai


diff --git a/configure.ac b/configure.ac
index c27646ca4c..a1a62482d9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -792,6 +792,9 @@ AC_CHECK_FUNC([posix_memalign], [DEFINES="$DEFINES 
-DHAVE_POSIX_MEMALIGN"])
 dnl See if getentropy is available
 AC_CHECK_FUNC([getentropy], [DEFINES="$DEFINES -DHAVE_GETENTROPY"])

+dnl See if arc4random_buf is available
+AC_CHECK_FUNC([arc4random_buf], [DEFINES="$DEFINES -DHAVE_ARC4RANDOM_BUF"])
+
 dnl Check for zlib
 PKG_CHECK_MODULES([ZLIB], [zlib >= $ZLIB_REQUIRED])

diff --git a/src/gallium/drivers/radeon/r600_test_dma.c 
b/src/gallium/drivers/radeon/r600_test_dma.c
index 3c23b09329..0cdd24d1c0 100644
--- a/src/gallium/drivers/radeon/r600_test_dma.c
+++ b/src/gallium/drivers/radeon/r600_test_dma.c
@@ -77,7 +77,7 @@ static void set_random_pixels(struct pipe_context *ctx,

                        for (x = 0; x < size; x++) {
                                *ptr++ = *ptr_cpu++ =
-                                       
rand_xorshift128plus(seed_xorshift128plus);
+                                       
rand_xorshift128plus_deterministic(seed_xorshift128plus);
                        }
                }
        }
diff --git a/src/util/rand_xor.c b/src/util/rand_xor.c
index c613371f67..db642dae54 100644
--- a/src/util/rand_xor.c
+++ b/src/util/rand_xor.c
@@ -37,6 +37,10 @@
 #include <time.h>
 #endif

+#ifdef HAVE_ARC4RANDOM_BUF
+#include <stdlib.h>
+#endif
+
 #include "rand_xor.h"

 /* Super fast random number generator.
@@ -45,7 +49,7 @@
  * to the public domain.
  */
 uint64_t
-rand_xorshift128plus(uint64_t *seed)
+rand_xorshift128plus_deterministic(uint64_t *seed)
 {
    uint64_t *s = seed;

@@ -58,6 +62,18 @@ rand_xorshift128plus(uint64_t *seed)
    return s[1] + s0;
 }

+uint64_t
+rand_xorshift128plus(uint64_t *seed)
+{
+#ifdef HAVE_ARC4RANDOM_BUF
+  uint64_t buf;
+  arc4random_buf(&buf, sizeof(buf));
+  return buf;
+#else
+  return rand_xorshift128plus_deterministic(seed);
+#endif
+}
+
 void
 s_rand_xorshift128plus(uint64_t *seed, bool randomised_seed)
 {
diff --git a/src/util/rand_xor.h b/src/util/rand_xor.h
index 532d549bcd..0fbf4d3a8a 100644
--- a/src/util/rand_xor.h
+++ b/src/util/rand_xor.h
@@ -31,6 +31,9 @@
 uint64_t
 rand_xorshift128plus(uint64_t *seed);

+uint64_t
+rand_xorshift128plus_deterministic(uint64_t *seed);
+
 void
 s_rand_xorshift128plus(uint64_t *seed, bool randomised_seed);

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev



--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to