webruby 0.2.2 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/webruby/config.rb +4 -9
- data/lib/webruby/rake/files.rake +2 -2
- data/modules/emscripten/AUTHORS +9 -1
- data/modules/emscripten/CONTRIBUTING.markdown +5 -0
- data/modules/emscripten/ChangeLog +435 -0
- data/modules/emscripten/cmake/Modules/FindOpenAL.cmake +26 -0
- data/modules/emscripten/cmake/Platform/Emscripten.cmake +9 -2
- data/modules/emscripten/em++ +0 -2
- data/modules/emscripten/emcc +92 -32
- data/modules/emscripten/emlink.py +16 -13
- data/modules/emscripten/emmake +1 -1
- data/modules/emscripten/emrun +918 -0
- data/modules/emscripten/emrun.bat +2 -0
- data/modules/emscripten/emscripten.py +545 -20
- data/modules/emscripten/src/analyzer.js +6 -1
- data/modules/emscripten/src/compiler.js +25 -16
- data/modules/emscripten/src/emrun_postjs.js +20 -0
- data/modules/emscripten/{tests → src}/hello_world.js +0 -0
- data/modules/emscripten/src/intertyper.js +45 -16
- data/modules/emscripten/src/jsifier.js +78 -48
- data/modules/emscripten/src/library.js +381 -96
- data/modules/emscripten/src/library_browser.js +50 -53
- data/modules/emscripten/src/library_egl.js +66 -24
- data/modules/emscripten/src/library_fs.js +122 -90
- data/modules/emscripten/src/library_gl.js +739 -353
- data/modules/emscripten/src/library_glfw.js +9 -3
- data/modules/emscripten/src/library_glut.js +10 -5
- data/modules/emscripten/src/library_idbfs.js +14 -14
- data/modules/emscripten/src/library_memfs.js +65 -41
- data/modules/emscripten/src/library_nodefs.js +61 -9
- data/modules/emscripten/src/library_openal.js +4 -4
- data/modules/emscripten/src/library_path.js +9 -13
- data/modules/emscripten/src/library_sdl.js +301 -64
- data/modules/emscripten/src/library_sockfs.js +7 -5
- data/modules/emscripten/src/modules.js +62 -22
- data/modules/emscripten/src/parseTools.js +135 -102
- data/modules/emscripten/src/postamble.js +3 -4
- data/modules/emscripten/src/preamble.js +49 -29
- data/modules/emscripten/src/proxyClient.js +1 -1
- data/modules/emscripten/src/proxyWorker.js +10 -10
- data/modules/emscripten/src/relooper/Relooper.cpp +15 -4
- data/modules/emscripten/src/runtime.js +32 -8
- data/modules/emscripten/src/settings.js +25 -8
- data/modules/emscripten/src/shell.html +6 -3
- data/modules/emscripten/src/shell.js +13 -11
- data/modules/emscripten/src/simd.js +602 -432
- data/modules/emscripten/src/struct_info.json +22 -2
- data/modules/emscripten/src/utility.js +32 -17
- data/modules/emscripten/system/include/SDL/SDL_events.h +1 -0
- data/modules/emscripten/system/include/compat/ctype.h +17 -0
- data/modules/emscripten/system/include/compat/wchar.h +23 -0
- data/modules/emscripten/system/include/compat/wctype.h +23 -0
- data/modules/emscripten/system/include/emscripten/emmintrin.h +87 -0
- data/modules/emscripten/system/include/emscripten/emscripten.h +30 -4
- data/modules/emscripten/system/include/emscripten/vector.h +29 -1
- data/modules/emscripten/system/include/emscripten/xmmintrin.h +131 -0
- data/modules/emscripten/system/include/libcxx/CREDITS.TXT +9 -1
- data/modules/emscripten/system/include/libcxx/__bit_reference +8 -8
- data/modules/emscripten/system/include/libcxx/__config +95 -17
- data/modules/emscripten/system/include/libcxx/__debug +25 -4
- data/modules/emscripten/system/include/libcxx/__functional_03 +7 -7
- data/modules/emscripten/system/include/libcxx/__functional_base +169 -9
- data/modules/emscripten/system/include/libcxx/__functional_base_03 +1 -1
- data/modules/emscripten/system/include/libcxx/__hash_table +25 -25
- data/modules/emscripten/system/include/libcxx/__locale +21 -19
- data/modules/emscripten/system/include/libcxx/__mutex_base +2 -33
- data/modules/emscripten/system/include/libcxx/__split_buffer +9 -9
- data/modules/emscripten/system/include/libcxx/__std_stream +14 -0
- data/modules/emscripten/system/include/libcxx/__tree +35 -26
- data/modules/emscripten/system/include/libcxx/__tuple +15 -15
- data/modules/emscripten/system/include/libcxx/__tuple_03 +2 -2
- data/modules/emscripten/system/include/libcxx/__undef_min_max +8 -0
- data/modules/emscripten/system/include/libcxx/algorithm +121 -110
- data/modules/emscripten/system/include/libcxx/array +15 -15
- data/modules/emscripten/system/include/libcxx/bitset +4 -4
- data/modules/emscripten/system/include/libcxx/chrono +51 -17
- data/modules/emscripten/system/include/libcxx/cmath +25 -23
- data/modules/emscripten/system/include/libcxx/codecvt +21 -18
- data/modules/emscripten/system/include/libcxx/complex +48 -7
- data/modules/emscripten/system/include/libcxx/cstddef +1 -1
- data/modules/emscripten/system/include/libcxx/cstdio +8 -1
- data/modules/emscripten/system/include/libcxx/cstdlib +1 -1
- data/modules/emscripten/system/include/libcxx/cwchar +1 -1
- data/modules/emscripten/system/include/libcxx/deque +26 -12
- data/modules/emscripten/system/include/libcxx/dynarray +311 -0
- data/modules/emscripten/system/include/libcxx/exception +4 -4
- data/modules/emscripten/system/include/libcxx/ext/__hash +3 -3
- data/modules/emscripten/system/include/libcxx/ext/hash_map +19 -15
- data/modules/emscripten/system/include/libcxx/ext/hash_set +7 -3
- data/modules/emscripten/system/include/libcxx/forward_list +33 -7
- data/modules/emscripten/system/include/libcxx/fstream +4 -4
- data/modules/emscripten/system/include/libcxx/functional +200 -170
- data/modules/emscripten/system/include/libcxx/future +83 -39
- data/modules/emscripten/system/include/libcxx/initializer_list +24 -11
- data/modules/emscripten/system/include/libcxx/iomanip +147 -0
- data/modules/emscripten/system/include/libcxx/ios +24 -16
- data/modules/emscripten/system/include/libcxx/iosfwd +19 -19
- data/modules/emscripten/system/include/libcxx/istream +13 -8
- data/modules/emscripten/system/include/libcxx/iterator +108 -417
- data/modules/emscripten/system/include/libcxx/limits +8 -4
- data/modules/emscripten/system/include/libcxx/list +28 -8
- data/modules/emscripten/system/include/libcxx/locale +153 -390
- data/modules/emscripten/system/include/libcxx/map +280 -100
- data/modules/emscripten/system/include/libcxx/memory +49 -97
- data/modules/emscripten/system/include/libcxx/mutex +2 -2
- data/modules/emscripten/system/include/libcxx/new +43 -14
- data/modules/emscripten/system/include/libcxx/numeric +2 -2
- data/modules/emscripten/system/include/libcxx/optional +697 -0
- data/modules/emscripten/system/include/libcxx/ostream +17 -8
- data/modules/emscripten/system/include/libcxx/queue +5 -5
- data/modules/emscripten/system/include/libcxx/random +53 -51
- data/modules/emscripten/system/include/libcxx/ratio +11 -11
- data/modules/emscripten/system/include/libcxx/readme.txt +1 -1
- data/modules/emscripten/system/include/libcxx/regex +23 -20
- data/modules/emscripten/system/include/libcxx/scoped_allocator +1 -1
- data/modules/emscripten/system/include/libcxx/set +166 -2
- data/modules/emscripten/system/include/libcxx/shared_mutex +419 -0
- data/modules/emscripten/system/include/libcxx/sstream +4 -4
- data/modules/emscripten/system/include/libcxx/stack +3 -3
- data/modules/emscripten/system/include/libcxx/streambuf +5 -5
- data/modules/emscripten/system/include/libcxx/string +372 -324
- data/modules/emscripten/system/include/libcxx/support/ibm/limits.h +99 -0
- data/modules/emscripten/system/include/libcxx/support/ibm/support.h +54 -0
- data/modules/emscripten/system/include/libcxx/support/ibm/xlocale.h +326 -0
- data/modules/emscripten/system/include/libcxx/support/win32/limits_win32.h +6 -6
- data/modules/emscripten/system/include/libcxx/support/win32/locale_win32.h +15 -15
- data/modules/emscripten/system/include/libcxx/support/win32/math_win32.h +2 -0
- data/modules/emscripten/system/include/libcxx/support/win32/support.h +6 -1
- data/modules/emscripten/system/include/libcxx/system_error +14 -8
- data/modules/emscripten/system/include/libcxx/thread +7 -8
- data/modules/emscripten/system/include/libcxx/tuple +29 -88
- data/modules/emscripten/system/include/libcxx/type_traits +253 -209
- data/modules/emscripten/system/include/libcxx/typeindex +3 -3
- data/modules/emscripten/system/include/libcxx/unordered_map +162 -101
- data/modules/emscripten/system/include/libcxx/unordered_set +79 -2
- data/modules/emscripten/system/include/libcxx/utility +20 -20
- data/modules/emscripten/system/include/libcxx/valarray +23 -23
- data/modules/emscripten/system/include/libcxx/vector +114 -91
- data/modules/emscripten/system/lib/libc/musl/src/regex/regcomp.c +3352 -0
- data/modules/emscripten/system/lib/libc/musl/src/regex/regerror.c +35 -0
- data/modules/emscripten/system/lib/libc/musl/src/regex/regexec.c +1011 -0
- data/modules/emscripten/system/lib/libc/musl/src/regex/tre-mem.c +158 -0
- data/modules/emscripten/system/lib/libc/musl/src/regex/tre.h +231 -0
- data/modules/emscripten/system/lib/libcextra.symbols +7 -0
- data/modules/emscripten/system/lib/libcxx/CREDITS.TXT +9 -1
- data/modules/emscripten/system/lib/libcxx/algorithm.cpp +1 -0
- data/modules/emscripten/system/lib/libcxx/debug.cpp +66 -42
- data/modules/emscripten/system/lib/libcxx/exception.cpp +88 -16
- data/modules/emscripten/system/lib/libcxx/future.cpp +6 -0
- data/modules/emscripten/system/lib/libcxx/ios.cpp +7 -2
- data/modules/emscripten/system/lib/libcxx/iostream.cpp +8 -8
- data/modules/emscripten/system/lib/libcxx/locale.cpp +38 -11
- data/modules/emscripten/system/lib/libcxx/mutex.cpp +3 -0
- data/modules/emscripten/system/lib/libcxx/new.cpp +44 -10
- data/modules/emscripten/system/lib/libcxx/optional.cpp +25 -0
- data/modules/emscripten/system/lib/libcxx/random.cpp +26 -0
- data/modules/emscripten/system/lib/libcxx/readme.txt +1 -1
- data/modules/emscripten/system/lib/libcxx/shared_mutex.cpp +101 -0
- data/modules/emscripten/system/lib/libcxx/stdexcept.cpp +11 -7
- data/modules/emscripten/system/lib/libcxx/string.cpp +3 -1
- data/modules/emscripten/system/lib/libcxx/strstream.cpp +7 -7
- data/modules/emscripten/system/lib/libcxx/support/win32/locale_win32.cpp +12 -13
- data/modules/emscripten/system/lib/libcxx/support/win32/support.cpp +33 -36
- data/modules/emscripten/system/lib/libcxx/symbols +187 -168
- data/modules/emscripten/system/lib/libcxx/system_error.cpp +1 -0
- data/modules/emscripten/system/lib/libcxx/thread.cpp +7 -3
- data/modules/emscripten/system/lib/libcxx/typeinfo.cpp +9 -6
- data/modules/emscripten/system/lib/libcxx/valarray.cpp +2 -0
- data/modules/emscripten/third_party/lzma.js/doit.bat +4 -0
- data/modules/emscripten/third_party/lzma.js/doit.sh +9 -2
- data/modules/emscripten/tools/cache.py +5 -7
- data/modules/emscripten/tools/cache.pyc +0 -0
- data/modules/emscripten/tools/eliminator/asm-eliminator-test-output.js +7 -0
- data/modules/emscripten/tools/eliminator/asm-eliminator-test.js +9 -1
- data/modules/emscripten/tools/eliminator/eliminator-test-output.js +3 -0
- data/modules/emscripten/tools/eliminator/eliminator-test.js +9 -1
- data/modules/emscripten/tools/file_packager.py +93 -50
- data/modules/emscripten/tools/js-optimizer.js +98 -48
- data/modules/emscripten/tools/js_optimizer.py +4 -4
- data/modules/emscripten/tools/js_optimizer.pyc +0 -0
- data/modules/emscripten/tools/jsrun.py +1 -1
- data/modules/emscripten/tools/jsrun.pyc +0 -0
- data/modules/emscripten/tools/response_file.py +6 -0
- data/modules/emscripten/tools/response_file.pyc +0 -0
- data/modules/emscripten/tools/settings_template_readonly.py +2 -0
- data/modules/emscripten/tools/shared.py +88 -34
- data/modules/emscripten/tools/shared.pyc +0 -0
- data/modules/emscripten/tools/split.py +21 -13
- data/modules/mruby/build_config.rb +7 -1
- data/modules/mruby/doc/compile/README.md +5 -9
- data/modules/mruby/include/mrbconf.h +5 -2
- data/modules/mruby/include/mruby/array.h +1 -0
- data/modules/mruby/include/mruby/compile.h +2 -4
- data/modules/mruby/include/mruby/dump.h +7 -16
- data/modules/mruby/include/mruby/hash.h +1 -1
- data/modules/mruby/include/mruby/irep.h +14 -2
- data/modules/mruby/include/mruby/khash.h +8 -7
- data/modules/mruby/include/mruby/string.h +1 -0
- data/modules/mruby/include/mruby/value.h +5 -2
- data/modules/mruby/include/mruby.h +12 -13
- data/modules/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +16 -6
- data/modules/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +18 -30
- data/modules/mruby/mrbgems/mruby-fiber/src/fiber.c +21 -0
- data/modules/mruby/mrbgems/mruby-math/src/math.c +1 -1
- data/modules/mruby/mrbgems/mruby-random/src/random.c +144 -47
- data/modules/mruby/mrbgems/mruby-random/test/random.rb +44 -0
- data/modules/mruby/mrbgems/mruby-struct/src/struct.c +5 -5
- data/modules/mruby/mrblib/numeric.rb +99 -33
- data/modules/mruby/src/array.c +11 -4
- data/modules/mruby/src/backtrace.c +2 -2
- data/modules/mruby/src/class.c +49 -30
- data/modules/mruby/src/codegen.c +131 -79
- data/modules/mruby/src/debug.c +1 -1
- data/modules/mruby/src/dump.c +213 -163
- data/modules/mruby/src/error.c +17 -17
- data/modules/mruby/src/error.h +1 -1
- data/modules/mruby/src/etc.c +10 -0
- data/modules/mruby/src/gc.c +35 -17
- data/modules/mruby/src/hash.c +5 -5
- data/modules/mruby/src/kernel.c +36 -14
- data/modules/mruby/src/load.c +238 -296
- data/modules/mruby/src/numeric.c +18 -98
- data/modules/mruby/src/object.c +3 -5
- data/modules/mruby/src/parse.y +63 -56
- data/modules/mruby/src/proc.c +8 -5
- data/modules/mruby/src/re.h +0 -1
- data/modules/mruby/src/state.c +65 -27
- data/modules/mruby/src/string.c +3 -31
- data/modules/mruby/src/symbol.c +3 -3
- data/modules/mruby/src/variable.c +12 -5
- data/modules/mruby/src/vm.c +90 -72
- data/modules/mruby/tasks/mruby_build.rake +10 -1
- data/modules/mruby/tasks/toolchains/gcc.rake +12 -2
- data/modules/mruby/tasks/toolchains/{vs2012.rake → visualcpp.rake} +1 -1
- data/modules/mruby/test/driver.c +3 -3
- data/modules/mruby/test/t/array.rb +5 -5
- data/modules/mruby/test/t/class.rb +14 -1
- data/modules/mruby/test/t/kernel.rb +4 -0
- data/modules/mruby/test/t/module.rb +4 -4
- data/modules/mruby/test/t/nameerror.rb +1 -1
- data/modules/mruby/tools/mrbc/mrbc.c +23 -17
- data/modules/mruby/travis_config.rb +10 -1
- metadata +28 -5
- data/modules/mruby/tasks/toolchains/vs2010.rake +0 -3
@@ -11,6 +11,7 @@ var LibraryGL = {
|
|
11
11
|
#endif
|
12
12
|
|
13
13
|
counter: 1, // 0 is reserved as 'null' in gl
|
14
|
+
lastError: 0,
|
14
15
|
buffers: [],
|
15
16
|
programs: [],
|
16
17
|
framebuffers: [],
|
@@ -40,7 +41,13 @@ var LibraryGL = {
|
|
40
41
|
8 // GL_DOUBLE
|
41
42
|
],
|
42
43
|
|
43
|
-
|
44
|
+
programInfos: {}, // Stores additional information needed for each shader program. Each entry is of form:
|
45
|
+
/* { uniforms: {}, // Maps ints back to the opaque WebGLUniformLocation objects.
|
46
|
+
maxUniformLength: int, // Cached in order to implement glGetProgramiv(GL_ACTIVE_UNIFORM_MAX_LENGTH)
|
47
|
+
maxAttributeLength: int // Cached in order to implement glGetProgramiv(GL_ACTIVE_ATTRIBUTE_MAX_LENGTH)
|
48
|
+
} */
|
49
|
+
|
50
|
+
stringCache: {},
|
44
51
|
|
45
52
|
packAlignment: 4, // default alignment is 4 bytes
|
46
53
|
unpackAlignment: 4, // default alignment is 4 bytes
|
@@ -49,6 +56,13 @@ var LibraryGL = {
|
|
49
56
|
Browser.moduleContextCreatedCallbacks.push(GL.initExtensions);
|
50
57
|
},
|
51
58
|
|
59
|
+
// Records a GL error condition that occurred, stored until user calls glGetError() to fetch it. As per GLES2 spec, only the first error
|
60
|
+
// is remembered, and subsequent errors are discarded until the user has cleared the stored error by a call to glGetError().
|
61
|
+
recordError: function recordError(errorCode) {
|
62
|
+
if (!GL.lastError) {
|
63
|
+
GL.lastError = errorCode;
|
64
|
+
}
|
65
|
+
},
|
52
66
|
// Get a new ID for a texture/buffer/etc., while keeping the table dense and fast. Creation is farely rare so it is worth optimizing lookups later.
|
53
67
|
getNewId: function(table) {
|
54
68
|
var ret = GL.counter++;
|
@@ -195,6 +209,114 @@ var LibraryGL = {
|
|
195
209
|
((height - 1) * alignedRowSize + plainRowSize);
|
196
210
|
},
|
197
211
|
|
212
|
+
get: function(name_, p, type) {
|
213
|
+
// Guard against user passing a null pointer.
|
214
|
+
// Note that GLES2 spec does not say anything about how passing a null pointer should be treated.
|
215
|
+
// Testing on desktop core GL 3, the application crashes on glGetIntegerv to a null pointer, but
|
216
|
+
// better to report an error instead of doing anything random.
|
217
|
+
if (!p) {
|
218
|
+
#if GL_ASSERTIONS
|
219
|
+
Module.printErr('GL_INVALID_VALUE in glGet' + type + 'v(name=' + name_ + ': Function called with null out pointer!');
|
220
|
+
#endif
|
221
|
+
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
|
222
|
+
return;
|
223
|
+
}
|
224
|
+
var ret = undefined;
|
225
|
+
switch(name_) { // Handle a few trivial GLES values
|
226
|
+
case 0x8DFA: // GL_SHADER_COMPILER
|
227
|
+
ret = 1;
|
228
|
+
break;
|
229
|
+
case 0x8DF8: // GL_SHADER_BINARY_FORMATS
|
230
|
+
if (type !== 'Integer') {
|
231
|
+
GL.recordError(0x0500); // GL_INVALID_ENUM
|
232
|
+
#if GL_ASSERTIONS
|
233
|
+
Module.printErr('GL_INVALID_ENUM in glGet' + type + 'v(GL_SHADER_BINARY_FORMATS): Invalid parameter type!');
|
234
|
+
#endif
|
235
|
+
}
|
236
|
+
return; // Do not write anything to the out pointer, since no binary formats are supported.
|
237
|
+
case 0x8DF9: // GL_NUM_SHADER_BINARY_FORMATS
|
238
|
+
ret = 0;
|
239
|
+
break;
|
240
|
+
case 0x86A2: // GL_NUM_COMPRESSED_TEXTURE_FORMATS
|
241
|
+
// WebGL doesn't have GL_NUM_COMPRESSED_TEXTURE_FORMATS (it's obsolete since GL_COMPRESSED_TEXTURE_FORMATS returns a JS array that can be queried for length),
|
242
|
+
// so implement it ourselves to allow C++ GLES2 code get the length.
|
243
|
+
var formats = Module.ctx.getParameter(0x86A3 /*GL_COMPRESSED_TEXTURE_FORMATS*/);
|
244
|
+
ret = formats.length;
|
245
|
+
break;
|
246
|
+
case 0x8B9A: // GL_IMPLEMENTATION_COLOR_READ_TYPE
|
247
|
+
ret = 0x1401; // GL_UNSIGNED_BYTE
|
248
|
+
break;
|
249
|
+
case 0x8B9B: // GL_IMPLEMENTATION_COLOR_READ_FORMAT
|
250
|
+
ret = 0x1908; // GL_RGBA
|
251
|
+
break;
|
252
|
+
}
|
253
|
+
|
254
|
+
if (ret === undefined) {
|
255
|
+
var result = Module.ctx.getParameter(name_);
|
256
|
+
switch (typeof(result)) {
|
257
|
+
case "number":
|
258
|
+
ret = result;
|
259
|
+
break;
|
260
|
+
case "boolean":
|
261
|
+
ret = result ? 1 : 0;
|
262
|
+
break;
|
263
|
+
case "string":
|
264
|
+
GL.recordError(0x0500); // GL_INVALID_ENUM
|
265
|
+
#if GL_ASSERTIONS
|
266
|
+
Module.printErr('GL_INVALID_ENUM in glGet' + type + 'v(' + name_ + ') on a name which returns a string!');
|
267
|
+
#endif
|
268
|
+
return;
|
269
|
+
case "object":
|
270
|
+
if (result === null) {
|
271
|
+
GL.recordError(0x0500); // GL_INVALID_ENUM
|
272
|
+
#if GL_ASSERTIONS
|
273
|
+
Module.printErr('GL_INVALID_ENUM in glGet' + type + 'v(' + name_ + ') and it returns null!');
|
274
|
+
#endif
|
275
|
+
return;
|
276
|
+
} else if (result instanceof Float32Array ||
|
277
|
+
result instanceof Uint32Array ||
|
278
|
+
result instanceof Int32Array ||
|
279
|
+
result instanceof Array) {
|
280
|
+
for (var i = 0; i < result.length; ++i) {
|
281
|
+
switch (type) {
|
282
|
+
case 'Integer': {{{ makeSetValue('p', 'i*4', 'result[i]', 'i32') }}}; break;
|
283
|
+
case 'Float': {{{ makeSetValue('p', 'i*4', 'result[i]', 'float') }}}; break;
|
284
|
+
case 'Boolean': {{{ makeSetValue('p', 'i', 'result[i] ? 1 : 0', 'i8') }}}; break;
|
285
|
+
default: throw 'internal glGet error, bad type: ' + type;
|
286
|
+
}
|
287
|
+
}
|
288
|
+
return;
|
289
|
+
} else if (result instanceof WebGLBuffer ||
|
290
|
+
result instanceof WebGLProgram ||
|
291
|
+
result instanceof WebGLFramebuffer ||
|
292
|
+
result instanceof WebGLRenderbuffer ||
|
293
|
+
result instanceof WebGLTexture) {
|
294
|
+
ret = result.name | 0;
|
295
|
+
} else {
|
296
|
+
GL.recordError(0x0500); // GL_INVALID_ENUM
|
297
|
+
#if GL_ASSERTIONS
|
298
|
+
Module.printErr('GL_INVALID_ENUM in glGet' + type + 'v: Unknown object returned from WebGL getParameter(' + name_ + ')!');
|
299
|
+
#endif
|
300
|
+
return;
|
301
|
+
}
|
302
|
+
break;
|
303
|
+
default:
|
304
|
+
GL.recordError(0x0500); // GL_INVALID_ENUM
|
305
|
+
#if GL_ASSERTIONS
|
306
|
+
Module.printErr('GL_INVALID_ENUM in glGetIntegerv: Native code calling glGet' + type + 'v(' + name_ + ') and it returns ' + result + ' of type ' + typeof(result) + '!');
|
307
|
+
#endif
|
308
|
+
return;
|
309
|
+
}
|
310
|
+
}
|
311
|
+
|
312
|
+
switch (type) {
|
313
|
+
case 'Integer': {{{ makeSetValue('p', '0', 'ret', 'i32') }}}; break;
|
314
|
+
case 'Float': {{{ makeSetValue('p', '0', 'ret', 'float') }}}; break;
|
315
|
+
case 'Boolean': {{{ makeSetValue('p', '0', 'ret ? 1 : 0', 'i8') }}}; break;
|
316
|
+
default: throw 'internal glGet error, bad type: ' + type;
|
317
|
+
}
|
318
|
+
},
|
319
|
+
|
198
320
|
getTexPixelData: function(type, format, width, height, pixels, internalFormat) {
|
199
321
|
var sizePerPixel;
|
200
322
|
switch (type) {
|
@@ -240,7 +362,9 @@ var LibraryGL = {
|
|
240
362
|
sizePerPixel = 2;
|
241
363
|
break;
|
242
364
|
case 0x1406 /* GL_FLOAT */:
|
365
|
+
#if ASSERTIONS
|
243
366
|
assert(GL.floatExt, 'Must have OES_texture_float to use float textures');
|
367
|
+
#endif
|
244
368
|
switch (format) {
|
245
369
|
case 0x1907 /* GL_RGB */:
|
246
370
|
sizePerPixel = 3*4;
|
@@ -272,8 +396,24 @@ var LibraryGL = {
|
|
272
396
|
}
|
273
397
|
},
|
274
398
|
|
399
|
+
#if GL_FFP_ONLY
|
400
|
+
enabledClientAttribIndices: [],
|
401
|
+
enableVertexAttribArray: function enableVertexAttribArray(index) {
|
402
|
+
if (!GL.enabledClientAttribIndices[index]) {
|
403
|
+
GL.enabledClientAttribIndices[index] = true;
|
404
|
+
Module.ctx.enableVertexAttribArray(index);
|
405
|
+
}
|
406
|
+
},
|
407
|
+
disableVertexAttribArray: function disableVertexAttribArray(index) {
|
408
|
+
if (GL.enabledClientAttribIndices[index]) {
|
409
|
+
GL.enabledClientAttribIndices[index] = false;
|
410
|
+
Module.ctx.disableVertexAttribArray(index);
|
411
|
+
}
|
412
|
+
},
|
413
|
+
#endif
|
414
|
+
|
275
415
|
#if FULL_ES2
|
276
|
-
calcBufLength: function(size, type, stride, count) {
|
416
|
+
calcBufLength: function calcBufLength(size, type, stride, count) {
|
277
417
|
if (stride > 0) {
|
278
418
|
return count * stride; // XXXvlad this is not exactly correct I don't think
|
279
419
|
}
|
@@ -283,7 +423,7 @@ var LibraryGL = {
|
|
283
423
|
|
284
424
|
usedTempBuffers: [],
|
285
425
|
|
286
|
-
preDrawHandleClientVertexAttribBindings: function(count) {
|
426
|
+
preDrawHandleClientVertexAttribBindings: function preDrawHandleClientVertexAttribBindings(count) {
|
287
427
|
GL.resetBufferBinding = false;
|
288
428
|
|
289
429
|
var used = GL.usedTempBuffers;
|
@@ -317,7 +457,7 @@ var LibraryGL = {
|
|
317
457
|
}
|
318
458
|
},
|
319
459
|
|
320
|
-
postDrawHandleClientVertexAttribBindings: function() {
|
460
|
+
postDrawHandleClientVertexAttribBindings: function postDrawHandleClientVertexAttribBindings() {
|
321
461
|
if (GL.resetBufferBinding) {
|
322
462
|
Module.ctx.bindBuffer(Module.ctx.ARRAY_BUFFER, GL.buffers[GL.currArrayBuffer]);
|
323
463
|
}
|
@@ -451,15 +591,23 @@ var LibraryGL = {
|
|
451
591
|
GL.validateGLObjectID(GL.programs, program, 'populateUniformTable', 'program');
|
452
592
|
#endif
|
453
593
|
var p = GL.programs[program];
|
454
|
-
GL.
|
455
|
-
|
456
|
-
|
594
|
+
GL.programInfos[program] = {
|
595
|
+
uniforms: {},
|
596
|
+
maxUniformLength: 0, // This is eagerly computed below, since we already enumerate all uniforms anyway.
|
597
|
+
maxAttributeLength: -1 // This is lazily computed and cached, computed when/if first asked, "-1" meaning not computed yet.
|
598
|
+
};
|
599
|
+
|
600
|
+
var ptable = GL.programInfos[program];
|
601
|
+
var utable = ptable.uniforms;
|
602
|
+
// A program's uniform table maps the string name of an uniform to an integer location of that uniform.
|
457
603
|
// The global GL.uniforms map maps integer locations to WebGLUniformLocations.
|
458
604
|
var numUniforms = Module.ctx.getProgramParameter(p, Module.ctx.ACTIVE_UNIFORMS);
|
459
605
|
for (var i = 0; i < numUniforms; ++i) {
|
460
606
|
var u = Module.ctx.getActiveUniform(p, i);
|
461
607
|
|
462
608
|
var name = u.name;
|
609
|
+
ptable.maxUniformLength = Math.max(ptable.maxUniformLength, name.length+1);
|
610
|
+
|
463
611
|
// Strip off any trailing array specifier we might have got, e.g. "[0]".
|
464
612
|
if (name.indexOf(']', name.length-1) !== -1) {
|
465
613
|
var ls = name.lastIndexOf('[');
|
@@ -467,11 +615,11 @@ var LibraryGL = {
|
|
467
615
|
}
|
468
616
|
|
469
617
|
// Optimize memory usage slightly: If we have an array of uniforms, e.g. 'vec3 colors[3];', then
|
470
|
-
// only store the string 'colors' in
|
618
|
+
// only store the string 'colors' in utable, and 'colors[0]', 'colors[1]' and 'colors[2]' will be parsed as 'colors'+i.
|
471
619
|
// Note that for the GL.uniforms table, we still need to fetch the all WebGLUniformLocations for all the indices.
|
472
620
|
var loc = Module.ctx.getUniformLocation(p, name);
|
473
621
|
var id = GL.getNewId(GL.uniforms);
|
474
|
-
|
622
|
+
utable[name] = [u.size, id];
|
475
623
|
GL.uniforms[id] = loc;
|
476
624
|
|
477
625
|
for (var j = 1; j < u.size; ++j) {
|
@@ -497,11 +645,14 @@ var LibraryGL = {
|
|
497
645
|
|
498
646
|
glGetString__sig: 'ii',
|
499
647
|
glGetString: function(name_) {
|
648
|
+
if (GL.stringCache[name_]) return GL.stringCache[name_];
|
649
|
+
var ret;
|
500
650
|
switch(name_) {
|
501
651
|
case 0x1F00 /* GL_VENDOR */:
|
502
652
|
case 0x1F01 /* GL_RENDERER */:
|
503
653
|
case 0x1F02 /* GL_VERSION */:
|
504
|
-
|
654
|
+
ret = allocate(intArrayFromString(Module.ctx.getParameter(name_)), 'i8', ALLOC_NORMAL);
|
655
|
+
break;
|
505
656
|
case 0x1F03 /* GL_EXTENSIONS */:
|
506
657
|
var exts = Module.ctx.getSupportedExtensions();
|
507
658
|
var gl_exts = [];
|
@@ -509,151 +660,35 @@ var LibraryGL = {
|
|
509
660
|
gl_exts.push(exts[i]);
|
510
661
|
gl_exts.push("GL_" + exts[i]);
|
511
662
|
}
|
512
|
-
|
663
|
+
ret = allocate(intArrayFromString(gl_exts.join(' ')), 'i8', ALLOC_NORMAL);
|
664
|
+
break;
|
513
665
|
case 0x8B8C /* GL_SHADING_LANGUAGE_VERSION */:
|
514
|
-
|
666
|
+
ret = allocate(intArrayFromString('OpenGL ES GLSL 1.00 (WebGL)'), 'i8', ALLOC_NORMAL);
|
667
|
+
break;
|
515
668
|
default:
|
516
|
-
|
669
|
+
GL.recordError(0x0500/*GL_INVALID_ENUM*/);
|
670
|
+
#if GL_ASSERTIONS
|
671
|
+
Module.printErr('GL_INVALID_ENUM in glGetString: Unknown parameter ' + name_ + '!');
|
672
|
+
#endif
|
673
|
+
return 0;
|
517
674
|
}
|
675
|
+
GL.stringCache[name_] = ret;
|
676
|
+
return ret;
|
518
677
|
},
|
519
678
|
|
520
679
|
glGetIntegerv__sig: 'vii',
|
521
680
|
glGetIntegerv: function(name_, p) {
|
522
|
-
|
523
|
-
case 0x8DFA: // GL_SHADER_COMPILER
|
524
|
-
{{{ makeSetValue('p', '0', '1', 'i32') }}};
|
525
|
-
return;
|
526
|
-
case 0x8DF9: // GL_NUM_SHADER_BINARY_FORMATS
|
527
|
-
{{{ makeSetValue('p', '0', '0', 'i32') }}};
|
528
|
-
return;
|
529
|
-
case 0x86A2: // GL_NUM_COMPRESSED_TEXTURE_FORMATS
|
530
|
-
// WebGL doesn't have GL_NUM_COMPRESSED_TEXTURE_FORMATS (it's obsolete since GL_COMPRESSED_TEXTURE_FORMATS returns a JS array that can be queried for length),
|
531
|
-
// so implement it ourselves to allow C++ GLES2 code get the length.
|
532
|
-
var formats = Module.ctx.getParameter(0x86A3 /*GL_COMPRESSED_TEXTURE_FORMATS*/);
|
533
|
-
{{{ makeSetValue('p', '0', 'formats.length', 'i32') }}};
|
534
|
-
return;
|
535
|
-
}
|
536
|
-
var result = Module.ctx.getParameter(name_);
|
537
|
-
switch (typeof(result)) {
|
538
|
-
case "number":
|
539
|
-
{{{ makeSetValue('p', '0', 'result', 'i32') }}};
|
540
|
-
break;
|
541
|
-
case "boolean":
|
542
|
-
{{{ makeSetValue('p', '0', 'result ? 1 : 0', 'i8') }}};
|
543
|
-
break;
|
544
|
-
case "string":
|
545
|
-
throw 'Native code calling glGetIntegerv(' + name_ + ') on a name which returns a string!';
|
546
|
-
case "object":
|
547
|
-
if (result === null) {
|
548
|
-
{{{ makeSetValue('p', '0', '0', 'i32') }}};
|
549
|
-
} else if (result instanceof Float32Array ||
|
550
|
-
result instanceof Uint32Array ||
|
551
|
-
result instanceof Int32Array ||
|
552
|
-
result instanceof Array) {
|
553
|
-
for (var i = 0; i < result.length; ++i) {
|
554
|
-
{{{ makeSetValue('p', 'i*4', 'result[i]', 'i32') }}};
|
555
|
-
}
|
556
|
-
} else if (result instanceof WebGLBuffer) {
|
557
|
-
{{{ makeSetValue('p', '0', 'result.name | 0', 'i32') }}};
|
558
|
-
} else if (result instanceof WebGLProgram) {
|
559
|
-
{{{ makeSetValue('p', '0', 'result.name | 0', 'i32') }}};
|
560
|
-
} else if (result instanceof WebGLFramebuffer) {
|
561
|
-
{{{ makeSetValue('p', '0', 'result.name | 0', 'i32') }}};
|
562
|
-
} else if (result instanceof WebGLRenderbuffer) {
|
563
|
-
{{{ makeSetValue('p', '0', 'result.name | 0', 'i32') }}};
|
564
|
-
} else if (result instanceof WebGLTexture) {
|
565
|
-
{{{ makeSetValue('p', '0', 'result.name | 0', 'i32') }}};
|
566
|
-
} else {
|
567
|
-
throw 'Unknown object returned from WebGL getParameter';
|
568
|
-
}
|
569
|
-
break;
|
570
|
-
case "undefined":
|
571
|
-
throw 'Native code calling glGetIntegerv(' + name_ + ') and it returns undefined';
|
572
|
-
default:
|
573
|
-
throw 'Why did we hit the default case?';
|
574
|
-
}
|
681
|
+
return GL.get(name_, p, 'Integer');
|
575
682
|
},
|
576
683
|
|
577
684
|
glGetFloatv__sig: 'vii',
|
578
685
|
glGetFloatv: function(name_, p) {
|
579
|
-
|
580
|
-
switch (typeof(result)) {
|
581
|
-
case "number":
|
582
|
-
{{{ makeSetValue('p', '0', 'result', 'float') }}};
|
583
|
-
break;
|
584
|
-
case "boolean":
|
585
|
-
{{{ makeSetValue('p', '0', 'result ? 1.0 : 0.0', 'float') }}};
|
586
|
-
break;
|
587
|
-
case "string":
|
588
|
-
{{{ makeSetValue('p', '0', '0', 'float') }}};
|
589
|
-
case "object":
|
590
|
-
if (result === null) {
|
591
|
-
throw 'Native code calling glGetFloatv(' + name_ + ') and it returns null';
|
592
|
-
} else if (result instanceof Float32Array ||
|
593
|
-
result instanceof Uint32Array ||
|
594
|
-
result instanceof Int32Array ||
|
595
|
-
result instanceof Array) {
|
596
|
-
for (var i = 0; i < result.length; ++i) {
|
597
|
-
{{{ makeSetValue('p', 'i*4', 'result[i]', 'float') }}};
|
598
|
-
}
|
599
|
-
} else if (result instanceof WebGLBuffer) {
|
600
|
-
{{{ makeSetValue('p', '0', 'result.name | 0', 'float') }}};
|
601
|
-
} else if (result instanceof WebGLProgram) {
|
602
|
-
{{{ makeSetValue('p', '0', 'result.name | 0', 'float') }}};
|
603
|
-
} else if (result instanceof WebGLFramebuffer) {
|
604
|
-
{{{ makeSetValue('p', '0', 'result.name | 0', 'float') }}};
|
605
|
-
} else if (result instanceof WebGLRenderbuffer) {
|
606
|
-
{{{ makeSetValue('p', '0', 'result.name | 0', 'float') }}};
|
607
|
-
} else if (result instanceof WebGLTexture) {
|
608
|
-
{{{ makeSetValue('p', '0', 'result.name | 0', 'float') }}};
|
609
|
-
} else {
|
610
|
-
throw 'Unknown object returned from WebGL getParameter';
|
611
|
-
}
|
612
|
-
break;
|
613
|
-
case "undefined":
|
614
|
-
throw 'Native code calling glGetFloatv(' + name_ + ') and it returns undefined';
|
615
|
-
default:
|
616
|
-
throw 'Why did we hit the default case?';
|
617
|
-
}
|
686
|
+
return GL.get(name_, p, 'Float');
|
618
687
|
},
|
619
688
|
|
620
689
|
glGetBooleanv__sig: 'vii',
|
621
690
|
glGetBooleanv: function(name_, p) {
|
622
|
-
|
623
|
-
switch (typeof(result)) {
|
624
|
-
case "number":
|
625
|
-
{{{ makeSetValue('p', '0', 'result != 0', 'i8') }}};
|
626
|
-
break;
|
627
|
-
case "boolean":
|
628
|
-
{{{ makeSetValue('p', '0', 'result != 0', 'i8') }}};
|
629
|
-
break;
|
630
|
-
case "string":
|
631
|
-
throw 'Native code calling glGetBooleanv(' + name_ + ') on a name which returns a string!';
|
632
|
-
case "object":
|
633
|
-
if (result === null) {
|
634
|
-
{{{ makeSetValue('p', '0', '0', 'i8') }}};
|
635
|
-
} else if (result instanceof Float32Array ||
|
636
|
-
result instanceof Uint32Array ||
|
637
|
-
result instanceof Int32Array ||
|
638
|
-
result instanceof Array) {
|
639
|
-
for (var i = 0; i < result.length; ++i) {
|
640
|
-
{{{ makeSetValue('p', 'i', 'result[i] != 0', 'i8') }}};
|
641
|
-
}
|
642
|
-
} else if (result instanceof WebGLBuffer ||
|
643
|
-
result instanceof WebGLProgram ||
|
644
|
-
result instanceof WebGLFramebuffer ||
|
645
|
-
result instanceof WebGLRenderbuffer ||
|
646
|
-
result instanceof WebGLTexture) {
|
647
|
-
{{{ makeSetValue('p', '0', '1', 'i8') }}}; // non-zero ID is always 1!
|
648
|
-
} else {
|
649
|
-
throw 'Unknown object returned from WebGL getParameter';
|
650
|
-
}
|
651
|
-
break;
|
652
|
-
case "undefined":
|
653
|
-
throw 'Unknown object returned from WebGL getParameter';
|
654
|
-
default:
|
655
|
-
throw 'Why did we hit the default case?';
|
656
|
-
}
|
691
|
+
return GL.get(name_, p, 'Boolean');
|
657
692
|
},
|
658
693
|
|
659
694
|
glGenTextures__sig: 'vii',
|
@@ -680,7 +715,9 @@ var LibraryGL = {
|
|
680
715
|
|
681
716
|
glCompressedTexImage2D__sig: 'viiiiiiii',
|
682
717
|
glCompressedTexImage2D: function(target, level, internalFormat, width, height, border, imageSize, data) {
|
718
|
+
#if ASSERTIONS
|
683
719
|
assert(GL.compressionExt);
|
720
|
+
#endif
|
684
721
|
if (data) {
|
685
722
|
data = {{{ makeHEAPView('U8', 'data', 'data+imageSize') }}};
|
686
723
|
} else {
|
@@ -691,7 +728,9 @@ var LibraryGL = {
|
|
691
728
|
|
692
729
|
glCompressedTexSubImage2D__sig: 'viiiiiiiii',
|
693
730
|
glCompressedTexSubImage2D: function(target, level, xoffset, yoffset, width, height, format, imageSize, data) {
|
731
|
+
#if ASSERTIONS
|
694
732
|
assert(GL.compressionExt);
|
733
|
+
#endif
|
695
734
|
if (data) {
|
696
735
|
data = {{{ makeHEAPView('U8', 'data', 'data+imageSize') }}};
|
697
736
|
} else {
|
@@ -725,7 +764,9 @@ var LibraryGL = {
|
|
725
764
|
|
726
765
|
glReadPixels__sig: 'viiiiiii',
|
727
766
|
glReadPixels: function(x, y, width, height, format, type, pixels) {
|
767
|
+
#if ASSERTIONS
|
728
768
|
assert(type == 0x1401 /* GL_UNSIGNED_BYTE */);
|
769
|
+
#endif
|
729
770
|
var sizePerPixel;
|
730
771
|
switch (format) {
|
731
772
|
case 0x1907 /* GL_RGB */:
|
@@ -734,7 +775,12 @@ var LibraryGL = {
|
|
734
775
|
case 0x1908 /* GL_RGBA */:
|
735
776
|
sizePerPixel = 4;
|
736
777
|
break;
|
737
|
-
default:
|
778
|
+
default:
|
779
|
+
GL.recordError(0x0500/*GL_INVALID_ENUM*/);
|
780
|
+
#if GL_ASSERTIONS
|
781
|
+
Module.printErr('GL_INVALID_ENUM in glReadPixels: Unsupported format ' + format + '!');
|
782
|
+
#endif
|
783
|
+
return;
|
738
784
|
}
|
739
785
|
var totalSize = width*height*sizePerPixel;
|
740
786
|
Module.ctx.readPixels(x, y, width, height, format, type, HEAPU8.subarray(pixels, pixels + totalSize));
|
@@ -938,11 +984,12 @@ var LibraryGL = {
|
|
938
984
|
name = name.slice(0, ls);
|
939
985
|
}
|
940
986
|
|
941
|
-
var ptable = GL.
|
987
|
+
var ptable = GL.programInfos[program];
|
942
988
|
if (!ptable) {
|
943
989
|
return -1;
|
944
990
|
}
|
945
|
-
var
|
991
|
+
var utable = ptable.uniforms;
|
992
|
+
var uniformInfo = utable[name]; // returns pair [ dimension_of_uniform_array, uniform_location ]
|
946
993
|
if (uniformInfo && arrayOffset < uniformInfo[0]) { // Check if user asked for an out-of-bounds element, i.e. for 'vec4 colors[3];' user could ask for 'colors[10]' which should return -1.
|
947
994
|
return uniformInfo[1]+arrayOffset;
|
948
995
|
} else {
|
@@ -1357,7 +1404,9 @@ var LibraryGL = {
|
|
1357
1404
|
{{{ makeSetValue('count', '0', 'len', 'i32') }}};
|
1358
1405
|
for (var i = 0; i < len; ++i) {
|
1359
1406
|
var id = GL.shaders.indexOf(result[i]);
|
1407
|
+
#if ASSERTIONS
|
1360
1408
|
assert(id !== -1, 'shader not bound to local id');
|
1409
|
+
#endif
|
1361
1410
|
{{{ makeSetValue('shaders', 'i*4', 'id', 'i32') }}};
|
1362
1411
|
}
|
1363
1412
|
},
|
@@ -1428,6 +1477,47 @@ var LibraryGL = {
|
|
1428
1477
|
#endif
|
1429
1478
|
if (pname == 0x8B84) { // GL_INFO_LOG_LENGTH
|
1430
1479
|
{{{ makeSetValue('p', '0', 'Module.ctx.getProgramInfoLog(GL.programs[program]).length + 1', 'i32') }}};
|
1480
|
+
} else if (pname == 0x8B87 /* GL_ACTIVE_UNIFORM_MAX_LENGTH */) {
|
1481
|
+
var ptable = GL.programInfos[program];
|
1482
|
+
if (ptable) {
|
1483
|
+
{{{ makeSetValue('p', '0', 'ptable.maxUniformLength', 'i32') }}};
|
1484
|
+
return;
|
1485
|
+
} else if (program < GL.counter) {
|
1486
|
+
#if GL_ASSERTIONS
|
1487
|
+
Module.printErr("A GL object " + program + " that is not a program object was passed to glGetProgramiv!");
|
1488
|
+
#endif
|
1489
|
+
GL.recordError(0x0502 /* GL_INVALID_OPERATION */);
|
1490
|
+
} else {
|
1491
|
+
#if GL_ASSERTIONS
|
1492
|
+
Module.printErr("A GL object " + program + " that did not come from GL was passed to glGetProgramiv!");
|
1493
|
+
#endif
|
1494
|
+
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
|
1495
|
+
}
|
1496
|
+
} else if (pname == 0x8B8A /* GL_ACTIVE_ATTRIBUTE_MAX_LENGTH */) {
|
1497
|
+
var ptable = GL.programInfos[program];
|
1498
|
+
if (ptable) {
|
1499
|
+
if (ptable.maxAttributeLength == -1) {
|
1500
|
+
var program = GL.programs[program];
|
1501
|
+
var numAttribs = Module.ctx.getProgramParameter(program, Module.ctx.ACTIVE_ATTRIBUTES);
|
1502
|
+
ptable.maxAttributeLength = 0; // Spec says if there are no active attribs, 0 must be returned.
|
1503
|
+
for(var i = 0; i < numAttribs; ++i) {
|
1504
|
+
var activeAttrib = Module.ctx.getActiveAttrib(program, i);
|
1505
|
+
ptable.maxAttributeLength = Math.max(ptable.maxAttributeLength, activeAttrib.name.length+1);
|
1506
|
+
}
|
1507
|
+
}
|
1508
|
+
{{{ makeSetValue('p', '0', 'ptable.maxAttributeLength', 'i32') }}};
|
1509
|
+
return;
|
1510
|
+
} else if (program < GL.counter) {
|
1511
|
+
#if GL_ASSERTIONS
|
1512
|
+
Module.printErr("A GL object " + program + " that is not a program object was passed to glGetProgramiv!");
|
1513
|
+
#endif
|
1514
|
+
GL.recordError(0x0502 /* GL_INVALID_OPERATION */);
|
1515
|
+
} else {
|
1516
|
+
#if GL_ASSERTIONS
|
1517
|
+
Module.printErr("A GL object " + program + " that did not come from GL was passed to glGetProgramiv!");
|
1518
|
+
#endif
|
1519
|
+
GL.recordError(0x0501 /* GL_INVALID_VALUE */);
|
1520
|
+
}
|
1431
1521
|
} else {
|
1432
1522
|
{{{ makeSetValue('p', '0', 'Module.ctx.getProgramParameter(GL.programs[program], pname)', 'i32') }}};
|
1433
1523
|
}
|
@@ -1455,7 +1545,7 @@ var LibraryGL = {
|
|
1455
1545
|
Module.ctx.deleteProgram(program);
|
1456
1546
|
program.name = 0;
|
1457
1547
|
GL.programs[program] = null;
|
1458
|
-
GL.
|
1548
|
+
GL.programInfos[program] = null;
|
1459
1549
|
},
|
1460
1550
|
|
1461
1551
|
glAttachShader__sig: 'vii',
|
@@ -1491,7 +1581,7 @@ var LibraryGL = {
|
|
1491
1581
|
GL.validateGLObjectID(GL.programs, program, 'glLinkProgram', 'program');
|
1492
1582
|
#endif
|
1493
1583
|
Module.ctx.linkProgram(GL.programs[program]);
|
1494
|
-
GL.
|
1584
|
+
GL.programInfos[program] = null; // uniforms no longer keep the same names after linking
|
1495
1585
|
GL.populateUniformTable(program);
|
1496
1586
|
},
|
1497
1587
|
|
@@ -1645,7 +1735,7 @@ var LibraryGL = {
|
|
1645
1735
|
|
1646
1736
|
// Add some emulation workarounds
|
1647
1737
|
Module.printErr('WARNING: using emscripten GL emulation. This is a collection of limited workarounds, do not expect it to work.');
|
1648
|
-
#if GL_UNSAFE_OPTS ==
|
1738
|
+
#if GL_UNSAFE_OPTS == 1
|
1649
1739
|
Module.printErr('WARNING: using emscripten GL emulation unsafe opts. If weirdness happens, try -s GL_UNSAFE_OPTS=0');
|
1650
1740
|
#endif
|
1651
1741
|
|
@@ -1663,7 +1753,7 @@ var LibraryGL = {
|
|
1663
1753
|
};
|
1664
1754
|
|
1665
1755
|
var glEnable = _glEnable;
|
1666
|
-
_glEnable = function(cap) {
|
1756
|
+
_glEnable = function _glEnable(cap) {
|
1667
1757
|
// Clean up the renderer on any change to the rendering state. The optimization of
|
1668
1758
|
// skipping renderer setup is aimed at the case of multiple glDraw* right after each other
|
1669
1759
|
if (GL.immediate.lastRenderer) GL.immediate.lastRenderer.cleanup();
|
@@ -1685,7 +1775,7 @@ var LibraryGL = {
|
|
1685
1775
|
};
|
1686
1776
|
|
1687
1777
|
var glDisable = _glDisable;
|
1688
|
-
_glDisable = function(cap) {
|
1778
|
+
_glDisable = function _glDisable(cap) {
|
1689
1779
|
if (GL.immediate.lastRenderer) GL.immediate.lastRenderer.cleanup();
|
1690
1780
|
if (cap == 0x0B60 /* GL_FOG */) {
|
1691
1781
|
GLEmulation.fogEnabled = false;
|
@@ -1703,7 +1793,7 @@ var LibraryGL = {
|
|
1703
1793
|
}
|
1704
1794
|
glDisable(cap);
|
1705
1795
|
};
|
1706
|
-
_glIsEnabled = function(cap) {
|
1796
|
+
_glIsEnabled = function _glIsEnabled(cap) {
|
1707
1797
|
if (cap == 0x0B60 /* GL_FOG */) {
|
1708
1798
|
return GLEmulation.fogEnabled ? 1 : 0;
|
1709
1799
|
} else if (!(cap in validCapabilities)) {
|
@@ -1713,7 +1803,7 @@ var LibraryGL = {
|
|
1713
1803
|
};
|
1714
1804
|
|
1715
1805
|
var glGetBooleanv = _glGetBooleanv;
|
1716
|
-
_glGetBooleanv = function(pname, p) {
|
1806
|
+
_glGetBooleanv = function _glGetBooleanv(pname, p) {
|
1717
1807
|
var attrib = GLEmulation.getAttributeFromCapability(pname);
|
1718
1808
|
if (attrib !== null) {
|
1719
1809
|
var result = GL.immediate.enabledClientAttributes[attrib];
|
@@ -1724,7 +1814,7 @@ var LibraryGL = {
|
|
1724
1814
|
};
|
1725
1815
|
|
1726
1816
|
var glGetIntegerv = _glGetIntegerv;
|
1727
|
-
_glGetIntegerv = function(pname, params) {
|
1817
|
+
_glGetIntegerv = function _glGetIntegerv(pname, params) {
|
1728
1818
|
switch (pname) {
|
1729
1819
|
case 0x84E2: pname = Module.ctx.MAX_TEXTURE_IMAGE_UNITS /* fake it */; break; // GL_MAX_TEXTURE_UNITS
|
1730
1820
|
case 0x8B4A: { // GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB
|
@@ -1774,17 +1864,17 @@ var LibraryGL = {
|
|
1774
1864
|
return;
|
1775
1865
|
}
|
1776
1866
|
case 0x8088: { // GL_TEXTURE_COORD_ARRAY_SIZE
|
1777
|
-
var attribute = GLImmediate.clientAttributes[GLImmediate.TEXTURE0];
|
1867
|
+
var attribute = GLImmediate.clientAttributes[GLImmediate.TEXTURE0 + GLImmediate.clientActiveTexture];
|
1778
1868
|
{{{ makeSetValue('params', '0', 'attribute ? attribute.size : 0', 'i32') }}};
|
1779
1869
|
return;
|
1780
1870
|
}
|
1781
1871
|
case 0x8089: { // GL_TEXTURE_COORD_ARRAY_TYPE
|
1782
|
-
var attribute = GLImmediate.clientAttributes[GLImmediate.TEXTURE0];
|
1872
|
+
var attribute = GLImmediate.clientAttributes[GLImmediate.TEXTURE0 + GLImmediate.clientActiveTexture];
|
1783
1873
|
{{{ makeSetValue('params', '0', 'attribute ? attribute.type : 0', 'i32') }}};
|
1784
1874
|
return;
|
1785
1875
|
}
|
1786
1876
|
case 0x808A: { // GL_TEXTURE_COORD_ARRAY_STRIDE
|
1787
|
-
var attribute = GLImmediate.clientAttributes[GLImmediate.TEXTURE0];
|
1877
|
+
var attribute = GLImmediate.clientAttributes[GLImmediate.TEXTURE0 + GLImmediate.clientActiveTexture];
|
1788
1878
|
{{{ makeSetValue('params', '0', 'attribute ? attribute.stride : 0', 'i32') }}};
|
1789
1879
|
return;
|
1790
1880
|
}
|
@@ -1793,14 +1883,17 @@ var LibraryGL = {
|
|
1793
1883
|
};
|
1794
1884
|
|
1795
1885
|
var glGetString = _glGetString;
|
1796
|
-
_glGetString = function(name_) {
|
1886
|
+
_glGetString = function _glGetString(name_) {
|
1887
|
+
if (GL.stringCache[name_]) return GL.stringCache[name_];
|
1797
1888
|
switch(name_) {
|
1798
1889
|
case 0x1F03 /* GL_EXTENSIONS */: // Add various extensions that we can support
|
1799
|
-
|
1890
|
+
var ret = allocate(intArrayFromString(Module.ctx.getSupportedExtensions().join(' ') +
|
1800
1891
|
' GL_EXT_texture_env_combine GL_ARB_texture_env_crossbar GL_ATI_texture_env_combine3 GL_NV_texture_env_combine4 GL_EXT_texture_env_dot3 GL_ARB_multitexture GL_ARB_vertex_buffer_object GL_EXT_framebuffer_object GL_ARB_vertex_program GL_ARB_fragment_program GL_ARB_shading_language_100 GL_ARB_shader_objects GL_ARB_vertex_shader GL_ARB_fragment_shader GL_ARB_texture_cube_map GL_EXT_draw_range_elements' +
|
1801
1892
|
(GL.compressionExt ? ' GL_ARB_texture_compression GL_EXT_texture_compression_s3tc' : '') +
|
1802
1893
|
(GL.anisotropicExt ? ' GL_EXT_texture_filter_anisotropic' : '')
|
1803
1894
|
), 'i8', ALLOC_NORMAL);
|
1895
|
+
GL.stringCache[name_] = ret;
|
1896
|
+
return ret;
|
1804
1897
|
}
|
1805
1898
|
return glGetString(name_);
|
1806
1899
|
};
|
@@ -1814,7 +1907,7 @@ var LibraryGL = {
|
|
1814
1907
|
GL.shaderOriginalSources = {};
|
1815
1908
|
#endif
|
1816
1909
|
var glCreateShader = _glCreateShader;
|
1817
|
-
_glCreateShader = function(shaderType) {
|
1910
|
+
_glCreateShader = function _glCreateShader(shaderType) {
|
1818
1911
|
var id = glCreateShader(shaderType);
|
1819
1912
|
GL.shaderInfos[id] = {
|
1820
1913
|
type: shaderType,
|
@@ -1824,7 +1917,7 @@ var LibraryGL = {
|
|
1824
1917
|
};
|
1825
1918
|
|
1826
1919
|
var glShaderSource = _glShaderSource;
|
1827
|
-
_glShaderSource = function(shader, count, string, length) {
|
1920
|
+
_glShaderSource = function _glShaderSource(shader, count, string, length) {
|
1828
1921
|
var source = GL.getSource(shader, count, string, length);
|
1829
1922
|
#if GL_DEBUG
|
1830
1923
|
console.log("glShaderSource: Input: \n" + source);
|
@@ -1937,7 +2030,7 @@ var LibraryGL = {
|
|
1937
2030
|
};
|
1938
2031
|
|
1939
2032
|
var glCompileShader = _glCompileShader;
|
1940
|
-
_glCompileShader = function(shader) {
|
2033
|
+
_glCompileShader = function _glCompileShader(shader) {
|
1941
2034
|
Module.ctx.compileShader(GL.shaders[shader]);
|
1942
2035
|
#if GL_DEBUG
|
1943
2036
|
if (!Module.ctx.getShaderParameter(GL.shaders[shader], Module.ctx.COMPILE_STATUS)) {
|
@@ -1952,14 +2045,14 @@ var LibraryGL = {
|
|
1952
2045
|
|
1953
2046
|
GL.programShaders = {};
|
1954
2047
|
var glAttachShader = _glAttachShader;
|
1955
|
-
_glAttachShader = function(program, shader) {
|
2048
|
+
_glAttachShader = function _glAttachShader(program, shader) {
|
1956
2049
|
if (!GL.programShaders[program]) GL.programShaders[program] = [];
|
1957
2050
|
GL.programShaders[program].push(shader);
|
1958
2051
|
glAttachShader(program, shader);
|
1959
2052
|
};
|
1960
2053
|
|
1961
2054
|
var glDetachShader = _glDetachShader;
|
1962
|
-
_glDetachShader = function(program, shader) {
|
2055
|
+
_glDetachShader = function _glDetachShader(program, shader) {
|
1963
2056
|
var programShader = GL.programShaders[program];
|
1964
2057
|
if (!programShader) {
|
1965
2058
|
Module.printErr('WARNING: _glDetachShader received invalid program: ' + program);
|
@@ -1971,7 +2064,7 @@ var LibraryGL = {
|
|
1971
2064
|
};
|
1972
2065
|
|
1973
2066
|
var glUseProgram = _glUseProgram;
|
1974
|
-
_glUseProgram = function(program) {
|
2067
|
+
_glUseProgram = function _glUseProgram(program) {
|
1975
2068
|
#if GL_DEBUG
|
1976
2069
|
if (GL.debug) {
|
1977
2070
|
Module.printErr('[using program with shaders]');
|
@@ -1983,12 +2076,15 @@ var LibraryGL = {
|
|
1983
2076
|
}
|
1984
2077
|
}
|
1985
2078
|
#endif
|
1986
|
-
GL.currProgram
|
2079
|
+
if (GL.currProgram != program) {
|
2080
|
+
GL.currentRenderer = null; // This changes the FFP emulation shader program, need to recompute that.
|
2081
|
+
GL.currProgram = program;
|
2082
|
+
}
|
1987
2083
|
glUseProgram(program);
|
1988
2084
|
}
|
1989
2085
|
|
1990
2086
|
var glDeleteProgram = _glDeleteProgram;
|
1991
|
-
_glDeleteProgram = function(program) {
|
2087
|
+
_glDeleteProgram = function _glDeleteProgram(program) {
|
1992
2088
|
glDeleteProgram(program);
|
1993
2089
|
if (program == GL.currProgram) GL.currProgram = 0;
|
1994
2090
|
};
|
@@ -1996,12 +2092,12 @@ var LibraryGL = {
|
|
1996
2092
|
// If attribute 0 was not bound, bind it to 0 for WebGL performance reasons. Track if 0 is free for that.
|
1997
2093
|
var zeroUsedPrograms = {};
|
1998
2094
|
var glBindAttribLocation = _glBindAttribLocation;
|
1999
|
-
_glBindAttribLocation = function(program, index, name) {
|
2095
|
+
_glBindAttribLocation = function _glBindAttribLocation(program, index, name) {
|
2000
2096
|
if (index == 0) zeroUsedPrograms[program] = true;
|
2001
2097
|
glBindAttribLocation(program, index, name);
|
2002
2098
|
};
|
2003
2099
|
var glLinkProgram = _glLinkProgram;
|
2004
|
-
_glLinkProgram = function(program) {
|
2100
|
+
_glLinkProgram = function _glLinkProgram(program) {
|
2005
2101
|
if (!(program in zeroUsedPrograms)) {
|
2006
2102
|
Module.ctx.bindAttribLocation(GL.programs[program], 0, 'a_position');
|
2007
2103
|
}
|
@@ -2009,11 +2105,13 @@ var LibraryGL = {
|
|
2009
2105
|
};
|
2010
2106
|
|
2011
2107
|
var glBindBuffer = _glBindBuffer;
|
2012
|
-
_glBindBuffer = function(target, buffer) {
|
2108
|
+
_glBindBuffer = function _glBindBuffer(target, buffer) {
|
2013
2109
|
glBindBuffer(target, buffer);
|
2014
2110
|
if (target == Module.ctx.ARRAY_BUFFER) {
|
2015
2111
|
if (GLEmulation.currentVao) {
|
2112
|
+
#if ASSERTIONS
|
2016
2113
|
assert(GLEmulation.currentVao.arrayBuffer == buffer || GLEmulation.currentVao.arrayBuffer == 0 || buffer == 0, 'TODO: support for multiple array buffers in vao');
|
2114
|
+
#endif
|
2017
2115
|
GLEmulation.currentVao.arrayBuffer = buffer;
|
2018
2116
|
}
|
2019
2117
|
} else if (target == Module.ctx.ELEMENT_ARRAY_BUFFER) {
|
@@ -2022,7 +2120,7 @@ var LibraryGL = {
|
|
2022
2120
|
};
|
2023
2121
|
|
2024
2122
|
var glGetFloatv = _glGetFloatv;
|
2025
|
-
_glGetFloatv = function(pname, params) {
|
2123
|
+
_glGetFloatv = function _glGetFloatv(pname, params) {
|
2026
2124
|
if (pname == 0x0BA6) { // GL_MODELVIEW_MATRIX
|
2027
2125
|
HEAPF32.set(GL.immediate.matrix['m'], params >> 2);
|
2028
2126
|
} else if (pname == 0x0BA7) { // GL_PROJECTION_MATRIX
|
@@ -2045,7 +2143,7 @@ var LibraryGL = {
|
|
2045
2143
|
};
|
2046
2144
|
|
2047
2145
|
var glHint = _glHint;
|
2048
|
-
_glHint = function(target, mode) {
|
2146
|
+
_glHint = function _glHint(target, mode) {
|
2049
2147
|
if (target == 0x84EF) { // GL_TEXTURE_COMPRESSION_HINT
|
2050
2148
|
return;
|
2051
2149
|
}
|
@@ -2053,21 +2151,21 @@ var LibraryGL = {
|
|
2053
2151
|
};
|
2054
2152
|
|
2055
2153
|
var glEnableVertexAttribArray = _glEnableVertexAttribArray;
|
2056
|
-
_glEnableVertexAttribArray = function(index) {
|
2154
|
+
_glEnableVertexAttribArray = function _glEnableVertexAttribArray(index) {
|
2057
2155
|
glEnableVertexAttribArray(index);
|
2058
2156
|
GLEmulation.enabledVertexAttribArrays[index] = 1;
|
2059
2157
|
if (GLEmulation.currentVao) GLEmulation.currentVao.enabledVertexAttribArrays[index] = 1;
|
2060
2158
|
};
|
2061
2159
|
|
2062
2160
|
var glDisableVertexAttribArray = _glDisableVertexAttribArray;
|
2063
|
-
_glDisableVertexAttribArray = function(index) {
|
2161
|
+
_glDisableVertexAttribArray = function _glDisableVertexAttribArray(index) {
|
2064
2162
|
glDisableVertexAttribArray(index);
|
2065
2163
|
delete GLEmulation.enabledVertexAttribArrays[index];
|
2066
2164
|
if (GLEmulation.currentVao) delete GLEmulation.currentVao.enabledVertexAttribArrays[index];
|
2067
2165
|
};
|
2068
2166
|
|
2069
2167
|
var glVertexAttribPointer = _glVertexAttribPointer;
|
2070
|
-
_glVertexAttribPointer = function(index, size, type, normalized, stride, pointer) {
|
2168
|
+
_glVertexAttribPointer = function _glVertexAttribPointer(index, size, type, normalized, stride, pointer) {
|
2071
2169
|
glVertexAttribPointer(index, size, type, normalized, stride, pointer);
|
2072
2170
|
if (GLEmulation.currentVao) { // TODO: avoid object creation here? likely not hot though
|
2073
2171
|
GLEmulation.currentVao.vertexAttribPointers[index] = [index, size, type, normalized, stride, pointer];
|
@@ -2099,9 +2197,6 @@ var LibraryGL = {
|
|
2099
2197
|
glGetShaderPrecisionFormat__sig: 'v',
|
2100
2198
|
glGetShaderPrecisionFormat: function() { throw 'glGetShaderPrecisionFormat: TODO' },
|
2101
2199
|
|
2102
|
-
glShaderBinary__sig: 'v',
|
2103
|
-
glShaderBinary: function() { throw 'glShaderBinary: TODO' },
|
2104
|
-
|
2105
2200
|
glDeleteObject__sig: 'vi',
|
2106
2201
|
glDeleteObject: function(id) {
|
2107
2202
|
if (GL.programs[id]) {
|
@@ -2113,11 +2208,6 @@ var LibraryGL = {
|
|
2113
2208
|
}
|
2114
2209
|
},
|
2115
2210
|
|
2116
|
-
glReleaseShaderCompiler__sig: 'v',
|
2117
|
-
glReleaseShaderCompiler: function() {
|
2118
|
-
// NOP (as allowed by GLES 2.0 spec)
|
2119
|
-
},
|
2120
|
-
|
2121
2211
|
glGetObjectParameteriv__sig: 'viii',
|
2122
2212
|
glGetObjectParameteriv: function(id, type, result) {
|
2123
2213
|
if (GL.programs[id]) {
|
@@ -2153,7 +2243,9 @@ var LibraryGL = {
|
|
2153
2243
|
|
2154
2244
|
glBindProgram__sig: 'vii',
|
2155
2245
|
glBindProgram: function(type, id) {
|
2246
|
+
#if ASSERTIONS
|
2156
2247
|
assert(id == 0);
|
2248
|
+
#endif
|
2157
2249
|
},
|
2158
2250
|
|
2159
2251
|
glGetPointerv: function(name, p) {
|
@@ -2164,8 +2256,13 @@ var LibraryGL = {
|
|
2164
2256
|
case 0x8090: // GL_COLOR_ARRAY_POINTER
|
2165
2257
|
attribute = GLImmediate.clientAttributes[GLImmediate.COLOR]; break;
|
2166
2258
|
case 0x8092: // GL_TEXTURE_COORD_ARRAY_POINTER
|
2167
|
-
attribute = GLImmediate.clientAttributes[GLImmediate.TEXTURE0]; break;
|
2168
|
-
default:
|
2259
|
+
attribute = GLImmediate.clientAttributes[GLImmediate.TEXTURE0 + GLImmediate.clientActiveTexture]; break;
|
2260
|
+
default:
|
2261
|
+
GL.recordError(0x0500/*GL_INVALID_ENUM*/);
|
2262
|
+
#if GL_ASSERTIONS
|
2263
|
+
Module.printErr('GL_INVALID_ENUM in glGetPointerv: Unsupported name ' + name + '!');
|
2264
|
+
#endif
|
2265
|
+
return;
|
2169
2266
|
}
|
2170
2267
|
{{{ makeSetValue('p', '0', 'attribute ? attribute.pointer : 0', 'i32') }}};
|
2171
2268
|
},
|
@@ -2186,14 +2283,14 @@ var LibraryGL = {
|
|
2186
2283
|
function CNaiveListMap() {
|
2187
2284
|
var list = [];
|
2188
2285
|
|
2189
|
-
this.insert = function(key, val) {
|
2286
|
+
this.insert = function CNaiveListMap_insert(key, val) {
|
2190
2287
|
if (this.contains(key|0)) return false;
|
2191
2288
|
list.push([key, val]);
|
2192
2289
|
return true;
|
2193
2290
|
};
|
2194
2291
|
|
2195
2292
|
var __contains_i;
|
2196
|
-
this.contains = function(key) {
|
2293
|
+
this.contains = function CNaiveListMap_contains(key) {
|
2197
2294
|
for (__contains_i = 0; __contains_i < list.length; ++__contains_i) {
|
2198
2295
|
if (list[__contains_i][0] === key) return true;
|
2199
2296
|
}
|
@@ -2201,7 +2298,7 @@ var LibraryGL = {
|
|
2201
2298
|
};
|
2202
2299
|
|
2203
2300
|
var __get_i;
|
2204
|
-
this.get = function(key) {
|
2301
|
+
this.get = function CNaiveListMap_get(key) {
|
2205
2302
|
for (__get_i = 0; __get_i < list.length; ++__get_i) {
|
2206
2303
|
if (list[__get_i][0] === key) return list[__get_i][1];
|
2207
2304
|
}
|
@@ -2235,7 +2332,7 @@ var LibraryGL = {
|
|
2235
2332
|
function CNLNode() {
|
2236
2333
|
var map = new CNaiveListMap();
|
2237
2334
|
|
2238
|
-
this.child = function(keyFrag) {
|
2335
|
+
this.child = function CNLNode_child(keyFrag) {
|
2239
2336
|
if (!map.contains(keyFrag|0)) {
|
2240
2337
|
map.insert(keyFrag|0, new CNLNode());
|
2241
2338
|
}
|
@@ -2243,11 +2340,11 @@ var LibraryGL = {
|
|
2243
2340
|
};
|
2244
2341
|
|
2245
2342
|
this.value = undefined;
|
2246
|
-
this.get = function() {
|
2343
|
+
this.get = function CNLNode_get() {
|
2247
2344
|
return this.value;
|
2248
2345
|
};
|
2249
2346
|
|
2250
|
-
this.set = function(val) {
|
2347
|
+
this.set = function CNLNode_set(val) {
|
2251
2348
|
this.value = val;
|
2252
2349
|
};
|
2253
2350
|
}
|
@@ -2255,22 +2352,22 @@ var LibraryGL = {
|
|
2255
2352
|
function CKeyView(root) {
|
2256
2353
|
var cur;
|
2257
2354
|
|
2258
|
-
this.reset = function() {
|
2355
|
+
this.reset = function CKeyView_reset() {
|
2259
2356
|
cur = root;
|
2260
2357
|
return this;
|
2261
2358
|
};
|
2262
2359
|
this.reset();
|
2263
2360
|
|
2264
|
-
this.next = function(keyFrag) {
|
2361
|
+
this.next = function CKeyView_next(keyFrag) {
|
2265
2362
|
cur = cur.child(keyFrag);
|
2266
2363
|
return this;
|
2267
2364
|
};
|
2268
2365
|
|
2269
|
-
this.get = function() {
|
2366
|
+
this.get = function CKeyView_get() {
|
2270
2367
|
return cur.get();
|
2271
2368
|
};
|
2272
2369
|
|
2273
|
-
this.set = function(val) {
|
2370
|
+
this.set = function CKeyView_set(val) {
|
2274
2371
|
cur.set(val);
|
2275
2372
|
};
|
2276
2373
|
};
|
@@ -2278,17 +2375,17 @@ var LibraryGL = {
|
|
2278
2375
|
var root;
|
2279
2376
|
var staticKeyView;
|
2280
2377
|
|
2281
|
-
this.createKeyView = function() {
|
2378
|
+
this.createKeyView = function CNLNode_createKeyView() {
|
2282
2379
|
return new CKeyView(root);
|
2283
2380
|
}
|
2284
2381
|
|
2285
|
-
this.clear = function() {
|
2382
|
+
this.clear = function CNLNode_clear() {
|
2286
2383
|
root = new CNLNode();
|
2287
2384
|
staticKeyView = this.createKeyView();
|
2288
2385
|
};
|
2289
2386
|
this.clear();
|
2290
2387
|
|
2291
|
-
this.getStaticKeyView = function() {
|
2388
|
+
this.getStaticKeyView = function CNLNode_getStaticKeyView() {
|
2292
2389
|
staticKeyView.reset();
|
2293
2390
|
return staticKeyView;
|
2294
2391
|
};
|
@@ -2522,32 +2619,85 @@ var LibraryGL = {
|
|
2522
2619
|
GL_SRC_ALPHA
|
2523
2620
|
];
|
2524
2621
|
|
2622
|
+
// Map GLenums to small values to efficiently pack the enums to bits for tighter access.
|
2623
|
+
this.traverseKey = {
|
2624
|
+
// mode
|
2625
|
+
0x1E01 /* GL_REPLACE */: 0,
|
2626
|
+
0x2100 /* GL_MODULATE */: 1,
|
2627
|
+
0x0104 /* GL_ADD */: 2,
|
2628
|
+
0x0BE2 /* GL_BLEND */: 3,
|
2629
|
+
0x2101 /* GL_DECAL */: 4,
|
2630
|
+
0x8570 /* GL_COMBINE */: 5,
|
2631
|
+
|
2632
|
+
// additional color and alpha combiners
|
2633
|
+
0x84E7 /* GL_SUBTRACT */: 3,
|
2634
|
+
0x8575 /* GL_INTERPOLATE */: 4,
|
2635
|
+
|
2636
|
+
// color and alpha src
|
2637
|
+
0x1702 /* GL_TEXTURE */: 0,
|
2638
|
+
0x8576 /* GL_CONSTANT */: 1,
|
2639
|
+
0x8577 /* GL_PRIMARY_COLOR */: 2,
|
2640
|
+
0x8578 /* GL_PREVIOUS */: 3,
|
2641
|
+
|
2642
|
+
// color and alpha op
|
2643
|
+
0x0300 /* GL_SRC_COLOR */: 0,
|
2644
|
+
0x0301 /* GL_ONE_MINUS_SRC_COLOR */: 1,
|
2645
|
+
0x0302 /* GL_SRC_ALPHA */: 2,
|
2646
|
+
0x0300 /* GL_ONE_MINUS_SRC_ALPHA */: 3
|
2647
|
+
};
|
2648
|
+
|
2649
|
+
// The tuple (key0,key1,key2) uniquely identifies the state of the variables in CTexEnv.
|
2650
|
+
// -1 on key0 denotes 'the whole cached key is dirty'
|
2651
|
+
this.key0 = -1;
|
2652
|
+
this.key1 = 0;
|
2653
|
+
this.key2 = 0;
|
2654
|
+
|
2655
|
+
this.computeKey0 = function() {
|
2656
|
+
var k = this.traverseKey;
|
2657
|
+
var key = k[this.mode] * 1638400; // 6 distinct values.
|
2658
|
+
key += k[this.colorCombiner] * 327680; // 5 distinct values.
|
2659
|
+
key += k[this.alphaCombiner] * 65536; // 5 distinct values.
|
2660
|
+
// The above three fields have 6*5*5=150 distinct values -> 8 bits.
|
2661
|
+
key += (this.colorScale-1) * 16384; // 10 bits used.
|
2662
|
+
key += (this.alphaScale-1) * 4096; // 12 bits used.
|
2663
|
+
key += k[this.colorSrc[0]] * 1024; // 14
|
2664
|
+
key += k[this.colorSrc[1]] * 256; // 16
|
2665
|
+
key += k[this.colorSrc[2]] * 64; // 18
|
2666
|
+
key += k[this.alphaSrc[0]] * 16; // 20
|
2667
|
+
key += k[this.alphaSrc[1]] * 4; // 22
|
2668
|
+
key += k[this.alphaSrc[2]]; // 24 bits used total.
|
2669
|
+
return key;
|
2670
|
+
}
|
2671
|
+
this.computeKey1 = function() {
|
2672
|
+
var k = this.traverseKey;
|
2673
|
+
key = k[this.colorOp[0]] * 4096;
|
2674
|
+
key += k[this.colorOp[1]] * 1024;
|
2675
|
+
key += k[this.colorOp[2]] * 256;
|
2676
|
+
key += k[this.alphaOp[0]] * 16;
|
2677
|
+
key += k[this.alphaOp[1]] * 4;
|
2678
|
+
key += k[this.alphaOp[2]];
|
2679
|
+
return key;
|
2680
|
+
}
|
2681
|
+
// TODO: remove this. The color should not be part of the key!
|
2682
|
+
this.computeKey2 = function() {
|
2683
|
+
return this.envColor[0] * 16777216 + this.envColor[1] * 65536 + this.envColor[2] * 256 + 1 + this.envColor[3];
|
2684
|
+
}
|
2685
|
+
this.recomputeKey = function() {
|
2686
|
+
this.key0 = this.computeKey0();
|
2687
|
+
this.key1 = this.computeKey1();
|
2688
|
+
this.key2 = this.computeKey2();
|
2689
|
+
}
|
2690
|
+
this.invalidateKey = function() {
|
2691
|
+
this.key0 = -1; // The key of this texture unit must be recomputed when rendering the next time.
|
2692
|
+
GL.immediate.currentRenderer = null; // The currently used renderer must be re-evaluated at next render.
|
2693
|
+
}
|
2525
2694
|
this.traverseState = function(keyView) {
|
2526
|
-
|
2527
|
-
|
2528
|
-
|
2529
|
-
keyView.next(this.
|
2530
|
-
keyView.next(this.
|
2531
|
-
keyView.next(this.
|
2532
|
-
keyView.next(this.envColor[1]);
|
2533
|
-
keyView.next(this.envColor[2]);
|
2534
|
-
keyView.next(this.envColor[3]);
|
2535
|
-
|
2536
|
-
keyView.next(this.colorSrc[0]);
|
2537
|
-
keyView.next(this.colorSrc[1]);
|
2538
|
-
keyView.next(this.colorSrc[2]);
|
2539
|
-
|
2540
|
-
keyView.next(this.alphaSrc[0]);
|
2541
|
-
keyView.next(this.alphaSrc[1]);
|
2542
|
-
keyView.next(this.alphaSrc[2]);
|
2543
|
-
|
2544
|
-
keyView.next(this.colorOp[0]);
|
2545
|
-
keyView.next(this.colorOp[1]);
|
2546
|
-
keyView.next(this.colorOp[2]);
|
2547
|
-
|
2548
|
-
keyView.next(this.alphaOp[0]);
|
2549
|
-
keyView.next(this.alphaOp[1]);
|
2550
|
-
keyView.next(this.alphaOp[2]);
|
2695
|
+
if (this.key0 == -1) {
|
2696
|
+
this.recomputeKey();
|
2697
|
+
}
|
2698
|
+
keyView.next(this.key0);
|
2699
|
+
keyView.next(this.key1);
|
2700
|
+
keyView.next(this.key2);
|
2551
2701
|
};
|
2552
2702
|
}
|
2553
2703
|
|
@@ -2558,7 +2708,7 @@ var LibraryGL = {
|
|
2558
2708
|
this.enabled_tex3D = false;
|
2559
2709
|
this.enabled_texCube = false;
|
2560
2710
|
|
2561
|
-
this.traverseState = function(keyView) {
|
2711
|
+
this.traverseState = function CTexUnit_traverseState(keyView) {
|
2562
2712
|
var texUnitType = this.getTexType();
|
2563
2713
|
keyView.next(texUnitType);
|
2564
2714
|
if (!texUnitType) return;
|
@@ -2567,11 +2717,11 @@ var LibraryGL = {
|
|
2567
2717
|
};
|
2568
2718
|
|
2569
2719
|
// Class impls:
|
2570
|
-
CTexUnit.prototype.enabled = function() {
|
2720
|
+
CTexUnit.prototype.enabled = function CTexUnit_enabled() {
|
2571
2721
|
return this.getTexType() != 0;
|
2572
2722
|
}
|
2573
2723
|
|
2574
|
-
CTexUnit.prototype.genPassLines = function(passOutputVar, passInputVar, texUnitID) {
|
2724
|
+
CTexUnit.prototype.genPassLines = function CTexUnit_genPassLines(passOutputVar, passInputVar, texUnitID) {
|
2575
2725
|
if (!this.enabled()) {
|
2576
2726
|
return ["vec4 " + passOutputVar + " = " + passInputVar + ";"];
|
2577
2727
|
}
|
@@ -2579,7 +2729,7 @@ var LibraryGL = {
|
|
2579
2729
|
return this.env.genPassLines(passOutputVar, passInputVar, texUnitID);
|
2580
2730
|
}
|
2581
2731
|
|
2582
|
-
CTexUnit.prototype.getTexType = function() {
|
2732
|
+
CTexUnit.prototype.getTexType = function CTexUnit_getTexType() {
|
2583
2733
|
if (this.enabled_texCube) {
|
2584
2734
|
return GL_TEXTURE_CUBE_MAP;
|
2585
2735
|
} else if (this.enabled_tex3D) {
|
@@ -2592,7 +2742,7 @@ var LibraryGL = {
|
|
2592
2742
|
return 0;
|
2593
2743
|
}
|
2594
2744
|
|
2595
|
-
CTexEnv.prototype.genPassLines = function(passOutputVar, passInputVar, texUnitID) {
|
2745
|
+
CTexEnv.prototype.genPassLines = function CTexEnv_genPassLines(passOutputVar, passInputVar, texUnitID) {
|
2596
2746
|
switch (this.mode) {
|
2597
2747
|
case GL_REPLACE: {
|
2598
2748
|
/* RGB:
|
@@ -2714,9 +2864,9 @@ var LibraryGL = {
|
|
2714
2864
|
return Abort_NoSupport("Unsupported TexEnv mode: 0x" + this.mode.toString(16));
|
2715
2865
|
}
|
2716
2866
|
|
2717
|
-
CTexEnv.prototype.genCombinerLines = function(isColor, outputVar,
|
2718
|
-
|
2719
|
-
|
2867
|
+
CTexEnv.prototype.genCombinerLines = function CTexEnv_getCombinerLines(isColor, outputVar,
|
2868
|
+
passInputVar, texUnitID,
|
2869
|
+
combiner, srcArr, opArr)
|
2720
2870
|
{
|
2721
2871
|
var argsNeeded = null;
|
2722
2872
|
switch (combiner) {
|
@@ -2832,9 +2982,9 @@ var LibraryGL = {
|
|
2832
2982
|
} else if (gl) {
|
2833
2983
|
maxTexUnits = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);
|
2834
2984
|
}
|
2835
|
-
|
2985
|
+
#if ASSERTIONS
|
2836
2986
|
assert(maxTexUnits > 0);
|
2837
|
-
|
2987
|
+
#endif
|
2838
2988
|
s_texUnits = [];
|
2839
2989
|
for (var i = 0; i < maxTexUnits; i++) {
|
2840
2990
|
s_texUnits.push(new CTexUnit());
|
@@ -2893,9 +3043,10 @@ var LibraryGL = {
|
|
2893
3043
|
},
|
2894
3044
|
|
2895
3045
|
getTexUnitType: function(texUnitID) {
|
3046
|
+
#if ASSERTIONS
|
2896
3047
|
assert(texUnitID >= 0 &&
|
2897
3048
|
texUnitID < s_texUnits.length);
|
2898
|
-
|
3049
|
+
#endif
|
2899
3050
|
return s_texUnits[texUnitID].getTexType();
|
2900
3051
|
},
|
2901
3052
|
|
@@ -2908,16 +3059,28 @@ var LibraryGL = {
|
|
2908
3059
|
var cur = getCurTexUnit();
|
2909
3060
|
switch (cap) {
|
2910
3061
|
case GL_TEXTURE_1D:
|
2911
|
-
cur.enabled_tex1D
|
3062
|
+
if (!cur.enabled_tex1D) {
|
3063
|
+
GL.immediate.currentRenderer = null; // Renderer state changed, and must be recreated or looked up again.
|
3064
|
+
cur.enabled_tex1D = true;
|
3065
|
+
}
|
2912
3066
|
break;
|
2913
3067
|
case GL_TEXTURE_2D:
|
2914
|
-
cur.enabled_tex2D
|
3068
|
+
if (!cur.enabled_tex2D) {
|
3069
|
+
GL.immediate.currentRenderer = null;
|
3070
|
+
cur.enabled_tex2D = true;
|
3071
|
+
}
|
2915
3072
|
break;
|
2916
3073
|
case GL_TEXTURE_3D:
|
2917
|
-
cur.enabled_tex3D
|
3074
|
+
if (!cur.enabled_tex3D) {
|
3075
|
+
GL.immediate.currentRenderer = null;
|
3076
|
+
cur.enabled_tex3D = true;
|
3077
|
+
}
|
2918
3078
|
break;
|
2919
3079
|
case GL_TEXTURE_CUBE_MAP:
|
2920
|
-
cur.enabled_texCube
|
3080
|
+
if (!cur.enabled_texCube) {
|
3081
|
+
GL.immediate.currentRenderer = null;
|
3082
|
+
cur.enabled_texCube = true;
|
3083
|
+
}
|
2921
3084
|
break;
|
2922
3085
|
}
|
2923
3086
|
},
|
@@ -2926,16 +3089,28 @@ var LibraryGL = {
|
|
2926
3089
|
var cur = getCurTexUnit();
|
2927
3090
|
switch (cap) {
|
2928
3091
|
case GL_TEXTURE_1D:
|
2929
|
-
cur.enabled_tex1D
|
3092
|
+
if (cur.enabled_tex1D) {
|
3093
|
+
GL.immediate.currentRenderer = null; // Renderer state changed, and must be recreated or looked up again.
|
3094
|
+
cur.enabled_tex1D = false;
|
3095
|
+
}
|
2930
3096
|
break;
|
2931
3097
|
case GL_TEXTURE_2D:
|
2932
|
-
cur.enabled_tex2D
|
3098
|
+
if (cur.enabled_tex2D) {
|
3099
|
+
GL.immediate.currentRenderer = null;
|
3100
|
+
cur.enabled_tex2D = false;
|
3101
|
+
}
|
2933
3102
|
break;
|
2934
3103
|
case GL_TEXTURE_3D:
|
2935
|
-
cur.enabled_tex3D
|
3104
|
+
if (cur.enabled_tex3D) {
|
3105
|
+
GL.immediate.currentRenderer = null;
|
3106
|
+
cur.enabled_tex3D = false;
|
3107
|
+
}
|
2936
3108
|
break;
|
2937
3109
|
case GL_TEXTURE_CUBE_MAP:
|
2938
|
-
cur.enabled_texCube
|
3110
|
+
if (cur.enabled_texCube) {
|
3111
|
+
GL.immediate.currentRenderer = null;
|
3112
|
+
cur.enabled_texCube = false;
|
3113
|
+
}
|
2939
3114
|
break;
|
2940
3115
|
}
|
2941
3116
|
},
|
@@ -2947,10 +3122,16 @@ var LibraryGL = {
|
|
2947
3122
|
var env = getCurTexUnit().env;
|
2948
3123
|
switch (pname) {
|
2949
3124
|
case GL_RGB_SCALE:
|
2950
|
-
env.colorScale
|
3125
|
+
if (env.colorScale != param) {
|
3126
|
+
env.invalidateKey(); // We changed FFP emulation renderer state.
|
3127
|
+
env.colorScale = param;
|
3128
|
+
}
|
2951
3129
|
break;
|
2952
3130
|
case GL_ALPHA_SCALE:
|
2953
|
-
env.alphaScale
|
3131
|
+
if (env.alphaScale != param) {
|
3132
|
+
env.invalidateKey();
|
3133
|
+
env.alphaScale = param;
|
3134
|
+
}
|
2954
3135
|
break;
|
2955
3136
|
|
2956
3137
|
default:
|
@@ -2965,61 +3146,112 @@ var LibraryGL = {
|
|
2965
3146
|
var env = getCurTexUnit().env;
|
2966
3147
|
switch (pname) {
|
2967
3148
|
case GL_TEXTURE_ENV_MODE:
|
2968
|
-
env.mode
|
3149
|
+
if (env.mode != param) {
|
3150
|
+
env.invalidateKey(); // We changed FFP emulation renderer state.
|
3151
|
+
env.mode = param;
|
3152
|
+
}
|
2969
3153
|
break;
|
2970
3154
|
|
2971
3155
|
case GL_COMBINE_RGB:
|
2972
|
-
env.colorCombiner
|
3156
|
+
if (env.colorCombiner != param) {
|
3157
|
+
env.invalidateKey();
|
3158
|
+
env.colorCombiner = param;
|
3159
|
+
}
|
2973
3160
|
break;
|
2974
3161
|
case GL_COMBINE_ALPHA:
|
2975
|
-
env.alphaCombiner
|
3162
|
+
if (env.alphaCombiner != param) {
|
3163
|
+
env.invalidateKey();
|
3164
|
+
env.alphaCombiner = param;
|
3165
|
+
}
|
2976
3166
|
break;
|
2977
3167
|
|
2978
3168
|
case GL_SRC0_RGB:
|
2979
|
-
env.colorSrc[0]
|
3169
|
+
if (env.colorSrc[0] != param) {
|
3170
|
+
env.invalidateKey();
|
3171
|
+
env.colorSrc[0] = param;
|
3172
|
+
}
|
2980
3173
|
break;
|
2981
3174
|
case GL_SRC1_RGB:
|
2982
|
-
env.colorSrc[1]
|
3175
|
+
if (env.colorSrc[1] != param) {
|
3176
|
+
env.invalidateKey();
|
3177
|
+
env.colorSrc[1] = param;
|
3178
|
+
}
|
2983
3179
|
break;
|
2984
3180
|
case GL_SRC2_RGB:
|
2985
|
-
env.colorSrc[2]
|
3181
|
+
if (env.colorSrc[2] != param) {
|
3182
|
+
env.invalidateKey();
|
3183
|
+
env.colorSrc[2] = param;
|
3184
|
+
}
|
2986
3185
|
break;
|
2987
3186
|
|
2988
3187
|
case GL_SRC0_ALPHA:
|
2989
|
-
env.alphaSrc[0]
|
3188
|
+
if (env.alphaSrc[0] != param) {
|
3189
|
+
env.invalidateKey();
|
3190
|
+
env.alphaSrc[0] = param;
|
3191
|
+
}
|
2990
3192
|
break;
|
2991
3193
|
case GL_SRC1_ALPHA:
|
2992
|
-
env.alphaSrc[1]
|
3194
|
+
if (env.alphaSrc[1] != param) {
|
3195
|
+
env.invalidateKey();
|
3196
|
+
env.alphaSrc[1] = param;
|
3197
|
+
}
|
2993
3198
|
break;
|
2994
3199
|
case GL_SRC2_ALPHA:
|
2995
|
-
env.alphaSrc[2]
|
3200
|
+
if (env.alphaSrc[2] != param) {
|
3201
|
+
env.invalidateKey();
|
3202
|
+
env.alphaSrc[2] = param;
|
3203
|
+
}
|
2996
3204
|
break;
|
2997
3205
|
|
2998
3206
|
case GL_OPERAND0_RGB:
|
2999
|
-
env.colorOp[0]
|
3207
|
+
if (env.colorOp[0] != param) {
|
3208
|
+
env.invalidateKey();
|
3209
|
+
env.colorOp[0] = param;
|
3210
|
+
}
|
3000
3211
|
break;
|
3001
3212
|
case GL_OPERAND1_RGB:
|
3002
|
-
env.colorOp[1]
|
3213
|
+
if (env.colorOp[1] != param) {
|
3214
|
+
env.invalidateKey();
|
3215
|
+
env.colorOp[1] = param;
|
3216
|
+
}
|
3003
3217
|
break;
|
3004
3218
|
case GL_OPERAND2_RGB:
|
3005
|
-
env.colorOp[2]
|
3219
|
+
if (env.colorOp[2] != param) {
|
3220
|
+
env.invalidateKey();
|
3221
|
+
env.colorOp[2] = param;
|
3222
|
+
}
|
3006
3223
|
break;
|
3007
3224
|
|
3008
3225
|
case GL_OPERAND0_ALPHA:
|
3009
|
-
env.alphaOp[0]
|
3226
|
+
if (env.alphaOp[0] != param) {
|
3227
|
+
env.invalidateKey();
|
3228
|
+
env.alphaOp[0] = param;
|
3229
|
+
}
|
3010
3230
|
break;
|
3011
3231
|
case GL_OPERAND1_ALPHA:
|
3012
|
-
env.alphaOp[1]
|
3232
|
+
if (env.alphaOp[1] != param) {
|
3233
|
+
env.invalidateKey();
|
3234
|
+
env.alphaOp[1] = param;
|
3235
|
+
}
|
3013
3236
|
break;
|
3014
3237
|
case GL_OPERAND2_ALPHA:
|
3015
|
-
env.alphaOp[2]
|
3238
|
+
if (env.alphaOp[2] != param) {
|
3239
|
+
env.invalidateKey();
|
3240
|
+
env.alphaOp[2] = param;
|
3241
|
+
}
|
3016
3242
|
break;
|
3017
3243
|
|
3018
3244
|
case GL_RGB_SCALE:
|
3019
|
-
env.colorScale
|
3245
|
+
if (env.colorScale != param) {
|
3246
|
+
env.invalidateKey();
|
3247
|
+
env.colorScale = param;
|
3248
|
+
}
|
3020
3249
|
break;
|
3021
3250
|
case GL_ALPHA_SCALE:
|
3022
|
-
env.alphaScale
|
3251
|
+
if (env.alphaScale != param) {
|
3252
|
+
env.invalidateKey();
|
3253
|
+
env.alphaScale = param;
|
3254
|
+
}
|
3023
3255
|
break;
|
3024
3256
|
|
3025
3257
|
default:
|
@@ -3035,7 +3267,10 @@ var LibraryGL = {
|
|
3035
3267
|
case GL_TEXTURE_ENV_COLOR: {
|
3036
3268
|
for (var i = 0; i < 4; i++) {
|
3037
3269
|
var param = {{{ makeGetValue('params', 'i*4', 'float') }}};
|
3038
|
-
env.envColor[i]
|
3270
|
+
if (env.envColor[i] != param) {
|
3271
|
+
env.invalidateKey(); // We changed FFP emulation renderer state.
|
3272
|
+
env.envColor[i] = param;
|
3273
|
+
}
|
3039
3274
|
}
|
3040
3275
|
break
|
3041
3276
|
}
|
@@ -3075,26 +3310,21 @@ var LibraryGL = {
|
|
3075
3310
|
NORMAL: 1,
|
3076
3311
|
COLOR: 2,
|
3077
3312
|
TEXTURE0: 3,
|
3078
|
-
|
3079
|
-
|
3080
|
-
TEXTURE3: 6,
|
3081
|
-
TEXTURE4: 7,
|
3082
|
-
TEXTURE5: 8,
|
3083
|
-
TEXTURE6: 9,
|
3084
|
-
NUM_ATTRIBUTES: 10, // Overwritten in init().
|
3085
|
-
MAX_TEXTURES: 7, // Overwritten in init().
|
3313
|
+
NUM_ATTRIBUTES: -1, // Initialized in GL emulation init().
|
3314
|
+
MAX_TEXTURES: -1, // Initialized in GL emulation init().
|
3086
3315
|
|
3087
3316
|
totalEnabledClientAttributes: 0,
|
3088
3317
|
enabledClientAttributes: [0, 0],
|
3089
3318
|
clientAttributes: [], // raw data, including possible unneeded ones
|
3090
3319
|
liveClientAttributes: [], // the ones actually alive in the current computation, sorted
|
3320
|
+
currentRenderer: null, // Caches the currently active FFP emulation renderer, so that it does not have to be re-looked up unless relevant state changes.
|
3091
3321
|
modifiedClientAttributes: false,
|
3092
3322
|
clientActiveTexture: 0,
|
3093
3323
|
clientColor: null,
|
3094
3324
|
usedTexUnitList: [],
|
3095
3325
|
fixedFunctionProgram: null,
|
3096
3326
|
|
3097
|
-
setClientAttribute: function(name, size, type, stride, pointer) {
|
3327
|
+
setClientAttribute: function setClientAttribute(name, size, type, stride, pointer) {
|
3098
3328
|
var attrib = this.clientAttributes[name];
|
3099
3329
|
if (!attrib) {
|
3100
3330
|
for (var i = 0; i <= name; i++) { // keep flat
|
@@ -3121,7 +3351,7 @@ var LibraryGL = {
|
|
3121
3351
|
},
|
3122
3352
|
|
3123
3353
|
// Renderers
|
3124
|
-
addRendererComponent: function(name, size, type) {
|
3354
|
+
addRendererComponent: function addRendererComponent(name, size, type) {
|
3125
3355
|
if (!this.rendererComponents[name]) {
|
3126
3356
|
this.rendererComponents[name] = 1;
|
3127
3357
|
#if ASSERTIONS
|
@@ -3137,13 +3367,18 @@ var LibraryGL = {
|
|
3137
3367
|
}
|
3138
3368
|
},
|
3139
3369
|
|
3140
|
-
disableBeginEndClientAttributes: function() {
|
3370
|
+
disableBeginEndClientAttributes: function disableBeginEndClientAttributes() {
|
3141
3371
|
for (var i = 0; i < this.NUM_ATTRIBUTES; i++) {
|
3142
3372
|
if (this.rendererComponents[i]) this.enabledClientAttributes[i] = false;
|
3143
3373
|
}
|
3144
3374
|
},
|
3145
3375
|
|
3146
|
-
getRenderer: function() {
|
3376
|
+
getRenderer: function getRenderer() {
|
3377
|
+
// If no FFP state has changed that would have forced to re-evaluate which FFP emulation shader to use,
|
3378
|
+
// we have the currently used renderer in cache, and can immediately return that.
|
3379
|
+
if (this.currentRenderer) {
|
3380
|
+
return this.currentRenderer;
|
3381
|
+
}
|
3147
3382
|
// return a renderer object given the liveClientAttributes
|
3148
3383
|
// we maintain a cache of renderers, optimized to not generate garbage
|
3149
3384
|
var attributes = GL.immediate.liveClientAttributes;
|
@@ -3152,10 +3387,11 @@ var LibraryGL = {
|
|
3152
3387
|
var keyView = cacheMap.getStaticKeyView().reset();
|
3153
3388
|
|
3154
3389
|
// By attrib state:
|
3390
|
+
var enabledAttributesKey = 0;
|
3155
3391
|
for (var i = 0; i < attributes.length; i++) {
|
3156
|
-
|
3157
|
-
keyView.next(attribute.name).next(attribute.size).next(attribute.type);
|
3392
|
+
enabledAttributesKey |= 1 << attributes[i].name;
|
3158
3393
|
}
|
3394
|
+
keyView.next(enabledAttributesKey);
|
3159
3395
|
|
3160
3396
|
// By fog state:
|
3161
3397
|
var fogParam = 0;
|
@@ -3181,45 +3417,41 @@ var LibraryGL = {
|
|
3181
3417
|
}
|
3182
3418
|
|
3183
3419
|
// If we don't already have it, create it.
|
3184
|
-
|
3420
|
+
var renderer = keyView.get();
|
3421
|
+
if (!renderer) {
|
3185
3422
|
#if GL_DEBUG
|
3186
3423
|
Module.printErr('generating renderer for ' + JSON.stringify(attributes));
|
3187
3424
|
#endif
|
3188
|
-
|
3425
|
+
renderer = this.createRenderer();
|
3426
|
+
this.currentRenderer = renderer;
|
3427
|
+
keyView.set(renderer);
|
3428
|
+
return renderer;
|
3189
3429
|
}
|
3190
|
-
|
3430
|
+
this.currentRenderer = renderer; // Cache the currently used renderer, so later lookups without state changes can get this fast.
|
3431
|
+
return renderer;
|
3191
3432
|
},
|
3192
3433
|
|
3193
|
-
createRenderer: function(renderer) {
|
3434
|
+
createRenderer: function createRenderer(renderer) {
|
3194
3435
|
var useCurrProgram = !!GL.currProgram;
|
3195
|
-
var hasTextures = false
|
3436
|
+
var hasTextures = false;
|
3196
3437
|
for (var i = 0; i < GL.immediate.MAX_TEXTURES; i++) {
|
3197
3438
|
var texAttribName = GL.immediate.TEXTURE0 + i;
|
3198
3439
|
if (!GL.immediate.enabledClientAttributes[texAttribName])
|
3199
3440
|
continue;
|
3200
3441
|
|
3442
|
+
#if ASSERTIONS
|
3201
3443
|
if (!useCurrProgram) {
|
3202
|
-
|
3444
|
+
if (GL.immediate.TexEnvJIT.getTexUnitType(i) == 0) {
|
3445
|
+
Runtime.warnOnce("GL_TEXTURE" + i + " coords are supplied, but that texture unit is disabled in the fixed-function pipeline.");
|
3446
|
+
}
|
3203
3447
|
}
|
3448
|
+
#endif
|
3204
3449
|
|
3205
|
-
textureSizes[i] = GL.immediate.clientAttributes[texAttribName].size;
|
3206
|
-
textureTypes[i] = GL.immediate.clientAttributes[texAttribName].type;
|
3207
3450
|
hasTextures = true;
|
3208
3451
|
}
|
3209
|
-
|
3210
|
-
var positionType = GL.immediate.clientAttributes[GL.immediate.VERTEX].type;
|
3211
|
-
var colorSize = 0, colorType;
|
3212
|
-
if (GL.immediate.enabledClientAttributes[GL.immediate.COLOR]) {
|
3213
|
-
colorSize = GL.immediate.clientAttributes[GL.immediate.COLOR].size;
|
3214
|
-
colorType = GL.immediate.clientAttributes[GL.immediate.COLOR].type;
|
3215
|
-
}
|
3216
|
-
var normalSize = 0, normalType;
|
3217
|
-
if (GL.immediate.enabledClientAttributes[GL.immediate.NORMAL]) {
|
3218
|
-
normalSize = GL.immediate.clientAttributes[GL.immediate.NORMAL].size;
|
3219
|
-
normalType = GL.immediate.clientAttributes[GL.immediate.NORMAL].type;
|
3220
|
-
}
|
3452
|
+
|
3221
3453
|
var ret = {
|
3222
|
-
init: function() {
|
3454
|
+
init: function init() {
|
3223
3455
|
// For fixed-function shader generation.
|
3224
3456
|
var uTexUnitPrefix = 'u_texUnit';
|
3225
3457
|
var aTexCoordPrefix = 'a_texCoord';
|
@@ -3352,10 +3584,25 @@ var LibraryGL = {
|
|
3352
3584
|
this.program = Module.ctx.createProgram();
|
3353
3585
|
Module.ctx.attachShader(this.program, this.vertexShader);
|
3354
3586
|
Module.ctx.attachShader(this.program, this.fragmentShader);
|
3355
|
-
|
3587
|
+
|
3588
|
+
// As optimization, bind all attributes to prespecified locations, so that the FFP emulation
|
3589
|
+
// code can submit attributes to any generated FFP shader without having to examine each shader in turn.
|
3590
|
+
// These prespecified locations are only assumed if GL_FFP_ONLY is specified, since user could also create their
|
3591
|
+
// own shaders that didn't have attributes in the same locations.
|
3592
|
+
Module.ctx.bindAttribLocation(this.program, GL.immediate.VERTEX, 'a_position');
|
3593
|
+
Module.ctx.bindAttribLocation(this.program, GL.immediate.COLOR, 'a_color');
|
3594
|
+
Module.ctx.bindAttribLocation(this.program, GL.immediate.NORMAL, 'a_normal');
|
3595
|
+
for (var i = 0; i < GL.immediate.MAX_TEXTURES; i++) {
|
3596
|
+
Module.ctx.bindAttribLocation(this.program, GL.immediate.TEXTURE0 + i, 'a_texCoord'+i);
|
3597
|
+
Module.ctx.bindAttribLocation(this.program, GL.immediate.TEXTURE0 + i, aTexCoordPrefix+i);
|
3598
|
+
}
|
3356
3599
|
Module.ctx.linkProgram(this.program);
|
3357
3600
|
}
|
3358
3601
|
|
3602
|
+
// Stores a map that remembers which matrix uniforms are up-to-date in this FFP renderer, so they don't need to be resubmitted
|
3603
|
+
// each time we render with this program.
|
3604
|
+
this.textureMatrixVersion = {};
|
3605
|
+
|
3359
3606
|
this.positionLocation = Module.ctx.getAttribLocation(this.program, 'a_position');
|
3360
3607
|
|
3361
3608
|
this.texCoordLocations = [];
|
@@ -3398,7 +3645,9 @@ var LibraryGL = {
|
|
3398
3645
|
this.projectionLocation = Module.ctx.getUniformLocation(this.program, 'u_projection');
|
3399
3646
|
|
3400
3647
|
this.hasTextures = hasTextures;
|
3401
|
-
this.hasNormal =
|
3648
|
+
this.hasNormal = GL.immediate.enabledClientAttributes[GL.immediate.NORMAL] &&
|
3649
|
+
GL.immediate.clientAttributes[GL.immediate.NORMAL].size > 0 &&
|
3650
|
+
this.normalLocation >= 0;
|
3402
3651
|
this.hasColor = (this.colorLocation === 0) || this.colorLocation > 0;
|
3403
3652
|
|
3404
3653
|
this.floatType = Module.ctx.FLOAT; // minor optimization
|
@@ -3411,23 +3660,25 @@ var LibraryGL = {
|
|
3411
3660
|
this.fogScaleLocation || this.fogDensityLocation);
|
3412
3661
|
},
|
3413
3662
|
|
3414
|
-
prepare: function() {
|
3663
|
+
prepare: function prepare() {
|
3415
3664
|
// Calculate the array buffer
|
3416
3665
|
var arrayBuffer;
|
3417
3666
|
if (!GL.currArrayBuffer) {
|
3418
3667
|
var start = GL.immediate.firstVertex*GL.immediate.stride;
|
3419
3668
|
var end = GL.immediate.lastVertex*GL.immediate.stride;
|
3669
|
+
#if ASSERTIONS
|
3420
3670
|
assert(end <= GL.MAX_TEMP_BUFFER_SIZE, 'too much vertex data');
|
3671
|
+
#endif
|
3421
3672
|
arrayBuffer = GL.tempVertexBuffers[GL.tempBufferIndexLookup[end]];
|
3422
3673
|
// TODO: consider using the last buffer we bound, if it was larger. downside is larger buffer, but we might avoid rebinding and preparing
|
3423
3674
|
} else {
|
3424
3675
|
arrayBuffer = GL.currArrayBuffer;
|
3425
3676
|
}
|
3426
3677
|
|
3678
|
+
#if GL_UNSAFE_OPTS
|
3427
3679
|
// If the array buffer is unchanged and the renderer as well, then we can avoid all the work here
|
3428
3680
|
// XXX We use some heuristics here, and this may not work in all cases. Try disabling GL_UNSAFE_OPTS if you
|
3429
3681
|
// have odd glitches
|
3430
|
-
#if GL_UNSAFE_OPTS
|
3431
3682
|
var lastRenderer = GL.immediate.lastRenderer;
|
3432
3683
|
var canSkip = this == lastRenderer &&
|
3433
3684
|
arrayBuffer == GL.immediate.lastArrayBuffer &&
|
@@ -3462,62 +3713,105 @@ var LibraryGL = {
|
|
3462
3713
|
GL.immediate.fixedFunctionProgram = this.program;
|
3463
3714
|
}
|
3464
3715
|
|
3465
|
-
if (this.modelViewLocation
|
3466
|
-
|
3716
|
+
if (this.modelViewLocation && this.modelViewMatrixVersion != GL.immediate.matrixVersion['m']) {
|
3717
|
+
this.modelViewMatrixVersion = GL.immediate.matrixVersion['m'];
|
3718
|
+
Module.ctx.uniformMatrix4fv(this.modelViewLocation, false, GL.immediate.matrix['m']);
|
3719
|
+
}
|
3720
|
+
if (this.projectionLocation && this.projectionMatrixVersion != GL.immediate.matrixVersion['p']) {
|
3721
|
+
this.projectionMatrixVersion = GL.immediate.matrixVersion['p'];
|
3722
|
+
Module.ctx.uniformMatrix4fv(this.projectionLocation, false, GL.immediate.matrix['p']);
|
3723
|
+
}
|
3467
3724
|
|
3468
3725
|
var clientAttributes = GL.immediate.clientAttributes;
|
3726
|
+
var posAttr = clientAttributes[GL.immediate.VERTEX];
|
3469
3727
|
|
3470
3728
|
#if GL_ASSERTIONS
|
3471
|
-
GL.validateVertexAttribPointer(
|
3729
|
+
GL.validateVertexAttribPointer(posAttr.size, posAttr.type, GL.immediate.stride, clientAttributes[GL.immediate.VERTEX].offset);
|
3472
3730
|
#endif
|
3473
|
-
|
3474
|
-
|
3731
|
+
|
3732
|
+
#if GL_FFP_ONLY
|
3733
|
+
if (!GL.currArrayBuffer) {
|
3734
|
+
Module.ctx.vertexAttribPointer(GL.immediate.VERTEX, posAttr.size, posAttr.type, false, GL.immediate.stride, posAttr.offset);
|
3735
|
+
GL.enableVertexAttribArray(GL.immediate.VERTEX);
|
3736
|
+
if (this.hasNormal) {
|
3737
|
+
var normalAttr = clientAttributes[GL.immediate.NORMAL];
|
3738
|
+
Module.ctx.vertexAttribPointer(GL.immediate.NORMAL, normalAttr.size, normalAttr.type, true, GL.immediate.stride, normalAttr.offset);
|
3739
|
+
GL.enableVertexAttribArray(GL.immediate.NORMAL);
|
3740
|
+
}
|
3741
|
+
}
|
3742
|
+
#else
|
3743
|
+
Module.ctx.vertexAttribPointer(this.positionLocation, posAttr.size, posAttr.type, false, GL.immediate.stride, posAttr.offset);
|
3475
3744
|
Module.ctx.enableVertexAttribArray(this.positionLocation);
|
3745
|
+
if (this.hasNormal) {
|
3746
|
+
var normalAttr = clientAttributes[GL.immediate.NORMAL];
|
3747
|
+
#if GL_ASSERTIONS
|
3748
|
+
GL.validateVertexAttribPointer(normalAttr.size, normalAttr.type, GL.immediate.stride, normalAttr.offset);
|
3749
|
+
#endif
|
3750
|
+
Module.ctx.vertexAttribPointer(this.normalLocation, normalAttr.size, normalAttr.type, true, GL.immediate.stride, normalAttr.offset);
|
3751
|
+
Module.ctx.enableVertexAttribArray(this.normalLocation);
|
3752
|
+
}
|
3753
|
+
#endif
|
3476
3754
|
if (this.hasTextures) {
|
3477
|
-
//for (var i = 0; i < this.usedTexUnitList.length; i++) {
|
3478
|
-
// var texUnitID = this.usedTexUnitList[i];
|
3479
3755
|
for (var i = 0; i < GL.immediate.MAX_TEXTURES; i++) {
|
3480
|
-
|
3481
|
-
|
3756
|
+
#if GL_FFP_ONLY
|
3757
|
+
if (!GL.currArrayBuffer) {
|
3758
|
+
var attribLoc = GL.immediate.TEXTURE0+i;
|
3759
|
+
var texAttr = clientAttributes[attribLoc];
|
3760
|
+
if (texAttr.size) {
|
3761
|
+
Module.ctx.vertexAttribPointer(attribLoc, texAttr.size, texAttr.type, false, GL.immediate.stride, texAttr.offset);
|
3762
|
+
GL.enableVertexAttribArray(attribLoc);
|
3763
|
+
} else {
|
3764
|
+
// These two might be dangerous, but let's try them.
|
3765
|
+
Module.ctx.vertexAttrib4f(attribLoc, 0, 0, 0, 1);
|
3766
|
+
GL.disableVertexAttribArray(attribLoc);
|
3767
|
+
}
|
3768
|
+
}
|
3769
|
+
#else
|
3770
|
+
var attribLoc = this.texCoordLocations[i];
|
3482
3771
|
if (attribLoc === undefined || attribLoc < 0) continue;
|
3772
|
+
var texAttr = clientAttributes[GL.immediate.TEXTURE0+i];
|
3483
3773
|
|
3484
|
-
if (
|
3774
|
+
if (texAttr.size) {
|
3485
3775
|
#if GL_ASSERTIONS
|
3486
|
-
GL.validateVertexAttribPointer(
|
3776
|
+
GL.validateVertexAttribPointer(texAttr.size, texAttr.type, GL.immediate.stride, texAttr.offset);
|
3487
3777
|
#endif
|
3488
|
-
Module.ctx.vertexAttribPointer(attribLoc,
|
3489
|
-
GL.immediate.stride, GL.immediate.clientAttributes[GL.immediate.TEXTURE0 + texUnitID].offset);
|
3778
|
+
Module.ctx.vertexAttribPointer(attribLoc, texAttr.size, texAttr.type, false, GL.immediate.stride, texAttr.offset);
|
3490
3779
|
Module.ctx.enableVertexAttribArray(attribLoc);
|
3491
3780
|
} else {
|
3492
3781
|
// These two might be dangerous, but let's try them.
|
3493
3782
|
Module.ctx.vertexAttrib4f(attribLoc, 0, 0, 0, 1);
|
3494
3783
|
Module.ctx.disableVertexAttribArray(attribLoc);
|
3495
3784
|
}
|
3496
|
-
|
3497
|
-
|
3498
|
-
if (this.textureMatrixLocations[i]) { // XXX might we need this even without the condition we are currently in?
|
3499
|
-
|
3785
|
+
#endif
|
3786
|
+
var t = 't'+i;
|
3787
|
+
if (this.textureMatrixLocations[i] && this.textureMatrixVersion[t] != GL.immediate.matrixVersion[t]) { // XXX might we need this even without the condition we are currently in?
|
3788
|
+
this.textureMatrixVersion[t] = GL.immediate.matrixVersion[t];
|
3789
|
+
Module.ctx.uniformMatrix4fv(this.textureMatrixLocations[i], false, GL.immediate.matrix[t]);
|
3500
3790
|
}
|
3501
3791
|
}
|
3502
3792
|
}
|
3503
|
-
if (
|
3793
|
+
if (GL.immediate.enabledClientAttributes[GL.immediate.COLOR]) {
|
3794
|
+
var colorAttr = clientAttributes[GL.immediate.COLOR];
|
3504
3795
|
#if GL_ASSERTIONS
|
3505
|
-
GL.validateVertexAttribPointer(
|
3796
|
+
GL.validateVertexAttribPointer(colorAttr.size, colorAttr.type, GL.immediate.stride, colorAttr.offset);
|
3506
3797
|
#endif
|
3507
|
-
|
3508
|
-
|
3798
|
+
#if GL_FFP_ONLY
|
3799
|
+
if (!GL.currArrayBuffer) {
|
3800
|
+
Module.ctx.vertexAttribPointer(GL.immediate.COLOR, colorAttr.size, colorAttr.type, true, GL.immediate.stride, colorAttr.offset);
|
3801
|
+
GL.enableVertexAttribArray(GL.immediate.COLOR);
|
3802
|
+
}
|
3803
|
+
#else
|
3804
|
+
Module.ctx.vertexAttribPointer(this.colorLocation, colorAttr.size, colorAttr.type, true, GL.immediate.stride, colorAttr.offset);
|
3509
3805
|
Module.ctx.enableVertexAttribArray(this.colorLocation);
|
3806
|
+
#endif
|
3510
3807
|
} else if (this.hasColor) {
|
3808
|
+
#if GL_FFP_ONLY
|
3809
|
+
GL.disableVertexAttribArray(GL.immediate.COLOR);
|
3810
|
+
Module.ctx.vertexAttrib4fv(GL.immediate.COLOR, GL.immediate.clientColor);
|
3811
|
+
#else
|
3511
3812
|
Module.ctx.disableVertexAttribArray(this.colorLocation);
|
3512
3813
|
Module.ctx.vertexAttrib4fv(this.colorLocation, GL.immediate.clientColor);
|
3513
|
-
}
|
3514
|
-
if (this.hasNormal) {
|
3515
|
-
#if GL_ASSERTIONS
|
3516
|
-
GL.validateVertexAttribPointer(normalSize, normalType, GL.immediate.stride, clientAttributes[GL.immediate.NORMAL].offset);
|
3517
3814
|
#endif
|
3518
|
-
Module.ctx.vertexAttribPointer(this.normalLocation, normalSize, normalType, true,
|
3519
|
-
GL.immediate.stride, clientAttributes[GL.immediate.NORMAL].offset);
|
3520
|
-
Module.ctx.enableVertexAttribArray(this.normalLocation);
|
3521
3815
|
}
|
3522
3816
|
if (this.hasFog) {
|
3523
3817
|
if (this.fogColorLocation) Module.ctx.uniform4fv(this.fogColorLocation, GLEmulation.fogColor);
|
@@ -3527,11 +3821,12 @@ var LibraryGL = {
|
|
3527
3821
|
}
|
3528
3822
|
},
|
3529
3823
|
|
3530
|
-
cleanup: function() {
|
3824
|
+
cleanup: function cleanup() {
|
3825
|
+
#if !GL_FFP_ONLY
|
3531
3826
|
Module.ctx.disableVertexAttribArray(this.positionLocation);
|
3532
3827
|
if (this.hasTextures) {
|
3533
|
-
for (var i = 0; i <
|
3534
|
-
if (
|
3828
|
+
for (var i = 0; i < GL.immediate.MAX_TEXTURES; i++) {
|
3829
|
+
if (GL.immediate.enabledClientAttributes[GL.immediate.TEXTURE0+i] && this.texCoordLocations[i] >= 0) {
|
3535
3830
|
Module.ctx.disableVertexAttribArray(this.texCoordLocations[i]);
|
3536
3831
|
}
|
3537
3832
|
}
|
@@ -3555,6 +3850,7 @@ var LibraryGL = {
|
|
3555
3850
|
GL.immediate.lastProgram = null;
|
3556
3851
|
#endif
|
3557
3852
|
GL.immediate.matricesModified = true;
|
3853
|
+
#endif
|
3558
3854
|
}
|
3559
3855
|
};
|
3560
3856
|
ret.init();
|
@@ -3565,7 +3861,7 @@ var LibraryGL = {
|
|
3565
3861
|
// Replace some functions with immediate-mode aware versions. If there are no client
|
3566
3862
|
// attributes enabled, and we use webgl-friendly modes (no GL_QUADS), then no need
|
3567
3863
|
// for emulation
|
3568
|
-
_glDrawArrays = function(mode, first, count) {
|
3864
|
+
_glDrawArrays = function _glDrawArrays(mode, first, count) {
|
3569
3865
|
if (GL.immediate.totalEnabledClientAttributes == 0 && mode <= 6) {
|
3570
3866
|
Module.ctx.drawArrays(mode, first, count);
|
3571
3867
|
return;
|
@@ -3581,15 +3877,15 @@ var LibraryGL = {
|
|
3581
3877
|
GL.immediate.mode = -1;
|
3582
3878
|
};
|
3583
3879
|
|
3584
|
-
_glDrawElements = function(mode, count, type, indices, start, end) { // start, end are given if we come from glDrawRangeElements
|
3880
|
+
_glDrawElements = function _glDrawElements(mode, count, type, indices, start, end) { // start, end are given if we come from glDrawRangeElements
|
3585
3881
|
if (GL.immediate.totalEnabledClientAttributes == 0 && mode <= 6 && GL.currElementArrayBuffer) {
|
3586
3882
|
Module.ctx.drawElements(mode, count, type, indices);
|
3587
3883
|
return;
|
3588
3884
|
}
|
3885
|
+
#if ASSERTIONS
|
3589
3886
|
if (!GL.currElementArrayBuffer) {
|
3590
3887
|
assert(type == Module.ctx.UNSIGNED_SHORT); // We can only emulate buffers of this kind, for now
|
3591
3888
|
}
|
3592
|
-
#if ASSERTIONS
|
3593
3889
|
console.log("DrawElements doesn't actually prepareClientAttributes properly.");
|
3594
3890
|
#endif
|
3595
3891
|
GL.immediate.prepareClientAttributes(count, false);
|
@@ -3621,43 +3917,43 @@ var LibraryGL = {
|
|
3621
3917
|
}
|
3622
3918
|
|
3623
3919
|
var glActiveTexture = _glActiveTexture;
|
3624
|
-
_glActiveTexture = function(texture) {
|
3920
|
+
_glActiveTexture = function _glActiveTexture(texture) {
|
3625
3921
|
GL.immediate.TexEnvJIT.hook_activeTexture(texture);
|
3626
3922
|
glActiveTexture(texture);
|
3627
3923
|
};
|
3628
3924
|
|
3629
3925
|
var glEnable = _glEnable;
|
3630
|
-
_glEnable = function(cap) {
|
3926
|
+
_glEnable = function _glEnable(cap) {
|
3631
3927
|
GL.immediate.TexEnvJIT.hook_enable(cap);
|
3632
3928
|
glEnable(cap);
|
3633
3929
|
};
|
3634
3930
|
var glDisable = _glDisable;
|
3635
|
-
_glDisable = function(cap) {
|
3931
|
+
_glDisable = function _glDisable(cap) {
|
3636
3932
|
GL.immediate.TexEnvJIT.hook_disable(cap);
|
3637
3933
|
glDisable(cap);
|
3638
3934
|
};
|
3639
3935
|
|
3640
3936
|
var glTexEnvf = (typeof(_glTexEnvf) != 'undefined') ? _glTexEnvf : function(){};
|
3641
|
-
_glTexEnvf = function(target, pname, param) {
|
3937
|
+
_glTexEnvf = function _glTexEnvf(target, pname, param) {
|
3642
3938
|
GL.immediate.TexEnvJIT.hook_texEnvf(target, pname, param);
|
3643
3939
|
// Don't call old func, since we are the implementor.
|
3644
3940
|
//glTexEnvf(target, pname, param);
|
3645
3941
|
};
|
3646
3942
|
var glTexEnvi = (typeof(_glTexEnvi) != 'undefined') ? _glTexEnvi : function(){};
|
3647
|
-
_glTexEnvi = function(target, pname, param) {
|
3943
|
+
_glTexEnvi = function _glTexEnvi(target, pname, param) {
|
3648
3944
|
GL.immediate.TexEnvJIT.hook_texEnvi(target, pname, param);
|
3649
3945
|
// Don't call old func, since we are the implementor.
|
3650
3946
|
//glTexEnvi(target, pname, param);
|
3651
3947
|
};
|
3652
3948
|
var glTexEnvfv = (typeof(_glTexEnvfv) != 'undefined') ? _glTexEnvfv : function(){};
|
3653
|
-
_glTexEnvfv = function(target, pname, param) {
|
3949
|
+
_glTexEnvfv = function _glTexEnvfv(target, pname, param) {
|
3654
3950
|
GL.immediate.TexEnvJIT.hook_texEnvfv(target, pname, param);
|
3655
3951
|
// Don't call old func, since we are the implementor.
|
3656
3952
|
//glTexEnvfv(target, pname, param);
|
3657
3953
|
};
|
3658
3954
|
|
3659
3955
|
var glGetIntegerv = _glGetIntegerv;
|
3660
|
-
_glGetIntegerv = function(pname, params) {
|
3956
|
+
_glGetIntegerv = function _glGetIntegerv(pname, params) {
|
3661
3957
|
switch (pname) {
|
3662
3958
|
case 0x8B8D: { // GL_CURRENT_PROGRAM
|
3663
3959
|
// Just query directly so we're working with WebGL objects.
|
@@ -3684,11 +3980,15 @@ var LibraryGL = {
|
|
3684
3980
|
|
3685
3981
|
this.TexEnvJIT.init(Module.ctx);
|
3686
3982
|
|
3687
|
-
|
3688
|
-
|
3983
|
+
// User can override the maximum number of texture units that we emulate. Using fewer texture units increases runtime performance
|
3984
|
+
// slightly, so it is advantageous to choose as small value as needed.
|
3985
|
+
GL.immediate.MAX_TEXTURES = Module['GL_MAX_TEXTURE_IMAGE_UNITS'] || Module.ctx.getParameter(Module.ctx.MAX_TEXTURE_IMAGE_UNITS);
|
3986
|
+
GL.immediate.NUM_ATTRIBUTES = 3 /*pos+normal+color attributes*/ + GL.immediate.MAX_TEXTURES;
|
3689
3987
|
GL.immediate.clientAttributes = [];
|
3988
|
+
GLEmulation.enabledClientAttribIndices = [];
|
3690
3989
|
for (var i = 0; i < GL.immediate.NUM_ATTRIBUTES; i++) {
|
3691
3990
|
GL.immediate.clientAttributes.push({});
|
3991
|
+
GLEmulation.enabledClientAttribIndices.push(false);
|
3692
3992
|
}
|
3693
3993
|
|
3694
3994
|
this.matrixStack['m'] = [];
|
@@ -3698,13 +3998,18 @@ var LibraryGL = {
|
|
3698
3998
|
}
|
3699
3999
|
|
3700
4000
|
// Initialize matrix library
|
3701
|
-
|
4001
|
+
// When user sets a matrix, increment a 'version number' on the new data, and when rendering, submit
|
4002
|
+
// the matrices to the shader program only if they have an old version of the data.
|
4003
|
+
GL.immediate.matrixVersion = {};
|
3702
4004
|
GL.immediate.matrix['m'] = GL.immediate.matrix.lib.mat4.create();
|
4005
|
+
GL.immediate.matrixVersion['m'] = 0;
|
3703
4006
|
GL.immediate.matrix.lib.mat4.identity(GL.immediate.matrix['m']);
|
3704
4007
|
GL.immediate.matrix['p'] = GL.immediate.matrix.lib.mat4.create();
|
4008
|
+
GL.immediate.matrixVersion['p'] = 0;
|
3705
4009
|
GL.immediate.matrix.lib.mat4.identity(GL.immediate.matrix['p']);
|
3706
4010
|
for (var i = 0; i < GL.immediate.MAX_TEXTURES; i++) {
|
3707
4011
|
GL.immediate.matrix['t' + i] = GL.immediate.matrix.lib.mat4.create();
|
4012
|
+
GL.immediate.matrixVersion['t' + i] = 0;
|
3708
4013
|
}
|
3709
4014
|
|
3710
4015
|
// Renderer cache
|
@@ -3725,7 +4030,7 @@ var LibraryGL = {
|
|
3725
4030
|
// Modifies liveClientAttributes, stride, vertexPointer, vertexCounter
|
3726
4031
|
// count: number of elements we will draw
|
3727
4032
|
// beginEnd: whether we are drawing the results of a begin/end block
|
3728
|
-
prepareClientAttributes: function(count, beginEnd) {
|
4033
|
+
prepareClientAttributes: function prepareClientAttributes(count, beginEnd) {
|
3729
4034
|
// If no client attributes were modified since we were last called, do nothing. Note that this
|
3730
4035
|
// does not work for glBegin/End, where we generate renderer components dynamically and then
|
3731
4036
|
// disable them ourselves, but it does help with glDrawElements/Arrays.
|
@@ -3797,13 +4102,17 @@ var LibraryGL = {
|
|
3797
4102
|
if (!attribute) break;
|
3798
4103
|
attribute.offset = attribute.pointer - start;
|
3799
4104
|
if (attribute.offset > bytes) { // ensure we start where we should
|
4105
|
+
#if ASSERTIONS
|
3800
4106
|
assert((attribute.offset - bytes)%4 == 0); // XXX assuming 4-alignment
|
4107
|
+
#endif
|
3801
4108
|
bytes += attribute.offset - bytes;
|
3802
4109
|
}
|
3803
4110
|
bytes += attribute.size * GL.byteSizeByType[attribute.type - GL.byteSizeByTypeRoot];
|
3804
4111
|
if (bytes % 4 != 0) bytes += 4 - (bytes % 4); // XXX assuming 4-alignment
|
3805
4112
|
}
|
4113
|
+
#if ASSERTIONS
|
3806
4114
|
assert(beginEnd || bytes <= stride); // if not begin-end, explicit stride should make sense with total byte size
|
4115
|
+
#endif
|
3807
4116
|
if (bytes < stride) { // ensure the size is that of the stride
|
3808
4117
|
bytes = stride;
|
3809
4118
|
}
|
@@ -3819,7 +4128,7 @@ var LibraryGL = {
|
|
3819
4128
|
}
|
3820
4129
|
},
|
3821
4130
|
|
3822
|
-
flush: function(numProvidedIndexes, startIndex, ptr) {
|
4131
|
+
flush: function flush(numProvidedIndexes, startIndex, ptr) {
|
3823
4132
|
#if ASSERTIONS
|
3824
4133
|
assert(numProvidedIndexes >= 0 || !numProvidedIndexes);
|
3825
4134
|
#endif
|
@@ -3830,18 +4139,21 @@ var LibraryGL = {
|
|
3830
4139
|
|
3831
4140
|
// Generate index data in a format suitable for GLES 2.0/WebGL
|
3832
4141
|
var numVertexes = 4 * this.vertexCounter / GL.immediate.stride;
|
4142
|
+
#if ASSERTIONS
|
3833
4143
|
assert(numVertexes % 1 == 0, "`numVertexes` must be an integer.");
|
3834
|
-
|
4144
|
+
#endif
|
3835
4145
|
var emulatedElementArrayBuffer = false;
|
3836
4146
|
var numIndexes = 0;
|
3837
4147
|
if (numProvidedIndexes) {
|
3838
4148
|
numIndexes = numProvidedIndexes;
|
3839
4149
|
if (!GL.currArrayBuffer && GL.immediate.firstVertex > GL.immediate.lastVertex) {
|
3840
4150
|
// Figure out the first and last vertex from the index data
|
4151
|
+
#if ASSERTIONS
|
3841
4152
|
assert(!GL.currElementArrayBuffer); // If we are going to upload array buffer data, we need to find which range to
|
3842
4153
|
// upload based on the indices. If they are in a buffer on the GPU, that is very
|
3843
4154
|
// inconvenient! So if you do not have an array buffer, you should also not have
|
3844
4155
|
// an element array buffer. But best is to use both buffers!
|
4156
|
+
#endif
|
3845
4157
|
for (var i = 0; i < numProvidedIndexes; i++) {
|
3846
4158
|
var currIndex = {{{ makeGetValue('ptr', 'i*2', 'i16', null, 1) }}};
|
3847
4159
|
GL.immediate.firstVertex = Math.min(GL.immediate.firstVertex, currIndex);
|
@@ -3850,7 +4162,9 @@ var LibraryGL = {
|
|
3850
4162
|
}
|
3851
4163
|
if (!GL.currElementArrayBuffer) {
|
3852
4164
|
// If no element array buffer is bound, then indices is a literal pointer to clientside data
|
4165
|
+
#if ASSERTIONS
|
3853
4166
|
assert(numProvidedIndexes << 1 <= GL.MAX_TEMP_BUFFER_SIZE, 'too many immediate mode indexes (a)');
|
4167
|
+
#endif
|
3854
4168
|
var indexBuffer = GL.tempIndexBuffers[GL.tempBufferIndexLookup[numProvidedIndexes << 1]];
|
3855
4169
|
Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, indexBuffer);
|
3856
4170
|
Module.ctx.bufferSubData(Module.ctx.ELEMENT_ARRAY_BUFFER, 0, {{{ makeHEAPView('U16', 'ptr', 'ptr + (numProvidedIndexes << 1)') }}});
|
@@ -3862,11 +4176,15 @@ var LibraryGL = {
|
|
3862
4176
|
// GL.immediate.firstVertex is the first vertex we want. Quad indexes are in the pattern
|
3863
4177
|
// 0 1 2, 0 2 3, 4 5 6, 4 6 7, so we need to look at index firstVertex * 1.5 to see it.
|
3864
4178
|
// Then since indexes are 2 bytes each, that means 3
|
4179
|
+
#if ASSERTIONS
|
3865
4180
|
assert(GL.immediate.firstVertex % 4 == 0);
|
4181
|
+
#endif
|
3866
4182
|
ptr = GL.immediate.firstVertex*3;
|
3867
4183
|
var numQuads = numVertexes / 4;
|
3868
4184
|
numIndexes = numQuads * 6; // 0 1 2, 0 2 3 pattern
|
4185
|
+
#if ASSERTIONS
|
3869
4186
|
assert(ptr + (numIndexes << 1) <= GL.MAX_TEMP_BUFFER_SIZE, 'too many immediate mode indexes (b)');
|
4187
|
+
#endif
|
3870
4188
|
Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, GL.tempQuadIndexBuffer);
|
3871
4189
|
emulatedElementArrayBuffer = true;
|
3872
4190
|
}
|
@@ -3883,7 +4201,7 @@ var LibraryGL = {
|
|
3883
4201
|
Module.ctx.bindBuffer(Module.ctx.ELEMENT_ARRAY_BUFFER, GL.buffers[GL.currElementArrayBuffer] || null);
|
3884
4202
|
}
|
3885
4203
|
|
3886
|
-
#if GL_UNSAFE_OPTS == 0
|
4204
|
+
#if GL_UNSAFE_OPTS == 0 && !GL_FFP_ONLY
|
3887
4205
|
renderer.cleanup();
|
3888
4206
|
#endif
|
3889
4207
|
}
|
@@ -4050,7 +4368,7 @@ var LibraryGL = {
|
|
4050
4368
|
glColor4ubv__deps: ['glColor4ub'],
|
4051
4369
|
glColor4ubv: function(p) {
|
4052
4370
|
_glColor4ub({{{ makeGetValue('p', '0', 'i8') }}}, {{{ makeGetValue('p', '1', 'i8') }}}, {{{ makeGetValue('p', '2', 'i8') }}}, {{{ makeGetValue('p', '3', 'i8') }}});
|
4053
|
-
|
4371
|
+
},
|
4054
4372
|
|
4055
4373
|
glFogf: function(pname, param) { // partial support, TODO
|
4056
4374
|
switch(pname) {
|
@@ -4131,10 +4449,12 @@ var LibraryGL = {
|
|
4131
4449
|
if (disable && GL.immediate.enabledClientAttributes[attrib]) {
|
4132
4450
|
GL.immediate.enabledClientAttributes[attrib] = false;
|
4133
4451
|
GL.immediate.totalEnabledClientAttributes--;
|
4452
|
+
this.currentRenderer = null; // Will need to change current renderer, since the set of active vertex pointers changed.
|
4134
4453
|
if (GLEmulation.currentVao) delete GLEmulation.currentVao.enabledClientStates[cap];
|
4135
4454
|
} else if (!disable && !GL.immediate.enabledClientAttributes[attrib]) {
|
4136
4455
|
GL.immediate.enabledClientAttributes[attrib] = true;
|
4137
4456
|
GL.immediate.totalEnabledClientAttributes++;
|
4457
|
+
this.currentRenderer = null; // Will need to change current renderer, since the set of active vertex pointers changed.
|
4138
4458
|
if (GLEmulation.currentVao) GLEmulation.currentVao.enabledClientStates[cap] = 1;
|
4139
4459
|
}
|
4140
4460
|
GL.immediate.modifiedClientAttributes = true;
|
@@ -4146,15 +4466,40 @@ var LibraryGL = {
|
|
4146
4466
|
glVertexPointer__deps: ['$GLEmulation'], // if any pointers are used, glVertexPointer must be, and if it is, then we need emulation
|
4147
4467
|
glVertexPointer: function(size, type, stride, pointer) {
|
4148
4468
|
GL.immediate.setClientAttribute(GL.immediate.VERTEX, size, type, stride, pointer);
|
4469
|
+
#if GL_FFP_ONLY
|
4470
|
+
if (GL.currArrayBuffer) {
|
4471
|
+
Module.ctx.vertexAttribPointer(GL.immediate.VERTEX, size, type, false, stride, pointer);
|
4472
|
+
GL.enableVertexAttribArray(GL.immediate.VERTEX);
|
4473
|
+
}
|
4474
|
+
#endif
|
4149
4475
|
},
|
4150
4476
|
glTexCoordPointer: function(size, type, stride, pointer) {
|
4151
4477
|
GL.immediate.setClientAttribute(GL.immediate.TEXTURE0 + GL.immediate.clientActiveTexture, size, type, stride, pointer);
|
4478
|
+
#if GL_FFP_ONLY
|
4479
|
+
if (GL.currArrayBuffer) {
|
4480
|
+
var loc = GL.immediate.TEXTURE0 + GL.immediate.clientActiveTexture;
|
4481
|
+
Module.ctx.vertexAttribPointer(loc, size, type, false, stride, pointer);
|
4482
|
+
GL.enableVertexAttribArray(loc);
|
4483
|
+
}
|
4484
|
+
#endif
|
4152
4485
|
},
|
4153
4486
|
glNormalPointer: function(type, stride, pointer) {
|
4154
4487
|
GL.immediate.setClientAttribute(GL.immediate.NORMAL, 3, type, stride, pointer);
|
4488
|
+
#if GL_FFP_ONLY
|
4489
|
+
if (GL.currArrayBuffer) {
|
4490
|
+
Module.ctx.vertexAttribPointer(GL.immediate.NORMAL, size, type, true, stride, pointer);
|
4491
|
+
GL.enableVertexAttribArray(GL.immediate.NORMAL);
|
4492
|
+
}
|
4493
|
+
#endif
|
4155
4494
|
},
|
4156
4495
|
glColorPointer: function(size, type, stride, pointer) {
|
4157
4496
|
GL.immediate.setClientAttribute(GL.immediate.COLOR, size, type, stride, pointer);
|
4497
|
+
#if GL_FFP_ONLY
|
4498
|
+
if (GL.currArrayBuffer) {
|
4499
|
+
Module.ctx.vertexAttribPointer(GL.immediate.COLOR, size, type, true, stride, pointer);
|
4500
|
+
GL.enableVertexAttribArray(GL.immediate.COLOR);
|
4501
|
+
}
|
4502
|
+
#endif
|
4158
4503
|
},
|
4159
4504
|
|
4160
4505
|
glClientActiveTexture__sig: 'vi',
|
@@ -4237,23 +4582,27 @@ var LibraryGL = {
|
|
4237
4582
|
|
4238
4583
|
glPushMatrix: function() {
|
4239
4584
|
GL.immediate.matricesModified = true;
|
4585
|
+
GL.immediate.matrixVersion[GL.immediate.currentMatrix] = (GL.immediate.matrixVersion[GL.immediate.currentMatrix] + 1)|0;
|
4240
4586
|
GL.immediate.matrixStack[GL.immediate.currentMatrix].push(
|
4241
4587
|
Array.prototype.slice.call(GL.immediate.matrix[GL.immediate.currentMatrix]));
|
4242
4588
|
},
|
4243
4589
|
|
4244
4590
|
glPopMatrix: function() {
|
4245
4591
|
GL.immediate.matricesModified = true;
|
4592
|
+
GL.immediate.matrixVersion[GL.immediate.currentMatrix] = (GL.immediate.matrixVersion[GL.immediate.currentMatrix] + 1)|0;
|
4246
4593
|
GL.immediate.matrix[GL.immediate.currentMatrix] = GL.immediate.matrixStack[GL.immediate.currentMatrix].pop();
|
4247
4594
|
},
|
4248
4595
|
|
4249
4596
|
glLoadIdentity__deps: ['$GL', '$GLImmediateSetup'],
|
4250
4597
|
glLoadIdentity: function() {
|
4251
4598
|
GL.immediate.matricesModified = true;
|
4599
|
+
GL.immediate.matrixVersion[GL.immediate.currentMatrix] = (GL.immediate.matrixVersion[GL.immediate.currentMatrix] + 1)|0;
|
4252
4600
|
GL.immediate.matrix.lib.mat4.identity(GL.immediate.matrix[GL.immediate.currentMatrix]);
|
4253
4601
|
},
|
4254
4602
|
|
4255
4603
|
glLoadMatrixd: function(matrix) {
|
4256
4604
|
GL.immediate.matricesModified = true;
|
4605
|
+
GL.immediate.matrixVersion[GL.immediate.currentMatrix] = (GL.immediate.matrixVersion[GL.immediate.currentMatrix] + 1)|0;
|
4257
4606
|
GL.immediate.matrix.lib.mat4.set({{{ makeHEAPView('F64', 'matrix', 'matrix+' + (16*8)) }}}, GL.immediate.matrix[GL.immediate.currentMatrix]);
|
4258
4607
|
},
|
4259
4608
|
|
@@ -4262,35 +4611,41 @@ var LibraryGL = {
|
|
4262
4611
|
if (GL.debug) Module.printErr('glLoadMatrixf receiving: ' + Array.prototype.slice.call(HEAPF32.subarray(matrix >> 2, (matrix >> 2) + 16)));
|
4263
4612
|
#endif
|
4264
4613
|
GL.immediate.matricesModified = true;
|
4614
|
+
GL.immediate.matrixVersion[GL.immediate.currentMatrix] = (GL.immediate.matrixVersion[GL.immediate.currentMatrix] + 1)|0;
|
4265
4615
|
GL.immediate.matrix.lib.mat4.set({{{ makeHEAPView('F32', 'matrix', 'matrix+' + (16*4)) }}}, GL.immediate.matrix[GL.immediate.currentMatrix]);
|
4266
4616
|
},
|
4267
4617
|
|
4268
4618
|
glLoadTransposeMatrixd: function(matrix) {
|
4269
4619
|
GL.immediate.matricesModified = true;
|
4620
|
+
GL.immediate.matrixVersion[GL.immediate.currentMatrix] = (GL.immediate.matrixVersion[GL.immediate.currentMatrix] + 1)|0;
|
4270
4621
|
GL.immediate.matrix.lib.mat4.set({{{ makeHEAPView('F64', 'matrix', 'matrix+' + (16*8)) }}}, GL.immediate.matrix[GL.immediate.currentMatrix]);
|
4271
4622
|
GL.immediate.matrix.lib.mat4.transpose(GL.immediate.matrix[GL.immediate.currentMatrix]);
|
4272
4623
|
},
|
4273
4624
|
|
4274
4625
|
glLoadTransposeMatrixf: function(matrix) {
|
4275
4626
|
GL.immediate.matricesModified = true;
|
4627
|
+
GL.immediate.matrixVersion[GL.immediate.currentMatrix] = (GL.immediate.matrixVersion[GL.immediate.currentMatrix] + 1)|0;
|
4276
4628
|
GL.immediate.matrix.lib.mat4.set({{{ makeHEAPView('F32', 'matrix', 'matrix+' + (16*4)) }}}, GL.immediate.matrix[GL.immediate.currentMatrix]);
|
4277
4629
|
GL.immediate.matrix.lib.mat4.transpose(GL.immediate.matrix[GL.immediate.currentMatrix]);
|
4278
4630
|
},
|
4279
4631
|
|
4280
4632
|
glMultMatrixd: function(matrix) {
|
4281
4633
|
GL.immediate.matricesModified = true;
|
4634
|
+
GL.immediate.matrixVersion[GL.immediate.currentMatrix] = (GL.immediate.matrixVersion[GL.immediate.currentMatrix] + 1)|0;
|
4282
4635
|
GL.immediate.matrix.lib.mat4.multiply(GL.immediate.matrix[GL.immediate.currentMatrix],
|
4283
4636
|
{{{ makeHEAPView('F64', 'matrix', 'matrix+' + (16*8)) }}});
|
4284
4637
|
},
|
4285
4638
|
|
4286
4639
|
glMultMatrixf: function(matrix) {
|
4287
4640
|
GL.immediate.matricesModified = true;
|
4641
|
+
GL.immediate.matrixVersion[GL.immediate.currentMatrix] = (GL.immediate.matrixVersion[GL.immediate.currentMatrix] + 1)|0;
|
4288
4642
|
GL.immediate.matrix.lib.mat4.multiply(GL.immediate.matrix[GL.immediate.currentMatrix],
|
4289
4643
|
{{{ makeHEAPView('F32', 'matrix', 'matrix+' + (16*4)) }}});
|
4290
4644
|
},
|
4291
4645
|
|
4292
4646
|
glMultTransposeMatrixd: function(matrix) {
|
4293
4647
|
GL.immediate.matricesModified = true;
|
4648
|
+
GL.immediate.matrixVersion[GL.immediate.currentMatrix] = (GL.immediate.matrixVersion[GL.immediate.currentMatrix] + 1)|0;
|
4294
4649
|
var colMajor = GL.immediate.matrix.lib.mat4.create();
|
4295
4650
|
GL.immediate.matrix.lib.mat4.set({{{ makeHEAPView('F64', 'matrix', 'matrix+' + (16*8)) }}}, colMajor);
|
4296
4651
|
GL.immediate.matrix.lib.mat4.transpose(colMajor);
|
@@ -4299,6 +4654,7 @@ var LibraryGL = {
|
|
4299
4654
|
|
4300
4655
|
glMultTransposeMatrixf: function(matrix) {
|
4301
4656
|
GL.immediate.matricesModified = true;
|
4657
|
+
GL.immediate.matrixVersion[GL.immediate.currentMatrix] = (GL.immediate.matrixVersion[GL.immediate.currentMatrix] + 1)|0;
|
4302
4658
|
var colMajor = GL.immediate.matrix.lib.mat4.create();
|
4303
4659
|
GL.immediate.matrix.lib.mat4.set({{{ makeHEAPView('F32', 'matrix', 'matrix+' + (16*4)) }}}, colMajor);
|
4304
4660
|
GL.immediate.matrix.lib.mat4.transpose(colMajor);
|
@@ -4307,6 +4663,7 @@ var LibraryGL = {
|
|
4307
4663
|
|
4308
4664
|
glFrustum: function(left, right, bottom, top_, nearVal, farVal) {
|
4309
4665
|
GL.immediate.matricesModified = true;
|
4666
|
+
GL.immediate.matrixVersion[GL.immediate.currentMatrix] = (GL.immediate.matrixVersion[GL.immediate.currentMatrix] + 1)|0;
|
4310
4667
|
GL.immediate.matrix.lib.mat4.multiply(GL.immediate.matrix[GL.immediate.currentMatrix],
|
4311
4668
|
GL.immediate.matrix.lib.mat4.frustum(left, right, bottom, top_, nearVal, farVal));
|
4312
4669
|
},
|
@@ -4314,6 +4671,7 @@ var LibraryGL = {
|
|
4314
4671
|
|
4315
4672
|
glOrtho: function(left, right, bottom, top_, nearVal, farVal) {
|
4316
4673
|
GL.immediate.matricesModified = true;
|
4674
|
+
GL.immediate.matrixVersion[GL.immediate.currentMatrix] = (GL.immediate.matrixVersion[GL.immediate.currentMatrix] + 1)|0;
|
4317
4675
|
GL.immediate.matrix.lib.mat4.multiply(GL.immediate.matrix[GL.immediate.currentMatrix],
|
4318
4676
|
GL.immediate.matrix.lib.mat4.ortho(left, right, bottom, top_, nearVal, farVal));
|
4319
4677
|
},
|
@@ -4321,18 +4679,21 @@ var LibraryGL = {
|
|
4321
4679
|
|
4322
4680
|
glScaled: function(x, y, z) {
|
4323
4681
|
GL.immediate.matricesModified = true;
|
4682
|
+
GL.immediate.matrixVersion[GL.immediate.currentMatrix] = (GL.immediate.matrixVersion[GL.immediate.currentMatrix] + 1)|0;
|
4324
4683
|
GL.immediate.matrix.lib.mat4.scale(GL.immediate.matrix[GL.immediate.currentMatrix], [x, y, z]);
|
4325
4684
|
},
|
4326
4685
|
glScalef: 'glScaled',
|
4327
4686
|
|
4328
4687
|
glTranslated: function(x, y, z) {
|
4329
4688
|
GL.immediate.matricesModified = true;
|
4689
|
+
GL.immediate.matrixVersion[GL.immediate.currentMatrix] = (GL.immediate.matrixVersion[GL.immediate.currentMatrix] + 1)|0;
|
4330
4690
|
GL.immediate.matrix.lib.mat4.translate(GL.immediate.matrix[GL.immediate.currentMatrix], [x, y, z]);
|
4331
4691
|
},
|
4332
4692
|
glTranslatef: 'glTranslated',
|
4333
4693
|
|
4334
4694
|
glRotated: function(angle, x, y, z) {
|
4335
4695
|
GL.immediate.matricesModified = true;
|
4696
|
+
GL.immediate.matrixVersion[GL.immediate.currentMatrix] = (GL.immediate.matrixVersion[GL.immediate.currentMatrix] + 1)|0;
|
4336
4697
|
GL.immediate.matrix.lib.mat4.rotate(GL.immediate.matrix[GL.immediate.currentMatrix], angle*Math.PI/180, [x, y, z]);
|
4337
4698
|
},
|
4338
4699
|
glRotatef: 'glRotated',
|
@@ -4415,6 +4776,7 @@ var LibraryGL = {
|
|
4415
4776
|
|
4416
4777
|
gluPerspective: function(fov, aspect, near, far) {
|
4417
4778
|
GL.immediate.matricesModified = true;
|
4779
|
+
GL.immediate.matrixVersion[GL.immediate.currentMatrix] = (GL.immediate.matrixVersion[GL.immediate.currentMatrix] + 1)|0;
|
4418
4780
|
GL.immediate.matrix[GL.immediate.currentMatrix] =
|
4419
4781
|
GL.immediate.matrix.lib.mat4.perspective(fov, aspect, near, far,
|
4420
4782
|
GL.immediate.matrix[GL.immediate.currentMatrix]);
|
@@ -4422,6 +4784,7 @@ var LibraryGL = {
|
|
4422
4784
|
|
4423
4785
|
gluLookAt: function(ex, ey, ez, cx, cy, cz, ux, uy, uz) {
|
4424
4786
|
GL.immediate.matricesModified = true;
|
4787
|
+
GL.immediate.matrixVersion[GL.immediate.currentMatrix] = (GL.immediate.matrixVersion[GL.immediate.currentMatrix] + 1)|0;
|
4425
4788
|
GL.immediate.matrix.lib.mat4.lookAt(GL.immediate.matrix[GL.immediate.currentMatrix], [ex, ey, ez],
|
4426
4789
|
[cx, cy, cz], [ux, uy, uz]);
|
4427
4790
|
},
|
@@ -4572,6 +4935,30 @@ var LibraryGL = {
|
|
4572
4935
|
#endif
|
4573
4936
|
},
|
4574
4937
|
|
4938
|
+
glShaderBinary__sig: 'v',
|
4939
|
+
glShaderBinary: function() {
|
4940
|
+
GL.recordError(0x0500/*GL_INVALID_ENUM*/);
|
4941
|
+
#if GL_ASSERTIONS
|
4942
|
+
Module.printErr("GL_INVALID_ENUM in glShaderBinary: WebGL does not support binary shader formats! Calls to glShaderBinary always fail.");
|
4943
|
+
#endif
|
4944
|
+
},
|
4945
|
+
|
4946
|
+
glReleaseShaderCompiler__sig: 'v',
|
4947
|
+
glReleaseShaderCompiler: function() {
|
4948
|
+
// NOP (as allowed by GLES 2.0 spec)
|
4949
|
+
},
|
4950
|
+
|
4951
|
+
glGetError__sig: 'i',
|
4952
|
+
glGetError: function() {
|
4953
|
+
// First return any GL error generated by the emscripten library_gl.js interop layer.
|
4954
|
+
if (GL.lastError) {
|
4955
|
+
var error = GL.lastError;
|
4956
|
+
GL.lastError = 0/*GL_NO_ERROR*/;
|
4957
|
+
return error;
|
4958
|
+
} else { // If there were none, return the GL error from the browser GL context.
|
4959
|
+
return Module.ctx.getError();
|
4960
|
+
}
|
4961
|
+
},
|
4575
4962
|
// signatures of simple pass-through functions, see later
|
4576
4963
|
|
4577
4964
|
glActiveTexture__sig: 'vi',
|
@@ -4605,16 +4992,15 @@ var LibraryGL = {
|
|
4605
4992
|
glFlush__sig: 'v',
|
4606
4993
|
glClearColor__sig: 'viiii',
|
4607
4994
|
glIsEnabled__sig: 'ii',
|
4608
|
-
glGetError__sig: 'i',
|
4609
4995
|
glFrontFace__sig: 'vi',
|
4610
|
-
glSampleCoverage__sig: '
|
4996
|
+
glSampleCoverage__sig: 'vii',
|
4611
4997
|
};
|
4612
4998
|
|
4613
4999
|
|
4614
5000
|
// Simple pass-through functions. Starred ones have return values. [X] ones have X in the C name but not in the JS name
|
4615
|
-
[[0, '
|
4616
|
-
[1, 'clearDepth clearDepth[f] depthFunc enable disable frontFace cullFace clear lineWidth clearStencil depthMask stencilMask checkFramebufferStatus* generateMipmap activeTexture blendEquation
|
4617
|
-
[2, 'blendFunc blendEquationSeparate depthRange depthRange[f] stencilMaskSeparate hint polygonOffset vertexAttrib1f'],
|
5001
|
+
[[0, 'finish flush'],
|
5002
|
+
[1, 'clearDepth clearDepth[f] depthFunc enable disable frontFace cullFace clear lineWidth clearStencil depthMask stencilMask checkFramebufferStatus* generateMipmap activeTexture blendEquation isEnabled*'],
|
5003
|
+
[2, 'blendFunc blendEquationSeparate depthRange depthRange[f] stencilMaskSeparate hint polygonOffset vertexAttrib1f sampleCoverage'],
|
4618
5004
|
[3, 'texParameteri texParameterf vertexAttrib2f stencilFunc stencilOp'],
|
4619
5005
|
[4, 'viewport clearColor scissor vertexAttrib3f colorMask renderbufferStorage blendFuncSeparate blendColor stencilFuncSeparate stencilOpSeparate'],
|
4620
5006
|
[5, 'vertexAttrib4f'],
|
@@ -4687,7 +5073,7 @@ LibraryGL.emscripten_GetProcAddress__deps = [function() {
|
|
4687
5073
|
tableImpl += '}\nreturn 0;';
|
4688
5074
|
LibraryManager.library.emscripten_procAddressTable = new Function('name', tableImpl);
|
4689
5075
|
}, 'emscripten_procAddressTable'];
|
4690
|
-
LibraryGL.emscripten_GetProcAddress = function(name) {
|
5076
|
+
LibraryGL.emscripten_GetProcAddress = function _LibraryGL_emscripten_GetProcAddress(name) {
|
4691
5077
|
name = name.replace('EXT', '').replace('ARB', '');
|
4692
5078
|
switch(name) { // misc renamings
|
4693
5079
|
case 'glCreateProgramObject': name = 'glCreateProgram'; break;
|