Skip to content

Commit 1649189

Browse files
committed
Material uniform packing: add back arrays
1 parent 37dbcf2 commit 1649189

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

src/engine/renderer/gl_shader.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2136,12 +2136,17 @@ void GLShader::PostProcessUniforms() {
21362136
auto iterNext = FindUniformForOffset( uniformQueue, std140Size );
21372137
if ( iterNext == uniformQueue.end() ) {
21382138
// add 1 unit of padding
2139+
ASSERT( !( *iterNext )->_components ); // array WriteToBuffer impls don't handle padding correctly
21392140
++std140Size;
21402141
++_materialSystemUniforms.back()->_std430Size;
21412142
} else {
2142-
ASSERT_EQ( 0, ( *iterNext )->_components ); // array handling not implemented
21432143
( *iterNext )->_std430Size = ( *iterNext )->_std430BaseSize;
2144-
std140Size += ( *iterNext )->_std430Size;
2144+
if ( ( *iterNext )->_components ) {
2145+
ASSERT_GE( ( *iterNext )->_std430Alignment, 4 ); // these would need extra padding in a std130 array
2146+
std140Size += ( *iterNext )->_std430Size * ( *iterNext )->_components;
2147+
} else {
2148+
std140Size += ( *iterNext )->_std430Size;
2149+
}
21452150
align = std::max( align, ( *iterNext )->_std430Alignment );
21462151
_materialSystemUniforms.push_back( *iterNext );
21472152
uniformQueue.erase( iterNext );

src/engine/renderer/gl_shader_test.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,4 +122,21 @@ TEST(MaterialUniformPackingTest, Vec3Handling)
122122
EXPECT_EQ(uniforms[3]->_std430Size, 4u);
123123
}
124124

125+
TEST(MaterialUniformPackingTest, Array)
126+
{
127+
class Shader1 : public MaterialUniformPackingTestShaderBase,
128+
public u_Frustum //vec4[6]
129+
{
130+
public:
131+
Shader1() : u_Frustum(this) {}
132+
};
133+
134+
Shader1 shader1;
135+
std::vector<GLUniform*> uniforms = shader1.GetUniforms();
136+
EXPECT_EQ(shader1.GetSTD140Size(), 24u);
137+
ASSERT_EQ(uniforms.size(), 1);
138+
EXPECT_EQ(uniforms[0], Get<u_Frustum>(shader1));
139+
EXPECT_EQ(uniforms[0]->_std430Size, 4u);
140+
}
141+
125142
} // namespace

0 commit comments

Comments
 (0)