Fixed several bugs, imported math library.
authorethereal <ethereal@ethv.net>
Wed, 10 Jun 2015 22:32:07 +0000 (22:32 +0000)
committerethereal <ethereal@ethv.net>
Wed, 10 Jun 2015 22:32:07 +0000 (22:32 +0000)
src/ecommon.h
src/ecore/ecore.c
src/ecore/math.c [new file with mode: 0644]
src/ecore/math.h [new file with mode: 0644]
src/ecore/render.c
src/ecore/rreq.c
src/ewrap/main.c

index 377b78e..2e9daec 100644 (file)
@@ -34,12 +34,6 @@ typedef struct __attribute__((packed)) {
     uint32_t finished;
 
     shm_cam_t cam;
-
-    uint32_t msg[16];
-
-    uint32_t interrupts_fired;
-    uint32_t messages_received;
-    uint32_t range_end;
 } shm_region_t;
 
 #endif
index c591f4a..0e940ed 100644 (file)
@@ -23,12 +23,10 @@ int main() {
 
     int id = y*e_group_config.group_rows + x;
     while(1) {
-        shm_region->msg[id] = 1;
         request_new_range(id);
-        shm_region->msg[id] = 9;
 
         for(int i = 0; i < NUM_OUT_ELEMENTS; i ++) {
-            out_buffer_ptr[i] = i+1;
+            out_buffer_ptr[i] = i+1 + (id << 16);
         }
 
         // do rendering
diff --git a/src/ecore/math.c b/src/ecore/math.c
new file mode 100644 (file)
index 0000000..e79cedf
--- /dev/null
@@ -0,0 +1,106 @@
+#include "math.h"
+
+void set_vector(vector_t *v, float x, float y, float z, float w) {
+    v->c[0] = x;
+    v->c[1] = y;
+    v->c[2] = z;
+    v->c[3] = w;
+}
+
+void add_vectors(vector_t *v1, vector_t *v2, vector_t *result) {
+    result->c[0] = v1->c[0] + v2->c[0];
+    result->c[1] = v1->c[1] + v2->c[1];
+    result->c[2] = v1->c[2] + v2->c[2];
+    result->c[3] = v1->c[3] + v2->c[3];
+}
+
+void sub_vectors(vector_t *v1, vector_t *v2, vector_t *result) {
+    result->c[0] = v1->c[0] - v2->c[0];
+    result->c[1] = v1->c[1] - v2->c[1];
+    result->c[2] = v1->c[2] - v2->c[2];
+    result->c[3] = v1->c[3] - v2->c[3];
+}
+
+void mul_vector(vector_t *v, float s, vector_t *result) {
+    result->c[0] = v->c[0] * s;
+    result->c[1] = v->c[1] * s;
+    result->c[2] = v->c[2] * s;
+    result->c[3] = v->c[3] * s;
+}
+
+float dot_vectors(vector_t *v1, vector_t *v2) {
+    return v1->c[0]*v2->c[0] + v1->c[1]*v2->c[1]
+            + v1->c[2]*v2->c[2] + v1->c[3]*v2->c[3];
+}
+
+void cross_vectors(vector_t *v1, vector_t *v2, vector_t *result) {
+    float rx = v1->c[1]*v2->c[2] - v1->c[2]*v2->c[1];
+    float ry = v1->c[2]*v2->c[0] - v1->c[0]*v2->c[2];
+    float rz = v1->c[0]*v2->c[1] - v1->c[1]*v2->c[0];
+    result->c[0] = rx;
+    result->c[1] = ry;
+    result->c[2] = rz;
+}
+
+void project_vector(vector_t *onto, vector_t *v, vector_t *result) {
+    /*
+            cos = v . onto
+            cos = adj/hyp
+
+            
+    */
+    float c = dot_vectors(v, onto) / sqrt(dot_vectors(onto, onto));
+    mul_vector(onto, c, result);
+}
+
+void set_quaternion(vector_t *q, float x, float y, float z, float angle) {
+    float s = sin(angle/2);
+    float c = cos(angle/2);
+    q->c[0] = s*x;
+    q->c[1] = s*y;
+    q->c[2] = s*z;
+    q->c[3] = c;
+}
+
+void set_quaternion_aa(vector_t *q, vector_t *n, float angle) {
+    mul_vector(n, sin(angle/2), q);
+    q->c[3] = cos(angle/2);
+}
+
+void mul_quaternions(vector_t *q1, vector_t *q2, vector_t *result) {
+    /* result = [s1*s2 - v1.v2, s1*v2 + s2*v1 + v1*v2]. */
+
+    float s12 = q1->c[3]*q2->c[3];
+
+    vector_t v, v2;
+
+    vector_t qv1 = *q1;
+    vector_t qv2 = *q2;
+    qv1.c[3] = 0;
+    qv2.c[3] = 0;
+    
+    cross_vectors(&qv1, &qv2, &v2);
+    mul_vector(q1, q2->c[3], &v);
+    mul_vector(q2, q1->c[3], result);
+    
+    add_vectors(result, &v, result);
+    add_vectors(result, &v2, result);
+
+    result->c[3] = s12 - dot_vectors(&qv1, &qv2);
+}
+
+void conj_quaternion(vector_t *q, vector_t *result) {
+    mul_vector(q, -1, result);
+    result->c[3] *= -1;
+}
+
+void rotate_vector(vector_t *q, vector_t *v, vector_t *result) {
+    vector_t qt;
+    conj_quaternion(q, &qt);
+
+    /* Quaternions are associative, thankfully. So: */
+    mul_quaternions(v, &qt, &qt);
+    mul_quaternions(q, &qt, result);
+
+    /* And we end up with result = q*v*q^{conjugate}. */
+}
diff --git a/src/ecore/math.h b/src/ecore/math.h
new file mode 100644 (file)
index 0000000..8985b14
--- /dev/null
@@ -0,0 +1,30 @@
+#ifndef MATH_H
+#define MATH_H
+
+#include <math.h>
+
+/* Four-dimensional affine vector/point. */
+typedef struct vector_t vector_t;
+struct vector_t {
+        float c[4];
+};
+
+/* Vector operations. */
+void set_vector(vector_t *v, float x, float y, float z, float w);
+void add_vectors(vector_t *v1, vector_t *v2, vector_t *result);
+void sub_vectors(vector_t *v1, vector_t *v2, vector_t *result);
+void mul_vector(vector_t *v, float s, vector_t *result);
+float dot_vectors(vector_t *v1, vector_t *v2);
+void cross_vectors(vector_t *v1, vector_t *v2, vector_t *result);
+void project_vector(vector_t *onto, vector_t *v, vector_t *result);
+
+/* Quaternion operations. */
+void set_quaternion(vector_t *q, float x, float y, float z, float angle);
+void set_quaternion_aa(vector_t *q, vector_t *n, float angle);
+
+void mul_quaternions(vector_t *q1, vector_t *q2, vector_t *result);
+void conj_quaternion(vector_t *q, vector_t *result);
+
+void rotate_vector(vector_t *q, vector_t *v, vector_t *result);
+
+#endif
index 582b202..5de99a4 100644 (file)
@@ -13,7 +13,7 @@ void render_finished() {
     e_dma_desc_t desc;
     e_dma_set_desc(E_DMA_1, E_DMA_ENABLE | E_DMA_WORD | E_DMA_MASTER, NULL,
         4, 4, NUM_OUT_ELEMENTS, 1, 0, 0, out_buffer,
-        (uint8_t *)shared_mem.ephy_base + shm_region->fb_off + render_start,
+        (uint8_t *)shared_mem.ephy_base + shm_region->fb_off + render_start*4,
         &desc);
     e_dma_start(&desc, E_DMA_1);
     e_dma_wait(E_DMA_1);
index fbefdd3..50264ee 100644 (file)
@@ -12,13 +12,11 @@ e_dma_desc_t __attribute__((aligned(8))) dma_desc;
 
 
 void handle_range_request(int id) {
-    shm_region->msg[id] = 6;
     if(range_start >= range_end) {
         // set core to be marked as idle
         idle_cores |= (1<<id);
         return;
     }
-    shm_region->msg[id] = 7;
     range_requests[id] = 0;
 
     uint8_t target_r = id%e_group_config.group_rows;
@@ -29,6 +27,7 @@ void handle_range_request(int id) {
     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);
@@ -40,9 +39,7 @@ void handle_range_request(int id) {
     e_read(&e_group_config, &target_generation, target_r, target_c,
         &current_generation, 4);
 
-    shm_region->msg[id] = 8;
     if(target_generation != shm_region->generation) {
-        shm_region->msg[id] = 16 + target_generation;
         // first update generation ID
         e_write(&e_group_config, &shm_region->generation, target_r, target_c,
             &current_generation, 4);
@@ -76,8 +73,6 @@ void handle_range_request(int id) {
 void __attribute((interrupt)) range_request_handler(
     int __attribute__((unused)) irq) {
 
-    shm_region->interrupts_fired ++;
-
     // clear ILAT entry to accept other pending requests
     e_reg_write(E_REG_ILATCL, 1<<9);
 
@@ -97,7 +92,6 @@ void __attribute((interrupt)) range_request_handler(
         shm_region->finished = 0;
         // set up rendering range appropriately
         range_start = 0, range_end = shm_region->height*shm_region->width;
-        shm_region->range_end = range_end;
         // trigger handler again
         e_reg_write(E_REG_ILATST, 1<<9);
     }
@@ -105,7 +99,6 @@ void __attribute((interrupt)) range_request_handler(
 
 void __attribute((interrupt)) message_handler() {
     message_intr = 1;
-    shm_region->messages_received ++;
 }
 
 void setup_range_request() {
@@ -122,6 +115,5 @@ void request_new_range(int id) {
 
     message_intr = 0;
     e_irq_set(0, 0, E_USER_INT);
-    shm_region->msg[id] = 5;
     while(!message_intr) {}
 }
index 697a4df..7d35164 100644 (file)
@@ -58,25 +58,25 @@ int main() {
     // 
     while(shm_region->finished == 0) {}
     printf("Finished!\n");
-    shm_region->width = 0x10;
-    shm_region->height = 0x10;
+    shm_region->width = 0x40;
+    shm_region->height = 0x40;
     shm_region->data_end = 0x100;
     shm_region->generation = 1;
-    shm_region->fb_off = 0x100;
+    shm_region->fb_off = 0x200;
     //for(int i = 0; i < 30; i ++) printf("finished: %lx\n", shm_region->finished);
-    for(int i = 0; i < 30; i ++) {
+    /*for(int i = 0; i < 30; i ++) {
         printf("state: [%lx, %2lx, %2lx, %lx]", shm_region->finished, shm_region->interrupts_fired, shm_region->range_end, shm_region->messages_received);
         for(int j = 0; j < 16; j ++) printf(" %lx", shm_region->msg[j]);
         printf("\n");
-    }
+    }*/
     //while(shm_region->finished == 1) {}
     //while(shm_region->finished == 0) {}
 
-    printf("fb: ");
-    for(int i = 0; i < 0x100; i ++) {
-        printf("%lx", *((uint32_t *)shm_region + 0x100/4 + i));
+    /*printf("fb: ");
+    for(int i = 0; i < 0x1000; i ++) {
+        printf("%lx ", *((uint32_t *)shm_region + 0x200/4 + i));
     }
-    printf("\n");
+    printf("\n");*/
 
     e_close(&dev);
     e_shm_release("raytrace_shm");