JavaScript
function log(t) {
d.innerText += '\n' + t;
}
function expect(expected, was, desc) {
const ok = (a.toString() === b.toString());
const not_str = ok ? '' : ' NOT';
const text = `[${desc}] Should be `
}
const res = (function(){
const g = c.getContext('webgl2');
if (!g)
return 'No webgl2.';
const SIZE = 10;
const LAYERS = 3;
const COLORS = [
new Uint8Array([255, 0, 0, 255]),
new Uint8Array([0, 255, 0, 255]),
new Uint8Array([0, 0, 255, 255]),
];
const F_COLORS = COLORS.map(x => x.map(y => y / 255.0));
const src_tex = g.createTexture();
g.bindTexture(g.TEXTURE_2D_ARRAY, src_tex);
g.texStorage3D(g.TEXTURE_2D_ARRAY, 1, g.RGBA8, SIZE, SIZE, LAYERS);
const dst_tex = g.createTexture();
g.bindTexture(g.TEXTURE_2D_ARRAY, dst_tex);
g.texStorage3D(g.TEXTURE_2D_ARRAY, 1, g.RGBA8, SIZE, SIZE, LAYERS);
const src_fbs = [];
const dst_fbs = [];
for (let i in COLORS) {
dst_fbs[i] = g.createFramebuffer();
g.bindFramebuffer(g.FRAMEBUFFER, dst_fbs[i]);
g.framebufferTextureLayer(g.DRAW_FRAMEBUFFER, g.COLOR_ATTACHMENT0, dst_tex, 0, i);
src_fbs[i] = g.createFramebuffer();
g.bindFramebuffer(g.FRAMEBUFFER, src_fbs[i]);
g.framebufferTextureLayer(g.DRAW_FRAMEBUFFER, g.COLOR_ATTACHMENT0, src_tex, 0, i);
const c = F_COLORS[i];
g.clearColor(c[0], c[1], c[2], c[3]);
g.clear(g.COLOR_BUFFER_BIT);
}
for (let i in src_fbs) {
g.bindFramebuffer(g.READ_FRAMEBUFFER, src_fbs[i]);
const p = new Uint8Array(4);
g.readPixels(0, 0, 1, 1, g.RGBA, g.UNSIGNED_BYTE, p);
log(`[cleared] Should be ${COLORS[i]}, was ${p}.`);
}
for (let i in src_fbs) {
g.bindFramebuffer(g.READ_FRAMEBUFFER, src_fbs[i]);
g.bindFramebuffer(g.DRAW_FRAMEBUFFER, dst_fbs[i]);
g.blitFramebuffer(0, 0, SIZE, SIZE, 0, 0, SIZE, SIZE, g.COLOR_BUFFER_BIT, g.NEAREST);
}
for (let i in src_fbs) {
g.bindFramebuffer(g.READ_FRAMEBUFFER, dst_fbs[i]);
const p = new Uint8Array(4);
...