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:
Diffstat (limited to 'intern/cycles/render/buffers.cpp')
-rw-r--r--intern/cycles/render/buffers.cpp100
1 files changed, 29 insertions, 71 deletions
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
index cc34ae2bbdb..9ad465c3452 100644
--- a/intern/cycles/render/buffers.cpp
+++ b/intern/cycles/render/buffers.cpp
@@ -114,54 +114,36 @@ RenderTile::RenderTile()
/* Render Buffers */
-RenderBuffers::RenderBuffers(Device *device_)
+RenderBuffers::RenderBuffers(Device *device)
+: buffer(device, "RenderBuffers", MEM_READ_WRITE)
{
- device = device_;
}
RenderBuffers::~RenderBuffers()
{
- device_free();
+ buffer.free();
}
-void RenderBuffers::device_free()
-{
- if(buffer.device_pointer) {
- device->mem_free(buffer);
- buffer.clear();
- }
-}
-
-void RenderBuffers::reset(Device *device, BufferParams& params_)
+void RenderBuffers::reset(BufferParams& params_)
{
params = params_;
- /* free existing buffers */
- device_free();
-
- /* allocate buffer */
- buffer.resize(params.width*params.height*params.get_passes_size());
- device->mem_alloc("render_buffer", buffer, MEM_READ_WRITE);
- device->mem_zero(buffer);
+ /* re-allocate buffer */
+ buffer.alloc(params.width*params.height*params.get_passes_size());
+ buffer.zero_to_device();
}
-void RenderBuffers::zero(Device *device)
+void RenderBuffers::zero()
{
- if(buffer.device_pointer) {
- device->mem_zero(buffer);
- }
+ buffer.zero_to_device();
}
-bool RenderBuffers::copy_from_device(Device *from_device)
+bool RenderBuffers::copy_from_device()
{
if(!buffer.device_pointer)
return false;
- if(!from_device) {
- from_device = device;
- }
-
- from_device->mem_copy_from(buffer, 0, params.width, params.height, params.get_passes_size()*sizeof(float));
+ buffer.copy_from_device(0, params.width * params.get_passes_size(), params.height);
return true;
}
@@ -396,50 +378,35 @@ bool RenderBuffers::get_pass_rect(PassType type, float exposure, int sample, int
/* Display Buffer */
-DisplayBuffer::DisplayBuffer(Device *device_, bool linear)
+DisplayBuffer::DisplayBuffer(Device *device, bool linear)
+: draw_width(0),
+ draw_height(0),
+ transparent(true), /* todo: determine from background */
+ half_float(linear),
+ rgba_byte(device, "display buffer byte"),
+ rgba_half(device, "display buffer half")
{
- device = device_;
- draw_width = 0;
- draw_height = 0;
- transparent = true; /* todo: determine from background */
- half_float = linear;
}
DisplayBuffer::~DisplayBuffer()
{
- device_free();
+ rgba_byte.free();
+ rgba_half.free();
}
-void DisplayBuffer::device_free()
-{
- 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();
- }
-}
-
-void DisplayBuffer::reset(Device *device, BufferParams& params_)
+void DisplayBuffer::reset(BufferParams& params_)
{
draw_width = 0;
draw_height = 0;
params = params_;
- /* free existing buffers */
- device_free();
-
/* allocate display pixels */
if(half_float) {
- rgba_half.resize(params.width, params.height);
- device->pixels_alloc(rgba_half);
+ rgba_half.alloc_to_device(params.width, params.height);
}
else {
- rgba_byte.resize(params.width, params.height);
- device->pixels_alloc(rgba_byte);
+ rgba_byte.alloc_to_device(params.width, params.height);
}
}
@@ -454,7 +421,8 @@ void DisplayBuffer::draw_set(int width, int height)
void DisplayBuffer::draw(Device *device, const DeviceDrawParams& draw_params)
{
if(draw_width != 0 && draw_height != 0) {
- device_memory& rgba = rgba_data();
+ device_memory& rgba = (half_float)? (device_memory&)rgba_half:
+ (device_memory&)rgba_byte;
device->draw_pixels(
rgba, 0,
@@ -469,7 +437,7 @@ bool DisplayBuffer::draw_ready()
return (draw_width != 0 && draw_height != 0);
}
-void DisplayBuffer::write(Device *device, const string& filename)
+void DisplayBuffer::write(const string& filename)
{
int w = draw_width;
int h = draw_height;
@@ -481,21 +449,19 @@ void DisplayBuffer::write(Device *device, const string& filename)
return;
/* read buffer from device */
- device_memory& rgba = rgba_data();
- device->pixels_copy_from(rgba, 0, w, h);
+ uchar4 *pixels = rgba_byte.copy_from_device(0, w, h);
/* write image */
ImageOutput *out = ImageOutput::create(filename);
ImageSpec spec(w, h, 4, TypeDesc::UINT8);
- int scanlinesize = w*4*sizeof(uchar);
out->open(filename, spec);
/* conversion for different top/bottom convention */
out->write_image(TypeDesc::UINT8,
- (uchar*)rgba.data_pointer + (h-1)*scanlinesize,
+ (uchar*)(pixels + (h-1)*w),
AutoStride,
- -scanlinesize,
+ -w*sizeof(uchar4),
AutoStride);
out->close();
@@ -503,13 +469,5 @@ 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