diff options
-rwxr-xr-x | emcc | 11 | ||||
-rw-r--r-- | src/library_gl.js | 46 | ||||
-rw-r--r-- | src/library_sdl.js | 8 | ||||
-rwxr-xr-x | tests/runner.py | 92 |
4 files changed, 96 insertions, 61 deletions
@@ -881,6 +881,7 @@ try: data_files = filter(lambda file_: not os.path.isdir(file_['name']), data_files) for file_ in data_files: + file_['name'] = file_['name'].replace(os.path.sep, '/') file_['net_name'] = file_['name'] data_target = unsuffixed(target) + '.data' @@ -889,12 +890,12 @@ try: partial_dirs = [] for file_ in data_files: dirname = os.path.dirname(file_['name']) - if dirname != '' and dirname != os.path.sep: - parts = dirname.split(os.path.sep) + if dirname != '' and dirname != '/': + parts = dirname.split('/') for i in range(len(parts)): - partial = os.path.sep.join(parts[:i+1]) + partial = '/'.join(parts[:i+1]) if partial not in partial_dirs: - code += '''FS.createFolder('/%s', '%s', true, false);\n''' % (os.path.sep.join(parts[:i]), parts[i]) + code += '''FS.createFolder('/%s', '%s', true, false);\n''' % ('/'.join(parts[:i]), parts[i]) partial_dirs.append(partial) if final_suffix == 'html': @@ -903,7 +904,7 @@ try: start = 0 for file_ in data_files: file_['data_start'] = start - curr = open(file_['name']).read() + curr = open(file_['name'], 'rb').read() file_['data_end'] = start + len(curr) start += len(curr) data.write(curr) diff --git a/src/library_gl.js b/src/library_gl.js index 0b118555..586921d4 100644 --- a/src/library_gl.js +++ b/src/library_gl.js @@ -356,7 +356,7 @@ var LibraryGL = { glIsTexture: function(texture) { var fb = GL.textures[texture]; if (typeof(fb) == 'undefined') { - return false; + return 0; } return Module.ctx.isTexture(fb); }, @@ -377,6 +377,10 @@ var LibraryGL = { } }, + glGetBufferParameteriv: function(target, value, data) { + {{{ makeSetValue('data', '0', 'Module.ctx.getBufferParameter(target, value)', 'i32') }}}; + }, + glBufferData: function(target, size, data, usage) { Module.ctx.bufferData(target, HEAPU8.subarray(data, data+size), usage); }, @@ -389,7 +393,7 @@ var LibraryGL = { glIsBuffer: function(buffer) { var fb = GL.buffers[buffer]; if (typeof(fb) == 'undefined') { - return false; + return 0; } return Module.ctx.isBuffer(fb); }, @@ -421,11 +425,33 @@ var LibraryGL = { glIsRenderbuffer: function(renderbuffer) { var fb = GL.renderbuffers[renderbuffer]; if (typeof(fb) == 'undefined') { - return false; + return 0; } return Module.ctx.isRenderbuffer(fb); }, + glGetUniformfv: function(program, location, params) { + var data = Module.ctx.getUniform(GL.programs[program], GL.uniforms[location]); + if (typeof data == 'number') { + {{{ makeSetValue('params', '0', 'data', 'float') }}}; + } else { + for (var i = 0; i < data.length; i++) { + {{{ makeSetValue('params', 'i', 'data[i]', 'float') }}}; + } + } + }, + + glGetUniformiv: function(program, location, params) { + var data = Module.ctx.getUniform(GL.programs[program], GL.uniforms[location]); + if (typeof data == 'number') { + {{{ makeSetValue('params', '0', 'data', 'i32') }}}; + } else { + for (var i = 0; i < data.length; i++) { + {{{ makeSetValue('params', 'i', 'data[i]', 'i32') }}}; + } + } + }, + glGetUniformLocation: function(program, name) { name = Pointer_stringify(name); var loc = Module.ctx.getUniformLocation(GL.programs[program], name); @@ -715,7 +741,7 @@ var LibraryGL = { glIsShader: function(shader) { var fb = GL.shaders[shader]; if (typeof(fb) == 'undefined') { - return false; + return 0; } return Module.ctx.isShader(fb); }, @@ -771,7 +797,7 @@ var LibraryGL = { glIsProgram: function(program) { var fb = GL.programs[program]; if (typeof(fb) == 'undefined') { - return false; + return 0; } return Module.ctx.isProgram(fb); }, @@ -819,7 +845,7 @@ var LibraryGL = { glIsFramebuffer: function(framebuffer) { var fb = GL.framebuffers[framebuffer]; if (typeof(fb) == 'undefined') { - return false; + return 0; } return Module.ctx.isFramebuffer(fb); }, @@ -1192,11 +1218,11 @@ var LibraryGL = { }; // Simple pass-through functions. Starred ones have return values. [X] ones have X in the C name but not in the JS name -[[0, 'shadeModel fogi fogfv getError finish flush'], - [1, 'clearDepth clearDepth[f] depthFunc disable frontFace cullFace clear enableVertexAttribArray disableVertexAttribArray lineWidth clearStencil depthMask stencilMask stencilMaskSeparate checkFramebufferStatus* generateMipmap activeTexture blendEquation polygonOffset hint sampleCoverage'], - [2, 'blendFunc blendEquationSeparate depthRange depthRange[f]'], +[[0, 'shadeModel fogi fogfv getError* finish flush'], + [1, 'clearDepth clearDepth[f] depthFunc disable frontFace cullFace clear enableVertexAttribArray disableVertexAttribArray lineWidth clearStencil depthMask stencilMask checkFramebufferStatus* generateMipmap activeTexture blendEquation polygonOffset hint sampleCoverage isEnabled*'], + [2, 'blendFunc blendEquationSeparate depthRange depthRange[f] stencilMaskSeparate'], [3, 'texParameteri texParameterf drawArrays vertexAttrib2f stencilFunc stencilOp'], - [4, 'viewport clearColor scissor vertexAttrib3f colorMask drawElements renderbufferStorage blendFuncSeparate blendColor'], + [4, 'viewport clearColor scissor vertexAttrib3f colorMask drawElements renderbufferStorage blendFuncSeparate blendColor stencilFuncSeparate stencilOpSeparate'], [5, 'vertexAttrib4f'], [6, 'vertexAttribPointer'], [8, 'copyTexImage2D copyTexSubImage2D']].forEach(function(data) { diff --git a/src/library_sdl.js b/src/library_sdl.js index 11431e4e..8f7f4c08 100644 --- a/src/library_sdl.js +++ b/src/library_sdl.js @@ -75,7 +75,7 @@ // // * SDL_Quit does nothing. -mergeInto(LibraryManager.library, { +var LibrarySDL = { $SDL__deps: ['$FS', '$Browser'], $SDL: { defaults: { @@ -420,7 +420,6 @@ mergeInto(LibraryManager.library, { return SDL.version; }, - SDL_Init__deps: ['$SDL'], SDL_Init: function(what) { SDL.startTime = Date.now(); ['keydown', 'keyup'].forEach(function(event) { @@ -988,5 +987,8 @@ mergeInto(LibraryManager.library, { window.clearTimeout(id); return true; } -}); +}; + +autoAddDeps(LibrarySDL, '$SDL'); +mergeInto(LibraryManager.library, LibrarySDL); diff --git a/tests/runner.py b/tests/runner.py index 613f9977..7c24c799 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -14,7 +14,7 @@ will use 4 processes. To install nose do something like ''' from subprocess import Popen, PIPE, STDOUT -import os, unittest, tempfile, shutil, time, inspect, sys, math, glob, tempfile, re, difflib, webbrowser, hashlib, threading, platform, BaseHTTPServer, multiprocessing +import os, unittest, tempfile, shutil, time, inspect, sys, math, glob, tempfile, re, difflib, webbrowser, hashlib, threading, platform, BaseHTTPServer, multiprocessing, functools if len(sys.argv) == 1: @@ -6619,33 +6619,55 @@ fscanfed: 10 - hello elif 'browser' in str(sys.argv): # Browser tests. + # Run a server and a web page. When a test runs, we tell the server about it, + # which tells the web page, which then opens a window with the test. Doing + # it this way then allows the page to close() itself when done. + + def harness_server_func(q): + class TestServerHandler(BaseHTTPServer.BaseHTTPRequestHandler): + def do_GET(s): + s.send_response(200) + s.send_header("Content-type", "text/html") + s.end_headers() + if s.path == '/run_harness': + s.wfile.write(open(path_from_root('tests', 'browser_harness.html')).read()) + else: + result = 'False' + if not q.empty(): + result = q.get() + s.wfile.write(result) + s.wfile.close() + httpd = BaseHTTPServer.HTTPServer(('localhost', 9999), TestServerHandler) + httpd.serve_forever() # test runner will kill us + + def server_func(dir, q): + class TestServerHandler(BaseHTTPServer.BaseHTTPRequestHandler): + def do_GET(s): + if 'report_' in s.path: + q.put(s.path) + else: + filename = s.path[1:] + if os.path.exists(filename): + s.send_response(200) + s.send_header("Content-type", "text/html") + s.end_headers() + s.wfile.write(open(filename).read()) + s.wfile.close() + else: + s.send_response(500) + s.send_header("Content-type", "text/html") + s.end_headers() + os.chdir(dir) + httpd = BaseHTTPServer.HTTPServer(('localhost', 8888), TestServerHandler) + httpd.serve_forever() # test runner will kill us + class browser(RunnerCore): def __init__(self, *args, **kwargs): super(browser, self).__init__(*args, **kwargs) if hasattr(browser, 'harness_server'): return - - # Run a server and a web page. When a test runs, we tell the server about it, - # which tells the web page, which then opens a window with the test. Doing - # it this way then allows the page to close() itself when done. - def server_func(q): - class TestServerHandler(BaseHTTPServer.BaseHTTPRequestHandler): - def do_GET(s): - s.send_response(200) - s.send_header("Content-type", "text/html") - s.end_headers() - if s.path == '/run_harness': - s.wfile.write(open(path_from_root('tests', 'browser_harness.html')).read()) - else: - result = 'False' - if not q.empty(): - result = q.get() - s.wfile.write(result) - s.wfile.close() - httpd = BaseHTTPServer.HTTPServer(('localhost', 9999), TestServerHandler) - httpd.serve_forever() # test runner will kill us browser.harness_queue = multiprocessing.Queue() - browser.harness_server = multiprocessing.Process(target=server_func, args=(browser.harness_queue,)) + browser.harness_server = multiprocessing.Process(target=harness_server_func, args=(browser.harness_queue,)) browser.harness_server.start() print '[Browser harness server on process %d]' % browser.harness_server.pid webbrowser.open_new('http://localhost:9999/run_harness') @@ -6656,32 +6678,15 @@ elif 'browser' in str(sys.argv): browser.harness_server.terminate() delattr(browser, 'harness_server') print '[Browser harness server terminated]' + # On Windows, shutil.rmtree() in tearDown() raises this exception if we do not wait a bit: + # WindowsError: [Error 32] The process cannot access the file because it is being used by another process. + time.sleep(0.1) def run_browser(self, html_file, message, expectedResult=None): if expectedResult is not None: try: - def server_func(q): - class TestServerHandler(BaseHTTPServer.BaseHTTPRequestHandler): - def do_GET(s): - if 'report_' in s.path: - q.put(s.path) - else: - filename = s.path[1:] - if os.path.exists(filename): - s.send_response(200) - s.send_header("Content-type", "text/html") - s.end_headers() - s.wfile.write(open(filename).read()) - s.wfile.close() - else: - s.send_response(500) - s.send_header("Content-type", "text/html") - s.end_headers() - os.chdir(self.get_dir()) - httpd = BaseHTTPServer.HTTPServer(('localhost', 8888), TestServerHandler) - httpd.serve_forever() # test runner will kill us queue = multiprocessing.Queue() - server = multiprocessing.Process(target=server_func, args=(queue,)) + server = multiprocessing.Process(target=functools.partial(server_func, self.get_dir()), args=(queue,)) server.start() browser.harness_queue.put('http://localhost:8888/' + html_file) output = '[no http server activity]' @@ -6694,6 +6699,7 @@ elif 'browser' in str(sys.argv): self.assertIdentical(expectedResult, output) finally: server.terminate() + time.sleep(0.1) # see comment about Windows above else: webbrowser.open_new(os.path.abspath(html_file)) print 'A web browser window should have opened a page containing the results of a part of this test.' |