From 17beb406f2033ef522b0aebee07bae64317fa8fe Mon Sep 17 00:00:00 2001 From: Vito Caputo Date: Sat, 30 Apr 2022 10:13:23 -0700 Subject: til_fb: add draw flags for controlling texturability Just adds TIL_FB_DRAW_FLAG_TEXTURABLE so callers can granularly inhibit texturing if desired. --- src/libs/txt/txt.c | 2 +- src/modules/blinds/blinds.c | 4 ++-- src/modules/checkers/checkers.c | 2 +- src/modules/drizzle/drizzle.c | 2 +- src/modules/flui2d/flui2d.c | 2 +- src/modules/meta2d/meta2d.c | 2 +- src/modules/pixbounce/pixbounce.c | 2 +- src/modules/plato/plato.c | 4 ++-- src/modules/snow/snow.c | 2 +- src/modules/sparkler/particles.c | 4 ++-- src/modules/sparkler/rocket.c | 2 +- src/modules/sparkler/simple.c | 2 +- src/modules/sparkler/spark.c | 2 +- src/modules/sparkler/xplode.c | 2 +- src/modules/spiro/spiro.c | 12 ++++++------ src/modules/stars/stars.c | 4 ++-- src/modules/submit/submit.c | 4 ++-- src/modules/swab/swab.c | 2 +- src/modules/swarm/swarm.c | 6 +++--- src/til_fb.h | 20 +++++++++++--------- 20 files changed, 42 insertions(+), 40 deletions(-) (limited to 'src') diff --git a/src/libs/txt/txt.c b/src/libs/txt/txt.c index 02b753f..e1923b9 100644 --- a/src/libs/txt/txt.c +++ b/src/libs/txt/txt.c @@ -159,7 +159,7 @@ static inline void draw_char(til_fb_fragment_t *fragment, uint32_t color, int x, for (int i = 0; i < ASCII_HEIGHT; i++) { for (int j = 0; j < ASCII_WIDTH; j++) { if (ascii_chars[c][i * ASCII_WIDTH + j]) - til_fb_fragment_put_pixel_checked(fragment, x + j, y + i, color); + til_fb_fragment_put_pixel_checked(fragment, 0, x + j, y + i, color); } } } diff --git a/src/modules/blinds/blinds.c b/src/modules/blinds/blinds.c index 0a8342e..c4a94c9 100644 --- a/src/modules/blinds/blinds.c +++ b/src/modules/blinds/blinds.c @@ -69,7 +69,7 @@ static inline void draw_blind_horizontal(til_fb_fragment_t *fragment, unsigned r /* XXX FIXME: use faster block style fill/copy if til_fb gets that */ for (unsigned y = 0; y < height; y++) { for (unsigned x = 0; x < fragment->width; x++) - til_fb_fragment_put_pixel_unchecked(fragment, fragment->x + x, fragment->y + y + row * row_height, 0xffffffff); + til_fb_fragment_put_pixel_unchecked(fragment, TIL_FB_DRAW_FLAG_TEXTURABLE, fragment->x + x, fragment->y + y + row * row_height, 0xffffffff); } } @@ -83,7 +83,7 @@ static inline void draw_blind_vertical(til_fb_fragment_t *fragment, unsigned col /* XXX FIXME: use faster block style fill/copy if til_fb gets that */ for (unsigned y = 0; y < fragment->height; y++) { for (unsigned x = 0; x < width; x++) - til_fb_fragment_put_pixel_unchecked(fragment, fragment->x + x + column * column_width, fragment->y + y, 0xffffffff); + til_fb_fragment_put_pixel_unchecked(fragment, TIL_FB_DRAW_FLAG_TEXTURABLE, fragment->x + x + column * column_width, fragment->y + y, 0xffffffff); } } diff --git a/src/modules/checkers/checkers.c b/src/modules/checkers/checkers.c index ba5f4c7..27da42b 100644 --- a/src/modules/checkers/checkers.c +++ b/src/modules/checkers/checkers.c @@ -147,7 +147,7 @@ static void checkers_render_fragment(void *context, unsigned ticks, unsigned cpu if (!state) til_fb_fragment_clear(fragment); else - til_fb_fragment_fill(fragment, 0xffffffff); + til_fb_fragment_fill(fragment, TIL_FB_DRAW_FLAG_TEXTURABLE, 0xffffffff); } diff --git a/src/modules/drizzle/drizzle.c b/src/modules/drizzle/drizzle.c index 4fb62f6..5717bc7 100644 --- a/src/modules/drizzle/drizzle.c +++ b/src/modules/drizzle/drizzle.c @@ -146,7 +146,7 @@ static void drizzle_render_fragment(void *context, unsigned ticks, unsigned cpu, color.z = puddle_sample(ctxt->puddle, &coord); pixel = color_to_uint32(color); - til_fb_fragment_put_pixel_unchecked(fragment, x, y, pixel); + til_fb_fragment_put_pixel_unchecked(fragment, 0, x, y, pixel); coord.x += xf; } diff --git a/src/modules/flui2d/flui2d.c b/src/modules/flui2d/flui2d.c index dae73d8..f8afffb 100644 --- a/src/modules/flui2d/flui2d.c +++ b/src/modules/flui2d/flui2d.c @@ -376,7 +376,7 @@ static void flui2d_render_fragment(void *context, unsigned ticks, unsigned cpu, dx1 += ctxt->fluid.dens_b[(int)IX(x1, y1)] * (X - x0); b = dx0 * (1.f - (Y - y0)) + dx1 * (Y - y0); - til_fb_fragment_put_pixel_unchecked(fragment, x, y, gamma_color_to_uint32_rgb(r, g, b)); + til_fb_fragment_put_pixel_unchecked(fragment, 0, x, y, gamma_color_to_uint32_rgb(r, g, b)); } } } diff --git a/src/modules/meta2d/meta2d.c b/src/modules/meta2d/meta2d.c index 01bbc58..24af28c 100644 --- a/src/modules/meta2d/meta2d.c +++ b/src/modules/meta2d/meta2d.c @@ -206,7 +206,7 @@ static void meta2d_render_fragment(void *context, unsigned ticks, unsigned cpu, color = (v3f_t){}; pixel = color_to_uint32(color); - til_fb_fragment_put_pixel_unchecked(fragment, x, y, pixel); + til_fb_fragment_put_pixel_unchecked(fragment, 0, x, y, pixel); } } } diff --git a/src/modules/pixbounce/pixbounce.c b/src/modules/pixbounce/pixbounce.c index e864763..b8b2572 100644 --- a/src/modules/pixbounce/pixbounce.c +++ b/src/modules/pixbounce/pixbounce.c @@ -218,7 +218,7 @@ static void pixbounce_render_fragment(void *context, unsigned ticks, unsigned cp int pix_offset = ((cursor_y/ctxt->multiplier)*pix_width) + (cursor_x/ctxt->multiplier); if(pix_map[ctxt->pix_num][pix_offset] == 0) continue; til_fb_fragment_put_pixel_unchecked( - fragment, ctxt->x+cursor_x, ctxt->y+cursor_y, + fragment, TIL_FB_DRAW_FLAG_TEXTURABLE, ctxt->x+cursor_x, ctxt->y+cursor_y, ctxt->color ); } diff --git a/src/modules/plato/plato.c b/src/modules/plato/plato.c index 163a785..18f02e3 100644 --- a/src/modules/plato/plato.c +++ b/src/modules/plato/plato.c @@ -563,7 +563,7 @@ static void draw_line(til_fb_fragment_t *fragment, int x1, int y1, int x2, int y minor -= x_delta; } - til_fb_fragment_put_pixel_checked(fragment, x1, y1, 0xffffffff); + til_fb_fragment_put_pixel_checked(fragment, TIL_FB_DRAW_FLAG_TEXTURABLE, x1, y1, 0xffffffff); } } else { /* Y-major */ @@ -573,7 +573,7 @@ static void draw_line(til_fb_fragment_t *fragment, int x1, int y1, int x2, int y minor -= y_delta; } - til_fb_fragment_put_pixel_checked(fragment, x1, y1, 0xffffffff); + til_fb_fragment_put_pixel_checked(fragment, TIL_FB_DRAW_FLAG_TEXTURABLE, x1, y1, 0xffffffff); } } } diff --git a/src/modules/snow/snow.c b/src/modules/snow/snow.c index dc49a1a..8befc92 100644 --- a/src/modules/snow/snow.c +++ b/src/modules/snow/snow.c @@ -60,7 +60,7 @@ static void snow_render_fragment(void *context, unsigned ticks, unsigned cpu, ti uint32_t pixel = rand_r(seed) % 256; #endif - til_fb_fragment_put_pixel_unchecked(fragment, x, y, pixel << 16 | pixel << 8 | pixel); + til_fb_fragment_put_pixel_unchecked(fragment, 0, x, y, pixel << 16 | pixel << 8 | pixel); } } } diff --git a/src/modules/sparkler/particles.c b/src/modules/sparkler/particles.c index a567cea..2389e93 100644 --- a/src/modules/sparkler/particles.c +++ b/src/modules/sparkler/particles.c @@ -265,7 +265,7 @@ static void draw_line(til_fb_fragment_t *fragment, int x1, int y1, int x2, int y minor -= x_delta; } - til_fb_fragment_put_pixel_checked(fragment, x1, y1, 0xffffffff); + til_fb_fragment_put_pixel_checked(fragment, TIL_FB_DRAW_FLAG_TEXTURABLE, x1, y1, 0xffffffff); } } else { /* Y-major */ @@ -275,7 +275,7 @@ static void draw_line(til_fb_fragment_t *fragment, int x1, int y1, int x2, int y minor -= y_delta; } - til_fb_fragment_put_pixel_checked(fragment, x1, y1, 0xffffffff); + til_fb_fragment_put_pixel_checked(fragment, TIL_FB_DRAW_FLAG_TEXTURABLE, x1, y1, 0xffffffff); } } } diff --git a/src/modules/sparkler/rocket.c b/src/modules/sparkler/rocket.c index 3885304..0949d30 100644 --- a/src/modules/sparkler/rocket.c +++ b/src/modules/sparkler/rocket.c @@ -129,7 +129,7 @@ static void rocket_draw(particles_t *particles, const particles_conf_t *conf, pa /* kill off parts that wander off screen */ return; - til_fb_fragment_put_pixel_unchecked(f, x, y, 0xff0000); + til_fb_fragment_put_pixel_unchecked(f, 0, x, y, 0xff0000); } diff --git a/src/modules/sparkler/simple.c b/src/modules/sparkler/simple.c index 14c5d49..78e415b 100644 --- a/src/modules/sparkler/simple.c +++ b/src/modules/sparkler/simple.c @@ -104,7 +104,7 @@ static void simple_draw(particles_t *particles, const particles_conf_t *conf, pa /* immediately kill off stars that wander off screen */ return; - til_fb_fragment_put_pixel_unchecked(f, x, y, makergb(0xff, 0xff, 0xff, ((float)ctxt->longevity / ctxt->lifetime))); + til_fb_fragment_put_pixel_unchecked(f, 0, x, y, makergb(0xff, 0xff, 0xff, ((float)ctxt->longevity / ctxt->lifetime))); } diff --git a/src/modules/sparkler/spark.c b/src/modules/sparkler/spark.c index 8eff728..8627baa 100644 --- a/src/modules/sparkler/spark.c +++ b/src/modules/sparkler/spark.c @@ -54,7 +54,7 @@ static void spark_draw(particles_t *particles, const particles_conf_t *conf, par /* offscreen */ return; - til_fb_fragment_put_pixel_unchecked(f, x, y, makergb(0xff, 0xa0, 0x20, ((float)ctxt->longevity / ctxt->lifetime))); + til_fb_fragment_put_pixel_unchecked(f, 0, x, y, makergb(0xff, 0xa0, 0x20, ((float)ctxt->longevity / ctxt->lifetime))); } diff --git a/src/modules/sparkler/xplode.c b/src/modules/sparkler/xplode.c index 931ec83..31f56fd 100644 --- a/src/modules/sparkler/xplode.c +++ b/src/modules/sparkler/xplode.c @@ -72,7 +72,7 @@ static void xplode_draw(particles_t *particles, const particles_conf_t *conf, pa color = makergb(0xff, 0xff, 0x00, ((float)ctxt->longevity / ctxt->lifetime)); } - til_fb_fragment_put_pixel_unchecked(f, x, y, color); + til_fb_fragment_put_pixel_unchecked(f, 0, x, y, color); } diff --git a/src/modules/spiro/spiro.c b/src/modules/spiro/spiro.c index f588638..b51b22d 100644 --- a/src/modules/spiro/spiro.c +++ b/src/modules/spiro/spiro.c @@ -91,7 +91,7 @@ static void spiro_render_fragment(void *context, unsigned ticks, unsigned cpu, t float my_y=((1.f-k)*sinf(t))-(l*k*sinf(((1.f-k)/k)*t)); int pos_x=display_origin_x+(my_x*display_R); int pos_y=display_origin_y+(my_y*display_R); - til_fb_fragment_put_pixel_unchecked(fragment, pos_x, pos_y, + til_fb_fragment_put_pixel_unchecked(fragment, TIL_FB_DRAW_FLAG_TEXTURABLE, pos_x, pos_y, makergb(sinf(M_1_PI*t)*127+128, sinf(M_1_PI*t+(2*M_PI*.333333333333f))*127+128, sinf(M_1_PI*t+(4*M_PI*.333333333333f))*127+128, @@ -100,31 +100,31 @@ static void spiro_render_fragment(void *context, unsigned ticks, unsigned cpu, t #ifdef DEBUG /* plot the origin point */ - til_fb_fragment_put_pixel_unchecked(fragment, display_origin_x, display_origin_y, + til_fb_fragment_put_pixel_unchecked(fragment, 0, display_origin_x, display_origin_y, makergb(0xFF, 0xFF, 0x00, 1)); /* plot the fixed outer circle C0 */ for(float a=0.f; a<2*M_PI; a+= M_PI_2/display_R) { int pos_x=display_origin_x+(cosf(a)*display_R); int pos_y=display_origin_y+(sinf(a)*display_R); - til_fb_fragment_put_pixel_unchecked(fragment, pos_x, pos_y, + til_fb_fragment_put_pixel_unchecked(fragment, 0, pos_x, pos_y, makergb(0xFF, 0xFF, 0x00, 1)); } /* plot inner circle Ci */ - til_fb_fragment_put_pixel_unchecked(fragment, display_origin_x+display_R-(ctxt->r*display_R), + til_fb_fragment_put_pixel_unchecked(fragment, 0, display_origin_x+display_R-(ctxt->r*display_R), display_origin_y, makergb(0xFF, 0xFF, 0x00, 1)); for(float a=0.f; a<2*M_PI; a+= M_PI_2/display_R) { int pos_x=display_origin_x+display_R-(ctxt->r*display_R)+ (cosf(a)*ctxt->r*display_R); int pos_y=display_origin_y+(sinf(a)*ctxt->r*display_R); - til_fb_fragment_put_pixel_unchecked(fragment, pos_x, pos_y, + til_fb_fragment_put_pixel_unchecked(fragment, 0, pos_x, pos_y, makergb(0xFF, 0xFF, 0x00, 1)); } /* plot p */ - til_fb_fragment_put_pixel_unchecked(fragment, display_origin_x+display_R-(ctxt->r*display_R)+ + til_fb_fragment_put_pixel_unchecked(fragment, 0, display_origin_x+display_R-(ctxt->r*display_R)+ (ctxt->p*display_R), display_origin_y, makergb(0xFF, 0xFF, 0x00, 1)); #endif diff --git a/src/modules/stars/stars.c b/src/modules/stars/stars.c index 43e7622..e975c7c 100644 --- a/src/modules/stars/stars.c +++ b/src/modules/stars/stars.c @@ -159,7 +159,7 @@ static void stars_render_fragment(void *context, unsigned ticks, unsigned cpu, t opacity = 1; if (pos_x>0 && pos_x0 && pos_yx + x)) * xscale, .5f + ((float)(fragment->y + y)) * yscale); - til_fb_fragment_put_pixel_unchecked(fragment, fragment->x + x, fragment->y + y, color); + til_fb_fragment_put_pixel_unchecked(fragment, 0, fragment->x + x, fragment->y + y, color); } } } @@ -217,7 +217,7 @@ static void draw_grid_bilerp(submit_context_t *ctxt, til_fb_fragment_t *fragment /* TODO: this could be optimized a bit! i.e. don't recompute the y for every x etc. */ color = sample_grid_bilerp(ctxt, .5f + ((float)(fragment->x + x)) * xscale, .5f + ((float)(fragment->y + y)) * yscale); - til_fb_fragment_put_pixel_unchecked(fragment, fragment->x + x, fragment->y + y, color); + til_fb_fragment_put_pixel_unchecked(fragment, 0, fragment->x + x, fragment->y + y, color); } } } diff --git a/src/modules/swab/swab.c b/src/modules/swab/swab.c index 8c71049..90f7a36 100644 --- a/src/modules/swab/swab.c +++ b/src/modules/swab/swab.c @@ -127,7 +127,7 @@ static void swab_render_fragment(void *context, unsigned ticks, unsigned cpu, ti color.b = din(ctxt->din, &(v3f_t){ .x = xscaled * .81f, .y = yscaled * .81f, .z = z2 }) * t; pixel = color_to_uint32(color); - til_fb_fragment_put_pixel_unchecked(fragment, x, y, pixel); + til_fb_fragment_put_pixel_unchecked(fragment, 0, x, y, pixel); } } } diff --git a/src/modules/swarm/swarm.c b/src/modules/swarm/swarm.c index e2381ab..2d37e28 100644 --- a/src/modules/swarm/swarm.c +++ b/src/modules/swarm/swarm.c @@ -333,7 +333,7 @@ static void swarm_draw_as_points(swarm_context_t *ctxt, til_fb_fragment_t *fragm boid_t *b = &ctxt->boids[i]; v2f_t nc = swarm_scale(swarm_project_point(ctxt, &b->position), scale); - til_fb_fragment_put_pixel_checked(fragment, nc.x, nc.y, color); + til_fb_fragment_put_pixel_checked(fragment, TIL_FB_DRAW_FLAG_TEXTURABLE, nc.x, nc.y, color); } } @@ -357,7 +357,7 @@ static void draw_line_unchecked(til_fb_fragment_t *fragment, int x1, int y1, int minor -= x_delta; } /* XXX FIXME: segfaults occasionally when _unchecked !!! */ - til_fb_fragment_put_pixel_checked(fragment, x1, y1, color); + til_fb_fragment_put_pixel_checked(fragment, TIL_FB_DRAW_FLAG_TEXTURABLE, x1, y1, color); } } else { /* Y-major */ @@ -368,7 +368,7 @@ static void draw_line_unchecked(til_fb_fragment_t *fragment, int x1, int y1, int } /* XXX FIXME: segfaults occasionally when _unchecked !!! */ - til_fb_fragment_put_pixel_checked(fragment, x1, y1, color); + til_fb_fragment_put_pixel_checked(fragment, TIL_FB_DRAW_FLAG_TEXTURABLE, x1, y1, color); } } } diff --git a/src/til_fb.h b/src/til_fb.h index 3ebede7..a9636e4 100644 --- a/src/til_fb.h +++ b/src/til_fb.h @@ -11,6 +11,8 @@ typedef struct til_fb_fragment_t til_fb_fragment_t; +#define TIL_FB_DRAW_FLAG_TEXTURABLE 0x1 + /* All renderers should target fb_fragment_t, which may or may not represent * a full-screen mmap. Helpers are provided for subdividing fragments for * concurrent renderers. @@ -83,9 +85,9 @@ static inline uint32_t til_fb_fragment_get_pixel_unchecked(til_fb_fragment_t *fr /* puts a pixel into the fragment, no bounds checking is performed. */ -static inline void til_fb_fragment_put_pixel_unchecked(til_fb_fragment_t *fragment, int x, int y, uint32_t pixel) +static inline void til_fb_fragment_put_pixel_unchecked(til_fb_fragment_t *fragment, uint32_t flags, int x, int y, uint32_t pixel) { - if (fragment->texture) + if (fragment->texture && (flags & TIL_FB_DRAW_FLAG_TEXTURABLE)) pixel = til_fb_fragment_get_pixel_unchecked(fragment->texture, x, y); fragment->buf[(y - fragment->y) * fragment->pitch + x - fragment->x] = pixel; @@ -93,19 +95,19 @@ static inline void til_fb_fragment_put_pixel_unchecked(til_fb_fragment_t *fragme /* puts a pixel into the fragment, bounds checking is performed with a draw performed return status */ -static inline int til_fb_fragment_put_pixel_checked(til_fb_fragment_t *fragment, int x, int y, uint32_t pixel) +static inline int til_fb_fragment_put_pixel_checked(til_fb_fragment_t *fragment, uint32_t flags, int x, int y, uint32_t pixel) { if (!til_fb_fragment_contains(fragment, x, y)) return 0; - til_fb_fragment_put_pixel_unchecked(fragment, x, y, pixel); + til_fb_fragment_put_pixel_unchecked(fragment, flags, x, y, pixel); return 1; } /* copy a fragment, x,y,width,height are absolute coordinates within the frames, and will be clipped to the overlapping fragment areas */ -static inline void til_fb_fragment_copy(til_fb_fragment_t *dest, int x, int y, int width, int height, til_fb_fragment_t *src) +static inline void til_fb_fragment_copy(til_fb_fragment_t *dest, uint32_t flags, int x, int y, int width, int height, til_fb_fragment_t *src) { int X = MAX(dest->x, src->x); int Y = MAX(dest->y, src->y); @@ -123,7 +125,7 @@ static inline void til_fb_fragment_copy(til_fb_fragment_t *dest, int x, int y, i /* XXX FIXME TODO */ for (int v = 0; v < H; v++) { for (int u = 0; u < W; u++) - til_fb_fragment_put_pixel_unchecked(dest, X + u, Y + v, til_fb_fragment_get_pixel_unchecked(src, X + u, Y + v)); + til_fb_fragment_put_pixel_unchecked(dest, flags, X + u, Y + v, til_fb_fragment_get_pixel_unchecked(src, X + u, Y + v)); } } @@ -142,13 +144,13 @@ static inline void _til_fb_fragment_fill(til_fb_fragment_t *fragment, uint32_t p /* fill a fragment with an arbitrary pixel */ -static inline void til_fb_fragment_fill(til_fb_fragment_t *fragment, uint32_t pixel) +static inline void til_fb_fragment_fill(til_fb_fragment_t *fragment, uint32_t flags, uint32_t pixel) { - if (!fragment->texture) + if (!(fragment->texture && (flags & TIL_FB_DRAW_FLAG_TEXTURABLE))) return _til_fb_fragment_fill(fragment, pixel); /* when a texture is present, pixel is ignored and instead sourced from fragment->texture->buf[y*pitch+x] */ - til_fb_fragment_copy(fragment, fragment->x, fragment->y, fragment->width, fragment->height, fragment->texture); + til_fb_fragment_copy(fragment, flags, fragment->x, fragment->y, fragment->width, fragment->height, fragment->texture); } -- cgit v1.2.1