Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix a crash in miniTempWebGL*Buffers optimization #22130

Merged
merged 2 commits into from
Jun 24, 2024

Conversation

kainino0x
Copy link
Collaborator

library_webgl.js attempts to use a pool of temp float or int buffers for uniform uploads up to 288 elements, however it would only allocate 288 temp buffers, so 0 through 287 would be fine but 288 would crash (miniTempWebGLFloatBuffers[288] would be undefined).

Confirmed manually that any one of the six "Just at the optimization limit" calls would crash before, and with the fix does not.

Fix for the change in PR #21573

library_webgl.js attempts to use a pool of temp float or int buffers for
uniform uploads up to 288 elements, however it would only allocate 288
temp buffers, so 0 through 287 would be fine but 288 would crash
(miniTempWebGLFloatBuffers[288] would be undefined).

Fix for emscripten-core#21573
@kainino0x kainino0x requested a review from sbc100 June 22, 2024 00:38
@@ -28,13 +28,15 @@ var LibraryGL = {

$miniTempWebGLFloatBuffers: [],
$miniTempWebGLFloatBuffers__postset: `var miniTempWebGLFloatBuffersStorage = new Float32Array({{{ GL_POOL_TEMP_BUFFERS_SIZE }}});
for (/**@suppress{duplicate}*/var i = 0; i < {{{ GL_POOL_TEMP_BUFFERS_SIZE }}}; ++i) {
// Create GL_POOL_TEMP_BUFFERS_SIZE+1 temporary buffers, for uploads of size 0 through GL_POOL_TEMP_BUFFERS_SIZE inclusive
for (/**@suppress{duplicate}*/var i = 0; i <= {{{ GL_POOL_TEMP_BUFFERS_SIZE }}}; ++i) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess I was the one who broke this in #21573?

Could we instead update all the other places where GL_POOL_TEMP_BUFFERS_SIZE to use less than? e.g. all the places there we currently do if (count <= {{{ GL_POOL_TEMP_BUFFERS_SIZE }}})

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I considered this but decided it didn't make as much sense. Then the top end would be unused for vec2/vec3/vec4 - the maximum values that hit the optimization would be:

  • 287 floats
  • 143 vec2s (286 floats)
  • 95 vec3s (285 floats)
  • 71 vec4s (284 floats)

Also
miniTempWebGLFloatBuffersStorage = new Float32Array({{{ GL_POOL_TEMP_BUFFERS_SIZE }}});
would change to
miniTempWebGLFloatBuffersStorage = new Float32Array({{{ GL_POOL_TEMP_BUFFERS_SIZE }}} - 1);

@kainino0x kainino0x merged commit b963a9b into emscripten-core:main Jun 24, 2024
28 checks passed
@kainino0x kainino0x deleted the uniform288 branch June 24, 2024 18:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants