Commit: 5897c6799c3ae48e2e3a5d2e3f22a884b8f04f01 Author: Jeroen Bakker Date: Mon Jul 14 23:01:35 2014 +0200 https://developer.blender.org/rB5897c6799c3ae48e2e3a5d2e3f22a884b8f04f01
First implementation of the samplers. Refactored the read methods from the buffers to wpecialized classes. these classes can be optimized locally. next step: remove the read methods from the buffer. they should al go through the samplers of the buffers =================================================================== M source/blender/compositor/CMakeLists.txt M source/blender/compositor/intern/COM_MemoryBuffer.cpp M source/blender/compositor/intern/COM_MemoryBuffer.h M source/blender/compositor/intern/COM_MemoryBufferColor.cpp M source/blender/compositor/intern/COM_MemoryBufferColor.h M source/blender/compositor/intern/COM_MemoryBufferValue.cpp M source/blender/compositor/intern/COM_MemoryBufferValue.h M source/blender/compositor/intern/COM_MemoryBufferVector.cpp M source/blender/compositor/intern/COM_MemoryBufferVector.h A source/blender/compositor/intern/COM_Sampler.cpp A source/blender/compositor/intern/COM_Sampler.h =================================================================== diff --git a/source/blender/compositor/CMakeLists.txt b/source/blender/compositor/CMakeLists.txt index 3a300fa..6ff0d19 100644 --- a/source/blender/compositor/CMakeLists.txt +++ b/source/blender/compositor/CMakeLists.txt @@ -80,6 +80,8 @@ set(SRC intern/COM_MemoryBufferVector.h intern/COM_MemoryBufferValue.cpp intern/COM_MemoryBufferValue.h + intern/COM_Sampler.cpp + intern/COM_Sampler.h intern/COM_WorkScheduler.cpp intern/COM_WorkScheduler.h intern/COM_Tile.cpp diff --git a/source/blender/compositor/intern/COM_MemoryBuffer.cpp b/source/blender/compositor/intern/COM_MemoryBuffer.cpp index 05e8a0d..55c819f 100644 --- a/source/blender/compositor/intern/COM_MemoryBuffer.cpp +++ b/source/blender/compositor/intern/COM_MemoryBuffer.cpp @@ -192,6 +192,7 @@ float MemoryBuffer::getMaximumValue(rcti *rect) MemoryBuffer::~MemoryBuffer() { + this->deinit_samplers(); if (this->m_buffer) { MEM_freeN(this->m_buffer); this->m_buffer = NULL; diff --git a/source/blender/compositor/intern/COM_MemoryBuffer.h b/source/blender/compositor/intern/COM_MemoryBuffer.h index 8eddcb9..60dee84 100644 --- a/source/blender/compositor/intern/COM_MemoryBuffer.h +++ b/source/blender/compositor/intern/COM_MemoryBuffer.h @@ -119,6 +119,7 @@ protected: * @param num_channels Number of channels that must be allocated for every pixel */ MemoryBuffer(DataType datatype, rcti *rect, unsigned int num_channels); + public: /** * @brief factory method for the constructor, selecting the right subclass @@ -191,7 +192,9 @@ public: } } - virtual void read(float *result, int x, int y, + virtual void init_samplers() {} + virtual void deinit_samplers() {} + virtual void read(float *result, int x, int y, MemoryBufferExtend extend_x = COM_MB_CLIP, MemoryBufferExtend extend_y = COM_MB_CLIP) = 0; diff --git a/source/blender/compositor/intern/COM_MemoryBufferColor.cpp b/source/blender/compositor/intern/COM_MemoryBufferColor.cpp index 1513e2a..6bbe56c 100644 --- a/source/blender/compositor/intern/COM_MemoryBufferColor.cpp +++ b/source/blender/compositor/intern/COM_MemoryBufferColor.cpp @@ -27,17 +27,32 @@ MemoryBufferColor::MemoryBufferColor(MemoryProxy *memoryProxy, unsigned int chunkNumber, rcti *rect): MemoryBuffer(memoryProxy, chunkNumber, rect, NUMBER_OF_CHANNELS) { + this->init_samplers(); + } MemoryBufferColor::MemoryBufferColor(MemoryProxy *memoryProxy, rcti *rect) : MemoryBuffer(memoryProxy, rect, NUMBER_OF_CHANNELS) { + this->init_samplers(); } MemoryBufferColor::MemoryBufferColor(DataType datatype, rcti *rect) : MemoryBuffer(datatype, rect, NUMBER_OF_CHANNELS) { + this->init_samplers(); +} + +void MemoryBufferColor::init_samplers() { + this->m_sampler_nearest = new SamplerNearestColor(this); + this->m_sampler_nocheck = new SamplerNearestNoCheckColor(this); + this->m_sampler_bilinear = new SamplerBilinearColor(this); } +void MemoryBufferColor::deinit_samplers() { + delete this->m_sampler_nearest; + delete this->m_sampler_nocheck; + delete this->m_sampler_bilinear; +} MemoryBuffer *MemoryBufferColor::duplicate() { @@ -69,79 +84,24 @@ void MemoryBufferColor::addPixel(int x, int y, const float *color) // --- SAMPLERS --- inline void MemoryBufferColor::read(float *result, int x, int y, - MemoryBufferExtend extend_x, - MemoryBufferExtend extend_y) + MemoryBufferExtend extend_x, + MemoryBufferExtend extend_y) { - bool clip_x = (extend_x == COM_MB_CLIP && (x < m_rect.xmin || x >= m_rect.xmax)); - bool clip_y = (extend_y == COM_MB_CLIP && (y < m_rect.ymin || y >= m_rect.ymax)); - if (clip_x || clip_y) { - /* clip result outside rect is zero */ - zero_v4(result); - } - else - { - wrap_pixel(x, y, extend_x, extend_y); - const int offset = (this->m_chunkWidth * y + x) * NUMBER_OF_CHANNELS; - copy_v4_v4(result, &this->m_buffer[offset]); - } + this->m_sampler_nearest->read(result, x, y, extend_x, extend_y); } inline void MemoryBufferColor::readNoCheck(float *result, int x, int y, MemoryBufferExtend extend_x, MemoryBufferExtend extend_y) { - - wrap_pixel(x, y, extend_x, extend_y); - const int offset = (this->m_chunkWidth * y + x) * NUMBER_OF_CHANNELS; - - BLI_assert(offset >= 0); - BLI_assert(offset < this->determineBufferSize() * NUMBER_OF_CHANNELS); - BLI_assert(!(extend_x == COM_MB_CLIP && (x < m_rect.xmin || x >= m_rect.xmax)) && - !(extend_y == COM_MB_CLIP && (y < m_rect.ymin || y >= m_rect.ymax))); - - copy_v4_v4(result, &this->m_buffer[offset]); + this->m_sampler_nocheck->read(result, x, y, extend_x, extend_y); } inline void MemoryBufferColor::readBilinear(float *result, float x, float y, MemoryBufferExtend extend_x, MemoryBufferExtend extend_y) { - int x1 = floor(x); - int y1 = floor(y); - int x2 = x1 + 1; - int y2 = y1 + 1; - wrap_pixel(x1, y1, extend_x, extend_y); - wrap_pixel(x2, y2, extend_x, extend_y); - - float valuex = x - x1; - float valuey = y - y1; - float mvaluex = 1.0f - valuex; - float mvaluey = 1.0f - valuey; - - float color1[4]; - float color2[4]; - float color3[4]; - float color4[4]; - - read(color1, x1, y1); - read(color2, x1, y2); - read(color3, x2, y1); - read(color4, x2, y2); - - color1[0] = color1[0] * mvaluey + color2[0] * valuey; - color1[1] = color1[1] * mvaluey + color2[1] * valuey; - color1[2] = color1[2] * mvaluey + color2[2] * valuey; - color1[3] = color1[3] * mvaluey + color2[3] * valuey; - - color3[0] = color3[0] * mvaluey + color4[0] * valuey; - color3[1] = color3[1] * mvaluey + color4[1] * valuey; - color3[2] = color3[2] * mvaluey + color4[2] * valuey; - color3[3] = color3[3] * mvaluey + color4[3] * valuey; - - result[0] = color1[0] * mvaluex + color3[0] * valuex; - result[1] = color1[1] * mvaluex + color3[1] * valuex; - result[2] = color1[2] * mvaluex + color3[2] * valuex; - result[3] = color1[3] * mvaluex + color3[3] * valuex; + this->m_sampler_bilinear->read(result, x, y, extend_x, extend_y); } // --- EWA Filtering --- diff --git a/source/blender/compositor/intern/COM_MemoryBufferColor.h b/source/blender/compositor/intern/COM_MemoryBufferColor.h index 9195d08..b2b78a5 100644 --- a/source/blender/compositor/intern/COM_MemoryBufferColor.h +++ b/source/blender/compositor/intern/COM_MemoryBufferColor.h @@ -26,9 +26,15 @@ class MemoryBufferColor; #define _COM_MemoryBufferColor_h_ #include "COM_MemoryBuffer.h" +#include "COM_Sampler.h" class MemoryBufferColor: MemoryBuffer { +private: + SamplerNearestColor *m_sampler_nearest; + SamplerNearestNoCheckColor *m_sampler_nocheck; + SamplerBilinearColor *m_sampler_bilinear; + protected: /** * @brief construct new MemoryBuffer for a chunk @@ -41,7 +47,11 @@ protected: MemoryBufferColor(MemoryProxy *memoryProxy, rcti *rect); MemoryBufferColor(DataType datatype, rcti *rect); + + public: + void init_samplers(); + void deinit_samplers(); void writePixel(int x, int y, const float *color); void addPixel(int x, int y, const float *color); void read(float *result, int x, int y, diff --git a/source/blender/compositor/intern/COM_MemoryBufferValue.cpp b/source/blender/compositor/intern/COM_MemoryBufferValue.cpp index 0aff4c0..8672f11 100644 --- a/source/blender/compositor/intern/COM_MemoryBufferValue.cpp +++ b/source/blender/compositor/intern/COM_MemoryBufferValue.cpp @@ -27,15 +27,18 @@ MemoryBufferValue::MemoryBufferValue(MemoryProxy *memoryProxy, unsigned int chunkNumber, rcti *rect): MemoryBuffer(memoryProxy, chunkNumber, rect, NUMBER_OF_CHANNELS) { + this->init_samplers(); } MemoryBufferValue::MemoryBufferValue(MemoryProxy *memoryProxy, rcti *rect) : MemoryBuffer(memoryProxy, rect, NUMBER_OF_CHANNELS) { + this->init_samplers(); } MemoryBufferValue::MemoryBufferValue(DataType datatype, rcti *rect) : MemoryBuffer(datatype, rect, NUMBER_OF_CHANNELS) { + this->init_samplers(); } MemoryBuffer *MemoryBufferValue::duplicate() @@ -72,65 +75,34 @@ inline void MemoryBufferValue::read(float *result, int x, int y, MemoryBufferExtend extend_x, MemoryBufferExtend extend_y) { - bool clip_x = (extend_x == COM_MB_CLIP && (x < m_rect.xmin || x >= m_rect.xmax)); - bool clip_y = (extend_y == COM_MB_CLIP && (y < m_rect.ymin || y >= m_rect.ymax)); - if (clip_x || clip_y) { - /* clip result outside rect is zero */ - zero_v4(result); - } - else - { - wrap_pixel(x, y, extend_x, extend_y); - const int offset = (this->m_chunkWidth * y + x) * NUMBER_OF_CHANNELS; - result[0] = this->m_buffer[offset]; - } + this->m_sampler_nearest->read(result, x, y, extend_x, extend_y); } +void MemoryBufferValue::init_samplers() { + this->m_sampler_nearest = new SamplerNearestValue(this); + this->m_sampler_nocheck = new SamplerNearestNoCheckValue(this); + this->m_sampler_bilinear = new SamplerBilinearValue(this); +} + +void MemoryBufferValue::deinit_samplers() { + delete this->m_sampler_nearest; + delete this->m_sampler_nocheck; + delete this->m_sampler_bilinear; +} + + inline void MemoryBufferValue::readNoCheck(float *result, int x, int y, MemoryBufferExtend extend_x, MemoryBufferExtend extend_y) { - - wrap_pixel(x, y, extend_x, extend_y); - const int offset = (this->m_chunkWidth * y + x) * NUMBER_OF_CHANNELS; - - BLI_assert(offset >= 0); - BLI_assert(offset < this->determineBufferSize() * NUMBER_OF_CHANNELS); - BLI_assert(!(extend_x == COM_MB_CLIP && (x < m_rect.xmin || x >= m_rect.xmax)) && - !(extend_y == COM_MB_CLIP && (y < m_rect.ymin || y >= m_rect.ymax))); - - result[0] = this->m_buffer[offset]; + this->m_sampler_nocheck->read(result, x, y, extend_x, extend_y); } inline void MemoryBufferValue::readBilinear(float *result, float x, float y, MemoryBufferExtend extend_x, MemoryBufferExtend extend_y) { - int x1 = floor(x); - int y1 = floor(y); - int x2 = x1 + 1; - int y2 = y1 + 1; - wrap_pixel(x1, y1, extend_x, extend_y); - wrap_pixel(x2, y2, extend_x, extend_y); - - float valuex = x - x1; - float valuey = y - y1; - float mvaluex = 1.0f - valuex; - float mvaluey = 1.0f - valuey; - - float value1; - float value2; - float value3; - float value4; - - read(&value1, x1, y1); - r @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs