changeset 7:febf899d0043

mandelbrot
author yutaka@localhost.localdomain
date Mon, 12 Apr 2010 00:32:34 +0900
parents b25035e3282d
children ec2c1003f9b6
files ppe/Menu.cc ppe/fb.cc task/Run.cc
diffstat 3 files changed, 83 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/ppe/Menu.cc	Sat Apr 10 16:50:55 2010 +0900
+++ b/ppe/Menu.cc	Mon Apr 12 00:32:34 2010 +0900
@@ -14,27 +14,26 @@
 
   fb_t fb = get_fbdev_addr();
   int max_size = MAX_DMA_SIZE - sizeof(task_head_t);
-  int all_task_num = fb.height;
+  int all_line_num = fb.height;
   int line_size = fb.width * fb.bpp / DIV_BYTE;
 
   // line num per task
   int lnpt = max_size / line_size;
   int out_size = lnpt * line_size;
-  int list_length = (all_task_num / list_num) / lnpt;
+  int list_length = (all_line_num / list_num) / lnpt;
 
   int in_size  = sizeof(int)*4;
   int real_in_size = sizeof(int)*2;
 
   task_head_t *list_head = (task_head_t*)allocate(sizeof(task_head_t)*list_num);
+  task_t **tail = (task_t**)allocate(sizeof(task_t*)*list_num);
 
   int index = 0;
-
   for (int i = 0; i < list_num; i++) {
-
-    task_t *head = entry_head(&list_head[i]);
-
-    for (int j = 0; j < list_length; j++) {
-
+    tail[i] = entry_head(&list_head[i]);
+  }
+  
+  for (int i = 0; i < all_line_num / lnpt; i++) {
       task_t *task = task_allocate(in_size, 0);
       task->head->ea_out = (unsigned long long) (unsigned long) &fb.pixels[index*out_size];
       task->head->size_out = out_size;
@@ -47,13 +46,37 @@
       int pin_out = 0;
 
       set_pin(task, pin_in, pin_out);
-      head = add_list(head, task);
+      tail[i%list_num] = add_list(tail[i%list_num], task);
 
       index++;
 
-    }
+  }
+  
+//   for (int i = 0; i < list_num; i++) {
+
+//     task_t *head = entry_head(&list_head[i]);
+
+//     for (int j = 0; j < list_length; j++) {
+
+//       task_t *task = task_allocate(in_size, 0);
+//       task->head->ea_out = (unsigned long long) (unsigned long) &fb.pixels[index*out_size];
+//       task->head->size_out = out_size;
+//       int *in = (int*)task->input;
 
-  }
+//       in[0] = index*out_size;
+//       in[1] = (index+1)*out_size;
+
+//       int pin_in  = in_size - real_in_size;
+//       int pin_out = 0;
+
+//       set_pin(task, pin_in, pin_out);
+//       head = add_list(head, task);
+
+//       index++;
+
+//     }
+
+//   }
 
   printf("return run\n");
  
--- a/ppe/fb.cc	Sat Apr 10 16:50:55 2010 +0900
+++ b/ppe/fb.cc	Mon Apr 12 00:32:34 2010 +0900
@@ -50,6 +50,7 @@
 	vbpp = vinfo.bits_per_pixel ;
 	line_len = finfo.line_length ;
 	sprintf( tmp , "%d(pixel)x%d(line), %dbpp(bits per pixel)",xres,yres,vbpp);
+	sprintf( tmp , "%d(xoffset)x%d(yoffset)",vinfo.xoffset, vinfo.yoffset);
 	send_current_information( tmp );
 
 	/* バイト単位でのスクリーンのサイズを計算 */
--- a/task/Run.cc	Sat Apr 10 16:50:55 2010 +0900
+++ b/task/Run.cc	Mon Apr 12 00:32:34 2010 +0900
@@ -1,4 +1,5 @@
 #include <stdio.h>
+#include <math.h>
 #include "Run.h"
 
 typedef struct {
@@ -11,10 +12,22 @@
 } rgb_t;
 
 void
+mandelbrot(float &za, float &zb, float cx, float cy) {
+
+  float tmp_za = za;
+  float tmp_zb = zb;
+
+  za = tmp_za * tmp_za - tmp_zb * tmp_zb + cx;
+  zb = 2 * tmp_za * tmp_zb + cy;
+
+}
+
+void
 set_rgb(rgb_t rgb, int *pixels)
 {
 
   *pixels = (char)rgb.red | ((char)rgb.green) << 8 | ((char)rgb.bule) << 16 | ((char)rgb.alpha) << 24;
+  //*pixels = 255;
 
 }
 
@@ -23,18 +36,45 @@
 {
 
   int *pixels = (int*)out;
-  rgb_t rgb;
+  int *location = (int*)in;
+
+  for (int l = location[0]; l <= location[0] + size_out; l += 4) {
+    int x = l / 4 % 1920;
+    int y = l / 4 / 1920;
+
+    float a = 0;
+    float b = 0;
+
+    float cx = (x - 1200) / 500.f;
+    float cy = (y - 540) / 500.f;
+    
+    int i;
+    for (i = 0; i < 255; i++) {
 
-  rgb.red = 0;
-  rgb.green = 255;
-  rgb.bule = 255;
-  rgb.alpha = 1;
+      mandelbrot(a, b, cx, cy);
+
+      if( a*a + b*b > 4) {
+	break;
+      }
+
+    }
 
-  for (int i = 0; i < size_out; i++) {
-
-    set_rgb(rgb, &pixels[i]);
+    rgb_t rgb;
+    rgb.red = 255 * sin(i);
+    rgb.green = 255 * sin(i);
+    rgb.bule = 255 * cos(i);
+    rgb.alpha = 1;
     
+    set_rgb( rgb, &pixels[(l - location[0]) / 4] );
   }
 
+  
+  //printf("location[0] %d\n",location[0]);
+  //printf("location[1] %d\n",location[1]);
+
+  //rgb.red = 0;
+  //rgb.green = 255;
+  //rgb.bule = 255;
+  //rgb.alpha = 1;
 
 }