@@ -99,12 +99,56 @@ int main() {
99
99
glEnableVertexAttribArray (0 );
100
100
glEnableVertexAttribArray (1 );
101
101
102
+ // Spot-test for miniTempWebGLFloatBuffers optimization in library_webgl.js.
103
+ // Note there WILL be GL errors from this, but the test doesn't check for them
104
+ // so it won't cause it to fail.
105
+ #define GL_POOL_TEMP_BUFFERS_SIZE 288
106
+ {
107
+ GLfloat fdata [GL_POOL_TEMP_BUFFERS_SIZE + 4 ] = {};
108
+ // Just under the optimization limit (should use unoptimized codepath)
109
+ glUniform4fv (glGetUniformLocation (program , "color2" ), GL_POOL_TEMP_BUFFERS_SIZE / 4 - 1 , fdata );
110
+ glUniform2fv (glGetUniformLocation (program , "color2" ), GL_POOL_TEMP_BUFFERS_SIZE / 2 - 1 , fdata );
111
+ glUniform1fv (glGetUniformLocation (program , "color2" ), GL_POOL_TEMP_BUFFERS_SIZE - 1 , fdata );
112
+ // Just at the optimization limit (should use optimized codepath)
113
+ glUniform4fv (glGetUniformLocation (program , "color2" ), GL_POOL_TEMP_BUFFERS_SIZE / 4 , fdata );
114
+ glUniform2fv (glGetUniformLocation (program , "color2" ), GL_POOL_TEMP_BUFFERS_SIZE / 2 , fdata );
115
+ glUniform1fv (glGetUniformLocation (program , "color2" ), GL_POOL_TEMP_BUFFERS_SIZE , fdata );
116
+ // Just over the optimization limit (should use optimized codepath)
117
+ glUniform4fv (glGetUniformLocation (program , "color2" ), GL_POOL_TEMP_BUFFERS_SIZE / 4 + 1 , fdata );
118
+ glUniform2fv (glGetUniformLocation (program , "color2" ), GL_POOL_TEMP_BUFFERS_SIZE / 2 + 1 , fdata );
119
+ glUniform1fv (glGetUniformLocation (program , "color2" ), GL_POOL_TEMP_BUFFERS_SIZE + 1 , fdata );
120
+
121
+ GLint idata [GL_POOL_TEMP_BUFFERS_SIZE + 4 ] = {};
122
+ // Just under the optimization limit (should use unoptimized codepath)
123
+ glUniform4iv (glGetUniformLocation (program , "color2" ), GL_POOL_TEMP_BUFFERS_SIZE / 4 - 1 , idata );
124
+ glUniform2iv (glGetUniformLocation (program , "color2" ), GL_POOL_TEMP_BUFFERS_SIZE / 2 - 1 , idata );
125
+ glUniform1iv (glGetUniformLocation (program , "color2" ), GL_POOL_TEMP_BUFFERS_SIZE - 1 , idata );
126
+ // Just at the optimization limit (should use optimized codepath)
127
+ glUniform4iv (glGetUniformLocation (program , "color2" ), GL_POOL_TEMP_BUFFERS_SIZE / 4 , idata );
128
+ glUniform2iv (glGetUniformLocation (program , "color2" ), GL_POOL_TEMP_BUFFERS_SIZE / 2 , idata );
129
+ glUniform1iv (glGetUniformLocation (program , "color2" ), GL_POOL_TEMP_BUFFERS_SIZE , idata );
130
+ // Just over the optimization limit (should use optimized codepath)
131
+ glUniform4iv (glGetUniformLocation (program , "color2" ), GL_POOL_TEMP_BUFFERS_SIZE / 4 + 1 , idata );
132
+ glUniform2iv (glGetUniformLocation (program , "color2" ), GL_POOL_TEMP_BUFFERS_SIZE / 2 + 1 , idata );
133
+ glUniform1iv (glGetUniformLocation (program , "color2" ), GL_POOL_TEMP_BUFFERS_SIZE + 1 , idata );
134
+ }
135
+
136
+ // Actual upload for the rest of the test (overwrites the previous one).
102
137
float color2 [4 ] = { 0.0f , 1.f , 0.0f , 1.0f };
103
138
glUniform4fv (glGetUniformLocation (program , "color2" ), 1 , color2 );
104
139
105
140
// Test that passing zero for the size paramater does not cause error
106
141
// https://github.com/emscripten-core/emscripten/issues/21567
107
- glUniform4fv (glGetUniformLocation (program , "color2" ), 0 , color2 );
142
+ // (These are zero-sized, so shouldn't overwrite anything.)
143
+ {
144
+ GLfloat fdata [4 ] = {};
145
+ glUniform4fv (glGetUniformLocation (program , "color2" ), 0 , fdata );
146
+ glUniform4fv (glGetUniformLocation (program , "color2" ), 0 , NULL );
147
+
148
+ GLint idata [4 ] = {};
149
+ glUniform4iv (glGetUniformLocation (program , "color2" ), 0 , idata );
150
+ glUniform4iv (glGetUniformLocation (program , "color2" ), 0 , NULL );
151
+ }
108
152
109
153
glClearColor (0.3f ,0.3f ,0.3f ,1 );
110
154
glClear (GL_COLOR_BUFFER_BIT );
0 commit comments