YaGL: Cache minmax index query result in yagl_gles_buffer
authorStanislav Vorobiov <s.vorobiov@samsung.com>
Tue, 27 Aug 2013 08:21:03 +0000 (12:21 +0400)
committerStanislav Vorobiov <s.vorobiov@samsung.com>
Tue, 27 Aug 2013 08:24:22 +0000 (12:24 +0400)
This seemed to be a bottleneck, according to perf. With
this fix minmax index query is no longer "red" in perf report

hw/yagl_apis/gles/yagl_gles_buffer.c
hw/yagl_apis/gles/yagl_gles_buffer.h

index 22cc136..7cfd895 100644 (file)
@@ -218,6 +218,8 @@ void yagl_gles_buffer_set_data(struct yagl_gles_buffer *buffer,
     yagl_range_list_add(&buffer->default_part.range_list, 0, buffer->size);
     yagl_range_list_add(&buffer->fixed_part.range_list, 0, buffer->size);
     yagl_range_list_add(&buffer->byte_part.range_list, 0, buffer->size);
+
+    buffer->cached_minmax_idx = false;
 }
 
 bool yagl_gles_buffer_update_data(struct yagl_gles_buffer *buffer,
@@ -239,6 +241,8 @@ bool yagl_gles_buffer_update_data(struct yagl_gles_buffer *buffer,
     yagl_range_list_add(&buffer->fixed_part.range_list, offset, size);
     yagl_range_list_add(&buffer->byte_part.range_list, offset, size);
 
+    buffer->cached_minmax_idx = false;
+
     return true;
 }
 
@@ -263,6 +267,15 @@ bool yagl_gles_buffer_get_minmax_index(struct yagl_gles_buffer *buffer,
         return false;
     }
 
+    if (buffer->cached_minmax_idx &&
+        (buffer->cached_type == type) &&
+        (buffer->cached_offset == offset) &&
+        (buffer->cached_count == count)) {
+        *min_idx = buffer->cached_min_idx;
+        *max_idx = buffer->cached_max_idx;
+        return true;
+    }
+
     for (i = 0; i < count; ++i) {
         /*
          * We don't respect target endian here, but we don't care for now,
@@ -289,6 +302,13 @@ bool yagl_gles_buffer_get_minmax_index(struct yagl_gles_buffer *buffer,
         }
     }
 
+    buffer->cached_minmax_idx = true;
+    buffer->cached_type = type;
+    buffer->cached_offset = offset;
+    buffer->cached_count = count;
+    buffer->cached_min_idx = *min_idx;
+    buffer->cached_max_idx = *max_idx;
+
     return true;
 }
 
index 0944ae7..b3804d0 100644 (file)
@@ -47,6 +47,13 @@ struct yagl_gles_buffer
     GLenum usage;
 
     bool was_bound;
+
+    bool cached_minmax_idx;
+    GLenum cached_type;
+    GLint cached_offset;
+    GLint cached_count;
+    uint32_t cached_min_idx;
+    uint32_t cached_max_idx;
 };
 
 struct yagl_gles_buffer