changeset 621:5b178db5988a

Cell fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 15 Nov 2009 03:34:18 +0900
parents 55ed910d13c2
children 6a5e88112ed9
files Renderer/Engine/Func.h Renderer/Engine/spe/DrawSpan.cc Renderer/Engine/spe/spe-main.cc Renderer/Engine/task/DrawSpan.cc TaskManager/Cell/CellTaskManagerImpl.cc TaskManager/Cell/SpeThreads.cc TaskManager/Cell/SpeThreads.h TaskManager/Cell/spe/SpeTaskManagerImpl.cc TaskManager/Cell/spe/SpeTaskManagerImpl.h TaskManager/Cell/spe/main.cc TaskManager/Makefile.cell TaskManager/kernel/schedule/Scheduler.cc TaskManager/kernel/schedule/Scheduler.h
diffstat 13 files changed, 98 insertions(+), 114 deletions(-) [+]
line wrap: on
line diff
--- a/Renderer/Engine/Func.h	Sun Nov 15 02:05:33 2009 +0900
+++ b/Renderer/Engine/Func.h	Sun Nov 15 03:34:18 2009 +0900
@@ -28,6 +28,8 @@
      Switch,
 
      ChainMove,
+     ChainCal,
+     ChainInit,
 
 
      RUN_FINISH,
--- a/Renderer/Engine/spe/DrawSpan.cc	Sun Nov 15 02:05:33 2009 +0900
+++ b/Renderer/Engine/spe/DrawSpan.cc	Sun Nov 15 03:34:18 2009 +0900
@@ -47,6 +47,12 @@
 // static    void drawLine2(SchedTask *smanager, SpanPtr span, int startx, int endx, int js, int wait_tag);
 static    int infinity_light_calc(int color,float normal_x, float normal_y, float normal_z);
 
+static float
+innerProduct1(float *v0, float *v1)
+{
+    return (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2]);
+}
+
 
 /**
  * テクスチャは、TEXTURE_SPLIT_PIXEL^2 のブロックに分割する
@@ -379,7 +385,7 @@
 #endif
 
     // 法線ベクトルと光源ベクトルとの内積をとる
-    inner_product = innerProduct(normal_vector,light_vector);
+    inner_product = innerProduct1(normal_vector,light_vector);
     // 内積がマイナスの場合は色がない。
     flag = (inner_product > 0);
 
--- a/Renderer/Engine/spe/spe-main.cc	Sun Nov 15 02:05:33 2009 +0900
+++ b/Renderer/Engine/spe/spe-main.cc	Sun Nov 15 03:34:18 2009 +0900
@@ -25,7 +25,7 @@
     SchedRegister( LoadTexture);
     SchedRegister( SetTexture);
     SchedRegister( DrawSpan);
-    SchedRegister( DrawSpanEnd);
+    // SchedRegister( DrawSpanEnd);
 
     SchedRegister( ChainCal);
     SchedRegister( ChainInit);
--- a/Renderer/Engine/task/DrawSpan.cc	Sun Nov 15 02:05:33 2009 +0900
+++ b/Renderer/Engine/task/DrawSpan.cc	Sun Nov 15 03:34:18 2009 +0900
@@ -47,6 +47,12 @@
 // static    void drawLine2(SchedTask *smanager, SpanPtr span, int startx, int endx, int js, int wait_tag);
 static    int infinity_light_calc(int color,float normal_x, float normal_y, float normal_z);
 
+static float
+innerProduct1(float *v0, float *v1)
+{
+    return (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2]);
+}
+
 
 /**
  * テクスチャは、TEXTURE_SPLIT_PIXEL^2 のブロックに分割する
@@ -379,7 +385,7 @@
 #endif
 
     // 法線ベクトルと光源ベクトルとの内積をとる
-    inner_product = innerProduct(normal_vector,light_vector);
+    inner_product = innerProduct1(normal_vector,light_vector);
     // 内積がマイナスの場合は色がない。
     flag = (inner_product > 0);
 
--- a/TaskManager/Cell/CellTaskManagerImpl.cc	Sun Nov 15 02:05:33 2009 +0900
+++ b/TaskManager/Cell/CellTaskManagerImpl.cc	Sun Nov 15 03:34:18 2009 +0900
@@ -6,6 +6,7 @@
 #include "CellTaskManagerImpl.h"
 #include "CellTaskListInfo.h"
 #include "HTaskInfo.h"
+#include "SchedTask.h"
 #include "PpeScheduler.h"
 #include "types.h"
 
@@ -221,7 +222,7 @@
 		    //__debug_ppe("[PPE] MALLOCED 0x%x from [SPE %d]\n", alloc_info[1],id);
 		    speThreads->add_output_tasklist(command, alloc_info[1], alloc_size);
 
-		    speThreads->send_mail(id, 2, (memaddr *)alloc_info);
+		    speThreads->send_mail(id, 2, alloc_info);
 		} else if (data > MY_SPE_NOP) {
 		    //__debug_ppe("[PPE] recv from [SPE %d] : 0x%x\n", id, data);
 		    HTaskPtr task = (HTaskPtr)data;
@@ -275,7 +276,7 @@
     taskListImpl->clear_taskList(speTaskList_bg[id]);
 
     //speThreads->send_mail(id, 1, (unsigned int *)&speTaskList[id]);
-    speThreads->send_mail(id, 1, (memaddr *)&speTaskList[id]);
+    speThreads->send_mail(id, 1, (unsigned int *)&speTaskList[id]);
     flag_sendTaskList[id] = 0;
 }
 
--- a/TaskManager/Cell/SpeThreads.cc	Sun Nov 15 02:05:33 2009 +0900
+++ b/TaskManager/Cell/SpeThreads.cc	Sun Nov 15 03:34:18 2009 +0900
@@ -6,7 +6,7 @@
 
 SpeThreads::~SpeThreads(void)
 {
-    memaddr mail = MY_SPE_COMMAND_EXIT;
+    unsigned int mail = MY_SPE_COMMAND_EXIT;
     int ret;
 
     for (int i = 0; i < spe_num; i++) {
@@ -97,13 +97,8 @@
     }
 
     for (int i = 0; i < spe_num; i++) {
-#if 0
-	pthread_create(&threads[i], NULL,
-		       &frontend_thread_run, (void*)&args[i]);
-#else
 	pthread_create(&threads[i], NULL,
 		       &spe_thread_run, (void*)&args[i]);
-#endif
     }
 }
 
@@ -116,17 +111,13 @@
  * @return Received 32-bit mailbox messages
  *         if ([ret] < 0) no data read
  */
-memaddr
+int
 SpeThreads::get_mail(int speid, int count, unsigned int* ret)
 {   
-    memaddr mail = spe_out_mbox_read(spe_ctx[speid], ret, 1);    
-    if (sizeof(memaddr)>4) {
-	mail += spe_out_mbox_read(spe_ctx[speid], ret, 1)<<4;    
-    }
-    return mail;
+    return spe_out_mbox_read(spe_ctx[speid], ret, count);    
 }
 
-memaddr
+int
 SpeThreads::check_mail(int speid, int count, unsigned int* ret)
 {
 /* 
@@ -134,11 +125,7 @@
  *  does not work.
  */
     if (spe_out_mbox_status(spe_ctx[speid]) >= 1) {    
-	memaddr mail = spe_out_mbox_read(spe_ctx[speid], ret, 1);   
-	if (sizeof(memaddr)>4) {
-	    mail += spe_out_mbox_read(spe_ctx[speid], ret, 1)<<4;    
-	}
-	return mail;
+	return spe_out_mbox_read(spe_ctx[speid], ret, count);   
     } else {
 	return 0;            
     }
@@ -159,14 +146,10 @@
  * @param [num] The number of messages
  */
 void
-SpeThreads::send_mail(int speid, int num, memaddr *data1)
+SpeThreads::send_mail(int speid, int num, unsigned int *data)
 
 {
-    unsigned int *data = (unsigned int *) data1;
     spe_in_mbox_write(spe_ctx[speid], data, num, SPE_MBOX_ALL_BLOCKING);
-//    if (sizeof(memaddr)>4) {
-//	spe_in_mbox_write(spe_ctx[speid], (data>>4), num, SPE_MBOX_ALL_BLOCKING);
-//    }
 }
 
 void
--- a/TaskManager/Cell/SpeThreads.h	Sun Nov 15 02:05:33 2009 +0900
+++ b/TaskManager/Cell/SpeThreads.h	Sun Nov 15 03:34:18 2009 +0900
@@ -19,9 +19,9 @@
 
     /* functions */
     void init(void);
-    memaddr get_mail(int speid, int count, unsigned int* ret); // BLOCKING
-    memaddr check_mail(int speid, int count, unsigned int* ret); // NONBLOCK
-    void send_mail(int speid, int num, memaddr *data); // BLOCKING
+    int get_mail(int speid, int count, unsigned int* ret); // BLOCKING
+    int check_mail(int speid, int count, unsigned int* ret); // NONBLOCK
+    void send_mail(int speid, int num, unsigned int *data); // BLOCKING
     static void *spe_thread_run(void *arg);
     static void *frontend_thread_run(void *arg);
     void add_output_tasklist(int command, unsigned int buff, int alloc_size);
--- a/TaskManager/Cell/spe/SpeTaskManagerImpl.cc	Sun Nov 15 02:05:33 2009 +0900
+++ b/TaskManager/Cell/spe/SpeTaskManagerImpl.cc	Sun Nov 15 03:34:18 2009 +0900
@@ -1,57 +1,13 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "FifoTaskManagerImpl.h"
+#include "SpeTaskManagerImpl.h"
 #include "Scheduler.h"
-#include "SchedTask.h"
-#include "types.h"
-#include "error.h"
-
-FifoTaskManagerImpl::~FifoTaskManagerImpl()
-{
-
-}
 
-/**
- */
-void
-FifoTaskManagerImpl::init()
-{
-}
-
-/**
- */
-void
-FifoTaskManagerImpl::init(MainScheduler *_sched)
-{
-    scheduler = _sched;
-}
 
 
-void
-FifoTaskManagerImpl::run()
-{
-}
-
-
-void*
-FifoTaskManagerImpl::allocate(int size, int alignment)
-{
-    void *buff;
-    posix_memalign(&buff, alignment, size);
-    return buff;
-}
+HTaskPtr TaskManagerImpl::create_task(int cmd) {return 0;}
+void TaskManagerImpl::set_task_depend(HTaskPtr master, HTaskPtr slave) {}
+void TaskManagerImpl::spawn_task(HTaskPtr) {}
+void TaskManagerImpl::set_task_cpu(HTaskPtr, CPU_TYPE) {}
 
-void*
-FifoTaskManagerImpl::allocate(int size)
-{
-    void *buff;
-    posix_memalign(&buff, DEFAULT_ALIGNMENT, size);
-    return buff;
-}
+void* TaskManagerImpl::allocate(int size) { return scheduler->allocate(size); }
+void* TaskManagerImpl::allocate(int size,int align) { return scheduler->allocate(size,align); }
 
-Scheduler*
-FifoTaskManagerImpl::get_scheduler() {
-    return scheduler;
-}
-
--- a/TaskManager/Cell/spe/SpeTaskManagerImpl.h	Sun Nov 15 02:05:33 2009 +0900
+++ b/TaskManager/Cell/spe/SpeTaskManagerImpl.h	Sun Nov 15 03:34:18 2009 +0900
@@ -1,29 +1,38 @@
-#ifndef INCLUDED_FIFO_TASK_MANAGER_IMPL
-#define INCLUDED_FIFO_TASK_MANAGER_IMPL
+#ifndef INCLUDED_TASK_MANAGER_IMPL
+#define INCLUDED_TASK_MANAGER_IMPL
 
-#include "TaskManagerImpl.h"
-#include "MainScheduler.h"
-#include "Scheduler.h"
+#include "MailManager.h"
+#include "ListData.h"
+#include "TaskListInfo.h"
+#include "TaskQueueInfo.h"
+#include "HTaskInfo.h"
+class Scheduler;
+class MemList;
 
-class SpeTaskManagerImpl : public TaskManagerImpl {
+
+class TaskManagerImpl {
 public:
-    /* constructor */
-    SpeTaskManagerImpl(int num = 1) : TaskManagerImpl(num) {}
-    ~SpeTaskManagerImpl(void);
+
+    BASE_NEW_DELETE(TaskManagerImpl);
 
     /* variables */
-    CellScheduler *scheduler;
+    SchedTask *schedTaskManager;
+    Scheduler *scheduler;
+
+    /* constructor */
+    TaskManagerImpl(Scheduler *s) { scheduler = s; }
+
+    ~TaskManagerImpl() { }
 
-    /* functions */
-    // call by system
-    void init(void);
-    void run(void);
+    // user
+    HTaskPtr create_task(int cmd);
+    void set_task_depend(HTaskPtr master, HTaskPtr slave);
+    void spawn_task(HTaskPtr);
+    void set_task_cpu(HTaskPtr, CPU_TYPE);
 
-    // call by user
-    int add_data(ListDataPtr, uint32, int);
+    void* allocate(int size);
     void* allocate(int size,int align);
-    void* allocate(int size);
-    Scheduler* get_scheduler();
+    Scheduler* get_scheduler() { return scheduler; };
 };
 
 
--- a/TaskManager/Cell/spe/main.cc	Sun Nov 15 02:05:33 2009 +0900
+++ b/TaskManager/Cell/spe/main.cc	Sun Nov 15 03:34:18 2009 +0900
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include "CellScheduler.h"
+#include "SpeTaskManagerImpl.h"
 #include "spu_mfcio.h"
 #include "error.h"
 
@@ -23,7 +24,7 @@
     manager->init();
     manager->id = (int)argc;
 
-    TaskManagerImpl *tm = new SpeTaskManagerImpl(manager);
+    TaskManagerImpl *tm = new TaskManagerImpl(manager);
     manager->set_manager(tm);
 
     spu_write_decrementer(0x7FFFFFFFU);
--- a/TaskManager/Makefile.cell	Sun Nov 15 02:05:33 2009 +0900
+++ b/TaskManager/Makefile.cell	Sun Nov 15 03:34:18 2009 +0900
@@ -20,6 +20,7 @@
 CELL_SPE_SRCS =  \
     $(CELL_SPE_DIR)/CellDmaManager.cc   \
     $(CELL_SPE_DIR)/CellScheduler.cc    \
+    $(CELL_SPE_DIR)/SpeTaskManagerImpl.cc    \
     $(CELL_SPE_DIR)/main.cc
 
 CELL_SPE_TASK_SRCS =  \
--- a/TaskManager/kernel/schedule/Scheduler.cc	Sun Nov 15 02:05:33 2009 +0900
+++ b/TaskManager/kernel/schedule/Scheduler.cc	Sun Nov 15 03:34:18 2009 +0900
@@ -4,6 +4,7 @@
 #include "SchedNop.h"
 #include "error.h"
 #include <assert.h>
+#include "TaskManagerImpl.h"
 
 /*
  * Edit kernel/schedule/xx.cc, Cell/spe/xx.cc will be over writen by this.
@@ -392,4 +393,20 @@
     s->tag = 0;
 }
 
+HTask * Scheduler::create_task(int cmd) { return manager->create_task(cmd); }
+void Scheduler::set_task_depend(HTask * master, HTask * slave) { 
+    manager->set_task_depend(master, slave) ;
+}
+void Scheduler::spawn_task(HTask * t) { manager->spawn_task(t); }
+void Scheduler::set_task_cpu(HTask * t, CPU_TYPE cpu) { manager->set_task_cpu(t,cpu); }
+void* Scheduler::allocate(int size,int align) { return allocate(size); }
+long Scheduler::get_random() { 
+#if defined(__SPU__)
+    return 0; 
+#else
+    return random(); 
+#endif
+
+}
+
 /* end */
--- a/TaskManager/kernel/schedule/Scheduler.h	Sun Nov 15 02:05:33 2009 +0900
+++ b/TaskManager/kernel/schedule/Scheduler.h	Sun Nov 15 03:34:18 2009 +0900
@@ -1,7 +1,7 @@
 #ifndef INCLUDED_SCHEDULER
 #define INCLUDED_SCHEDULER
 
-#include "stdlib.h"
+#include <stdlib.h>
 #include "base.h"
 #include "TaskList.h"
 #include "ListData.h"
@@ -10,7 +10,6 @@
 #include "SchedTaskList.h"
 #include "MemList.h"
 #include "MemHash.h"
-#include "TaskManagerImpl.h"
 
 
 #define MAX_USER_TASK 32
@@ -22,10 +21,15 @@
 class SchedTaskBase;
 class SchedTask;
 class SchedTaskList;
-class TaskManager;
+class TaskManagerImpl;
+class HTask;
 
 typedef int (*TaskObjectRun)(SchedTask* smanager, void* r, void *w);
 
+extern "C" {
+    extern long random();
+}
+
 class Scheduler {
 public:
     virtual ~Scheduler();
@@ -122,18 +126,16 @@
 
     /* manager */
 
-    void set_manager(TaskManagerImpl *m) { manager = m; }
+    void set_manager(TaskManagerImpl *m) { manager = m; };
 
     // user
-    HTaskPtr create_task(int cmd) { return manager->create_task(cmd); }
-    void set_task_depend(HTaskPtr master, HTaskPtr slave) {
-	manager->set_task_depend(master, slave) ;
-    }
-    void spawn_task(HTaskPtr t) { manager->spawn_task(t); }
-    void set_task_cpu(HTaskPtr t, CPU_TYPE cpu) { manager->set_task_cpu(t,cpu); }
-    void* allocate(int size,int align) { return manager->allocate(size,align); }
-    int get_random() { return random(); }
-    Scheduler *get_scheduler() { return this; }
+    HTask * create_task(int cmd);
+    void set_task_depend(HTask * master, HTask * slave) ;
+    void spawn_task(HTask * t) ;
+    void set_task_cpu(HTask * t, CPU_TYPE cpu) ;
+    void* allocate(int size,int align) ;
+    long get_random() ;
+    Scheduler *get_scheduler() { return this; };
 
 
 };