aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xemcc11
-rw-r--r--src/library_gl.js46
-rw-r--r--src/library_sdl.js8
-rwxr-xr-xtests/runner.py92
4 files changed, 96 insertions, 61 deletions
diff --git a/emcc b/emcc
index fb215a60..58645eb4 100755
--- a/emcc
+++ b/emcc
@@ -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.'