Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel Castilla <manzanillawork@gmail.com>2021-07-13 22:48:42 +0300
committerManuel Castilla <manzanillawork@gmail.com>2021-07-13 23:34:28 +0300
commit96a4b54cfb5c183d9e05c6fe8d96e290f1a98bf6 (patch)
tree7c303bbb6e0ad5ade6b603a19d2eb289da10dc4d /source/blender/compositor/operations/COM_RenderLayersProg.cc
parent538f452ea97f93daa158a479dfed2b7c3973ec06 (diff)
Compositor: Full frame Render Layers node
Adds full frame implementation to this node operations. No functional changes. 2.5x faster than tiled fallback on average. Reviewed By: jbakker Differential Revision: https://developer.blender.org/D11690
Diffstat (limited to 'source/blender/compositor/operations/COM_RenderLayersProg.cc')
-rw-r--r--source/blender/compositor/operations/COM_RenderLayersProg.cc66
1 files changed, 66 insertions, 0 deletions
diff --git a/source/blender/compositor/operations/COM_RenderLayersProg.cc b/source/blender/compositor/operations/COM_RenderLayersProg.cc
index 1ac451b95c2..34fea705c75 100644
--- a/source/blender/compositor/operations/COM_RenderLayersProg.cc
+++ b/source/blender/compositor/operations/COM_RenderLayersProg.cc
@@ -43,6 +43,7 @@ RenderLayersProg::RenderLayersProg(const char *passName, DataType type, int elem
this->m_inputBuffer = nullptr;
this->m_elementsize = elementsize;
this->m_rd = nullptr;
+ layer_buffer_ = nullptr;
this->addOutputSocket(type);
}
@@ -65,6 +66,9 @@ void RenderLayersProg::initExecution()
if (rl) {
this->m_inputBuffer = RE_RenderLayerGetPass(
rl, this->m_passName.c_str(), this->m_viewName);
+ if (m_inputBuffer) {
+ layer_buffer_ = new MemoryBuffer(m_inputBuffer, m_elementsize, getWidth(), getHeight());
+ }
}
}
}
@@ -186,6 +190,10 @@ void RenderLayersProg::executePixelSampled(float output[4], float x, float y, Pi
void RenderLayersProg::deinitExecution()
{
this->m_inputBuffer = nullptr;
+ if (layer_buffer_) {
+ delete layer_buffer_;
+ layer_buffer_ = nullptr;
+ }
}
void RenderLayersProg::determineResolution(unsigned int resolution[2],
@@ -255,6 +263,20 @@ std::unique_ptr<MetaData> RenderLayersProg::getMetaData()
return std::move(callback_data.meta_data);
}
+void RenderLayersProg::update_memory_buffer_partial(MemoryBuffer *output,
+ const rcti &area,
+ Span<MemoryBuffer *> UNUSED(inputs))
+{
+ BLI_assert(output->get_num_channels() >= m_elementsize);
+ if (layer_buffer_) {
+ output->copy_from(layer_buffer_, area, 0, m_elementsize, 0);
+ }
+ else {
+ std::unique_ptr<float[]> zero_elem = std::make_unique<float[]>(m_elementsize);
+ output->fill(area, 0, zero_elem.get(), m_elementsize);
+ }
+}
+
/* ******** Render Layers AO Operation ******** */
void RenderLayersAOOperation::executePixelSampled(float output[4],
float x,
@@ -271,6 +293,21 @@ void RenderLayersAOOperation::executePixelSampled(float output[4],
output[3] = 1.0f;
}
+void RenderLayersAOOperation::update_memory_buffer_partial(MemoryBuffer *output,
+ const rcti &area,
+ Span<MemoryBuffer *> UNUSED(inputs))
+{
+ BLI_assert(output->get_num_channels() == COM_DATA_TYPE_COLOR_CHANNELS);
+ BLI_assert(m_elementsize == COM_DATA_TYPE_COLOR_CHANNELS);
+ if (layer_buffer_) {
+ output->copy_from(layer_buffer_, area, 0, COM_DATA_TYPE_VECTOR_CHANNELS, 0);
+ }
+ else {
+ output->fill(area, 0, COM_VECTOR_ZERO, COM_DATA_TYPE_VECTOR_CHANNELS);
+ }
+ output->fill(area, 3, COM_VALUE_ONE, COM_DATA_TYPE_VALUE_CHANNELS);
+}
+
/* ******** Render Layers Alpha Operation ******** */
void RenderLayersAlphaProg::executePixelSampled(float output[4],
float x,
@@ -289,6 +326,20 @@ void RenderLayersAlphaProg::executePixelSampled(float output[4],
}
}
+void RenderLayersAlphaProg::update_memory_buffer_partial(MemoryBuffer *output,
+ const rcti &area,
+ Span<MemoryBuffer *> UNUSED(inputs))
+{
+ BLI_assert(output->get_num_channels() == COM_DATA_TYPE_VALUE_CHANNELS);
+ BLI_assert(m_elementsize == COM_DATA_TYPE_COLOR_CHANNELS);
+ if (layer_buffer_) {
+ output->copy_from(layer_buffer_, area, 3, COM_DATA_TYPE_VALUE_CHANNELS, 0);
+ }
+ else {
+ output->fill(area, COM_VALUE_ZERO);
+ }
+}
+
/* ******** Render Layers Depth Operation ******** */
void RenderLayersDepthProg::executePixelSampled(float output[4],
float x,
@@ -309,4 +360,19 @@ void RenderLayersDepthProg::executePixelSampled(float output[4],
}
}
+void RenderLayersDepthProg::update_memory_buffer_partial(MemoryBuffer *output,
+ const rcti &area,
+ Span<MemoryBuffer *> UNUSED(inputs))
+{
+ BLI_assert(output->get_num_channels() == COM_DATA_TYPE_VALUE_CHANNELS);
+ BLI_assert(m_elementsize == COM_DATA_TYPE_VALUE_CHANNELS);
+ if (layer_buffer_) {
+ output->copy_from(layer_buffer_, area);
+ }
+ else {
+ const float default_depth = 10e10f;
+ output->fill(area, &default_depth);
+ }
+}
+
} // namespace blender::compositor