Various small changes to save memory.
authorethereal <ethereal@ethv.net>
Wed, 24 Jun 2015 20:03:46 +0000 (20:03 +0000)
committerethereal <ethereal@ethv.net>
Wed, 24 Jun 2015 20:03:46 +0000 (20:03 +0000)
src/ecommon.h
src/ecore/ecore.c
src/ecore/render.c
src/ecore/rreq.c
src/ewrap/main.c

index f217cdc..17b24eb 100644 (file)
@@ -47,14 +47,7 @@ typedef struct __attribute__((packed)) {
     uint32_t generation;
     uint32_t finished;
 
-    uint32_t msg[16];
-
     shm_cam_t cam;
-
-    float cam_basis_x[4];
-    float cam_basis_y[4];
-
-    float cam_origin[4];
 } shm_region_t;
 
 #endif
index 051c16a..a2b1e6a 100644 (file)
@@ -6,8 +6,6 @@
 e_memseg_t shared_mem;
 volatile shm_region_t *shm_region;
 
-//int __errno;
-
 void *memcpy(void *dst, const void *src, size_t n) {
     uint8_t *dst8 = dst;
     const uint8_t *src8 = src;
@@ -25,28 +23,22 @@ int main() {
 
     setup_range_request();
 
-    e_coreid_t eid = e_get_coreid();
-    unsigned x, y;
-    e_coords_from_coreid(eid, &x, &y);
+    int id;
+    {
+        /* don't need these variables cluttering up the stack. */
+        e_coreid_t eid = e_get_coreid();
+        unsigned x, y;
+        e_coords_from_coreid(eid, &x, &y);
+        id = y*e_group_config.group_rows + x;
+    }
 
     e_irq_global_mask(E_FALSE);
     e_irq_mask(E_USER_INT, E_FALSE);
     e_irq_mask(E_MESSAGE_INT, E_FALSE);
 
-    int id = y*e_group_config.group_rows + x;
     while(1) {
         request_new_range(id);
 
-        /*for(int i = 0; i < 0x1000; i ++) {
-            *((uint32_t *)shared_mem.ephy_base + 0x200/4 + i) = 1;
-        }*/
-        /*for(int i = render_start; i < render_end; i ++) {
-            *((uint32_t *)shared_mem.ephy_base + 0x200/4 + i) = id+1;
-        }
-        while(1) {}*/
-
-        //shm_region->msg[id] = ++ind;
-
         render_range();
     }
 
index 7833f3f..55708d4 100644 (file)
@@ -3,7 +3,6 @@
 #include "../vmath.h"
 
 uint32_t render_start, render_end;
-/*uint8_t __attribute__((section(".data_bank2"))) in_buffer[0x2000];*/
 uint8_t in_buffer[0x2000];
 void *in_buffer_ptr = in_buffer;
 
@@ -26,15 +25,13 @@ int sphere_intersect(shm_sph_t *sph, vector_t *ray, vector_t *dir,
     sub_vectors(ray, &pos, &pos);
     
     float b = 2*(dot_vectors(&pos, dir));
-    float c = dot_vectors(&pos, &pos) - sph->r*sph->r;
-
-    float dis = b*b - 4*c;
+    float dis = b*b - 4*(dot_vectors(&pos, &pos) - sph->r*sph->r);
     if(dis < 0) return 0;
 
-    float ds = sqrtf(dis);
+    dis = sqrtf(dis);
 
-    float i1 = (-b - ds)/2.0;
-    float i2 = (-b + ds)/2.0;
+    float i1 = (-b - dis)/2.0;
+    float i2 = (-b + dis)/2.0;
 
     if(i1>i2) {
         float t = i1;
@@ -71,11 +68,6 @@ vector_t trace(vector_t *ray, vector_t *dir, int depth) {
         ret.c[0] = ret.c[1] = ret.c[2] = ret.c[3] = 0.0;
         return ret;
     }
-    /*else {
-        vector_t ret;
-        ret.c[0] = ret.c[1] = ret.c[2] = ret.c[3] = 1.0;
-        return ret;
-    }*/
 
     /* We have an intersection. */
     vector_t intersection;
@@ -106,11 +98,11 @@ vector_t trace(vector_t *ray, vector_t *dir, int depth) {
 
         set_vector(&r, 0.0, 0.0, -1.0, 0.0);
 
-        vector_t rloc;
-        mul_vector(&r, 1000, &rloc);
-        add_vectors(&rloc, &intersection, &rloc);
+        /*vector_t rloc;
+        mul_vector(&r, 1e-2, &rloc);
+        add_vectors(&rloc, &intersection, &rloc);*/
         
-        ret = trace(&rloc, &r, depth-1);
+        ret = trace(&intersection, &r, depth-1);
         mul_vector(&ret, mat->ref, &ret);
     }
 
@@ -146,7 +138,7 @@ vector_t trace(vector_t *ray, vector_t *dir, int depth) {
         ret.c[0] += diffuse * mat->r * lights[i].r;
         ret.c[1] += diffuse * mat->g * lights[i].g;
         ret.c[2] += diffuse * mat->b * lights[i].b;
-        
+
         /* apply specular */
         vector_t r;
         mul_vector(&normal, -2 * dot_vectors(&normal, &ldir), &r);
@@ -194,20 +186,6 @@ void render_range() {
     set_vector(&cam_basisy, 0.0, -1.0, 0.0, 0.0);
     rotate_vector(&cam_rot, &cam_basisy, &cam_basisy);
 
-    shm_region->cam_origin[0] = cam_plane.c[0];
-    shm_region->cam_origin[1] = cam_plane.c[1];
-    shm_region->cam_origin[2] = cam_plane.c[2];
-    shm_region->cam_origin[3] = cam_plane.c[3];
-    
-    shm_region->cam_basis_x[0] = cam_basisx.c[0];
-    shm_region->cam_basis_x[1] = cam_basisx.c[1];
-    shm_region->cam_basis_x[2] = cam_basisx.c[2];
-    shm_region->cam_basis_x[3] = cam_basisx.c[3];
-    shm_region->cam_basis_y[0] = cam_basisy.c[0];
-    shm_region->cam_basis_y[1] = cam_basisy.c[1];
-    shm_region->cam_basis_y[2] = cam_basisy.c[2];
-    shm_region->cam_basis_y[3] = cam_basisy.c[3];
-
     unsigned ix = render_start % buf_region->width;
     unsigned iy = render_start / buf_region->width;
 
@@ -216,23 +194,25 @@ void render_range() {
         float y = (iy / (float)buf_region->height) - 0.5;
         
         /* Calculate ray direction. */
-        vector_t ray_dir, temp;
-        mul_vector(&cam_basisx, x, &ray_dir);
-        mul_vector(&cam_basisy, y, &temp);
-        add_vectors(&temp, &ray_dir, &ray_dir);
-        add_vectors(&ray_dir, &cam_plane, &ray_dir);
-        norm_vector(&ray_dir);
+        vector_t ray_dir;
+        {
+            vector_t temp;
+            mul_vector(&cam_basisx, x, &ray_dir);
+            mul_vector(&cam_basisy, y, &temp);
+            add_vectors(&temp, &ray_dir, &ray_dir);
+            add_vectors(&ray_dir, &cam_plane, &ray_dir);
+            norm_vector(&ray_dir);
+        }
 
         /* Begin trace */
-        vector_t col = trace(&cam_pos, &ray_dir, 3);
+        vector_t col = trace(&cam_pos, &ray_dir, 2);
 
         /* Write back result into framebuffer. */
-        uint32_t result = 0;
-        result |= (int)(col.c[0] * 255);
-        result |= (int)(col.c[1] * 255) << 8;
-        result |= (int)(col.c[2] * 255) << 16;
-
-        write_render_result(result);
+        write_render_result(
+            ((int)(col.c[0] * 255))
+            | ((int)(col.c[1] * 255) << 8)
+            | ((int)(col.c[2] * 255) << 16)
+        );
         /* Done, next pixel! */
         render_start ++;
         ix ++;
index af72615..c3114a0 100644 (file)
@@ -23,17 +23,17 @@ void handle_range_request(int id) {
     uint8_t target_r = id%e_group_config.group_rows;
     uint8_t target_c = id/e_group_config.group_rows;
 
-    // assign target core a rendering range
-    uint32_t len = range_end - range_start;
-    if(len > NUM_OUT_ELEMENTS) len = NUM_OUT_ELEMENTS;
-    uint32_t target_range_start = range_start;
-    uint32_t target_range_end = range_start + len;
-    range_start += len;
-
-    e_write(&e_group_config, &target_range_start, target_r, target_c,
-        &render_start, 4);
-    e_write(&e_group_config, &target_range_end, target_r, target_c,
-        &render_end, 4);
+    {
+        // assign target core a rendering range
+        uint32_t len = range_end - range_start;
+        if(len > NUM_OUT_ELEMENTS) len = NUM_OUT_ELEMENTS;
+
+        e_write(&e_group_config, &range_start, target_r, target_c,
+            &render_start, 4);
+        range_start += len;
+        e_write(&e_group_config, &range_start, target_r, target_c,
+            &render_end, 4);
+    }
 
     // do cross-core read of current generation to check if it's up to date
     uint32_t target_generation;
@@ -107,8 +107,10 @@ void setup_range_request() {
 }
 
 void request_new_range(int id) {
-    uint8_t one = 1;
-    e_write(&e_group_config, &one, 0, 0, range_requests + id, 1);
+    {
+        uint8_t one = 1;
+        e_write(&e_group_config, &one, 0, 0, range_requests + id, 1);
+    }
 
     message_intr = 0;
     e_irq_set(0, 0, E_USER_INT);
index 21784f6..9dd0e0c 100644 (file)
@@ -81,7 +81,7 @@ int main() {
     material->shininess = 1.0;
     material->sr = material->sg = material->sb = 1.0;
     material->a = material->s = material->d = 1.0;
-    material->ref = 0.0;
+    material->ref = 0.1;
 
     material ++;
     material->r = material->b = 0.0;
@@ -89,7 +89,7 @@ int main() {
     material->shininess = 1.0;
     material->sr = material->sg = material->sb = 1.0;
     material->a = material->s = material->d = 1.0;
-    material->ref = 0.0;
+    material->ref = 0.1;
 
     shm_region->sph_count = 2;
     shm_region->sph_off = shm_region->mat_off + sizeof(*material)*shm_region->mat_count;
@@ -147,12 +147,6 @@ int main() {
     printf("\n");
     */
 
-    printf("camera plane basis vectors: (%f,%f,%f,%f) and (%f,%f,%f,%f)\n",
-        shm_region->cam_basis_x[0], shm_region->cam_basis_x[1], shm_region->cam_basis_x[2], shm_region->cam_basis_x[3],
-        shm_region->cam_basis_y[0], shm_region->cam_basis_y[1], shm_region->cam_basis_y[2], shm_region->cam_basis_y[3]);
-    printf("camera plane origin: (%f,%f,%f,%f)\n",
-        shm_region->cam_origin[0], shm_region->cam_origin[1], shm_region->cam_origin[2], shm_region->cam_origin[3]);
-
     FILE *fp = fopen("output.ppm", "w");
     
     fprintf(fp, "P3 %lu %lu 255\n", shm_region->width, shm_region->height);