diff options
Diffstat (limited to 'source/blender/compositor/intern/COM_ExecutionGroup.cpp')
-rw-r--r-- | source/blender/compositor/intern/COM_ExecutionGroup.cpp | 103 |
1 files changed, 86 insertions, 17 deletions
diff --git a/source/blender/compositor/intern/COM_ExecutionGroup.cpp b/source/blender/compositor/intern/COM_ExecutionGroup.cpp index ffc36281874..82d1c7883e1 100644 --- a/source/blender/compositor/intern/COM_ExecutionGroup.cpp +++ b/source/blender/compositor/intern/COM_ExecutionGroup.cpp @@ -40,6 +40,8 @@ #include "MEM_guardedalloc.h" #include "BLI_math.h" +#include "BLI_string.h" +#include "BKE_global.h" #include "PIL_time.h" #include "WM_api.h" #include "WM_types.h" @@ -60,6 +62,8 @@ ExecutionGroup::ExecutionGroup() this->m_openCL = false; this->m_singleThreaded = false; this->m_chunksFinished = 0; + BLI_rcti_init(&this->m_viewerBorder, 0, 0, 0, 0); + this->m_executionStartTime = 0; } CompositorPriority ExecutionGroup::getRenderPriotrity() @@ -196,6 +200,7 @@ void ExecutionGroup::determineResolution(unsigned int resolution[2]) resolution[0] = operation->getWidth(); resolution[1] = operation->getHeight(); this->setResolution(resolution); + BLI_rcti_init(&this->m_viewerBorder, 0, this->m_width, 0, this->m_height); } void ExecutionGroup::determineNumberOfChunks() @@ -207,8 +212,10 @@ void ExecutionGroup::determineNumberOfChunks() } else { const float chunkSizef = this->m_chunkSize; - this->m_numberOfXChunks = ceil(this->m_width / chunkSizef); - this->m_numberOfYChunks = ceil(this->m_height / chunkSizef); + const int border_width = BLI_rcti_size_x(&this->m_viewerBorder); + const int border_height = BLI_rcti_size_y(&this->m_viewerBorder); + this->m_numberOfXChunks = ceil(border_width / chunkSizef); + this->m_numberOfYChunks = ceil(border_height / chunkSizef); this->m_numberOfChunks = this->m_numberOfXChunks * this->m_numberOfYChunks; } } @@ -225,6 +232,8 @@ void ExecutionGroup::execute(ExecutionSystem *graph) if (this->m_numberOfChunks == 0) {return; } /// @note: early break out unsigned int chunkNumber; + this->m_executionStartTime = PIL_check_seconds_timer(); + this->m_chunksFinished = 0; this->m_bTree = bTree; unsigned int index; @@ -245,6 +254,9 @@ void ExecutionGroup::execute(ExecutionSystem *graph) chunkorder = viewer->getChunkOrder(); } + const int border_width = BLI_rcti_size_x(&this->m_viewerBorder); + const int border_height = BLI_rcti_size_y(&this->m_viewerBorder); + switch (chunkorder) { case COM_TO_RANDOM: for (index = 0; index < 2 * this->m_numberOfChunks; index++) { @@ -258,14 +270,14 @@ void ExecutionGroup::execute(ExecutionSystem *graph) case COM_TO_CENTER_OUT: { ChunkOrderHotspot *hotspots[1]; - hotspots[0] = new ChunkOrderHotspot(this->m_width * centerX, this->m_height * centerY, 0.0f); + hotspots[0] = new ChunkOrderHotspot(border_width * centerX, border_height * centerY, 0.0f); rcti rect; ChunkOrder *chunkOrders = (ChunkOrder *)MEM_mallocN(sizeof(ChunkOrder) * this->m_numberOfChunks, __func__); for (index = 0; index < this->m_numberOfChunks; index++) { determineChunkRect(&rect, index); chunkOrders[index].setChunkNumber(index); - chunkOrders[index].setX(rect.xmin); - chunkOrders[index].setY(rect.ymin); + chunkOrders[index].setX(rect.xmin - this->m_viewerBorder.xmin); + chunkOrders[index].setY(rect.ymin - this->m_viewerBorder.ymin); chunkOrders[index].determineDistance(hotspots, 1); } @@ -281,10 +293,10 @@ void ExecutionGroup::execute(ExecutionSystem *graph) case COM_TO_RULE_OF_THIRDS: { ChunkOrderHotspot *hotspots[9]; - unsigned int tx = this->m_width / 6; - unsigned int ty = this->m_height / 6; - unsigned int mx = this->m_width / 2; - unsigned int my = this->m_height / 2; + unsigned int tx = border_width / 6; + unsigned int ty = border_height / 6; + unsigned int mx = border_width / 2; + unsigned int my = border_height / 2; unsigned int bx = mx + 2 * tx; unsigned int by = my + 2 * ty; @@ -303,8 +315,8 @@ void ExecutionGroup::execute(ExecutionSystem *graph) for (index = 0; index < this->m_numberOfChunks; index++) { determineChunkRect(&rect, index); chunkOrders[index].setChunkNumber(index); - chunkOrders[index].setX(rect.xmin); - chunkOrders[index].setY(rect.ymin); + chunkOrders[index].setX(rect.xmin - this->m_viewerBorder.xmin); + chunkOrders[index].setY(rect.ymin - this->m_viewerBorder.ymin); chunkOrders[index].determineDistance(hotspots, 9); } @@ -403,6 +415,35 @@ MemoryBuffer *ExecutionGroup::constructConsolidatedMemoryBuffer(MemoryProxy *mem return result; } +void ExecutionGroup::printBackgroundStats(void) +{ + uintptr_t mem_in_use, mmap_in_use, peak_memory; + float megs_used_memory, mmap_used_memory, megs_peak_memory; + double execution_time; + char timestr[64]; + + execution_time = PIL_check_seconds_timer() - this->m_executionStartTime; + + mem_in_use = MEM_get_memory_in_use(); + mmap_in_use = MEM_get_mapped_memory_in_use(); + peak_memory = MEM_get_peak_memory(); + + megs_used_memory = (mem_in_use - mmap_in_use) / (1024.0 * 1024.0); + mmap_used_memory = (mmap_in_use) / (1024.0 * 1024.0); + megs_peak_memory = (peak_memory) / (1024.0 * 1024.0); + + fprintf(stdout, "Mem:%.2fM (%.2fM, Peak %.2fM) ", + megs_used_memory, mmap_used_memory, megs_peak_memory); + + BLI_timestr(execution_time, timestr); + printf("| Elapsed %s ", timestr); + printf("| Tree %s, Tile %d-%d ", this->m_bTree->id.name + 2, + this->m_chunksFinished, this->m_numberOfChunks); + + fputc('\n', stdout); + fflush(stdout); +} + void ExecutionGroup::finalizeChunkExecution(int chunkNumber, MemoryBuffer **memoryBuffers) { if (this->m_chunkExecutionStates[chunkNumber] == COM_ES_SCHEDULED) @@ -426,18 +467,26 @@ void ExecutionGroup::finalizeChunkExecution(int chunkNumber, MemoryBuffer **memo float progress = this->m_chunksFinished; progress /= this->m_numberOfChunks; this->m_bTree->progress(this->m_bTree->prh, progress); + + if (G.background) + printBackgroundStats(); } } inline void ExecutionGroup::determineChunkRect(rcti *rect, const unsigned int xChunk, const unsigned int yChunk) const { + const int border_width = BLI_rcti_size_x(&this->m_viewerBorder); + const int border_height = BLI_rcti_size_y(&this->m_viewerBorder); + if (this->m_singleThreaded) { - BLI_rcti_init(rect, 0, this->m_width, 0, this->m_height); + BLI_rcti_init(rect, this->m_viewerBorder.xmin, border_width, this->m_viewerBorder.ymin, border_height); } else { - const unsigned int minx = xChunk * this->m_chunkSize; - const unsigned int miny = yChunk * this->m_chunkSize; - BLI_rcti_init(rect, minx, min(minx + this->m_chunkSize, this->m_width), miny, min(miny + this->m_chunkSize, this->m_height)); + const unsigned int minx = xChunk * this->m_chunkSize + this->m_viewerBorder.xmin; + const unsigned int miny = yChunk * this->m_chunkSize + this->m_viewerBorder.ymin; + const unsigned int width = min((unsigned int) this->m_viewerBorder.xmax, this->m_width); + const unsigned int height = min((unsigned int) this->m_viewerBorder.ymax, this->m_height); + BLI_rcti_init(rect, min(minx, this->m_width), min(minx + this->m_chunkSize, width), min(miny, this->m_height), min(miny + this->m_chunkSize, height)); } } @@ -472,9 +521,9 @@ bool ExecutionGroup::scheduleAreaWhenPossible(ExecutionSystem *graph, rcti *area float chunkSizef = this->m_chunkSize; int indexx, indexy; - int minxchunk = floor(area->xmin / chunkSizef); + int minxchunk = floor((area->xmin - this->m_viewerBorder.xmin) / chunkSizef); int maxxchunk = ceil((area->xmax - 1) / chunkSizef); - int minychunk = floor(area->ymin / chunkSizef); + int minychunk = floor((area->ymin - this->m_viewerBorder.ymin) / chunkSizef); int maxychunk = ceil((area->ymax - 1) / chunkSizef); minxchunk = max(minxchunk, 0); minychunk = max(minychunk, 0); @@ -574,3 +623,23 @@ bool ExecutionGroup::isOpenCL() { return this->m_openCL; } + +void ExecutionGroup::setViewerBorder(float xmin, float xmax, float ymin, float ymax) +{ + NodeOperation *operation = this->getOutputNodeOperation(); + + if (operation->isViewerOperation() || operation->isPreviewOperation()) { + BLI_rcti_init(&this->m_viewerBorder, xmin * this->m_width, xmax * this->m_width, + ymin * this->m_height, ymax * this->m_height); + } +} + +void ExecutionGroup::setRenderBorder(float xmin, float xmax, float ymin, float ymax) +{ + NodeOperation *operation = this->getOutputNodeOperation(); + + if (operation->isOutputOperation(true) && !(operation->isViewerOperation() || operation->isPreviewOperation())) { + BLI_rcti_init(&this->m_viewerBorder, xmin * this->m_width, xmax * this->m_width, + ymin * this->m_height, ymax * this->m_height); + } +} |