Successful DMA of input data with target's core.
authorethereal <ethereal@ethv.net>
Fri, 12 Jun 2015 00:24:57 +0000 (00:24 +0000)
committerethereal <ethereal@ethv.net>
Fri, 12 Jun 2015 00:24:57 +0000 (00:24 +0000)
src/ecore/ecore.c
src/ecore/math.c
src/ecore/render.c
src/ecore/rreq.c
src/ewrap/main.c

index 562060c..c6cd117 100644 (file)
@@ -19,15 +19,9 @@ void *memcpy(void *dst, const void *src, size_t n) {
 }
 
 // stupidity
-float sinf(float x) { return x; }
-float cosf(float x) { return x; }
 float tanf(float x) { return x; }
 float sqrtf(float x) { return x; }
 float powf(float x, float y) { return x; }
-//float __divsf3(float x) { return x; }
-
-//uint32_t __umodsi3() { return 0; }
-//uint32_t __udivsi3() { return 0; }
 
 int main() {
     e_shm_attach(&shared_mem, "raytrace_shm");
@@ -49,6 +43,14 @@ int main() {
     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 da0adca..e7a95d3 100644 (file)
@@ -121,60 +121,68 @@ float fabsf(float x) {
     return x;
 }
 
-float sinef(float x, int cosine) {
-  int sgn, N;
-  float y, XN, g, R, res;
+static float sinef(float x, int cosine) {
+    int sgn, N;
+    float y, XN, g, R, res;
 
-  /* Use sin and cos properties to ease computations. */
-  if (cosine)
+    /* Use sin and cos properties to ease computations. */
+    if (cosine)
     {
-      sgn = 1;
-      y = fabsf (x) + HALF_PI;
+        sgn = 1;
+        y = fabsf (x) + HALF_PI;
     }
-  else
+    else
     {
-      if (x < 0.0)
+        if (x < 0.0)
         {
-          sgn = -1;
-          y = -x;
+            sgn = -1;
+            y = -x;
         }
-      else
+        else
         {
-          sgn = 1;
-          y = x;
+            sgn = 1;
+            y = x;
         }
     }
 
-  /* Calculate the exponent. */
-  if (y < 0.0)
-    N = (int) (y * ONE_OVER_PI - 0.5);
-  else
-    N = (int) (y * ONE_OVER_PI + 0.5);
-  XN = (float) N;
+    /* Calculate the exponent. */
+    if (y < 0.0)
+        N = (int) (y * ONE_OVER_PI - 0.5);
+    else
+        N = (int) (y * ONE_OVER_PI + 0.5);
+    XN = (float) N;
 
-  if (N & 1)
-    sgn = -sgn;
+    if (N & 1)
+        sgn = -sgn;
 
-  if (cosine)
-    XN -= 0.5;
+    if (cosine)
+        XN -= 0.5;
 
-  y = fabsf (x) - XN * M_PI;
+    y = fabsf (x) - XN * M_PI;
 
-  if (-1e-5 < y && y < 1e-5)
-    res = y;
+    if (-1e-5 < y && y < 1e-5)
+        res = y;
 
-  else
+    else
     {
-      g = y * y;
+        g = y * y;
 
-      /* Calculate the Taylor series. */
-      R = (((r[3] * g + r[2]) * g + r[1]) * g + r[0]) * g;
+        /* Calculate the Taylor series. */
+        R = (((r[3] * g + r[2]) * g + r[1]) * g + r[0]) * g;
 
-      /* Finally, compute the result. */
-      res = y + y * R;
+        /* Finally, compute the result. */
+        res = y + y * R;
     }
-  res *= sgn;
 
-  return (res);
+    res *= sgn;
+
+    return (res);
+}
+
+float sinf(float x) {
+    return sinef(x, 0);
+}
+
+float cosf(float x) {
+    return sinef(x, 1);
 }
index 4ac6e2e..b08b666 100644 (file)
@@ -66,7 +66,7 @@ vector_t trace(vector_t *ray, vector_t *dir, int depth) {
 
     if(!find_closest(ray, dir, &min_i, &min_ind)) {
         vector_t ret;
-        ret.c[0] = ret.c[1] = ret.c[2] = ret.c[3] = 0;
+        ret.c[0] = ret.c[1] = ret.c[2] = ret.c[3] = 0.1;
         return ret;
     }
 
@@ -87,7 +87,7 @@ vector_t trace(vector_t *ray, vector_t *dir, int depth) {
 
     /* Do we need to do a recursive raycast? */
     vector_t ret;
-    ret.c[0] = ret.c[1] = ret.c[2] = ret.c[3] = 0;
+    ret.c[0] = ret.c[1] = ret.c[2] = ret.c[3] = 0.1;
     if(mat->ref > 0 && depth) {
         vector_t r;
         /* r = n*(2 * n.dot(-dir)) + dir */
@@ -171,6 +171,7 @@ void render_range() {
     rotate_vector(&cam_rot, &cam_basisy, &cam_basisy);
 
     while(render_start != render_end) {
+#if 0
         float x = (render_start % buf_region->width)
             / (float)buf_region->width - 0.5;
         float y = (render_start / buf_region->width)
@@ -192,8 +193,9 @@ void render_range() {
         result |= (int)(col.c[1] * 255) << 8;
         result |= (int)(col.c[2] * 255) << 16;
 
-        write_render_result(result);
-
+        write_render_result(result + 1<<24);
+#endif
+        write_render_result(1<<24);
         /* Done, next pixel! */
         render_start ++;
     }
index f32853e..4f1e264 100644 (file)
@@ -30,8 +30,6 @@ void handle_range_request(int id) {
     uint32_t target_range_end = range_start + len;
     range_start += len;
 
-    shm_region->light_off = range_start | range_end << 16;
-
     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,
@@ -47,25 +45,19 @@ void handle_range_request(int id) {
         e_write(&e_group_config, (void*)&shm_region->generation, target_r,
             target_c, &current_generation, 4);
 
-#if 0
         // need to DMA in render data, using target core's DMA engine
-        e_dma_desc_t desc;
-        desc.config = E_DMA_ENABLE | E_DMA_WORD | E_DMA_MASTER | E_DMA_MSGMODE;
-        desc.inner_stride = 4 << 16 | 4;
-        desc.outer_stride = 0;
-        desc.src_addr = shm_region;
-        desc.dst_addr = in_buffer_ptr;
-        desc.count = 1 << 16 | shm_region->data_end/4;
-        e_write(&e_group_config, &desc, target_r, target_c, &dma_desc,
-            sizeof(desc));
+        e_dma_desc_t *tdesc =
+            (void *)e_get_global_address(target_r, target_c, &dma_desc);
+        tdesc->config =
+            E_DMA_ENABLE | E_DMA_WORD | E_DMA_MASTER | E_DMA_MSGMODE;
+        tdesc->inner_stride = (4 << 16) | 4;
+        tdesc->count = (1 << 16) | (shm_region->data_end>>2);
+        tdesc->outer_stride = 0;
+        tdesc->src_addr = (void*)shm_region;
+        tdesc->dst_addr = e_get_global_address(target_r, target_c, in_buffer_ptr);
         // initiate DMA
-        uint32_t value = E_DMA_STARTUP | ((uint32_t)&dma_desc & 0xffff) << 16;
-        e_write(&e_group_config, &value, target_r, target_c,
-            (void *)E_REG_DMA1CONFIG, 4);
-#else
-        shm_region->msg[id] |= 1<<16;
-        e_irq_set(target_r, target_c, E_MESSAGE_INT);
-#endif
+        uint32_t value = E_DMA_STARTUP | ((uint32_t)&dma_desc << 16);
+        *(uint32_t *)e_get_global_address(target_r, target_c, (void *)E_REG_DMA1CONFIG) = value;
     }
     else {
         // render data already present, so just send a message IRQ
@@ -75,10 +67,6 @@ void handle_range_request(int id) {
 
 void __attribute((interrupt)) range_request_handler(
     int __attribute__((unused)) irq) {
-    static int call_index = 0;
-    call_index ++;
-
-    shm_region->light_count = call_index;
 
     // clear ILAT entry to accept other pending requests
     e_reg_write(E_REG_ILATCL, 1<<9);
@@ -95,9 +83,9 @@ void __attribute((interrupt)) range_request_handler(
 
         // if so, wait for next generation to be set up
         while(shm_region->generation == current_generation) {}
+        // finished will be cleared on host side
         // mark all cores as non-idle
         idle_cores = 0;
-        shm_region->finished = 0;
         // set up rendering range appropriately
         range_start = 0, range_end = shm_region->height*shm_region->width;
         // trigger handler again
@@ -107,7 +95,7 @@ void __attribute((interrupt)) range_request_handler(
 
 void __attribute((interrupt)) message_handler() {
     message_intr = 1;
-    shm_region->sph_count = 0x1234;
+    shm_region->sph_count = ((uint32_t *)in_buffer_ptr)[0];
 }
 
 void setup_range_request() {
@@ -123,8 +111,6 @@ void request_new_range(int id) {
     e_write(&e_group_config, &one, 0, 0, range_requests + id, 1);
 
     message_intr = 0;
-    shm_region->msg[id] |= 1;
     e_irq_set(0, 0, E_USER_INT);
     while(!message_intr) {}
-    shm_region->msg[id] |= 2;
 }
index b056c16..2ed7760 100644 (file)
@@ -53,13 +53,34 @@ int main() {
     // - wait for shm_region->finished == 1
     // 
     while(shm_region->finished == 0) {}
-    printf("Finished!\n");
+    printf("Finished init! Filling data...\n");
     shm_region->width = 0x40;
     shm_region->height = 0x40;
-    shm_region->data_end = 0x100;
     shm_region->fb_off = 0x200;
+
+    shm_region->light_count = 0;
+    shm_region->mat_count = 0;
+    shm_region->sph_count = 0;
+
+    shm_region->data_end = 0x100;
+
+    shm_region->finished = 0;
     shm_region->generation = 1;
-    while(shm_region->finished == 0) {}
+
+    const uint32_t in_buffer_address = 0x52e0;
+    for(int i = 0; i < 100; i ++) {
+        printf("in buffer content:");
+        uint32_t in_buffer[32];
+        e_read(&dev, 2, 2, in_buffer_address, in_buffer, 32*4);
+        for(int i = 0; i < 32; i ++) printf(" %lx", in_buffer[i]);
+        printf("\n");
+        usleep(1000);
+    }
+
+    printf("Waiting for rendering to finish...\n");
+    printf("Sphere count (i.e. width): %lx\n", shm_region->sph_count);
+    while(shm_region->finished != 1) {}
+    printf("Finished rendering!\n");
 
     printf("fb: ");
     for(int i = 0; i < 0x1000; i ++) {
@@ -67,6 +88,12 @@ int main() {
     }
     printf("\n");
 
+    printf("in buffer content:");
+    uint32_t in_buffer[32];
+    e_read(&dev, 2, 2, in_buffer_address, in_buffer, 32*4);
+    for(int i = 0; i < 32; i ++) printf(" %lx", in_buffer[i]);
+    printf("\n");
+
     e_close(&dev);
     e_shm_release("raytrace_shm");
     e_finalize();