Pushed, thanks!

On 22.07.2016 13:10, Nils Wallménius wrote:
When possible, do the memcpy on larger blocks. This reduces cycles
spent in _mesa_propagate_uniforms_to_driver_storage from
1.51 % to 0.62% according to perf during the Unigine Heaven benchmark.
It did not affect the framerate of the benchmark. The system used for
testing was an i5 6600K with a Radeon R9 380.

Piglit hangs randomly on this system both with and without the patch
so i could not make a comparison.

v2: fixed whitespace

Signed-off-by: Nils Wallménius <nils.wallmen...@gmail.com>
Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com>
---
 src/mesa/main/uniform_query.cpp | 29 +++++++++++++++++++++++------
 1 file changed, 23 insertions(+), 6 deletions(-)

diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
index ab22a0e..b9b9ff2 100644
--- a/src/mesa/main/uniform_query.cpp
+++ b/src/mesa/main/uniform_query.cpp
@@ -578,14 +578,31 @@ _mesa_propagate_uniforms_to_driver_storage(struct 
gl_uniform_storage *uni,
         unsigned j;
         unsigned v;

-        for (j = 0; j < count; j++) {
-           for (v = 0; v < vectors; v++) {
-              memcpy(dst, src, src_vector_byte_stride);
-              src += src_vector_byte_stride;
-              dst += store->vector_stride;
+        if (src_vector_byte_stride == store->vector_stride) {
+           if (extra_stride) {
+              for (j = 0; j < count; j++) {
+                 memcpy(dst, src, src_vector_byte_stride * vectors);
+                 src += src_vector_byte_stride * vectors;
+                 dst += store->vector_stride * vectors;
+
+                 dst += extra_stride;
+              }
+           } else {
+              /* Unigine Heaven benchmark gets here */
+              memcpy(dst, src, src_vector_byte_stride * vectors * count);
+              src += src_vector_byte_stride * vectors * count;
+              dst += store->vector_stride * vectors * count;
            }
+        } else {
+           for (j = 0; j < count; j++) {
+              for (v = 0; v < vectors; v++) {
+                 memcpy(dst, src, src_vector_byte_stride);
+                 src += src_vector_byte_stride;
+                 dst += store->vector_stride;
+              }

-           dst += extra_stride;
+              dst += extra_stride;
+           }
         }
         break;
       }

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

Reply via email to