<p dir="ltr">I realized this morning that there is a lot better way to do this. Consider these patches rescinded.</p>
<div class="gmail_quote">On Apr 4, 2016 6:00 PM, "Jason Ekstrand" <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">It's possible, when doing an x-tiled copy, to end up with a case where the<br>
bytes parameter is equal to 16 but the pointer is not actually aligned.<br>
This causes asserts in debug mode and segfaults in release builds due to<br>
doing an aligned operation on an unaligned pointer.<br>
<br>
Bugzilla: <a href="https://bugs.freedesktop.org/show_bug.cgi?id=93962" rel="noreferrer" target="_blank">https://bugs.freedesktop.org/show_bug.cgi?id=93962</a><br>
---<br>
src/mesa/drivers/dri/i965/intel_tiled_memcpy.c | 48 +++++++++++++-------------<br>
1 file changed, 24 insertions(+), 24 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/intel_tiled_memcpy.c b/src/mesa/drivers/dri/i965/intel_tiled_memcpy.c<br>
index 19079d0..823d8b0 100644<br>
--- a/src/mesa/drivers/dri/i965/intel_tiled_memcpy.c<br>
+++ b/src/mesa/drivers/dri/i965/intel_tiled_memcpy.c<br>
@@ -85,19 +85,19 @@ rgba8_copy_aligned_dst(void *dst, const void *src, size_t bytes)<br>
uint8_t const *s = src;<br>
<br>
#ifdef __SSSE3__<br>
- if (bytes == 16) {<br>
- assert(!(((uintptr_t)dst) & 0xf));<br>
- rgba8_copy_16_aligned_dst(d+ 0, s+ 0);<br>
- return dst;<br>
- }<br>
+ if ((((uintptr_t)dst) & 0xf) == 0) {<br>
+ if (bytes == 16) {<br>
+ rgba8_copy_16_aligned_dst(d+ 0, s+ 0);<br>
+ return dst;<br>
+ }<br>
<br>
- if (bytes == 64) {<br>
- assert(!(((uintptr_t)dst) & 0xf));<br>
- rgba8_copy_16_aligned_dst(d+ 0, s+ 0);<br>
- rgba8_copy_16_aligned_dst(d+16, s+16);<br>
- rgba8_copy_16_aligned_dst(d+32, s+32);<br>
- rgba8_copy_16_aligned_dst(d+48, s+48);<br>
- return dst;<br>
+ if (bytes == 64) {<br>
+ rgba8_copy_16_aligned_dst(d+ 0, s+ 0);<br>
+ rgba8_copy_16_aligned_dst(d+16, s+16);<br>
+ rgba8_copy_16_aligned_dst(d+32, s+32);<br>
+ rgba8_copy_16_aligned_dst(d+48, s+48);<br>
+ return dst;<br>
+ }<br>
}<br>
#endif<br>
<br>
@@ -123,19 +123,19 @@ rgba8_copy_aligned_src(void *dst, const void *src, size_t bytes)<br>
uint8_t const *s = src;<br>
<br>
#ifdef __SSSE3__<br>
- if (bytes == 16) {<br>
- assert(!(((uintptr_t)src) & 0xf));<br>
- rgba8_copy_16_aligned_src(d+ 0, s+ 0);<br>
- return dst;<br>
- }<br>
+ if ((((uintptr_t)src) & 0xf) == 0) {<br>
+ if (bytes == 16) {<br>
+ rgba8_copy_16_aligned_src(d+ 0, s+ 0);<br>
+ return dst;<br>
+ }<br>
<br>
- if (bytes == 64) {<br>
- assert(!(((uintptr_t)src) & 0xf));<br>
- rgba8_copy_16_aligned_src(d+ 0, s+ 0);<br>
- rgba8_copy_16_aligned_src(d+16, s+16);<br>
- rgba8_copy_16_aligned_src(d+32, s+32);<br>
- rgba8_copy_16_aligned_src(d+48, s+48);<br>
- return dst;<br>
+ if (bytes == 64) {<br>
+ rgba8_copy_16_aligned_src(d+ 0, s+ 0);<br>
+ rgba8_copy_16_aligned_src(d+16, s+16);<br>
+ rgba8_copy_16_aligned_src(d+32, s+32);<br>
+ rgba8_copy_16_aligned_src(d+48, s+48);<br>
+ return dst;<br>
+ }<br>
}<br>
#endif<br>
<br>
--<br>
2.5.0.400.gff86faf<br>
<br>
</blockquote></div>