Browse Source

gpu: fixed vbo attribute binding when one of the attribute on the buffer does not exist in the shader

undefined
Benlitz Sam Hocevar <sam@hocevar.net> 11 years ago
parent
commit
1a2bfe6609
2 changed files with 27 additions and 24 deletions
  1. +0
    -1
      src/gpu/shader.cpp
  2. +27
    -23
      src/gpu/vertexbuffer.cpp

+ 0
- 1
src/gpu/shader.cpp View File

@@ -342,7 +342,6 @@ ShaderAttrib Shader::GetAttribLocation(char const *attr,
if (l < 0) if (l < 0)
{ {
Log::Warn("tried to query invalid attribute: %s\n", attr); Log::Warn("tried to query invalid attribute: %s\n", attr);
l = 0;
} }
else else
{ {


+ 27
- 23
src/gpu/vertexbuffer.cpp View File

@@ -356,7 +356,8 @@ void VertexDeclaration::SetStream(VertexBuffer *vb, ShaderAttrib attr1,
uint32_t index = l[n].m_flags & 0xffff; uint32_t index = l[n].m_flags & 0xffff;


# if !defined __CELLOS_LV2__ # if !defined __CELLOS_LV2__
glEnableVertexAttribArray((GLint)reg);
if (reg != 0xffffffff)
glEnableVertexAttribArray((GLint)reg);
# else # else
switch (usage) switch (usage)
{ {
@@ -438,32 +439,35 @@ void VertexDeclaration::SetStream(VertexBuffer *vb, ShaderAttrib attr1,




# if !defined __CELLOS_LV2__ # 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 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 # 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 # 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 # endif
}
# else # else
switch (usage) switch (usage)
{ {


Loading…
Cancel
Save