From c4299a10c0526627947cd26cf3b9aae0ffaa6b0e Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 10 Oct 2017 03:55:45 +0200 Subject: [PATCH] gskspvwriter: Add optimization for access chain A single swizzle can be reduced to an access chain lookup. This is especially useful during assignments, because it means we don't need to load the whole vector and OpVectorShuffle it. --- gsk/gskspvwriter.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/gsk/gskspvwriter.c b/gsk/gskspvwriter.c index 83afefb4a1..64a986a77c 100644 --- a/gsk/gskspvwriter.c +++ b/gsk/gskspvwriter.c @@ -749,6 +749,27 @@ gsk_spv_access_chain_swizzle (GskSpvAccessChain *chain, guint tmp[4]; guint i; + if (length == 1) + { + GskSlValue *value; + guint32 new_index; + + if (chain->swizzle_length != 0) + new_index = chain->swizzle[indexes[0]]; + else + new_index = indexes[0]; + chain->swizzle_length = 0; + + value = gsk_sl_value_new_for_data (gsk_sl_type_get_scalar (GSK_SL_UINT), + &new_index, + NULL, NULL); + gsk_spv_access_chain_add_index (chain, + gsk_sl_type_get_index_type (chain->type), + gsk_spv_writer_get_id_for_value (chain->writer, value)); + gsk_sl_value_free (value); + return; + } + if (chain->swizzle_length != 0) { g_assert (length <= chain->swizzle_length);