Mercurial > hg > Members > kono > Cerium
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: /**