From deb98475a01a5e62d39109e9b703b567612260da Mon Sep 17 00:00:00 2001 From: Vito Caputo Date: Fri, 16 Jun 2023 19:23:58 -0700 Subject: modules/moire: some simple optimizations Major gain comes from eliminating the cosf() from the inner loop... There's still a bunch left on the table for moire but even just these changes turn 19FPS into 81FPS over here for: '--module=compose,layers=moire\\\,centers\\\=2\,moire\\\,centers\\\=2\,moire\\\,centers\\\=2\,moire\\\,centers\\\=2,texture=none' '--video=mem,size=1366x768' --- src/modules/moire/moire.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) (limited to 'src/modules/moire') diff --git a/src/modules/moire/moire.c b/src/modules/moire/moire.c index f8907af..973fbee 100644 --- a/src/modules/moire/moire.c +++ b/src/modules/moire/moire.c @@ -81,32 +81,34 @@ static void moire_render_fragment(til_module_context_t *context, til_stream_t *s moire_context_t *ctxt = (moire_context_t *)context; til_fb_fragment_t *fragment = *fragment_ptr; - float xf = 2.f / (float)fragment->frame_width; - float yf = 2.f / (float)fragment->frame_height; - float cx, cy; + float xf = 2.f / (float)fragment->frame_width; + float yf = 2.f / (float)fragment->frame_height; + unsigned n_centers = ctxt->setup->n_centers; + moire_center_t *centers = ctxt->centers; + float cx, cy; /* TODO: optimize */ cy = yf * (float)fragment->y - 1.f; - for (int y = fragment->y; y < fragment->y + fragment->height; y++, cy += yf) { + for (int y = 0; y < fragment->height; y++, cy += yf) { cx = xf * (float)fragment->x - 1.f; - for (int x = fragment->x; x < fragment->x + fragment->width; x++, cx += xf) { - int filled = 0; + for (int x = 0; x < fragment->width; x++, cx += xf) { + unsigned char filled = 0; - for (unsigned i = 0; i < ctxt->setup->n_centers; i++) { + for (unsigned i = 0; i < n_centers; i++) { float dx, dy; - dx = cx - ctxt->centers[i].x; - dy = cy - ctxt->centers[i].y; + dx = cx - centers[i].x; + dy = cy - centers[i].y; - if (cosf(sqrtf(dx * dx + dy * dy) * 50.f) < 0.f) + if ((int)((sqrtf(dx * dx + dy * dy)) * 20.f) % 2) filled ^= 1; } if (filled) - til_fb_fragment_put_pixel_unchecked(fragment, TIL_FB_DRAW_FLAG_TEXTURABLE, x, y, 0xffffffff); + til_fb_fragment_put_pixel_unchecked(fragment, TIL_FB_DRAW_FLAG_TEXTURABLE, fragment->x + x, fragment->y + y, 0xffffffff); else if (!fragment->cleared) - til_fb_fragment_put_pixel_unchecked(fragment, 0, x, y, 0x00000000); + til_fb_fragment_put_pixel_unchecked(fragment, 0, fragment->x + x, fragment->y + y, 0x00000000); } } } -- cgit v1.2.1