|
14 | 14 | #endif
|
15 | 15 | #endif
|
16 | 16 |
|
| 17 | +#ifdef __SSE__ |
17 | 18 | #include <xmmintrin.h>
|
| 19 | +#endif |
18 | 20 |
|
19 | 21 | // h: 0,360
|
20 | 22 | // s: 0,1
|
@@ -146,6 +148,7 @@ unsigned long long ComputeMandelbrot(float *srcReal, float *srcImag, uint32_t *d
|
146 | 148 | return (unsigned long long)((h-y)/yIncr)*w*numIters;
|
147 | 149 | }
|
148 | 150 |
|
| 151 | +#ifdef __SSE__ |
149 | 152 | // Not strictly correct anyzero_ps, but faster, and depends on that color alpha channel is always either 0xFF or 0.
|
150 | 153 | int anyzero_ps(__m128 m)
|
151 | 154 | {
|
@@ -249,6 +252,7 @@ unsigned long long ComputeMandelbrot_SSE(float *srcReal, float *srcImag, uint32_
|
249 | 252 | }
|
250 | 253 | return (unsigned long long)((h-y)/yIncr)*w*numIters;
|
251 | 254 | }
|
| 255 | +#endif |
252 | 256 |
|
253 | 257 | const int W = 512;
|
254 | 258 | const int H = 512;
|
@@ -304,9 +308,11 @@ void *mandelbrot_thread(void *arg)
|
304 | 308 | fputs("hello", handle);
|
305 | 309 | fclose(handle);
|
306 | 310 | #endif
|
| 311 | +#ifdef __SSE__ |
307 | 312 | if (use_sse)
|
308 | 313 | ni = ComputeMandelbrot_SSE(mandelReal, mandelImag, outputImage, sizeof(float)*W, sizeof(uint32_t)*W, 0, idx, numTasks, W, H, left, top, incrX, incrY, numItersDoneOnCanvas, numItersPerFrame);
|
309 | 314 | else
|
| 315 | +#endif |
310 | 316 | ni = ComputeMandelbrot(mandelReal, mandelImag, outputImage, sizeof(float)*W, sizeof(uint32_t)*W, 0, idx, numTasks, W, H, left, top, incrX, incrY, numItersDoneOnCanvas, numItersPerFrame);
|
311 | 317 | //emscripten_atomic_add_u32(&numIters, ni);
|
312 | 318 | double t1 = emscripten_get_now();
|
@@ -335,9 +341,11 @@ void register_tasks()
|
335 | 341 | for(int i = 0; i < numTasks; ++i)
|
336 | 342 | {
|
337 | 343 | double t0 = emscripten_get_now();
|
| 344 | +#ifdef __SSE__ |
338 | 345 | if (use_sse)
|
339 | 346 | numIters[0] += ComputeMandelbrot_SSE(mandelReal, mandelImag, outputImage, sizeof(float)*W, sizeof(uint32_t)*W, W*i/numTasks, 0, 1, W/numTasks, H, left, top, incrX, incrY, numItersDoneOnCanvas, numItersPerFrame);
|
340 | 347 | else
|
| 348 | +#endif |
341 | 349 | numIters[0] += ComputeMandelbrot(mandelReal, mandelImag, outputImage, sizeof(float)*W, sizeof(uint32_t)*W, W*i/numTasks, 0, 1, W/numTasks, H, left, top, incrX, incrY, numItersDoneOnCanvas, numItersPerFrame);
|
342 | 350 | double t1 = emscripten_get_now();
|
343 | 351 | timeSpentInMandelbrot[0] += t1-t0;
|
@@ -551,7 +559,9 @@ int main(int argc, char** argv)
|
551 | 559 | }
|
552 | 560 | #endif
|
553 | 561 |
|
| 562 | +#ifndef SINGLETHREADED |
554 | 563 | emscripten_set_thread_name(pthread_self(), "Mandelbrot main");
|
| 564 | +#endif |
555 | 565 |
|
556 | 566 | EM_ASM("SDL.defaults.copyOnLock = false; SDL.defaults.discardOnLock = true; SDL.defaults.opaqueFrontBuffer = false;");
|
557 | 567 |
|
|
0 commit comments