From 1a2bfe66091be53650361a6467a37f89082c54a9 Mon Sep 17 00:00:00 2001 From: Benlitz Date: Wed, 31 Jul 2013 14:49:42 +0000 Subject: [PATCH] gpu: fixed vbo attribute binding when one of the attribute on the buffer does not exist in the shader --- src/gpu/shader.cpp | 1 - src/gpu/vertexbuffer.cpp | 50 ++++++++++++++++++++++------------------ 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/gpu/shader.cpp b/src/gpu/shader.cpp index eaf8c911..904c1502 100644 --- a/src/gpu/shader.cpp +++ b/src/gpu/shader.cpp @@ -342,7 +342,6 @@ ShaderAttrib Shader::GetAttribLocation(char const *attr, if (l < 0) { Log::Warn("tried to query invalid attribute: %s\n", attr); - l = 0; } else { diff --git a/src/gpu/vertexbuffer.cpp b/src/gpu/vertexbuffer.cpp index 52686781..bdcaa443 100644 --- a/src/gpu/vertexbuffer.cpp +++ b/src/gpu/vertexbuffer.cpp @@ -356,7 +356,8 @@ void VertexDeclaration::SetStream(VertexBuffer *vb, ShaderAttrib attr1, uint32_t index = l[n].m_flags & 0xffff; # if !defined __CELLOS_LV2__ - glEnableVertexAttribArray((GLint)reg); + if (reg != 0xffffffff) + glEnableVertexAttribArray((GLint)reg); # else switch (usage) { @@ -438,32 +439,35 @@ void VertexDeclaration::SetStream(VertexBuffer *vb, ShaderAttrib attr1, # if !defined __CELLOS_LV2__ - if (tlut[type_index].type == GL_FLOAT - || tlut[type_index].type == GL_DOUBLE - || tlut[type_index].type == GL_BYTE - || tlut[type_index].type == GL_UNSIGNED_BYTE + if (reg != 0xffffffff) + { + if (tlut[type_index].type == GL_FLOAT + || tlut[type_index].type == GL_DOUBLE + || tlut[type_index].type == GL_BYTE + || tlut[type_index].type == GL_UNSIGNED_BYTE # if defined USE_GLEW && !defined __APPLE__ - /* If this is not available, don't use it */ - || !glVertexAttribIPointer + /* If this is not available, don't use it */ + || !glVertexAttribIPointer # endif - || false) - { - /* Normalize unsigned bytes by default, because it's usually - * some color information. */ - GLboolean normalize = (tlut[type_index].type == GL_UNSIGNED_BYTE) - || (tlut[type_index].type == GL_BYTE); - glVertexAttribPointer((GLint)reg, tlut[type_index].size, - tlut[type_index].type, normalize, - stride, (GLvoid const *)(uintptr_t)offset); - } + || false) + { + /* Normalize unsigned bytes by default, because it's usually + * some color information. */ + GLboolean normalize = (tlut[type_index].type == GL_UNSIGNED_BYTE) + || (tlut[type_index].type == GL_BYTE); + glVertexAttribPointer((GLint)reg, tlut[type_index].size, + tlut[type_index].type, normalize, + stride, (GLvoid const *)(uintptr_t)offset); + } # if defined GL_VERSION_3_0 - else - { - glVertexAttribIPointer((GLint)reg, tlut[type_index].size, - tlut[type_index].type, - stride, (GLvoid const *)(uintptr_t)offset); - } + else + { + glVertexAttribIPointer((GLint)reg, tlut[type_index].size, + tlut[type_index].type, + stride, (GLvoid const *)(uintptr_t)offset); + } # endif + } # else switch (usage) {