changeset 469:96c941eae962

fix spe/DrawSpan.cc (not yet tested)
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 02 Oct 2009 17:14:16 +0900
parents bd5b93d39597
children bf32e35f1afa
files TaskManager/Test/test_render/spe/ChainCal.cc TaskManager/Test/test_render/spe/DrawSpan.cc TaskManager/Test/test_render/spe/DrawSpan.h TaskManager/Test/test_render/spe/spe-main.cc
diffstat 4 files changed, 47 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/Test/test_render/spe/ChainCal.cc	Fri Oct 02 16:40:43 2009 +0900
+++ b/TaskManager/Test/test_render/spe/ChainCal.cc	Fri Oct 02 17:14:16 2009 +0900
@@ -27,8 +27,8 @@
     //int parent;
 } ChainProperty, *ChainPropertyPtr;
 
-int
-ChainCal::run(SchedTask *s,void *rbuf, void *wbuf)
+static int
+run(SchedTask *s,void *rbuf, void *wbuf)
 {
 	ChainPropertyPtr property = (ChainPropertyPtr)s->get_input(rbuf, 0);
     ChainPropertyPtr update_property = (ChainPropertyPtr)s->get_output(wbuf, 0);
--- a/TaskManager/Test/test_render/spe/DrawSpan.cc	Fri Oct 02 16:40:43 2009 +0900
+++ b/TaskManager/Test/test_render/spe/DrawSpan.cc	Fri Oct 02 17:14:16 2009 +0900
@@ -12,20 +12,23 @@
 #include "global_alloc.h"
 
 SchedDefineTask(DrawSpan);
+SchedDefineTask1(DrawSpanEnd,draw_span_end);
 
 #define TEX_LOAD1      0
 #define TEX_LOAD2      1
 #define SPAN_PACK_LOAD 2
 #define FB_STORE       3
 
-/*
- *   done in post func?
-DrawSpan::~DrawSpan(void)
+static int
+draw_span_end(SchedTask *s, void *rbuf, void *wbuf)
 {
-    smanager->dma_wait(FB_STORE);  // 誰のために待ってるの?
-    free((void*)((int)linebuf*doneWrite));
+    Gptr g = (Gptr)s->get_param(0);
+    s->dma_wait(FB_STORE);
+    free((void*)((int)g->linebuf*g->doneWrite));
+    free(g);
+    return 0;
 }
- */
+
 
 inline vector float
 spu_re_nrm(vector float a)
@@ -119,7 +122,7 @@
  * @return Buffer
  */
 static int*
-linebuf_init(int width, int height, int rgb)
+linebuf_init(SchedTask *smanager, int width, int height, int rgb)
 {
     int *buf = (int*)smanager->allocate(sizeof(int)*width*height);
 
@@ -138,7 +141,7 @@
  * @return Z-Buffer
  */
 static float*
-zRow_init(int width, int height)
+zRow_init(SchedTask *smanager, int width, int height)
 {
     float *buf = (float*)smanager->allocate(sizeof(float)*width*height);
     float def = 65535.0f;
@@ -213,16 +216,16 @@
 #endif
 
 static void
-writebuffer(unsigned int display, int buf_width, int height,
-                      int screen_width)
+writebuffer(SchedTask *smanager, Gptr g, unsigned int display, 
+        int buf_width, int height, int screen_width)
 {
     for (int i = 0; i < height; i++) {
-        smanager->dma_store(&linebuf[i*buf_width],
+        smanager->dma_store(&g->linebuf[i*buf_width],
                             display + (sizeof(int)*screen_width*i),
                             sizeof(int)*buf_width, FB_STORE);
     }
 
-    doneWrite = 1;
+    g->doneWrite = 1;
 }
 
 /**
@@ -237,13 +240,13 @@
  * @param tex_addr テクスチャのアドレス(MainMemory)
  */
 static void
-updateBuffer(float zpos, int rangex, int x, int y,
+updateBuffer(Gptr g, float zpos, int rangex, int x, int y,
                        int tex_x, int tex_y, TilePtr tile)
 {
     int rgb = get_rgb(tex_x, tex_y, tile);
 
-    zRow[x + (rangex*y)] = zpos;
-    linebuf[x + (rangex*y)] = rgb;
+    g->zRow[x + (rangex*y)] = zpos;
+    g->linebuf[x + (rangex*y)] = rgb;
 }
 
 /**
@@ -255,7 +258,7 @@
  */
 
 static int
-drawDot1(SpanPtr span, int startx, int endx, int wait_tag)
+drawDot1(SchedTask *smanager, Gptr g, SpanPtr span, int startx, int endx, int wait_tag)
 {
     int rangex = endx - startx + 1;
 
@@ -288,7 +291,7 @@
     tex_xpos = (int)((span->tex_width-1) * tex);
     tex_ypos = (int)((span->tex_height-1) * tey);
 
-    if (zpos < zRow[localx + (rangex*localy)]) {
+    if (zpos < g->zRow[localx + (rangex*localy)]) {
         tex_addr = getTile(tex_xpos, tex_ypos,
                            span->tex_width, (memaddr)span->tex_addr);
         tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL;
@@ -297,7 +300,7 @@
         TilePtr tile = smanager->get_segment(tex_addr,tileList);
         smanager->wait_segment(tile);
 
-        updateBuffer(zpos, rangex, localx, localy,
+        updateBuffer(g, zpos, rangex, localx, localy,
                      tex_localx, tex_localy, tile);	
     }
 
@@ -323,7 +326,7 @@
  * @return 「span のどの位置まで rendering が終わったか」の x 座標
  */
 static int
-drawLine1(SpanPtr span, int startx, int endx, int wait_tag)
+drawLine1(SchedTask *smanager, Gptr g, SpanPtr span, int startx, int endx, int wait_tag)
 {
     int x = span->x;
     int rangex = endx - startx + 1;
@@ -369,7 +372,7 @@
         tex_xpos = (int)((span->tex_width-1) * tex_x);
         tex_ypos = (int)((span->tex_height-1) * tex_y);
 
-        if (tex_z < zRow[localx + (rangex*localy)]) {
+        if (tex_z < g->zRow[localx + (rangex*localy)]) {
             // (tex_xpos, tex_ypos) の、Tile 内(上の図参照)での座標と
             // そのブロックのアドレス(MainMemory)
             memaddr tex_addr;
@@ -384,7 +387,7 @@
 	    TilePtr tile = smanager->get_segment(tex_addr,tileList);
 	    smanager->wait_segment(tile);
 
-            updateBuffer(tex_z, rangex, localx, localy,
+            updateBuffer(g, tex_z, rangex, localx, localy,
 			 tex_localx, tex_localy, tile);
         }
     }
@@ -396,7 +399,8 @@
 run(SchedTask *smanager, void *rbuf, void *wbuf)
 {
     __debug_spe("DrawSpan\n");
-    this->smanager = smanager;
+    Gptr g = (Gptr)smanager->allocate(sizeof(G));
+
     SpanPackPtr spack = (SpanPackPtr)smanager->get_input(0);
     SpanPackPtr next_spack = (SpanPackPtr)smanager->allocate(sizeof(SpanPack));
     SpanPackPtr free_spack = next_spack; // next_spack の free() 用
@@ -405,7 +409,7 @@
     Span nop_span;
     nop_span.length_x = 1;
 
-    int (DrawSpan::*drawFunc1[2])(SpanPtr, int, int, int) = {
+    int (DrawSpan::*drawFunc1[2])(SchedTask *, Gptr, SpanPtr, int, int, int) = {
         &DrawSpan::drawDot1, &DrawSpan::drawLine1
     };
 
@@ -422,11 +426,11 @@
 
     tileList = (TileListPtr)smanager->global_get(GLOBAL_TILE_LIST);
 
-    zRow = zRow_init(rangex, rangey);
+    g->zRow = zRow_init(rangex, rangey);
     //linebuf = linebuf_init(rangex, rangey, 0x00ffffff);
-    linebuf = linebuf_init(rangex, rangey, 0);
+    g->linebuf = linebuf_init(rangex, rangey, 0);
 
-    doneWrite = 0;
+    g->doneWrite = 0;
 
     int tl_tag[2] = {TEX_LOAD1, TEX_LOAD2};
     int tl_tag_flg1 = 0;
@@ -458,7 +462,8 @@
              * span の長さによって、drawLine か drawDot を選択している
              */
             next_span_x
-                = (this->*drawFunc1[(span->length_x != 1)])(
+                = (*drawFunc1[(span->length_x != 1)])(
+		    smanager, g,
                     span, rangex_start, rangex_end, tl_tag[tl_tag_flg1]);
             next_span = span;
 
@@ -483,12 +488,12 @@
         next_spack = tmp_spack;
     } while (spack);
 
-    writebuffer(display, rangex, rangey, screen_width);
+    writebuffer(smanager, g, display, rangex, rangey, screen_width);
 
     // linebuf は、writebuffer() の dma_store を wait する
     // DrawSpan::~DrawSpan() 内で free する。
     //free(linebuf);
-    free(zRow);
+    free(g->zRow);
 
 //FINISH:
     /**
@@ -497,5 +502,10 @@
      */
 
     free(free_spack);
+
+    TaskPtr nextTask = smanager->create_task(TASK_DRAW_SPAN_END);
+    nextTask->add_param((int)g);
+    smanager->wait_task(nextTask);
+
     return 0;
 }
--- a/TaskManager/Test/test_render/spe/DrawSpan.h	Fri Oct 02 16:40:43 2009 +0900
+++ b/TaskManager/Test/test_render/spe/DrawSpan.h	Fri Oct 02 17:14:16 2009 +0900
@@ -15,14 +15,14 @@
 
 static int run(SchedTask *smanager, void *rbuf, void *wbuf);
 
-static    int* linebuf_init(int width, int height, int rgb);
+static    int* linebuf_init(SchedTask *s, int width, int height, int rgb);
 static    float* zRow_init(int width, int height);
 static    uint32 get_rgb(int tx, int ty, TilePtr tile);
 static    memaddr getTile(int tx, int ty, int tw, memaddr tex_addr_top);
 static    int getTexBlock(int tx, int ty, int twidth);
-static    void writebuffer(unsigned int display, int width, int height,
+static    void writebuffer(SchedTask *s, Gptr g, unsigned int display, int width, int height,
 		     int screen_width);
-static    void updateBuffer(float zpos, int rangex, int x, int y,
+static    void updateBuffer(Gptr g, float zpos, int rangex, int x, int y,
 		      int tex_x, int tex_y, TilePtr tile);
 
 #if 0
@@ -30,9 +30,9 @@
 #endif
 
 static    int drawDot1(SpanPtr span, int startx, int endx, int wait_tag);
-static    void drawDot2(SpanPtr span, int startx, int endx, int js, int wait_tag);
+//static    void drawDot2(SpanPtr span, int startx, int endx, int js, int wait_tag);
 static    int drawLine1(SpanPtr span, int startx, int endx, int wait_tag);
-static    void drawLine2(SpanPtr span, int startx, int endx, int js, int wait_tag);
+//static    void drawLine2(SpanPtr span, int startx, int endx, int js, int wait_tag);
 };
 
 typedef struct {
--- a/TaskManager/Test/test_render/spe/spe-main.cc	Fri Oct 02 16:40:43 2009 +0900
+++ b/TaskManager/Test/test_render/spe/spe-main.cc	Fri Oct 02 17:14:16 2009 +0900
@@ -24,6 +24,7 @@
     SchedRegisterTask(TASK_INIT_TEXTURE, LoadTexture);
     SchedRegisterTask(TASK_SET_TEXTURE, SetTexture);
     SchedRegisterTask(TASK_DRAW_SPAN, DrawSpan);
+    SchedRegisterTask(TASK_DRAW_SPAN_END, DrawSpanEnd);
 
     SchedRegisterTask(CHAINCAL_TASK, ChainCal);
     SchedRegisterTask(CHAININIT_TASK, ChainInit);