[Bf-blender-cvs] [a84309e] blender-tiles: Merge remote-tracking branch 'blender-upstream/master' into blender-tiles
Jeroen Bakker
noreply at git.blender.org
Tue Jul 1 22:00:18 CEST 2014
Commit: a84309e894c787ecfc36003f93167270cc1680ad
Author: Jeroen Bakker
Date: Tue Jul 1 18:27:24 2014 +0200
https://developer.blender.org/rBa84309e894c787ecfc36003f93167270cc1680ad
Merge remote-tracking branch 'blender-upstream/master' into blender-tiles
Conflicts:
source/blender/compositor/intern/COM_MemoryBuffer.cpp
source/blender/compositor/operations/COM_FastGaussianBlurOperation.cpp
source/blender/compositor/operations/COM_KeyingClipOperation.cpp
source/blender/compositor/operations/COM_RenderLayersProg.cpp
===================================================================
===================================================================
diff --cc source/blender/compositor/intern/COM_MemoryBuffer.cpp
index ff20d4c,c1916f4..a4ebfa2
--- a/source/blender/compositor/intern/COM_MemoryBuffer.cpp
+++ b/source/blender/compositor/intern/COM_MemoryBuffer.cpp
@@@ -92,62 -46,33 +92,62 @@@ MemoryBuffer::MemoryBuffer(MemoryProxy
BLI_rcti_init(&this->m_rect, rect->xmin, rect->xmax, rect->ymin, rect->ymax);
this->m_memoryProxy = memoryProxy;
this->m_chunkNumber = chunkNumber;
- this->m_buffer = (float *)MEM_mallocN(sizeof(float) * determineBufferSize() * no_channels, "COM_MemoryBuffer");
- this->m_buffer = (float *)MEM_mallocN_aligned(sizeof(float) * determineBufferSize() * COM_NUMBER_OF_CHANNELS, 16, "COM_MemoryBuffer");
++ this->m_buffer = (float *)MEM_mallocN_aligned(sizeof(float) * determineBufferSize() * no_channels, 16, "COM_MemoryBuffer");
this->m_state = COM_MB_ALLOCATED;
- this->m_datatype = COM_DT_COLOR;
this->m_chunkWidth = this->m_rect.xmax - this->m_rect.xmin;
+ this->m_no_channels = no_channels;
}
-MemoryBuffer::MemoryBuffer(MemoryProxy *memoryProxy, rcti *rect)
+MemoryBuffer::MemoryBuffer(MemoryProxy *memoryProxy, rcti *rect, unsigned int no_channels)
{
BLI_rcti_init(&this->m_rect, rect->xmin, rect->xmax, rect->ymin, rect->ymax);
this->m_memoryProxy = memoryProxy;
this->m_chunkNumber = -1;
- this->m_buffer = (float *)MEM_mallocN(sizeof(float) * determineBufferSize() * no_channels, "COM_MemoryBuffer");
- this->m_buffer = (float *)MEM_mallocN_aligned(sizeof(float) * determineBufferSize() * COM_NUMBER_OF_CHANNELS, 16, "COM_MemoryBuffer");
++ this->m_buffer = (float *)MEM_mallocN_aligned(sizeof(float) * determineBufferSize() * no_channels, 16, "COM_MemoryBuffer");
this->m_state = COM_MB_TEMPORARILY;
- this->m_datatype = COM_DT_COLOR;
this->m_chunkWidth = this->m_rect.xmax - this->m_rect.xmin;
+ this->m_no_channels = no_channels;
}
-MemoryBuffer *MemoryBuffer::duplicate()
-{
- MemoryBuffer *result = new MemoryBuffer(this->m_memoryProxy, &this->m_rect);
- memcpy(result->m_buffer, this->m_buffer, this->determineBufferSize() * COM_NUMBER_OF_CHANNELS * sizeof(float));
- return result;
+
+MemoryBuffer::MemoryBuffer(DataType datatype, rcti *rect, unsigned int no_channels) {
+ BLI_rcti_init(&this->m_rect, rect->xmin, rect->xmax, rect->ymin, rect->ymax);
+ this->m_memoryProxy = NULL;
+ this->m_chunkNumber = -1;
- this->m_buffer = (float *)MEM_mallocN(sizeof(float) * determineBufferSize() * no_channels, "COM_MemoryBuffer");
++ this->m_buffer = (float *)MEM_mallocN_aligned(sizeof(float) * determineBufferSize() * no_channels, 16, "COM_MemoryBuffer");
+ this->m_state = COM_MB_TEMPORARILY;
+ this->m_chunkWidth = this->m_rect.xmax - this->m_rect.xmin;
+ this->m_no_channels = no_channels;
}
+
void MemoryBuffer::clear()
{
- memset(this->m_buffer, 0, this->determineBufferSize() * COM_NUMBER_OF_CHANNELS * sizeof(float));
+ memset(this->m_buffer, 0, this->determineBufferSize() * this->m_no_channels * sizeof(float));
+}
+
+void MemoryBuffer::copyContentFrom(MemoryBuffer *otherBuffer)
+{
+ if (!otherBuffer) {
+ BLI_assert(0);
+ return;
+ }
+ unsigned int otherY;
+ unsigned int minX = max(this->m_rect.xmin, otherBuffer->m_rect.xmin);
+ unsigned int maxX = min(this->m_rect.xmax, otherBuffer->m_rect.xmax);
+ unsigned int minY = max(this->m_rect.ymin, otherBuffer->m_rect.ymin);
+ unsigned int maxY = min(this->m_rect.ymax, otherBuffer->m_rect.ymax);
+ int offset;
+ int otherOffset;
+
+
+ for (otherY = minY; otherY < maxY; otherY++) {
+ otherOffset = ((otherY - otherBuffer->m_rect.ymin) * otherBuffer->m_chunkWidth + minX - otherBuffer->m_rect.xmin) * this->m_no_channels;
+ offset = ((otherY - this->m_rect.ymin) * this->m_chunkWidth + minX - this->m_rect.xmin) * this->m_no_channels;
+ memcpy(&this->m_buffer[offset], &otherBuffer->m_buffer[otherOffset], (maxX - minX) * this->m_no_channels * sizeof(float));
+ }
}
+
+// TODO: this method needs to be checked! At Mind 2014
float *MemoryBuffer::convertToValueBuffer()
{
const unsigned int size = this->determineBufferSize();
diff --cc source/blender/compositor/intern/COM_Tile.h
index b7e8f84,0000000..d66b911
mode 100644,000000..100644
--- a/source/blender/compositor/intern/COM_Tile.h
+++ b/source/blender/compositor/intern/COM_Tile.h
@@@ -1,127 -1,0 +1,137 @@@
+/*
+ * Copyright 2011, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor:
+ * Jeroen Bakker
+ * Monique Dewanchand
+ */
+
+class Tile;
+
+#ifndef _COM_Tile_h_
+#define _COM_Tile_h_
+class ExecutionGroup;
+#include "COM_ExecutionGroup.h"
+class WorkScheduler;
+#include <vector>
+
+typedef std::vector<Tile*> Tiles;
+
+typedef enum TileExecutionState{
+ CREATED = 0,
+ SCHEDULED = 1,
+ FINISHED = 2
+} TileExecutionState;
+
+/**
+ * @brief A tile is the work that can be scheduled.
+ *
+ * @see WorkScheduler
+ */
+class Tile {
+private:
+ /**
+ * @brief executionGroup with the operations-setup to be evaluated
+ */
+ ExecutionGroup *m_executionGroup;
+
+ /**
+ * @brief rcti that this tile calculates from an ExecutionGroup
+ */
+ rcti *m_rect;
+
+ /**
+ * @brief a list of tiles that needs to be calculated, before this tile can be scheduled
+ */
+ Tiles m_depends_on;
+
+ /**
+ * @brief Number of unfinished tiles in the m_depends_on.
+ */
+ int m_no_unfinished_tiles;
+
+ /**
+ * @brief a list of tiles that are waiting for me to be finished
+ */
+ Tiles m_dependents;
+
+ /**
+ * @brief m_state execution state of this tile.
+ */
+ TileExecutionState m_state;
+
++ /**
++ * @brief m_tile_number this is the tile number/chunk number of the old scheduling system.
++ * It is used during coding and will be removed when the new planning system will be activated.
++ *
++ * @deprecated
++ */
+ unsigned int m_tile_number;
+public:
+ /**
+ * constructor
+ */
+ Tile(ExecutionGroup *group, rcti *rect, unsigned int tile_number);
+ ~Tile();
+ /**
+ * @brief get the ExecutionGroup
+ */
+ ExecutionGroup *getExecutionGroup() const { return this->m_executionGroup; }
+
+ /**
+ * @brief schedule Schedule this tile for execution into the scheduler.
+ */
+ void schedule();
+
+ /**
+ * @brief add_dependent adds a tile to the list of tiles that depends on this tile
+ * @param tile
+ */
+ void add_dependent(Tile* tile);
+
+ /**
+ * @brief add_depends_on adds a tile to the list of tiles that this tile depends on
+ * @param tile
+ */
+ void add_depends_on(Tile* tile);
+
+ /**
+ * @brief get_rect get the rectangle of this tile
+ * @return reference to the rcti
+ */
+ rcti* get_rect() { return this->m_rect; }
+
++ /**
++ * @brief get_tile_number
++ * @return return the chunk number of this tile
++ */
+ unsigned int get_tile_number() { return this->m_tile_number; }
+
+private:
+ /**
+ * @brief execute function called from the workscheduler to execute this tile.
+ */
+ void execute();
+
+ friend class ExecutionGroup;
+ friend class WorkScheduler;
+#ifdef WITH_CXX_GUARDEDALLOC
+ MEM_CXX_CLASS_ALLOC_FUNCS("COM:Tile")
+#endif
+};
+
+#endif
diff --cc source/blender/compositor/operations/COM_KeyingClipOperation.cpp
index 148b75a,d9eb7b5..0e62224
--- a/source/blender/compositor/operations/COM_KeyingClipOperation.cpp
+++ b/source/blender/compositor/operations/COM_KeyingClipOperation.cpp
@@@ -62,28 -62,35 +62,35 @@@ void KeyingClipOperation::executePixel(
int bufferWidth = inputBuffer->getWidth();
int bufferHeight = inputBuffer->getHeight();
- int i, j, count = 0, totalCount = 0;
-
- float value = buffer[(y * bufferWidth + x)];
- float value = buffer[(y * bufferWidth + x) * 4];
++ float value = buffer[(y * bufferWidth + x)];
bool ok = false;
+ int start_x = max_ff(0, x - delta + 1),
+ start_y = max_ff(0, y - delta + 1),
+ end_x = min_ff(x + delta - 1, bufferWidth - 1),
+ end_y = min_ff(y + delta - 1, bufferHeight - 1);
+
+ int count = 0, totalCount = (end_x - start_x + 1) * (end_y - start_y + 1) - 1;
+ int thresholdCount = ceil((float) totalCount * 0.9f);
- for (i = -delta + 1; i < delta; i++) {
- for (j = -delta + 1; j < delta; j++) {
- int cx = x + j, cy = y + i;
+ if (delta == 0) {
+ ok = true;
+ }
- if (i == 0 && j == 0)
+ for (int cx = start_x; ok == false && cx <= end_x; ++cx) {
+ for (int cy = start_y; ok == false && cy <= end_y; ++cy) {
+ if (UNLIKELY(cx == x && cy == y)) {
continue;
+ }
- if (cx >= 0 && cx < bufferWidth && cy >= 0 && cy < bufferHeight) {
- int bufferIndex = (cy * bufferWidth + cx);
- float currentValue = buffer[bufferIndex];
- int bufferIndex = (cy * bufferWidth + cx) * 4;
++ int bufferIndex = (cy * bufferWidth + cx);
+ float currentValue = buffer[bufferIndex];
- if (fabsf(currentValue - value) < tolerance) {
- count++;
+ if (fabsf(currentValue - value) < tolerance) {
+ count++;
+ if (count >= thresholdCount) {
+ ok = true;
}
-
- totalCount++;
}
}
}
diff --cc source/blender/compositor/operations/COM_RenderLayersProg.cpp
index 0eec027,7141dd7..a037997
--- a/source/blender/compositor/operations/COM_RenderLayersProg.cpp
+++ b/source/blender/compositor/operations/COM_RenderLayersProg.cpp
@@@ -135,21 -145,10 +135,18 @@@ void RenderLayersBaseProg::executePixel
#endif
if (this->m_inputBuffer == NULL) {
- zero_v4(output);
+ int elemsize = this->m_elementsize;
+ if (elemsize == 1) {
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list