summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2019-11-10 23:33:04 -0800
committerVito Caputo <vcaputo@pengaru.com>2019-11-10 23:33:04 -0800
commitd2f5a06b00cf020409ca4916dac6fe3d2564d016 (patch)
treea78c37d8b5e357d0a9d1213a951161faaba10696
parent814d6614be19e20fe3db12f3c05d5e8dbcfdd0a1 (diff)
roto: drop roto64, turning roto32 back into roto
Initially I was going to make 32 vs. 64 be a setting, but decided now that SDL is supported it's fairly likely there will be odd fb dimensions (arbitrary window sizes). Since this never really brought anything of significant value, just drop the version that mostly just demonstrated how to pack multiple pixels into a single u64 write to the framebuffer more than anything else.
-rw-r--r--src/modules/roto/roto.c84
-rw-r--r--src/rototiller.c8
2 files changed, 9 insertions, 83 deletions
diff --git a/src/modules/roto/roto.c b/src/modules/roto/roto.c
index e21b971..c5c951d 100644
--- a/src/modules/roto/roto.c
+++ b/src/modules/roto/roto.c
@@ -198,8 +198,8 @@ static void roto_prepare_frame(void *context, unsigned n_cpus, fb_fragment_t *fr
}
-/* Draw a rotating checkered 256x256 texture into fragment. (32-bit version) */
-static void roto32_render_fragment(void *context, fb_fragment_t *fragment)
+/* Draw a rotating checkered 256x256 texture into fragment. */
+static void roto_render_fragment(void *context, fb_fragment_t *fragment)
{
roto_context_t *ctxt = context;
int y_cos_r, y_sin_r, x_cos_r, x_sin_r, x_cos_r_init, x_sin_r_init, cos_r, sin_r;
@@ -248,85 +248,13 @@ static void roto32_render_fragment(void *context, fb_fragment_t *fragment)
}
-/* Draw a rotating checkered 256x256 texture into fragment. (64-bit version) */
-static void roto64_render_fragment(void *context, fb_fragment_t *fragment)
-{
- roto_context_t *ctxt = context;
- int y_cos_r, y_sin_r, x_cos_r, x_sin_r, x_cos_r_init, x_sin_r_init, cos_r, sin_r;
- int x, y, frame_width = fragment->frame_width, frame_height = fragment->frame_height, width = fragment->width;
- uint64_t *buf = (uint64_t *)fragment->buf;
-
- /* This is all done using fixed-point in the hopes of being faster, and yes assumptions
- * are being made WRT the overflow of tx/ty as well, only tested on x86_64. */
- cos_r = FIXED_COS(ctxt->r);
- sin_r = FIXED_SIN(ctxt->r);
-
- /* Vary the colors, this is just a mashup of sinusoidal rgb values. */
- palette[0].r = (FIXED_MULT(FIXED_COS(ctxt->rr), FIXED_NEW(127)) + FIXED_NEW(128));
- palette[0].g = (FIXED_MULT(FIXED_SIN(ctxt->rr / 2), FIXED_NEW(127)) + FIXED_NEW(128));
- palette[0].b = (FIXED_MULT(FIXED_COS(ctxt->rr / 3), FIXED_NEW(127)) + FIXED_NEW(128));
-
- palette[1].r = (FIXED_MULT(FIXED_SIN(ctxt->rr / 2), FIXED_NEW(127)) + FIXED_NEW(128));
- palette[1].g = (FIXED_MULT(FIXED_COS(ctxt->rr / 2), FIXED_NEW(127)) + FIXED_NEW(128));
- palette[1].b = (FIXED_MULT(FIXED_SIN(ctxt->rr), FIXED_NEW(127)) + FIXED_NEW(128));
-
- /* The dimensions are cut in half and negated to center the rotation. */
- /* The [xy]_{sin,cos}_r variables are accumulators to replace multiplication with addition. */
- x_cos_r_init = FIXED_MULT(-FIXED_NEW(frame_width / 2) + FIXED_NEW(fragment->x), cos_r);
- x_sin_r_init = FIXED_MULT(-FIXED_NEW(frame_width / 2) + FIXED_NEW(fragment->x), sin_r);
-
- y_cos_r = FIXED_MULT(-FIXED_NEW(frame_height / 2) + FIXED_NEW(fragment->y), cos_r);
- y_sin_r = FIXED_MULT(-FIXED_NEW(frame_height / 2) + FIXED_NEW(fragment->y), sin_r);
-
- width /= 2; /* Since we're processing 64-bit words (2 pixels) at a time */
-
- for (y = fragment->y; y < fragment->y + fragment->height; y++) {
-
- x_cos_r = x_cos_r_init;
- x_sin_r = x_sin_r_init;
-
- for (x = fragment->x; x < fragment->x + width; x++, buf++) {
- uint64_t p;
-
- p = bilerp_color(texture, palette, x_sin_r - y_cos_r, y_sin_r + x_cos_r);
-
- x_cos_r += cos_r;
- x_sin_r += sin_r;
-
- p |= (uint64_t)(bilerp_color(texture, palette, x_sin_r - y_cos_r, y_sin_r + x_cos_r)) << 32;
-
- *buf = p;
-
- x_cos_r += cos_r;
- x_sin_r += sin_r;
- }
-
- buf = ((void *)buf) + fragment->stride;
- y_cos_r += cos_r;
- y_sin_r += sin_r;
- }
-}
-
-
-rototiller_module_t roto32_module = {
- .create_context = roto_create_context,
- .destroy_context = roto_destroy_context,
- .prepare_frame = roto_prepare_frame,
- .render_fragment = roto32_render_fragment,
- .name = "roto32",
- .description = "Anti-aliased tiled texture rotation (32-bit, threaded)",
- .author = "Vito Caputo <vcaputo@pengaru.com>",
- .license = "GPLv2",
-};
-
-
-rototiller_module_t roto64_module = {
+rototiller_module_t roto_module = {
.create_context = roto_create_context,
.destroy_context = roto_destroy_context,
.prepare_frame = roto_prepare_frame,
- .render_fragment = roto64_render_fragment,
- .name = "roto64",
- .description = "Anti-aliased tiled texture rotation (64-bit, threaded)",
+ .render_fragment = roto_render_fragment,
+ .name = "roto",
+ .description = "Anti-aliased tiled texture rotation (threaded)",
.author = "Vito Caputo <vcaputo@pengaru.com>",
.license = "GPLv2",
};
diff --git a/src/rototiller.c b/src/rototiller.c
index e638fb6..883ea25 100644
--- a/src/rototiller.c
+++ b/src/rototiller.c
@@ -24,7 +24,7 @@
* another page so we can begin rendering another frame before vsync. With
* just two pages we end up twiddling thumbs until the vsync arrives.
*/
-#define DEFAULT_MODULE "roto32"
+#define DEFAULT_MODULE "roto"
#define DEFAULT_VIDEO "sdl"
extern fb_ops_t drm_fb_ops;
@@ -35,16 +35,14 @@ extern rototiller_module_t flui2d_module;
extern rototiller_module_t julia_module;
extern rototiller_module_t pixbounce_module;
extern rototiller_module_t plasma_module;
-extern rototiller_module_t roto32_module;
-extern rototiller_module_t roto64_module;
+extern rototiller_module_t roto_module;
extern rototiller_module_t ray_module;
extern rototiller_module_t sparkler_module;
extern rototiller_module_t stars_module;
extern rototiller_module_t submit_module;
static rototiller_module_t *modules[] = {
- &roto32_module,
- &roto64_module,
+ &roto_module,
&ray_module,
&sparkler_module,
&stars_module,
© All Rights Reserved