diff Renderer/Engine/task/DrawSpan.cc @ 615:f7d78b3c1106

First addOutput rendering try failed.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Nov 2009 18:57:54 +0900
parents 4e44147d78ee
children f21603a335aa
line wrap: on
line diff
--- a/Renderer/Engine/task/DrawSpan.cc	Sat Nov 14 18:21:14 2009 +0900
+++ b/Renderer/Engine/task/DrawSpan.cc	Sat Nov 14 18:57:54 2009 +0900
@@ -7,27 +7,45 @@
 #include "Func.h"
 #include "sys.h"
 #include "global_alloc.h"
+#include "SchedTask.h"
+#include "Tapestry.h"
+#include "SpanPack.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
 
-static int
-draw_span_end(SchedTask *s, void *rbuf, void *wbuf)
-{
-    Gptr g = (Gptr)s->get_param(0);
-    s->dma_wait(FB_STORE);
+typedef struct {
+    int **linebuf;
+    float *zRow;
+    TileListPtr tileList;
+    int doneWrite;
+} G, *Gptr; 
 
-    if (!g->doneWrite) {
-	free(g->linebuf);
-    }
-    free(g);
-    return 0;
-}
+static    int** linebuf_init(SchedTask *smanager, int width, int height, int rgb);
+static    float* zRow_init(SchedTask *smanager, int width, int height);
+// static    TilePtr set_rgb(memaddr addr, int wait_tag);
+// static    void set_rgbs(memaddr addr, uint32 *max_addr, int wait_tag);
+static    uint32 get_rgb(int tx, int ty, TilePtr tile);
+// static    TilePtr isAvailableTile(memaddr addr);
+static    memaddr getTile(int tx, int ty, int tw, memaddr tex_addr_top);
+static    int getTexBlock(int tx, int ty, int twidth);
+static    void updateBuffer(Gptr g, float zpos, int rangex, int x, int y,
+                      int tex_x, int tex_y, float normal_x, float nomral_x, float normal_z, TilePtr tile);
+
+
+// static    void reboot(SpanPackPtr spack, int cur_span_x);
+
+static    int drawDot1(SchedTask *smanager, Gptr g, SpanPtr span, int startx, int endx, int wait_tag);
+//static    void drawDot2(SchedTask *smanager, SpanPtr span, int startx, int endx, int js, int wait_tag);
+static    int drawLine1(SchedTask *smanager, Gptr g, SpanPtr span, int startx, int endx, int wait_tag);
+// 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);
+
 
 /**
  * テクスチャは、TEXTURE_SPLIT_PIXEL^2 のブロックに分割する
@@ -95,16 +113,17 @@
  * @param rgb    Initial value of RGB at Buffer
  * @return Buffer
  */
-static int*
+static int **
 linebuf_init(SchedTask *smanager, int width, int height, int rgb)
 {
-    int *buf = (int*)smanager->allocate(sizeof(int)*width*height);
-
-    for (int i = 0; i < width*height; i++) {
-        buf[i] = rgb;
+    int **linebuf = (int**)smanager->allocate(height*sizeof(int*));
+    for(int h = 0;h<height;h++) {
+	int *buf = linebuf[height] = (int*)smanager->get_output(height);
+	for (int i = 0; i < width*height; i++) {
+	    buf[i] = rgb;
+	}
     }
-
-    return buf;
+    return linebuf;
 }
 
 /**
@@ -136,18 +155,6 @@
 }
 
 
-static void
-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(&g->linebuf[i*buf_width],
-                            display + (sizeof(int)*screen_width*i),
-                            sizeof(int)*buf_width, FB_STORE);
-    }
-
-    g->doneWrite = 1;
-}
 
 /**
  * zRow と Linebuf を更新する
@@ -174,7 +181,8 @@
     color = infinity_light_calc(color,normal_x,normal_y,normal_z);
 
     g->zRow[x + (rangex*y)] = zpos*flag + g->zRow[x + (rangex*y)]*(1-flag);
-    g->linebuf[x + (rangex*y)] = color*flag + g->linebuf[x + (rangex*y)]*(1-flag);
+    int *point = &g->linebuf[y][x] ;
+    *point =  color*flag + *point *(1-flag);
 
 }
 
@@ -392,7 +400,7 @@
         &drawDot1, &drawLine1
     };
 
-    uint32 display   = smanager->get_param(0);
+    // uint32 display   = smanager->get_param(0);
     int screen_width = smanager->get_param(1);
     int rangex_start = smanager->get_param(2);
     int rangex_end   = smanager->get_param(3);
@@ -405,11 +413,8 @@
     g->tileList = (TileListPtr)smanager->global_get(GLOBAL_TILE_LIST);
 
     g->zRow = zRow_init(smanager, rangex, rangey);
-    //linebuf = linebuf_init(rangex, rangey, 0x00ffffff);
     g->linebuf = linebuf_init(smanager, rangex, rangey, 0);
 
-    g->doneWrite = 0;
-
     int tl_tag[2] = {TEX_LOAD1, TEX_LOAD2};
     int tl_tag_flg1 = 0;
     int tl_tag_flg2 = 1;
@@ -466,12 +471,10 @@
         next_spack = tmp_spack;
     } while (spack);
 
-    writebuffer(smanager, g, display, rangex, rangey, screen_width);
 
-    // linebuf は、writebuffer() の dma_store を wait する
-    // DrawSpan::~DrawSpan() 内で free する。
-    //free(linebuf);
     free(g->zRow);
+    free(g->linebuf);
+    free(g);
 
 //FINISH:
     /**