Cycles: border rendering support, includes some refactoring in how pixels are
accessed on devices.
This commit is contained in:
@@ -51,8 +51,6 @@ Session::Session(const SessionParams& params_)
|
||||
sample = 0;
|
||||
|
||||
delayed_reset.do_reset = false;
|
||||
delayed_reset.w = 0;
|
||||
delayed_reset.h = 0;
|
||||
delayed_reset.samples = 0;
|
||||
|
||||
display_outdated = false;
|
||||
@@ -108,7 +106,7 @@ bool Session::ready_to_reset()
|
||||
|
||||
/* GPU Session */
|
||||
|
||||
void Session::reset_gpu(int w, int h, int samples)
|
||||
void Session::reset_gpu(BufferParams& buffer_params, int samples)
|
||||
{
|
||||
/* block for buffer acces and reset immediately. we can't do this
|
||||
in the thread, because we need to allocate an OpenGL buffer, and
|
||||
@@ -119,7 +117,7 @@ void Session::reset_gpu(int w, int h, int samples)
|
||||
display_outdated = true;
|
||||
reset_time = time_dt();
|
||||
|
||||
reset_(w, h, samples);
|
||||
reset_(buffer_params, samples);
|
||||
|
||||
gpu_need_tonemap = false;
|
||||
gpu_need_tonemap_cond.notify_all();
|
||||
@@ -127,7 +125,7 @@ void Session::reset_gpu(int w, int h, int samples)
|
||||
pause_cond.notify_all();
|
||||
}
|
||||
|
||||
bool Session::draw_gpu(int w, int h)
|
||||
bool Session::draw_gpu(BufferParams& buffer_params)
|
||||
{
|
||||
/* block for buffer access */
|
||||
thread_scoped_lock display_lock(display->mutex);
|
||||
@@ -136,7 +134,7 @@ bool Session::draw_gpu(int w, int h)
|
||||
if(gpu_draw_ready) {
|
||||
/* then verify the buffers have the expected size, so we don't
|
||||
draw previous results in a resized window */
|
||||
if(w == display->width && h == display->height) {
|
||||
if(!buffer_params.modified(display->params)) {
|
||||
/* for CUDA we need to do tonemapping still, since we can
|
||||
only access GL buffers from the main thread */
|
||||
if(gpu_need_tonemap) {
|
||||
@@ -261,15 +259,14 @@ void Session::run_gpu()
|
||||
|
||||
/* CPU Session */
|
||||
|
||||
void Session::reset_cpu(int w, int h, int samples)
|
||||
void Session::reset_cpu(BufferParams& buffer_params, int samples)
|
||||
{
|
||||
thread_scoped_lock reset_lock(delayed_reset.mutex);
|
||||
|
||||
display_outdated = true;
|
||||
reset_time = time_dt();
|
||||
|
||||
delayed_reset.w = w;
|
||||
delayed_reset.h = h;
|
||||
delayed_reset.params = buffer_params;
|
||||
delayed_reset.samples = samples;
|
||||
delayed_reset.do_reset = true;
|
||||
device->task_cancel();
|
||||
@@ -277,7 +274,7 @@ void Session::reset_cpu(int w, int h, int samples)
|
||||
pause_cond.notify_all();
|
||||
}
|
||||
|
||||
bool Session::draw_cpu(int w, int h)
|
||||
bool Session::draw_cpu(BufferParams& buffer_params)
|
||||
{
|
||||
thread_scoped_lock display_lock(display->mutex);
|
||||
|
||||
@@ -285,7 +282,7 @@ bool Session::draw_cpu(int w, int h)
|
||||
if(display->draw_ready()) {
|
||||
/* then verify the buffers have the expected size, so we don't
|
||||
draw previous results in a resized window */
|
||||
if(w == display->width && h == display->height) {
|
||||
if(!buffer_params.modified(display->params)) {
|
||||
display->draw(device);
|
||||
|
||||
if(display_outdated && (time_dt() - reset_time) > params.text_timeout)
|
||||
@@ -306,7 +303,7 @@ void Session::run_cpu()
|
||||
thread_scoped_lock buffers_lock(buffers->mutex);
|
||||
thread_scoped_lock display_lock(display->mutex);
|
||||
|
||||
reset_(delayed_reset.w, delayed_reset.h, delayed_reset.samples);
|
||||
reset_(delayed_reset.params, delayed_reset.samples);
|
||||
delayed_reset.do_reset = false;
|
||||
}
|
||||
|
||||
@@ -389,7 +386,7 @@ void Session::run_cpu()
|
||||
if(delayed_reset.do_reset) {
|
||||
/* reset rendering if request from main thread */
|
||||
delayed_reset.do_reset = false;
|
||||
reset_(delayed_reset.w, delayed_reset.h, delayed_reset.samples);
|
||||
reset_(delayed_reset.params, delayed_reset.samples);
|
||||
}
|
||||
else if(need_tonemap) {
|
||||
/* tonemap only if we do not reset, we don't we don't
|
||||
@@ -438,23 +435,23 @@ void Session::run()
|
||||
progress.set_update();
|
||||
}
|
||||
|
||||
bool Session::draw(int w, int h)
|
||||
bool Session::draw(BufferParams& buffer_params)
|
||||
{
|
||||
if(device_use_gl)
|
||||
return draw_gpu(w, h);
|
||||
return draw_gpu(buffer_params);
|
||||
else
|
||||
return draw_cpu(w, h);
|
||||
return draw_cpu(buffer_params);
|
||||
}
|
||||
|
||||
void Session::reset_(int w, int h, int samples)
|
||||
void Session::reset_(BufferParams& buffer_params, int samples)
|
||||
{
|
||||
if(w != buffers->width || h != buffers->height) {
|
||||
if(buffer_params.modified(buffers->params)) {
|
||||
gpu_draw_ready = false;
|
||||
buffers->reset(device, w, h);
|
||||
display->reset(device, w, h);
|
||||
buffers->reset(device, buffer_params);
|
||||
display->reset(device, buffer_params);
|
||||
}
|
||||
|
||||
tile_manager.reset(w, h, samples);
|
||||
tile_manager.reset(buffer_params, samples);
|
||||
|
||||
start_time = time_dt();
|
||||
preview_time = 0.0;
|
||||
@@ -462,12 +459,12 @@ void Session::reset_(int w, int h, int samples)
|
||||
sample = 0;
|
||||
}
|
||||
|
||||
void Session::reset(int w, int h, int samples)
|
||||
void Session::reset(BufferParams& buffer_params, int samples)
|
||||
{
|
||||
if(device_use_gl)
|
||||
reset_gpu(w, h, samples);
|
||||
reset_gpu(buffer_params, samples);
|
||||
else
|
||||
reset_cpu(w, h, samples);
|
||||
reset_cpu(buffer_params, samples);
|
||||
}
|
||||
|
||||
void Session::set_samples(int samples)
|
||||
@@ -514,14 +511,18 @@ void Session::update_scene()
|
||||
|
||||
progress.set_status("Updating Scene");
|
||||
|
||||
/* update camera if dimensions changed for progressive render */
|
||||
/* update camera if dimensions changed for progressive render. the camera
|
||||
knows nothing about progressive or cropped rendering, it just gets the
|
||||
image dimensions passed in */
|
||||
Camera *cam = scene->camera;
|
||||
int w = tile_manager.state.width;
|
||||
int h = tile_manager.state.height;
|
||||
float progressive_x = tile_manager.state.width/(float)tile_manager.params.width;
|
||||
float progressive_y = tile_manager.state.height/(float)tile_manager.params.height;
|
||||
int width = tile_manager.params.full_width*progressive_x;
|
||||
int height = tile_manager.params.full_height*progressive_y;
|
||||
|
||||
if(cam->width != w || cam->height != h) {
|
||||
cam->width = w;
|
||||
cam->height = h;
|
||||
if(width != cam->width || height != cam->height) {
|
||||
cam->width = width;
|
||||
cam->height = height;
|
||||
cam->tag_update();
|
||||
}
|
||||
|
||||
@@ -573,14 +574,16 @@ void Session::path_trace(Tile& tile)
|
||||
/* add path trace task */
|
||||
DeviceTask task(DeviceTask::PATH_TRACE);
|
||||
|
||||
task.x = tile.x;
|
||||
task.y = tile.y;
|
||||
task.x = tile_manager.state.full_x + tile.x;
|
||||
task.y = tile_manager.state.full_y + tile.y;
|
||||
task.w = tile.w;
|
||||
task.h = tile.h;
|
||||
task.buffer = buffers->buffer.device_pointer;
|
||||
task.rng_state = buffers->rng_state.device_pointer;
|
||||
task.sample = tile_manager.state.sample;
|
||||
task.resolution = tile_manager.state.resolution;
|
||||
task.offset = -(tile_manager.state.full_x + tile_manager.state.full_y*tile_manager.state.width);
|
||||
task.stride = tile_manager.state.width;
|
||||
|
||||
device->task_add(task);
|
||||
}
|
||||
@@ -590,14 +593,16 @@ void Session::tonemap()
|
||||
/* add tonemap task */
|
||||
DeviceTask task(DeviceTask::TONEMAP);
|
||||
|
||||
task.x = 0;
|
||||
task.y = 0;
|
||||
task.x = tile_manager.state.full_x;
|
||||
task.y = tile_manager.state.full_y;
|
||||
task.w = tile_manager.state.width;
|
||||
task.h = tile_manager.state.height;
|
||||
task.rgba = display->rgba.device_pointer;
|
||||
task.buffer = buffers->buffer.device_pointer;
|
||||
task.sample = tile_manager.state.sample;
|
||||
task.resolution = tile_manager.state.resolution;
|
||||
task.offset = -(tile_manager.state.full_x + tile_manager.state.full_y*tile_manager.state.width);
|
||||
task.stride = tile_manager.state.width;
|
||||
|
||||
if(task.w > 0 && task.h > 0) {
|
||||
device->task_add(task);
|
||||
|
Reference in New Issue
Block a user