view ppe/Menu.cc @ 8:ec2c1003f9b6 default tip

fix mandel
author yutaka@localhost.localdomain
date Mon, 12 Apr 2010 23:58:19 +0900
parents febf899d0043
children
line wrap: on
line source

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "Menu.h"
#include "Sys.h"
#include "params.h"
#include "fb.h"

//headk_num と send_param_head の値を必ず返さないと、動作しない

char *make_color_table(int size) {

  char *color_table = (char*)allocate(size);

  srandom(time(NULL));

  for (int i = 0; i < size; i++) {
    color_table[i] = random() % 256;
  }

  return color_table;

}

task_head_t*
menu(int &list_num, int argc, char *argv[]) {

  list_num = SPE_NUM;

  fb_t fb = get_fbdev_addr();

  int max_size = MAX_DMA_SIZE - sizeof(task_head_t);
  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_line_num / list_num) / lnpt;

  //color table;
  int color_table_size = sizeof(char)*256;
  // location, width, height, bpp;
  int params_size = sizeof(int)*6;

  int task_in_size = params_size + color_table_size;
  int alignment = 16;
  int send_in_size  = size_fix(task_in_size, alignment);

  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);

  char *tmp_color = make_color_table(color_table_size);

  for (int i = 0; i < color_table_size; i++) {

    //printf("tmp_color[%d] %d\n",i, tmp_color[i]);

  }

  int index = 0;
  for (int i = 0; i < list_num; i++) {
    tail[i] = entry_head(&list_head[i]);
  }
  
  for (int i = 0; i < all_line_num / lnpt; i++) {

      //task create
      task_t *task = task_allocate(send_in_size, 0);

      //output
      task->head->ea_out = (unsigned long long) (unsigned long) &fb.pixels[index*out_size];
      task->head->size_out = out_size;
   
      //input params set
      int *in = (int*)get_addr(task->input, 0);
      in[0] = index*out_size;
      in[1] = fb.width;
      in[2] = fb.height;
      in[3] = fb.bpp;
      in[4] = params_size;
      in[5] = color_table_size;
      
      //input color table set
      char *color = (char*)get_addr(task->input, params_size);
      for (int j = 0; j < color_table_size; j++) {
	color[j] = tmp_color[j];
      }

      //pin
      int pin_in  = send_in_size - task_in_size;
      int pin_out = 0;
      set_pin(task, pin_in, pin_out);

      //list add
      tail[i%list_num] = add_list(tail[i%list_num], task);

      index++;

  }
 
  free(tmp_color); 

  printf("return run\n");
 
  //munmap(fb.pixels, fb.size);
  //close(fb.fd);

  return list_head;

}