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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2013-08-31 03:49:38 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2013-08-31 03:49:38 +0400
commit29f6616d609fbd92cf313b0fdec555c2fcb4ede0 (patch)
treee0c9500368c5210071cb841ea86f5674b0cf6f25 /intern/cycles/render/buffers.cpp
parent60ff60dcdc9f43891fb8a19e10f9bb7964a539bf (diff)
Cycles: viewport render now takes scene color management settings into account,
except for curves, that's still missing from the OpenColorIO GLSL shader. The pixels are stored in a half float texture, converterd from full float with native GPU instructions and SIMD on the CPU, so it should be pretty quick. Using a GLSL shader is useful for GPU render because it avoids a copy through CPU memory.
Diffstat (limited to 'intern/cycles/render/buffers.cpp')
-rw-r--r--intern/cycles/render/buffers.cpp37
1 files changed, 30 insertions, 7 deletions
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
index e0bc3f40c4e..5fb648cec5f 100644
--- a/intern/cycles/render/buffers.cpp
+++ b/intern/cycles/render/buffers.cpp
@@ -91,7 +91,6 @@ RenderTile::RenderTile()
buffer = 0;
rng_state = 0;
- rgba = 0;
buffers = NULL;
}
@@ -298,12 +297,13 @@ bool RenderBuffers::get_pass_rect(PassType type, float exposure, int sample, int
/* Display Buffer */
-DisplayBuffer::DisplayBuffer(Device *device_)
+DisplayBuffer::DisplayBuffer(Device *device_, bool linear)
{
device = device_;
draw_width = 0;
draw_height = 0;
transparent = true; /* todo: determine from background */
+ half_float = linear;
}
DisplayBuffer::~DisplayBuffer()
@@ -313,9 +313,13 @@ DisplayBuffer::~DisplayBuffer()
void DisplayBuffer::device_free()
{
- if(rgba.device_pointer) {
- device->pixels_free(rgba);
- rgba.clear();
+ if(rgba_byte.device_pointer) {
+ device->pixels_free(rgba_byte);
+ rgba_byte.clear();
+ }
+ if(rgba_half.device_pointer) {
+ device->pixels_free(rgba_half);
+ rgba_half.clear();
}
}
@@ -330,8 +334,14 @@ void DisplayBuffer::reset(Device *device, BufferParams& params_)
device_free();
/* allocate display pixels */
- rgba.resize(params.width, params.height);
- device->pixels_alloc(rgba);
+ if(half_float) {
+ rgba_half.resize(params.width, params.height);
+ device->pixels_alloc(rgba_half);
+ }
+ else {
+ rgba_byte.resize(params.width, params.height);
+ device->pixels_alloc(rgba_byte);
+ }
}
void DisplayBuffer::draw_set(int width, int height)
@@ -347,6 +357,7 @@ void DisplayBuffer::draw(Device *device)
if(draw_width != 0 && draw_height != 0) {
glPushMatrix();
glTranslatef(params.full_x, params.full_y, 0.0f);
+ device_memory& rgba = rgba_data();
device->draw_pixels(rgba, 0, draw_width, draw_height, 0, params.width, params.height, transparent);
@@ -366,8 +377,12 @@ void DisplayBuffer::write(Device *device, const string& filename)
if(w == 0 || h == 0)
return;
+
+ if(half_float)
+ return;
/* read buffer from device */
+ device_memory& rgba = rgba_data();
device->pixels_copy_from(rgba, 0, w, h);
/* write image */
@@ -389,5 +404,13 @@ void DisplayBuffer::write(Device *device, const string& filename)
delete out;
}
+device_memory& DisplayBuffer::rgba_data()
+{
+ if(half_float)
+ return rgba_half;
+ else
+ return rgba_byte;
+}
+
CCL_NAMESPACE_END