Skip to content

Commit 7520e31

Browse files
committed
Add graphical mode for cpu
1 parent 76ef54e commit 7520e31

3 files changed

Lines changed: 82 additions & 8 deletions

File tree

src/backend/fallback.js

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,18 @@
7979
}
8080
}
8181

82+
var canvas;
83+
var canvasCtx;
84+
var imageData;
85+
var data;
8286
if (opt.graphical) {
83-
throw "CPU fallback for graphical output is not supported!";
87+
canvas = gpu.getCanvas('cpu');
88+
canvas.width = threadDim[0];
89+
canvas.height = threadDim[1];
90+
91+
canvasCtx = canvas.getContext("2d");
92+
imageData = canvasCtx.createImageData(threadDim[0], threadDim[1]);
93+
data = new Uint8ClampedArray(threadDim[0]*threadDim[1]*4);
8494
}
8595

8696
var ctx = {
@@ -89,20 +99,50 @@
8999
y: 0,
90100
z: 0
91101
},
92-
dimensions: threadDim,
93-
color: function(r, g, b, a) {
94-
console.warn("color() does nothing on fallback mode");
102+
dimensions: {
103+
x: threadDim[0],
104+
y: threadDim[1],
105+
z: threadDim[2]
95106
}
96107
};
97108

109+
ctx.color = function(r, g, b, a) {
110+
if (a == undefined) {
111+
a = 1.0;
112+
}
113+
114+
r = Math.floor(r * 255);
115+
g = Math.floor(g * 255);
116+
b = Math.floor(b * 255);
117+
a = Math.floor(a * 255);
118+
119+
var width = ctx.dimensions.x;
120+
var height = ctx.dimensions.y;
121+
122+
var x = ctx.thread.x;
123+
var y = height - ctx.thread.y - 1;
124+
125+
var index = x + y*width;
126+
127+
data[index*4+0] = r;
128+
data[index*4+1] = g;
129+
data[index*4+2] = b;
130+
data[index*4+3] = a;
131+
};
132+
98133
for (ctx.thread.z=0; ctx.thread.z<threadDim[2]; ctx.thread.z++) {
99134
for (ctx.thread.y=0; ctx.thread.y<threadDim[1]; ctx.thread.y++) {
100135
for (ctx.thread.x=0; ctx.thread.x<threadDim[0]; ctx.thread.x++) {
101136
ret[ctx.thread.z][ctx.thread.y][ctx.thread.x] = kernel.apply(ctx, kernelArgs);
102137
}
103138
}
104139
}
105-
140+
141+
if (opt.graphical) {
142+
imageData.data.set(data);
143+
canvasCtx.putImageData(imageData, 0, 0);
144+
}
145+
106146
if (opt.dimensions.length == 1) {
107147
ret = ret[0][0];
108148
} else if (opt.dimensions.length == 2) {
@@ -117,6 +157,16 @@
117157
return ret;
118158
};
119159

160+
ret.debug = function(flag) {
161+
opt.debug = flag;
162+
return ret;
163+
};
164+
165+
ret.graphical = function(flag) {
166+
opt.graphical = flag;
167+
return ret;
168+
};
169+
120170
ret.wraparound = function() {
121171
opt.wraparound = false;
122172
return ret;
@@ -137,6 +187,10 @@
137187
return gpu.createKernel(kernel, opt);
138188
};
139189

190+
ret.getCanvas = function() {
191+
return gpu.getCanvas('cpu');
192+
};
193+
140194
return ret;
141195
};
142196
})(GPU);

src/backend/glsl.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,16 @@
494494
return ret;
495495
};
496496

497+
ret.debug = function(flag) {
498+
opt.debug = flag;
499+
return ret;
500+
};
501+
502+
ret.graphical = function(flag) {
503+
opt.graphical = flag;
504+
return ret;
505+
};
506+
497507
ret.wraparound = function(flag) {
498508
opt.wraparound = flag;
499509
return ret;
@@ -514,6 +524,10 @@
514524
return gpu.createKernel(kernel, opt);
515525
};
516526

527+
ret.getCanvas = function() {
528+
return gpu.getCanvas();
529+
};
530+
517531
return ret;
518532
};
519533

src/gpu.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
/// GPU.JS core class =D
55
///
66
var GPU = (function() {
7-
var gl, canvas;
8-
97
// https://gist.github.com/TooTallNate/4750953
108
function endianness() {
119
var b = new ArrayBuffer(4);
@@ -18,9 +16,12 @@ var GPU = (function() {
1816
}
1917

2018
function GPU(ctx) {
19+
var gl, canvas, canvasCpu;
20+
2121
canvas = undefined;
2222
gl = ctx;
2323
if (gl === undefined) {
24+
canvasCpu = document.createElement('canvas');
2425
canvas = document.createElement('canvas');
2526
canvas.width = 2;
2627
canvas.height = 2;
@@ -38,6 +39,7 @@ var GPU = (function() {
3839

3940
this.gl = gl;
4041
this.canvas = canvas;
42+
this.canvasCpu = canvasCpu;
4143
this.programCache = {};
4244
this.endianness = endianness();
4345

@@ -49,7 +51,11 @@ var GPU = (function() {
4951
return this.gl;
5052
};
5153

52-
GPU.prototype.getCanvas = function() {
54+
GPU.prototype.getCanvas = function(mode) {
55+
if (mode == "cpu") {
56+
return this.canvasCpu;
57+
}
58+
5359
return this.canvas;
5460
};
5561

0 commit comments

Comments
 (0)