diff options
Diffstat (limited to 'dom/canvas/test/webgl-mochitest/test_implicit_color_buffer_float.html')
-rw-r--r-- | dom/canvas/test/webgl-mochitest/test_implicit_color_buffer_float.html | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-mochitest/test_implicit_color_buffer_float.html b/dom/canvas/test/webgl-mochitest/test_implicit_color_buffer_float.html new file mode 100644 index 0000000000..bbabef3e8b --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_implicit_color_buffer_float.html @@ -0,0 +1,199 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset='utf-8'> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +</head> +<body> +<script> + +var RGBA32F_EXT = 0x8814; +var RGBA16F_EXT = 0x881A; // Yep, it's really 4 and A. +var HALF_FLOAT_OES = 0x8D61; + +function IsFormatValidForRB(gl, format) { + ok(!gl.getError(), 'Should have no errors here.'); + + var rb = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, rb); + gl.renderbufferStorage(gl.RENDERBUFFER, format, 4, 4); + + var error = gl.getError(); + if (error == gl.INVALID_ENUM) + return false; + + ok(error == gl.NO_ERROR, 'Error should be INVALID_ENUM or NO_ERROR.'); + return error == gl.NO_ERROR; +} + +function IsFormatValidForTex(gl, format, type) { + ok(!gl.getError(), 'Should have no errors here.'); + + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D(gl.TEXTURE_2D, 0, format, 4, 4, 0, format, type, null); + + var error = gl.getError(); + if (error == gl.INVALID_ENUM || error == gl.INVALID_OPERATION) + return false; + + ok(error == gl.NO_ERROR, 'Error should be INVALID_{ENUM,OPERATION} or NO_ERROR.'); + return error == gl.NO_ERROR; +} + +function IsFormatValidForTexFB(gl, format, type) { + ok(!gl.getError(), 'Should have no errors here.'); + + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D(gl.TEXTURE_2D, 0, format, 4, 4, 0, format, type, null); + + var error = gl.getError(); + if (error == gl.INVALID_ENUM || error == gl.INVALID_OPERATION) + return false; + + ok(error == gl.NO_ERROR, 'Error should be INVALID_{ENUM,OPERATION} or NO_ERROR.'); + + var fb = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, + tex, 0); + error = gl.getError(); + ok(error == gl.NO_ERROR, 'Error should be NO_ERROR.'); + + var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); + return status == gl.FRAMEBUFFER_COMPLETE; +} + +function IsFormatValidForTexFBRead(gl, texFormat, texType, readType) { + ok(!gl.getError(), 'Should have no errors here.'); + + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D(gl.TEXTURE_2D, 0, texFormat, 4, 4, 0, texFormat, texType, + null); + + var error = gl.getError(); + if (error == gl.INVALID_ENUM || error == gl.INVALID_OPERATION) + return false; + + ok(error == gl.NO_ERROR, 'Error should be INVALID_{ENUM,OPERATION} or NO_ERROR.'); + + var fb = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, + tex, 0); + error = gl.getError(); + ok(error == gl.NO_ERROR, 'Error should be NO_ERROR.'); + + var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); + if (status != gl.FRAMEBUFFER_COMPLETE) + return false; + + var data; + switch (readType) { + case gl.UNSIGNED_BYTE: + data = new Uint8Array(4); + break; + case HALF_FLOAT_OES: + data = new Uint16Array(4); + break; + case gl.FLOAT: + data = new Float32Array(4); + break; + default: + throw 'Bad `readType`.'; + } + gl.readPixels(0, 0, 1, 1, gl.RGBA, readType, data); + + error = gl.getError(); + return error == gl.NO_ERROR; +} + +function TestColorBufferExt(gl, rbFormat, texFormat, texType, readType) +{ + var isTexFBValid = IsFormatValidForTexFB(gl, texFormat, texType); + var isTexFBReadValid = IsFormatValidForTexFBRead(gl, texFormat, texType, + readType); + var isRBValid = IsFormatValidForRB(gl, rbFormat); + + var validSubsetCount = isTexFBValid + isTexFBReadValid + isRBValid; + + if (validSubsetCount) { + ok(isTexFBValid, 'If active, texture-fbs should work.'); + ok(isTexFBReadValid, 'If active, reading texture-fbs should work.'); + ok(isRBValid, 'If active, renderbuffers should work.'); + } + + return validSubsetCount == 3; +} + +function TestImpliedExtension(gl, baseExtName, impliedExtName, rbFormat, + texFormat, texType, readType) +{ + ok(true, '========'); + ok(true, 'Testing if ' + baseExtName + ' implies ' + impliedExtName + '.'); + ok(true, '--------'); + + var baseExt = gl.getExtension(baseExtName); + if (!baseExt) { + ok(!baseExt, 'Ext \'' + baseExtName + '\' can be unsupported.'); + return; + } + + var isTexValid = IsFormatValidForTex(gl, texFormat, texType); + ok(isTexValid, baseExtName + ' should allow float textures.'); + if (!isTexValid) + return; + + var isImplicitlyActive = TestColorBufferExt(gl, rbFormat, texFormat, + texType, readType); + + if (isImplicitlyActive) { + ok(true, 'Activating ' + baseExtName + ' has implicitly activated ' + + impliedExtName + '.'); + + var impliedExt = gl.getExtension(impliedExtName); + ok(impliedExt, 'If ' + impliedExtName + ' is supported implicitly, it' + + ' must be supported explicitly as well.'); + return; + } + + ok(true, 'Activating ' + baseExtName + ' has not implicitly activated ' + + impliedExtName + '.'); + ok(true, '--------'); + + var impliedExt = gl.getExtension(impliedExtName); + if (!impliedExt) { + ok(true, impliedExtName + ' can be unsupported.'); + return; + } + ok(true, 'Explicit activation of ' + impliedExtName + ' successful.'); + + var isFunctional = TestColorBufferExt(gl, rbFormat, texFormat, texType, + readType); + ok(isFunctional, impliedExtName + ' should be fully functional.'); +} + +(function() { + var canvas = document.createElement('canvas'); + var gl = canvas.getContext('experimental-webgl'); + if (!gl) { + ok(!gl, 'WebGL can be unsupported.'); + return; + } + + TestImpliedExtension(gl, 'OES_texture_float', 'WEBGL_color_buffer_float', + RGBA32F_EXT, gl.RGBA, gl.FLOAT, gl.FLOAT); + TestImpliedExtension(gl, 'OES_texture_half_float', + 'EXT_color_buffer_half_float', RGBA16F_EXT, gl.RGBA, + HALF_FLOAT_OES, gl.FLOAT); + ok(true, '========'); + ok(true, 'TEST COMPLETE'); +})(); + +</script> + +</body> +</html> |