From 3fc469b1f6392158d12ed90cd188d163af2262ba Mon Sep 17 00:00:00 2001 From: Benlitz Date: Thu, 18 Jul 2013 10:03:42 +0000 Subject: [PATCH] shaders now cache attribute location once they have been retrieved for the first time. --- src/gpu/shader.cpp | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/gpu/shader.cpp b/src/gpu/shader.cpp index db0265e6..294005c2 100644 --- a/src/gpu/shader.cpp +++ b/src/gpu/shader.cpp @@ -60,6 +60,8 @@ private: ID3DXConstantTable *vert_table, *frag_table; #elif !defined __CELLOS_LV2__ GLuint prog_id, vert_id, frag_id; + // Benlitz: using a simple array could be faster since there is never more than a few attribute locations to store + Map attrib_locations; #else CGprogram vert_id, frag_id; #endif @@ -332,12 +334,21 @@ ShaderAttrib Shader::GetAttribLocation(char const *attr, ret.m_flags |= (uint64_t)(uint16_t)index; #if defined USE_D3D9 || defined _XBOX #elif !defined __CELLOS_LV2__ - GLint l = glGetAttribLocation(data->prog_id, attr); - if (l < 0) - { - Log::Warn("tried to query invalid attribute: %s\n", attr); - l = 0; - } + GLint l; + + if (!data->attrib_locations.TryGetValue(attr, l)) + { + l = glGetAttribLocation(data->prog_id, attr); + if (l < 0) + { + Log::Warn("tried to query invalid attribute: %s\n", attr); + l = 0; + } + else + { + data->attrib_locations[String(attr)] = l; + } + } ret.m_flags |= (uint64_t)(uint32_t)l << 32; #else /* FIXME: can we do this at all on the PS3? */