diff --git a/apps/nexus/lrupserver.h b/apps/nexus/lrupserver.h index 3cfa4fe7..ac5eb6c3 100644 --- a/apps/nexus/lrupserver.h +++ b/apps/nexus/lrupserver.h @@ -29,9 +29,9 @@ class LruPServer: public PServer { return *((*i).second); } else { while(ram_used > ram_max) { - index.erase(items.back().first); - FlushPatch(patch, items.back().second); - items.pop_back(); + index.erase(items.back().first); + FlushPatch(patch, items.back().second); + items.pop_back(); } Item item; item.first = patch; @@ -46,13 +46,14 @@ class LruPServer: public PServer { bool IsLoaded(unsigned int patch) { return index.count(patch); } - void Flush() { - std::cerr << "Lru flulshing\n"; + void Flush() { std::map::iterator i; for(i = index.begin(); i != index.end(); i++) { Item &item = *((*i).second); FlushPatch((*i).first, item.second); - } + } + for(int k = 0; k < entries.size(); k++) + entries[k].patch = NULL; items.clear(); index.clear(); diff --git a/apps/nexus/nexusmt.cpp b/apps/nexus/nexusmt.cpp index e7943960..060281e6 100644 --- a/apps/nexus/nexusmt.cpp +++ b/apps/nexus/nexusmt.cpp @@ -215,9 +215,9 @@ bool NexusMt::InitGL(Vbo mode, unsigned int vbosize) { cerr << "No vbo available!" << endl; vbo_mode = VBO_OFF; } - patches.vbo_max = vbosize / chunk_size; +/*WORKING? patches.vbo_max = vbosize / chunk_size; if(vbo_mode == VBO_OFF) - patches.vbo_max = 0; + patches.vbo_max = 0;*/ prefetch.start(); return true; @@ -381,7 +381,7 @@ void NexusMt::SetError(float error) { } void NexusMt::SetVboSize(unsigned int _vbo_max) { - patches.vbo_max = _vbo_max; +//WORKING patches.vbo_max = _vbo_max; } void NexusMt::SetPrefetchSize(unsigned int size) { @@ -443,14 +443,16 @@ void NexusMt::LoadHistory() { Node &node = nodes[current_node]; node.error = 0; + //cerr << "Created: "; //created cells belong to this node, we look also for max error. - for(unsigned int i = 0; i < (*u).created.size(); i++) { + for(unsigned int i = 0; i < (*u).created.size(); i++) { unsigned int cell = (*u).created[i]; + //cerr << cell << " "; if(index[cell].error > node.error) - node.error = index[cell].error; - + node.error = index[cell].error; cell_node[cell] = current_node; } + //cerr << endl; //Every erased cell already belonged to a node. //we record for each node its cells. diff --git a/apps/nexus/nexusview.cpp b/apps/nexus/nexusview.cpp index 04b59ff9..7bdbfeb4 100644 --- a/apps/nexus/nexusview.cpp +++ b/apps/nexus/nexusview.cpp @@ -24,6 +24,9 @@ History $Log: not supported by cvs2svn $ +Revision 1.25 2004/12/15 08:46:16 ponchio +Optimizing realtime vis. + Revision 1.24 2004/12/13 00:44:48 ponchio Lotsa changes... @@ -259,9 +262,14 @@ int main(int argc, char *argv[]) { float alpha = 0; bool redraw = false; float fps = 0; - float tframe = 0; + unsigned int nave = 5; + unsigned int offset = 0; + vector tframe; + for(int i = 0; i < 5; i++) tframe.push_back(0); + bool keepdrawing = true; + watch.Start(); while( !quit ) { unsigned int anything = SDL_PollEvent(&event); if(!anything && !keepdrawing) { @@ -281,12 +289,12 @@ int main(int argc, char *argv[]) { case SDLK_c: show_colors = !show_colors; break; case SDLK_n: show_normals = !show_normals; break; - case SDLK_LEFT: nexus.extraction_max *= 0.7; break; - case SDLK_RIGHT: nexus.extraction_max *= 1.5; break; - case SDLK_UP: nexus.draw_max *= 1.5; break; - case SDLK_DOWN: nexus.draw_max *= 0.7; break; - case SDLK_PAGEUP: nexus.disk_max *= 1.5; break; - case SDLK_PAGEDOWN: nexus.disk_max *= 0.7; break; + case SDLK_LEFT: nexus.patches.ram_max *= 0.8; break; + case SDLK_RIGHT: nexus.patches.ram_max *= 1.3; break; + case SDLK_UP: nexus.draw_max *= 1.3; break; + case SDLK_DOWN: nexus.draw_max *= 0.8; break; + case SDLK_PAGEUP: nexus.disk_max *= 1.3; break; + case SDLK_PAGEDOWN: nexus.disk_max *= 0.8; break; case SDLK_s: metric = NexusMt::FRUSTUM; break; case SDLK_p: mode = NexusMt::POINTS; nexus.SetMode(mode); break; @@ -394,7 +402,7 @@ int main(int argc, char *argv[]) { nexus.SetComponent(NexusMt::NORMAL, show_normals); static vector cells; - watch.Start(); + //watch.Start(); if(extract) { // nexus.patches.Flush(); @@ -439,18 +447,19 @@ int main(int argc, char *argv[]) { char buffer[1024]; glColor3f(1.0f, 1.0f, 1.0f); + double ftime = (tframe[(offset+4)%5] - tframe[(offset)%5])/5.0f; + /* sprintf(buffer, "Ram size : %.3fMb (max) %.3fMb (cur)", nexus.patches->ram_size * nexus.chunk_size/(float)(1<<20), nexus.patches->ram_used * nexus.chunk_size/(float)(1<<20)); gl_print(0.03, 0.12, buffer);*/ - sprintf(buffer, "Extr size: %.3fMb(max) %.3fMb(cur)", + sprintf(buffer, "Ram size: %.3fMb(max) %.3fMb(cur)", nexus.patches.ram_max * nexus.chunk_size/(float)(1<<20), nexus.patches.ram_used * nexus.chunk_size/(float)(1<<20)); gl_print(0.03, 0.09, buffer); - sprintf(buffer, "Vbo size : %.3fMb(max) %.3fMb(cur)", - nexus.patches.vbo_max * nexus.chunk_size/(float)(1<<20), + sprintf(buffer, "Vbo size : %.3fMb(cur)", nexus.patches.vbo_used * nexus.chunk_size/(float)(1<<20)); gl_print(0.03, 0.06, buffer); @@ -458,7 +467,7 @@ int main(int argc, char *argv[]) { "%.3f time %.2f FPS", nexus.tri_total/(float)(1<<10), nexus.tri_rendered/(float)(1<<10), - tframe, 1/tframe); + ftime, 1/ftime); gl_print(0.03, 0.03, buffer); glEnable(GL_DEPTH_TEST); @@ -469,7 +478,7 @@ int main(int argc, char *argv[]) { } SDL_GL_SwapBuffers(); - tframe = watch.Time(); + tframe[offset++%5] = watch.Time(); } diff --git a/apps/nexus/prefetch.cpp b/apps/nexus/prefetch.cpp index b9396833..9666ddf2 100644 --- a/apps/nexus/prefetch.cpp +++ b/apps/nexus/prefetch.cpp @@ -31,11 +31,17 @@ void Prefetch::init(NexusMt *m, std::vector &selected, notloaded++; } else { PatchInfo &info = mt->index[patch]; - QueuePServer::Data &data = mt->patches.Lookup(patch, info.nvert, info.nface, 0.0f, flush); - if(flush.size() != 0) { + //WORKING QueuePServer::Data &data = mt->patches.Lookup(patch, info.nvert, info.nface, 0.0f, flush); + QueuePServer::Data &data = mt->patches.Lookup(patch, info.nvert, info.nface, flush); + for(unsigned int i = 0; i < flush.size(); i++) { + QueuePServer::Data *data = new QueuePServer::Data; + *data = flush[i]; + draw.post(QueuePServer::FLUSH, (unsigned int)data); + } + /* WORKING if(flush.size() != 0) { cerr << "Flushing!\n"; exit(0); - } + } */ mt->todraw.push_back(&data); } //missing.push_back(PServer::Item(patch, 0.0f)); @@ -52,7 +58,7 @@ void Prefetch::init(NexusMt *m, std::vector &selected, missing.push_back(item); } - QueuePServer &ps = mt->patches; +/* WORKING QueuePServer &ps = mt->patches; for(unsigned int i = 0; i < ps.heap.size(); i++) { PServer::Item &item = ps.heap[i]; if(tmp.count(item.patch)) @@ -61,14 +67,9 @@ void Prefetch::init(NexusMt *m, std::vector &selected, if(item.priority == 0) item.priority = 1; item.priority *= 1.1; - } - - /*if(tmp.count(item.patch)) - item.priority = tmp[item.patch]; - else - item.priority = 1e30;*/ + } } - make_heap(ps.heap.begin(), ps.heap.end()); + make_heap(ps.heap.begin(), ps.heap.end());*/ sort(missing.begin(), missing.end()); //CRITICAL reverse pero'! reverse(missing.begin(), missing.end()); @@ -77,19 +78,25 @@ void Prefetch::init(NexusMt *m, std::vector &selected, safety.unlock(); } -void Prefetch::execute() { +void Prefetch::execute() { + unsigned int prefetched = 0; while(1) { if(get_signaled()) return; vector flush; if(load.get_count() || missing.size() == 0) { + if(prefetched) + cerr << "Prefetched: " << prefetched << endl; + prefetched = 0; + pt::message *msg = load.getmessage(); if(msg->id != 0xffffffff) { safety.lock(); PatchInfo &info = mt->index[msg->id]; //posting draw message - QueuePServer::Data &data = mt->patches.Lookup(msg->id, info.nvert, info.nface, 0.0f, flush); + //WORKING QueuePServer::Data &data = mt->patches.Lookup(msg->id, info.nvert, info.nface, 0.0f, flush); + QueuePServer::Data &data = mt->patches.Lookup(msg->id, info.nvert, info.nface, flush); pt::message *msg = new pt::message(QueuePServer::DRAW, (unsigned int)&data); msg->result = msg->id; draw.post(msg); @@ -109,19 +116,23 @@ void Prefetch::execute() { PServer::Item item = missing.back(); missing.pop_back(); - if(item.priority > mt->patches.MaxPriority()) { +/*Working if(item.priority > mt->patches.MaxPriority()) { missing.clear(); - } else { + } else { */ PatchInfo &info = mt->index[item.patch]; //cerr << "prefetching: " << item.patch << endl; - mt->patches.Lookup(item.patch, info.nvert, info.nface, item.priority, flush); - for(unsigned int i = 0; i < flush.size(); i++) { - QueuePServer::Data *data = new QueuePServer::Data; - *data = flush[i]; - draw.post(QueuePServer::FLUSH, (unsigned int)data); + //WORKING mt->patches.Lookup(item.patch, info.nvert, info.nface, item.priority, flush); + if(!mt->patches.entries[item.patch].patch) { + mt->patches.Lookup(item.patch, info.nvert, info.nface, flush); + prefetched++; + for(unsigned int i = 0; i < flush.size(); i++) { + QueuePServer::Data *data = new QueuePServer::Data; + *data = flush[i]; + draw.post(QueuePServer::FLUSH, (unsigned int)data); + } } - } + // } } safety.unlock(); } diff --git a/apps/nexus/pserver.cpp b/apps/nexus/pserver.cpp index 91f14d91..5ea81efb 100644 --- a/apps/nexus/pserver.cpp +++ b/apps/nexus/pserver.cpp @@ -66,6 +66,7 @@ void PServer::AddPatch(unsigned short nvert, unsigned short nface) { entry.patch_start = 0xffffffff; entry.ram_size = Patch::ChunkSize(signature, nvert, nface, chunk_size); entry.disk_size = 0xffff; + entry.patch = NULL; entries.push_back(entry); } @@ -79,7 +80,7 @@ Patch *PServer::LoadPatch(unsigned int idx, if(entry.patch) return entry.patch; char *ram = new char[entry.ram_size * chunk_size]; -#ifdef CONTROLS +#ifndef NDEBUG if(!ram) { cerr << "COuld not allocate ram!\n"; exit(0); diff --git a/apps/nexus/queuepserver.cpp b/apps/nexus/queuepserver.cpp index 61a7095e..86c419ca 100644 --- a/apps/nexus/queuepserver.cpp +++ b/apps/nexus/queuepserver.cpp @@ -6,7 +6,7 @@ using namespace std; using namespace nxs; using namespace pt; - + /* QueuePServer::Data &QueuePServer::Lookup(unsigned int patch, unsigned short nv, unsigned short nf, float priority, @@ -33,85 +33,12 @@ QueuePServer::Data &QueuePServer::Lookup(unsigned int patch, // cerr << "Loading: " << patch << endl; data.patch = LoadPatch(patch, nv, nf); - /*if(priority == 0) { - message *msg = new message(DRAW, (unsigned int)&data); - msg->result = patch; - queue.post(msg); - } */ + return data; } } -/* -QueuePServer::Data &QueuePServer::Lookup(unsigned int patch, - unsigned short nv, unsigned short nf, - float priority) { - if(index.count(patch)) { - Data &data = index[patch]; - if(priority == 0) { - // cerr << "Posting draw!\n"; - message *msg = new message(DRAW, (unsigned int)&data); - msg->result = patch; - queue.post(msg); - } - return data; - } else { - while(ram_used > ram_max) { - pop_heap(heap.begin(), heap.end()); - Item item = heap.back(); - if(item.priority == 0) break; //no deleting needed patches. - // cerr << "Dropping: " << item.patch << endl; - Data &data = index[item.patch]; - FlushVbo(data); - Data *d = new Data(data); - queue.post(FLUSH, (unsigned int)d); - FlushPatch(item.patch, data.patch); - index.erase(item.patch); - } - Item item(patch, priority); - heap.push_back(item); - push_heap(heap.begin(), heap.end()); - Data &data = index[patch]; - // cerr << "Loading: " << patch << endl; - data.patch = LoadPatch(patch, nv, nf); - - if(priority == 0) { - message *msg = new message(DRAW, (unsigned int)&data); - msg->result = patch; - queue.post(msg); - } - return data; - } -} -*/ -/*QueuePServer::Data &QueuePServer::Lookup(unsigned int patch, - Patch *mem, - float priority) { - if(index.count(patch)) { - Data &data = index[patch]; - return data; - } else { - while(ram_used > ram_max) { - pop_heap(heap.begin(), heap.end()); - Item item = heap.back(); - if(item.priority == 0) break; //no deleting needed patches. - // cerr << "Dropping: " << item.patch << endl; - Data &data = index[item.patch]; - FlushVbo(data); - FlushPatch(item.patch, data.patch); - index.erase(item.patch); - } - Item item(patch, priority); - heap.push_back(item); - push_heap(heap.begin(), heap.end()); - Data &data = index[patch]; - // cerr << "Loading: " << patch << endl; - data.patch = mem; - LoadVbo(data); - return data; - } -} */ bool QueuePServer::IsLoaded(unsigned int patch) { return index.count(patch); @@ -128,10 +55,10 @@ void QueuePServer::Flush() { FlushVbo((*i).second); FlushPatch((*i).first, (*i).second.patch); } -} +} */ void QueuePServer::LoadVbo(Data &data) { - if(!vbo_max) return; +//WORKING if(!vbo_max) return; Patch &patch = *data.patch; glGenBuffersARB(1, &data.vbo_element); assert(data.vbo_element); @@ -157,7 +84,7 @@ void QueuePServer::LoadVbo(Data &data) { vbo_used += size; } void QueuePServer::FlushVbo(Data &data) { - if(!vbo_max) return; +//WORKING if(!vbo_max) return; if(!data.vbo_element) return; //glDeleteBuffersARB(1, &data.vbo_element); //glDeleteBuffersARB(1, &data.vbo_array); diff --git a/apps/nexus/queuepserver.h b/apps/nexus/queuepserver.h index e40e2a8a..1fbef819 100644 --- a/apps/nexus/queuepserver.h +++ b/apps/nexus/queuepserver.h @@ -12,6 +12,7 @@ namespace nxs { + class QueuePServer: public PServer { public: @@ -23,27 +24,72 @@ class QueuePServer: public PServer { Data(): patch(NULL), vbo_array(0), vbo_element(0) {} }; - pt::jobqueue queue; - + pt::jobqueue queue; unsigned int vbo_used; - unsigned int vbo_max; - std::map index; - std::vector heap; - - QueuePServer(): queue(64000) {} + typedef std::pair Item; + std::list items; + typedef std::list Items; + std::map index; - //Data &Lookup(unsigned int patch, unsigned short nv, unsigned short nf, -// float priority = 0.0f); + QueuePServer(): queue(64000), vbo_used(0) {} + ~QueuePServer() { + Flush(); + } + Data &Lookup(unsigned int patch, unsigned short nv, unsigned short nf, + std::vector &flush) { + if(index.count(patch)) { + Items::iterator &i = index[patch]; + Item item = *i; + items.erase(i); + items.push_front(item); + i = items.begin(); + return ((*i).second); + } else { + while(ram_used > ram_max) { + Data &data = items.back().second; + //TODO i should not flush current extraction! + index.erase(items.back().first); + FlushPatch(patch, data.patch); + flush.push_back(data); + items.pop_back(); + } + Item item; + item.first = patch; + item.second.patch = LoadPatch(patch, nv, nf); + items.push_front(item); + Items::iterator i = items.begin(); + index[patch] = i; + return ((*i).second); + } + } + + //return flushing too. - Data &Lookup(unsigned int patch, unsigned short nv, unsigned short nf, float priority, - std::vector &data); - - bool IsLoaded(unsigned int patch); - float MaxPriority(); - void Flush(); + //Data &Lookup(unsigned int patch, unsigned short nv, unsigned short nf, float priority, + // std::vector &data); + //bool IsLoaded(unsigned int patch); + //float MaxPriority(); + + + bool IsLoaded(unsigned int patch) { + return index.count(patch); + } + void Flush() { + std::map::iterator i; + for(i = index.begin(); i != index.end(); i++) { + Item &item = *((*i).second); + FlushVbo(item.second); + FlushPatch((*i).first, item.second.patch); + } + for(int k = 0; k < entries.size(); k++) + entries[k].patch = NULL; + + items.clear(); + index.clear(); + } void LoadVbo(Data &data); void FlushVbo(Data &data); }; diff --git a/apps/nexus/watch.cpp b/apps/nexus/watch.cpp index 698f4ff9..f35491c6 100644 --- a/apps/nexus/watch.cpp +++ b/apps/nexus/watch.cpp @@ -24,6 +24,9 @@ History $Log: not supported by cvs2svn $ +Revision 1.3 2004/10/21 13:40:16 ponchio +Debugging. + Revision 1.2 2004/10/21 12:14:02 ponchio Support for mfile (>4Gb) @@ -61,19 +64,19 @@ void Watch::Start(void) { elapsed = 0; } -float Watch::Pause() { +double Watch::Pause() { QueryPerformanceCounter(&tend); elapsed += Diff(); - return (float)elapsed; + return (double)elapsed; } void Watch::Continue() { QueryPerformanceCounter(&tstart); } -float Watch::Time() { +double Watch::Time() { QueryPerformanceCounter(&tend); - return (float)(elapsed + Diff()); + return (double)(elapsed + Diff()); } double Watch::Diff() { @@ -91,19 +94,19 @@ void Watch::Start() { elapsed = 0; } -float Watch::Pause() { +double Watch::Pause() { gettimeofday(&tend, &tz); elapsed += Diff(); - return (float)elapsed; + return (double)elapsed; } void Watch::Continue() { gettimeofday(&tstart, &tz); } -float Watch::Time() { +double Watch::Time() { gettimeofday(&tend, &tz); - return (float)(elapsed + Diff()); + return (double)(elapsed + Diff()); } double Watch::Diff() { @@ -127,7 +130,7 @@ int Watch::Usec() { #endif } -void Report::Init(unsigned int t, float inter) { +void Report::Init(unsigned int t, double inter) { watch.Start(); tot = t; last = 0; @@ -136,17 +139,17 @@ void Report::Init(unsigned int t, float inter) { void Report::Step(unsigned int count) { if(count == 0) return; - float now = watch.Time(); + double now = watch.Time(); if(now - last < interval) return; //estimate final time - float tot_time = now * tot/(float)count; + double tot_time = now * tot/(double)count; printf("%d/%d\telapsed: %.1f\tremaining: %.1f\ttotal: %.1f\n", count, tot, now, tot_time - now, tot_time); last = now; } void Report::Finish() { - float now = watch.Time(); + double now = watch.Time(); printf("Tot: %.1f\tN: %d\tN/sec: %.1f\n", now, tot, tot/now); } diff --git a/apps/nexus/watch.h b/apps/nexus/watch.h index 78a774fb..cbe364b5 100644 --- a/apps/nexus/watch.h +++ b/apps/nexus/watch.h @@ -24,6 +24,9 @@ History $Log: not supported by cvs2svn $ +Revision 1.5 2004/12/01 16:00:35 ponchio +Level 3 + Revision 1.4 2004/11/28 04:10:59 ponchio winsockapi include problem @@ -65,10 +68,10 @@ class Watch { public: Watch(); void Start(); - float Pause(); + double Pause(); void Continue(); void Reset(); - float Time(); + double Time(); int Usec(); private: double Diff(); @@ -85,13 +88,13 @@ private: class Report { public: - Report(unsigned int tot = 1, float inter = 30.0f) { Init(tot, inter); } - void Init(unsigned int tot, float inter = 30.0f); + Report(unsigned int tot = 1, double inter = 30.0f) { Init(tot, inter); } + void Init(unsigned int tot, double inter = 30.0f); void Step(unsigned int count); void Finish(); private: Watch watch; int tot; - float last; - float interval; + double last; + double interval; };