[Bf-blender-cvs] [ef814f0] soc-2016-cycles_denoising: Cycles: Explicitly pass region of interest to RenderBuffers when exporting pixels to Blender
Lukas Stockner
noreply at git.blender.org
Wed Jul 6 04:28:52 CEST 2016
Commit: ef814f016ab3db4fb2de4504a9cef9f1ce1378b2
Author: Lukas Stockner
Date: Wed Jul 6 03:44:23 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rBef814f016ab3db4fb2de4504a9cef9f1ce1378b2
Cycles: Explicitly pass region of interest to RenderBuffers when exporting pixels to Blender
By itself, that change is pretty useless, but it's important for the upcoming denoise-after-render support.
===================================================================
M intern/cycles/blender/blender_session.cpp
M intern/cycles/render/buffers.cpp
M intern/cycles/render/buffers.h
===================================================================
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index b2eef02..4ec1dde 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -390,10 +390,10 @@ static void add_pass(BL::RenderEngine& b_engine,
void BlenderSession::do_write_update_render_tile(RenderTile& rtile, bool do_update_only, bool highlight)
{
BufferParams& params = rtile.buffers->params;
- int x = params.full_x + params.overscan - session->tile_manager.params.full_x;
- int y = params.full_y + params.overscan - session->tile_manager.params.full_y;
- int w = params.final_width;
- int h = params.final_height;
+ int x = rtile.x + params.overscan;
+ int y = rtile.y + params.overscan;
+ int w = rtile.w - 2*params.overscan;
+ int h = rtile.h - 2*params.overscan;
/* get render result */
BL::RenderResult b_rr = begin_render_result(b_engine, x, y, w, h, b_rlay_name.c_str(), b_rview_name.c_str());
@@ -761,7 +761,10 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult& b_rr,
BufferParams& params = buffers->params;
float exposure = scene->film->exposure;
- vector<float> pixels(params.final_width*params.final_height*4);
+ int4 rect = make_int4(rtile.x + params.overscan, rtile.y + params.overscan,
+ rtile.x+rtile.w - params.overscan, rtile.y+rtile.h - params.overscan);
+
+ vector<float> pixels((rect.w-rect.y)*(rect.z-rect.x)*4);
/* Adjust absolute sample number to the range. */
int sample = rtile.sample;
@@ -782,14 +785,14 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult& b_rr,
/* copy pixels */
if(extended_type) {
- if(!buffers->get_denoising_rect(extended_type, exposure, sample, components, &pixels[0]))
+ if(!buffers->get_denoising_rect(extended_type, exposure, sample, components, rect, &pixels[0]))
memset(&pixels[0], 0, pixels.size()*sizeof(float));
}
else {
/* find matching pass type */
PassType pass_type = get_pass_type(b_pass);
- if(!buffers->get_pass_rect(pass_type, exposure, sample, components, &pixels[0]))
+ if(!buffers->get_pass_rect(pass_type, exposure, sample, components, rect, &pixels[0]))
memset(&pixels[0], 0, pixels.size()*sizeof(float));
}
@@ -799,7 +802,7 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult& b_rr,
else {
/* copy combined pass */
BL::RenderPass b_combined_pass(b_rlay.passes.find_by_type(BL::RenderPass::type_COMBINED, b_rview_name.c_str()));
- if(buffers->get_pass_rect(PASS_COMBINED, exposure, sample, 4, &pixels[0]))
+ if(buffers->get_pass_rect(PASS_COMBINED, exposure, sample, 4, rect, &pixels[0]))
b_combined_pass.rect(&pixels[0]);
}
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
index 7d0b074..1016061 100644
--- a/intern/cycles/render/buffers.cpp
+++ b/intern/cycles/render/buffers.cpp
@@ -181,7 +181,26 @@ bool RenderBuffers::copy_from_device()
return true;
}
-bool RenderBuffers::get_denoising_rect(int type, float exposure, int sample, int components, float *pixels)
+/* When calling from the BlenderSession, rect is in final image coordinates.
+ * To make addressing the buffer easier, rect is brought to "buffer coordinates"
+ * where the buffer starts at (0, 0) and ends at (width, height). */
+int4 RenderBuffers::rect_to_local(int4 rect) {
+ rect.x -= params.full_x;
+ rect.y -= params.full_y;
+ rect.z -= params.full_x;
+ rect.w -= params.full_y;
+ assert(rect.x >= 0 && rect.y >= 0 && rect.z <= params.width && rect.w <= params.height);
+ return rect;
+}
+
+/* Helper macro that loops over all the pixels in the rect.
+ * First, the buffer pointer is shifted to the starting point of the rect.
+ * Then, after each line, the buffer pointer is shifted to the start of the next one. */
+#define FOREACH_PIXEL in += (rect.y*params.width + rect.x)*pass_stride; \
+ for(int y = rect.y; y < rect.w; y++, in += (params.width + rect.x - rect.z)*pass_stride) \
+ for(int x = rect.x; x < rect.z; x++, in += pass_stride, pixels += components)
+
+bool RenderBuffers::get_denoising_rect(int type, float exposure, int sample, int components, int4 rect, float *pixels, bool read_pixels)
{
if(!params.denoising_passes)
/* The RenderBuffer doesn't have denoising passes. */
@@ -190,6 +209,8 @@ bool RenderBuffers::get_denoising_rect(int type, float exposure, int sample, int
/* The type doesn't correspond to any denoising pass. */
return false;
+ rect = rect_to_local(rect);
+
float scale = 1.0f;
int type_offset = 0;
switch(type) {
@@ -210,10 +231,6 @@ bool RenderBuffers::get_denoising_rect(int type, float exposure, int sample, int
float *in = (float*)buffer.data_pointer + pass_offset;
int pass_stride = params.get_passes_size();
-#define FOREACH_PIXEL in += (params.overscan*(params.width + 1))*pass_stride; \
- for(int y = params.overscan; y < params.height - params.overscan; y++, in += 2*params.overscan*pass_stride) \
- for(int x = params.overscan; x < params.width - params.overscan; x++, in += pass_stride, pixels += components)
-
if(components == 1) {
assert(type & (EX_TYPE_DENOISE_DEPTH | EX_TYPE_DENOISE_DEPTH_VAR));
FOREACH_PIXEL
@@ -233,8 +250,10 @@ bool RenderBuffers::get_denoising_rect(int type, float exposure, int sample, int
return true;
}
-bool RenderBuffers::get_pass_rect(PassType type, float exposure, int sample, int components, float *pixels)
+bool RenderBuffers::get_pass_rect(PassType type, float exposure, int sample, int components, int4 rect, float *pixels, bool read_pixels)
{
+ rect = rect_to_local(rect);
+
int pass_offset = 0;
for(size_t j = 0; j < params.passes.size(); j++) {
diff --git a/intern/cycles/render/buffers.h b/intern/cycles/render/buffers.h
index 1797e28..eeb95d7 100644
--- a/intern/cycles/render/buffers.h
+++ b/intern/cycles/render/buffers.h
@@ -112,11 +112,12 @@ public:
void reset(Device *device, BufferParams& params);
bool copy_from_device();
- bool get_pass_rect(PassType type, float exposure, int sample, int components, float *pixels);
- bool get_denoising_rect(int denoising_pass, float exposure, int sample, int components, float *pixels);
+ bool get_pass_rect(PassType type, float exposure, int sample, int components, int4 rect, float *pixels, bool read_pixels = false);
+ bool get_denoising_rect(int denoising_pass, float exposure, int sample, int components, int4 rect, float *pixels, bool read_pixels = false);
protected:
void device_free();
+ int4 rect_to_local(int4 rect);
Device *device;
};
More information about the Bf-blender-cvs
mailing list