diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-08-31 03:49:38 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-08-31 03:49:38 +0400 |
commit | 29f6616d609fbd92cf313b0fdec555c2fcb4ede0 (patch) | |
tree | e0c9500368c5210071cb841ea86f5674b0cf6f25 /intern/cycles/render/buffers.cpp | |
parent | 60ff60dcdc9f43891fb8a19e10f9bb7964a539bf (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.cpp | 37 |
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 |