From 73e5afcf5da3e764f4dab83cba2064a97986ba18 Mon Sep 17 00:00:00 2001 From: Stanislav Vorobiov Date: Tue, 27 Aug 2013 12:21:03 +0400 Subject: [PATCH] YaGL: Cache minmax index query result in yagl_gles_buffer 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 | 20 ++++++++++++++++++++ hw/yagl_apis/gles/yagl_gles_buffer.h | 7 +++++++ 2 files changed, 27 insertions(+) diff --git a/hw/yagl_apis/gles/yagl_gles_buffer.c b/hw/yagl_apis/gles/yagl_gles_buffer.c index 22cc13664c..7cfd8953c9 100644 --- a/hw/yagl_apis/gles/yagl_gles_buffer.c +++ b/hw/yagl_apis/gles/yagl_gles_buffer.c @@ -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; } diff --git a/hw/yagl_apis/gles/yagl_gles_buffer.h b/hw/yagl_apis/gles/yagl_gles_buffer.h index 0944ae7605..b3804d0984 100644 --- a/hw/yagl_apis/gles/yagl_gles_buffer.h +++ b/hw/yagl_apis/gles/yagl_gles_buffer.h @@ -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 -- 2.34.1