Mercurial > hg > Game > Cerium
changeset 1175:d7486d6a5e37 draft
minor change
author | Yutaka_Kinjyo |
---|---|
date | Tue, 07 Jun 2011 17:55:20 +0900 |
parents | 0e826d18f59a |
children | fc4a96198ed3 5abf0ce8c71c |
files | Renderer/Engine/task/CreateSpan.cc TaskManager/kernel/memory/AddrList.h TaskManager/kernel/memory/MemIterator.cc TaskManager/kernel/memory/MemIterator.h TaskManager/kernel/schedule/SchedTask.cc TaskManager/kernel/schedule/SchedTask.h TaskManager/kernel/schedule/Scheduler.cc TaskManager/kernel/schedule/Scheduler.h |
diffstat | 8 files changed, 135 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/Renderer/Engine/task/CreateSpan.cc Tue Jun 07 01:31:03 2011 +0900 +++ b/Renderer/Engine/task/CreateSpan.cc Tue Jun 07 17:55:20 2011 +0900 @@ -404,12 +404,6 @@ #ifdef USE_SEGMENT - /* - it = create_iterator(spackList, span_ml); - ms = (MemorySegmentPtr)it->get_ms(); - spack = (SpanPackPtr)ms->data; - - */ smanager->wait_segment(span_put_ms); @@ -422,6 +416,13 @@ prev_index = index; spack = (SpanPackPtr)span_get_ms->data; + +#elif defined(USE_ITERATOR) + + ms = it->get_ms(); + spack = (SpanPackPtr)ms->data; + prev_index = index; + #else tmp_spack = spack; @@ -454,7 +455,7 @@ * Segment領域を確保して、それをsegmentのAPIでやり取りするのが嬉しいのかね。 * * mainMem 追い出すには、ちょっと苦労するかも? - * mainMem するかどうかは予想できる。 + * mainMem するかどうかは予想できはする。 */ if (spack->info.size >= MAX_SIZE_SPAN) { @@ -469,12 +470,6 @@ #ifdef USE_SEGMENT - /* - cur_spack = get_list_cur(); - cur_spack = next; - - */ - smanager->wait_segment(span_put_ms); span_put_ms = span_get_ms; @@ -487,6 +482,20 @@ spack = (SpanPackPtr)span_get_ms->data; spack->init((index+1)*split_screen_h); + +#elif defined(USE_ITERATOR) + + /* + next は AddrList に直さないといけない + AddrList next_list = make_list(next); + とかいうAPIか、overwrite_list の中でもいいかもね。 + */ + + overwrite_list(next_ist); + ms = it->get_ms(); + spack = (SpanPackPtr)ms->data; + prev_index = index; + #else @@ -597,6 +606,7 @@ #endif + // ここで AddrList は作れるかな。 int charge_y_top = (long)smanager->get_param(1); int charge_y_end = (long)smanager->get_param(2); @@ -612,6 +622,10 @@ pp_ms = smanager->get_segment((memaddr)pp->next, pp_ml); +#elif defined(USE_ITERATOR) + + + #else smanager->dma_load(next_pp, (memaddr)pp->next, @@ -625,6 +639,9 @@ pp_ms = NULL; +#elif defined(USE_ITERATOR) + + #else next_pp = NULL; @@ -706,6 +723,8 @@ } else { pp = NULL; } + +#elif defined(USE_ITERATOR) #else @@ -736,13 +755,14 @@ sizeof(SpanPack), SPAN_PACK_STORE); smanager->dma_wait(SPAN_PACK_STORE); - #endif #ifdef USE_SEGMENT // Global でSegmentとったので、いつか解放しないといかないなぁ。 +#elif defined(USE_ITERATOR) + #else free(free_pp);
--- a/TaskManager/kernel/memory/AddrList.h Tue Jun 07 01:31:03 2011 +0900 +++ b/TaskManager/kernel/memory/AddrList.h Tue Jun 07 17:55:20 2011 +0900 @@ -13,7 +13,7 @@ typedef struct AddrList { memaddr addr; - memaddr next; + AddrList *next; }AddrList, *AddrListPtr; // 8
--- a/TaskManager/kernel/memory/MemIterator.cc Tue Jun 07 01:31:03 2011 +0900 +++ b/TaskManager/kernel/memory/MemIterator.cc Tue Jun 07 17:55:20 2011 +0900 @@ -6,6 +6,9 @@ * @param [addr_list] main memory 側のアドレスリスト * @param [mem_list] memory segment のリスト * @param [cmd] Iterator パターンというべきか. + * + * cmd は、ms, MemList で情報を持っててもできる + * */ MemIterator::MemIterator(AddrListPtr addr_list, MemList *mem_list, @@ -81,7 +84,7 @@ exec_ms = read_ms; // アドレスをリストから追っていく - addr_list = (AddrListPtr)addr_list->next; + addr_list = addr_list->next; // 次必要なものを load し始めておく read_ms = smanager->get_segment(addr_list->addr, mem_list); @@ -106,7 +109,7 @@ exec_ms = read_ms; // アドレスをリストから追っていく - addr_list = (AddrListPtr)addr_list->next; + addr_list = addr_list->next; // 次必要なものを load し始めておく @@ -147,7 +150,65 @@ write_ms = smanager->get_free_segment(addr_list->addr, mem_list); // アドレスをリストから追っていく - addr_list = (AddrListPtr)addr_list->next; + addr_list = addr_list->next; return write_ms; } + + +/* + * 出しておいた segment 命令を待つ. + * まだ、書きこまれていないmsを書きこむ + * 最後の締め. + */ + +void +MemIterator::collect_ms(void) +{ + smanager->put_segment(write_ms); + smanager->wait_segment(free_ms); + smanager->wait_segment(write_ms); + smanager->wait_segment(read_ms); +} + + +/* + * 走査中のlistの一部を上書きする. + * mainMem (CreateSpan) とかやるとき、使う予定 + */ +void +MemIterator::overwrite_list(AddrListPtr list) +{ + + /* + * すでに次のリストの read を開始している可能性がある + * ので、それをいったん中止、同じ ms に 新しく load をかける。 + * + * でも、これは write only な場合いらない.. + */ + + // dma命令キャンセルする方法があるかな. 調べてみる. あるならwaitするよりそっちがいい. + smanager->wait_segment(read_ms); + + /* segment に直接上書きする機能が必要かも. 要実装. + * 指定した ms に load する + * この場合は、read_ms に新しく list->addr を load する + */ + smanager->overwrite_segment(read_ms, list->addr); + + + /* + * 現在のaddr_list を新しい list に上書きする + */ + AddrListPtr tmp = list; + + while(list->next) { + list = list->next; + } + + list->next = addr_list->next; + addr_list = tmp; + +} + +
--- a/TaskManager/kernel/memory/MemIterator.h Tue Jun 07 01:31:03 2011 +0900 +++ b/TaskManager/kernel/memory/MemIterator.h Tue Jun 07 17:55:20 2011 +0900 @@ -34,11 +34,18 @@ MemIterator(AddrListPtr add_list, MemList *mem_list, int cmd, SchedTask *smanager); ~MemIterator(); + + MemorySegmentPtr (MemIterator::*get_ms)(void); + int hasNext(void); - MemorySegmentPtr (MemIterator::*get_ms)(void); + MemorySegmentPtr get_read_write_ms(void); MemorySegmentPtr get_read_ms(void); MemorySegmentPtr get_write_ms(void); + + void collect_ms(void); + void overwrite_list(AddrListPtr list); + }; typedef MemIterator *MemIteratorPtr;
--- a/TaskManager/kernel/schedule/SchedTask.cc Tue Jun 07 01:31:03 2011 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.cc Tue Jun 07 17:55:20 2011 +0900 @@ -270,6 +270,10 @@ return scheduler->get_free_segment(addr,m); } +void SchedTask::overwrite_segment(MemorySegment *s, memaddr addr) { + return scheduler->overwrite_segment(s,addr); +} + void SchedTask::put_segment(MemorySegment *s) { scheduler->put_segment(s);
--- a/TaskManager/kernel/schedule/SchedTask.h Tue Jun 07 01:31:03 2011 +0900 +++ b/TaskManager/kernel/schedule/SchedTask.h Tue Jun 07 17:55:20 2011 +0900 @@ -66,6 +66,7 @@ MemorySegment * get_segment(memaddr addr, MemList *m); MemorySegment * get_free_segment(memaddr addr, MemList *m); + void overwrite_segment(MemorySegment *s, memaddr addr); uint32 get_tag(); void put_segment(MemorySegment *s); void wait_segment(MemorySegment *s);
--- a/TaskManager/kernel/schedule/Scheduler.cc Tue Jun 07 01:31:03 2011 +0900 +++ b/TaskManager/kernel/schedule/Scheduler.cc Tue Jun 07 17:55:20 2011 +0900 @@ -452,6 +452,28 @@ } +/*! + + 指定した MemorySegment を上書きする + + @param [s] 上書きするMemorySegment + @param [addr] 上書きするdataへのアドレス + + */ + +void +Scheduler::overwrite_segment(MemorySegment *s, memaddr addr) +{ + + if(addr == NULL) { + return; + } + + s->address = addr; + dma_load(s->data, addr, s->size, s->tag); + +} + MemorySegment * Scheduler::get_segment(memaddr addr, MemList *m, int size)
--- a/TaskManager/kernel/schedule/Scheduler.h Tue Jun 07 01:31:03 2011 +0900 +++ b/TaskManager/kernel/schedule/Scheduler.h Tue Jun 07 17:55:20 2011 +0900 @@ -111,6 +111,7 @@ MemorySegment * get_segment(memaddr addr, MemList *m); MemorySegment * get_segment(memaddr addr, MemList *m, int size); MemorySegment * get_free_segment(memaddr addr, MemList *m); + void overwrite_segment(MemorySegment *s, memaddr addr); void allocate_code_segment(int size, int count,struct tbl *table);