Don't use SSBO for skinning
It causes trouble in hd5670 in windows
This commit is contained in:
@@ -64,12 +64,5 @@ layout (std140) uniform LightingData
|
||||
float rL22;
|
||||
};
|
||||
|
||||
#ifdef SSBO_SKINNING
|
||||
layout (std140, binding = 0) readonly buffer SkinningData
|
||||
{
|
||||
mat4 joint_matrices[MAX_BONES];
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif // HEADER_TXT
|
||||
|
||||
@@ -78,15 +78,11 @@ void main(void)
|
||||
{
|
||||
break;
|
||||
}
|
||||
#ifdef SSBO_SKINNING
|
||||
mat4 joint_matrix = joint_matrices[Joint[i] + skinning_offset];
|
||||
#else
|
||||
mat4 joint_matrix = mat4(
|
||||
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4),
|
||||
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4 + 1),
|
||||
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4 + 2),
|
||||
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4 + 3));
|
||||
#endif
|
||||
skinned_position += Weight[i] * joint_matrix * idle_position;
|
||||
skinned_normal += Weight[i] * joint_matrix * idle_normal;
|
||||
skinned_tangent += Weight[i] * joint_matrix * idle_tangent;
|
||||
|
||||
@@ -57,15 +57,11 @@ void main(void)
|
||||
{
|
||||
break;
|
||||
}
|
||||
#ifdef SSBO_SKINNING
|
||||
mat4 joint_matrix = joint_matrices[Joint[i] + skinning_offset];
|
||||
#else
|
||||
mat4 joint_matrix = mat4(
|
||||
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4),
|
||||
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4 + 1),
|
||||
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4 + 2),
|
||||
texelFetch(skinning_tex, (Joint[i] + skinning_offset) * 4 + 3));
|
||||
#endif
|
||||
skinned_position += Weight[i] * joint_matrix * idle_position;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,9 +75,7 @@ void main(void)
|
||||
{
|
||||
break;
|
||||
}
|
||||
#ifdef SSBO_SKINNING
|
||||
mat4 joint_matrix = joint_matrices[Joint[i] + skinning_offset];
|
||||
#elif defined(GL_ES)
|
||||
#ifdef GL_ES
|
||||
mat4 joint_matrix = mat4(
|
||||
texelFetch(skinning_tex, ivec2(0, skinning_offset + Joint[i]), 0),
|
||||
texelFetch(skinning_tex, ivec2(1, skinning_offset + Joint[i]), 0),
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
uniform mat4 ModelMatrix;
|
||||
uniform int skinning_offset;
|
||||
uniform int layer;
|
||||
#ifdef GL_ES
|
||||
uniform sampler2D skinning_tex;
|
||||
#else
|
||||
uniform samplerBuffer skinning_tex;
|
||||
#endif
|
||||
|
||||
#ifdef Explicit_Attrib_Location_Usable
|
||||
layout(location = 0) in vec3 Position;
|
||||
@@ -38,9 +42,7 @@ void main(void)
|
||||
{
|
||||
break;
|
||||
}
|
||||
#ifdef SSBO_SKINNING
|
||||
mat4 joint_matrix = joint_matrices[Joint[i] + skinning_offset];
|
||||
#elif defined(GL_ES)
|
||||
ifdef GL_ES
|
||||
mat4 joint_matrix = mat4(
|
||||
texelFetch(skinning_tex, ivec2(0, skinning_offset + Joint[i]), 0),
|
||||
texelFetch(skinning_tex, ivec2(1, skinning_offset + Joint[i]), 0),
|
||||
|
||||
@@ -686,30 +686,19 @@ void DrawCalls::prepareDrawCalls( ShadowMatrices& shadow_matrices,
|
||||
|
||||
PROFILER_PUSH_CPU_MARKER("- Animations/Buffer upload", 0x0, 0x0, 0x0);
|
||||
shadow_matrices.updateUBO();
|
||||
if (CVS->supportsHardwareSkinning())
|
||||
{
|
||||
#ifdef USE_GLES2
|
||||
glBindTexture(GL_TEXTURE_2D, SharedGPUObjects::getSkinningTexture());
|
||||
glBindTexture(GL_TEXTURE_2D, SharedGPUObjects::getSkinningTexture());
|
||||
#else
|
||||
glBindBuffer(CVS->isARBShaderStorageBufferObjectUsable() ?
|
||||
GL_SHADER_STORAGE_BUFFER : GL_TEXTURE_BUFFER,
|
||||
SharedGPUObjects::getSkinningBuffer());
|
||||
glBindBuffer(GL_TEXTURE_BUFFER, SharedGPUObjects::getSkinningBuffer());
|
||||
#endif
|
||||
}
|
||||
for (unsigned i = 0; i < m_deferred_update.size(); i++)
|
||||
{
|
||||
m_deferred_update[i]->updateGL();
|
||||
}
|
||||
if (CVS->supportsHardwareSkinning())
|
||||
{
|
||||
#ifdef USE_GLES2
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
#else
|
||||
glBindBuffer(CVS->isARBShaderStorageBufferObjectUsable() ?
|
||||
GL_SHADER_STORAGE_BUFFER : GL_TEXTURE_BUFFER, 0);
|
||||
#endif
|
||||
}
|
||||
PROFILER_POP_CPU_MARKER();
|
||||
#ifdef USE_GLES2
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
#else
|
||||
glBindBuffer(GL_TEXTURE_BUFFER, 0);
|
||||
#endif
|
||||
|
||||
PROFILER_PUSH_CPU_MARKER("- cpu particle upload", 0x3F, 0x03, 0x61);
|
||||
CPUParticleManager::getInstance()->uploadAll();
|
||||
|
||||
@@ -383,44 +383,28 @@ public:
|
||||
class SkinnedMeshShader
|
||||
{
|
||||
private:
|
||||
GLuint m_skinning_location;
|
||||
GLuint m_skinning_tex_location;
|
||||
public:
|
||||
SkinnedMeshShader() : m_skinning_location(0) {}
|
||||
SkinnedMeshShader() : m_skinning_tex_location(0) {}
|
||||
// ------------------------------------------------------------------------
|
||||
template <typename Shader>
|
||||
void init(Shader* s)
|
||||
{
|
||||
s->use();
|
||||
#ifndef USE_GLES2
|
||||
if (CVS->isARBShaderStorageBufferObjectUsable() &&
|
||||
CVS->supportsHardwareSkinning())
|
||||
{
|
||||
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0,
|
||||
SharedGPUObjects::getSkinningBuffer());
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
m_skinning_location = s->getUniformLocation("skinning_tex");
|
||||
glUniform1i(m_skinning_location, 15);
|
||||
}
|
||||
m_skinning_tex_location = s->getUniformLocation("skinning_tex");
|
||||
glUniform1i(m_skinning_tex_location, 15);
|
||||
}
|
||||
// ------------------------------------------------------------------------
|
||||
void bindSkinningTexture()
|
||||
{
|
||||
#ifdef USE_GLES2
|
||||
glActiveTexture(GL_TEXTURE0 + 15);
|
||||
#ifdef USE_GLES2
|
||||
glBindTexture(GL_TEXTURE_2D, SharedGPUObjects::getSkinningTexture());
|
||||
glBindSampler(15, 0);
|
||||
#else
|
||||
if (!CVS->isARBShaderStorageBufferObjectUsable())
|
||||
{
|
||||
glActiveTexture(GL_TEXTURE0 + 15);
|
||||
glBindTexture(GL_TEXTURE_BUFFER,
|
||||
SharedGPUObjects::getSkinningTexture());
|
||||
glBindSampler(15, 0);
|
||||
}
|
||||
glBindTexture(GL_TEXTURE_BUFFER,
|
||||
SharedGPUObjects::getSkinningTexture());
|
||||
#endif
|
||||
glBindSampler(15, 0);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -170,9 +170,7 @@ GLuint ShaderFilesManager::loadShader(const std::string &file, unsigned type)
|
||||
code << "#define Advanced_Lighting_Enabled\n";
|
||||
if (CVS->isARBSRGBFramebufferUsable())
|
||||
code << "#define sRGB_Framebuffer_Usable\n";
|
||||
if (CVS->isARBShaderStorageBufferObjectUsable() &&
|
||||
CVS->supportsHardwareSkinning())
|
||||
code << "#define SSBO_SKINNING\n";
|
||||
|
||||
#if !defined(USE_GLES2)
|
||||
// shader compilation fails with some drivers if there is no precision
|
||||
// qualifier
|
||||
|
||||
@@ -184,32 +184,25 @@ void SharedGPUObjects::initSkinning()
|
||||
#else
|
||||
|
||||
glGenBuffers(1, &m_skinning_buf);
|
||||
const bool ssbo = CVS->isARBShaderStorageBufferObjectUsable();
|
||||
glGetIntegerv(ssbo ? GL_MAX_SHADER_STORAGE_BLOCK_SIZE :
|
||||
GL_MAX_TEXTURE_BUFFER_SIZE, &max_size);
|
||||
|
||||
glGetIntegerv(GL_MAX_TEXTURE_BUFFER_SIZE, &max_size);
|
||||
if (stk_config->m_max_skinning_bones * 64 > (unsigned)max_size)
|
||||
{
|
||||
Log::warn("SharedGPUObjects", "Too many bones for skinning, max: %d",
|
||||
max_size >> 6);
|
||||
stk_config->m_max_skinning_bones = max_size >> 6;
|
||||
}
|
||||
Log::info("SharedGPUObjects", "Hardware Skinning enabled, method: %s, "
|
||||
"max bones: %u", CVS->isARBShaderStorageBufferObjectUsable() ?
|
||||
"SSBO" : "TBO", stk_config->m_max_skinning_bones);
|
||||
Log::info("SharedGPUObjects", "Hardware Skinning enabled, method: TBO, "
|
||||
"max bones: %u", stk_config->m_max_skinning_bones);
|
||||
|
||||
const GLenum buffer = ssbo ? GL_SHADER_STORAGE_BUFFER : GL_TEXTURE_BUFFER;
|
||||
glBindBuffer(buffer, m_skinning_buf);
|
||||
glBufferData(buffer, stk_config->m_max_skinning_bones * 64, NULL,
|
||||
glBindBuffer(GL_TEXTURE_BUFFER, m_skinning_buf);
|
||||
glBufferData(GL_TEXTURE_BUFFER, stk_config->m_max_skinning_bones * 64, NULL,
|
||||
GL_DYNAMIC_DRAW);
|
||||
if (!ssbo)
|
||||
{
|
||||
glBindTexture(GL_TEXTURE_BUFFER, m_skinning_tex);
|
||||
glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, m_skinning_buf);
|
||||
glBindTexture(GL_TEXTURE_BUFFER, 0);
|
||||
}
|
||||
glBindBuffer(buffer, 0);
|
||||
glBindTexture(GL_TEXTURE_BUFFER, m_skinning_tex);
|
||||
glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, m_skinning_buf);
|
||||
glBindTexture(GL_TEXTURE_BUFFER, 0);
|
||||
glBindBuffer(GL_TEXTURE_BUFFER, 0);
|
||||
#endif
|
||||
|
||||
} // initSkinning
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
@@ -382,9 +382,7 @@ void STKAnimatedMesh::uploadJoints(const irr::core::matrix4& m,
|
||||
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, (offset >> 6) + joint, 16, 1, GL_RGBA,
|
||||
GL_FLOAT, m.pointer());
|
||||
#else
|
||||
glBufferSubData(CVS->isARBShaderStorageBufferObjectUsable() ?
|
||||
GL_SHADER_STORAGE_BUFFER : GL_TEXTURE_BUFFER,
|
||||
offset + joint * 16 * sizeof(float),
|
||||
glBufferSubData(GL_TEXTURE_BUFFER, offset + joint * 16 * sizeof(float),
|
||||
16 * sizeof(float), m.pointer());
|
||||
#endif
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user