diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-10-26 15:35:28 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-10-26 15:35:28 -0700 |
commit | 14c6628d28648cd069a9e0e519cc69513e3d470b (patch) | |
tree | 0fea539d8cc4423704354d1ede7fbd4a483e8ca3 /src | |
parent | 84f9bc30e322b878011e866989dfe68619643e16 (diff) |
cache string allocations in glGetString and eglQueryString
Diffstat (limited to 'src')
-rw-r--r-- | src/library_egl.js | 14 | ||||
-rw-r--r-- | src/library_gl.js | 12 |
2 files changed, 19 insertions, 7 deletions
diff --git a/src/library_egl.js b/src/library_egl.js index c25dc8ef..69902785 100644 --- a/src/library_egl.js +++ b/src/library_egl.js @@ -10,6 +10,8 @@ var LibraryEGL = { $EGL: { // This variable tracks the success status of the most recently invoked EGL function call. eglErrorCode: 0x3000 /* EGL_SUCCESS */, + + stringCache: {}, setErrorCode: function(code) { EGL.eglErrorCode = code; @@ -416,15 +418,19 @@ var LibraryEGL = { } //\todo An EGL_NOT_INITIALIZED error is generated if EGL is not initialized for dpy. EGL.setErrorCode(0x3000 /* EGL_SUCCESS */); + if (EGL.stringCache[name]) return EGL.stringCache[name]; + var ret; switch(name) { - case 0x3053 /* EGL_VENDOR */: return allocate(intArrayFromString("Emscripten"), 'i8', ALLOC_NORMAL); - case 0x3054 /* EGL_VERSION */: return allocate(intArrayFromString("1.4 Emscripten EGL"), 'i8', ALLOC_NORMAL); - case 0x3055 /* EGL_EXTENSIONS */: return allocate(intArrayFromString(""), 'i8', ALLOC_NORMAL); // Currently not supporting any EGL extensions. - case 0x308D /* EGL_CLIENT_APIS */: return allocate(intArrayFromString("OpenGL_ES"), 'i8', ALLOC_NORMAL); + case 0x3053 /* EGL_VENDOR */: ret = allocate(intArrayFromString("Emscripten"), 'i8', ALLOC_NORMAL); + case 0x3054 /* EGL_VERSION */: ret = allocate(intArrayFromString("1.4 Emscripten EGL"), 'i8', ALLOC_NORMAL); + case 0x3055 /* EGL_EXTENSIONS */: ret = allocate(intArrayFromString(""), 'i8', ALLOC_NORMAL); // Currently not supporting any EGL extensions. + case 0x308D /* EGL_CLIENT_APIS */: ret = allocate(intArrayFromString("OpenGL_ES"), 'i8', ALLOC_NORMAL); default: EGL.setErrorCode(0x300C /* EGL_BAD_PARAMETER */); return 0; } + EGL.stringCache[name] = ret; + return ret; }, // EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI(EGLenum api); diff --git a/src/library_gl.js b/src/library_gl.js index 1ea8efc2..cfdd800d 100644 --- a/src/library_gl.js +++ b/src/library_gl.js @@ -42,6 +42,8 @@ var LibraryGL = { uniformTable: {}, // name => uniform ID. the uID must be identical until relinking, cannot create a new uID each call to glGetUniformLocation + stringCache: {}, + packAlignment: 4, // default alignment is 4 bytes unpackAlignment: 4, // default alignment is 4 bytes @@ -497,11 +499,13 @@ var LibraryGL = { glGetString__sig: 'ii', glGetString: function(name_) { + if (GL.stringCache[name_]) return GL.stringCache[name_]; + var ret; switch(name_) { case 0x1F00 /* GL_VENDOR */: case 0x1F01 /* GL_RENDERER */: case 0x1F02 /* GL_VERSION */: - return allocate(intArrayFromString(Module.ctx.getParameter(name_)), 'i8', ALLOC_NORMAL); + ret = allocate(intArrayFromString(Module.ctx.getParameter(name_)), 'i8', ALLOC_NORMAL); case 0x1F03 /* GL_EXTENSIONS */: var exts = Module.ctx.getSupportedExtensions(); var gl_exts = []; @@ -509,12 +513,14 @@ var LibraryGL = { gl_exts.push(exts[i]); gl_exts.push("GL_" + exts[i]); } - return allocate(intArrayFromString(gl_exts.join(' ')), 'i8', ALLOC_NORMAL); // XXX this leaks! TODO: Cache all results like this in library_gl.js to be clean and nice and avoid leaking. + ret = allocate(intArrayFromString(gl_exts.join(' ')), 'i8', ALLOC_NORMAL); case 0x8B8C /* GL_SHADING_LANGUAGE_VERSION */: - return allocate(intArrayFromString('OpenGL ES GLSL 1.00 (WebGL)'), 'i8', ALLOC_NORMAL); + ret = allocate(intArrayFromString('OpenGL ES GLSL 1.00 (WebGL)'), 'i8', ALLOC_NORMAL); default: throw 'Failure: Invalid glGetString value: ' + name_; } + GL.stringCache[name_] = ret; + return ret; }, glGetIntegerv__sig: 'vii', |