Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/render/session.cpp
| Show First 20 Lines • Show All 77 Lines • ▼ Show 20 Lines | Session::Session(const SessionParams ¶ms_) | ||||
| reset_time = 0.0; | reset_time = 0.0; | ||||
| last_update_time = 0.0; | last_update_time = 0.0; | ||||
| delayed_reset.do_reset = false; | delayed_reset.do_reset = false; | ||||
| delayed_reset.samples = 0; | delayed_reset.samples = 0; | ||||
| display_outdated = false; | display_outdated = false; | ||||
| gpu_draw_ready = false; | gpu_draw_ready = false; | ||||
| gpu_need_tonemap = false; | gpu_need_display_buffer_update = false; | ||||
| pause = false; | pause = false; | ||||
| kernels_loaded = false; | kernels_loaded = false; | ||||
| /* TODO(sergey): Check if it's indeed optimal value for the split kernel. */ | /* TODO(sergey): Check if it's indeed optimal value for the split kernel. */ | ||||
| max_closure_global = 1; | max_closure_global = 1; | ||||
| } | } | ||||
| Session::~Session() | Session::~Session() | ||||
| { | { | ||||
| if (session_thread) { | if (session_thread) { | ||||
| /* wait for session thread to end */ | /* wait for session thread to end */ | ||||
| progress.set_cancel("Exiting"); | progress.set_cancel("Exiting"); | ||||
| gpu_need_tonemap = false; | gpu_need_display_buffer_update = false; | ||||
| gpu_need_tonemap_cond.notify_all(); | gpu_need_display_buffer_update_cond.notify_all(); | ||||
| { | { | ||||
| thread_scoped_lock pause_lock(pause_mutex); | thread_scoped_lock pause_lock(pause_mutex); | ||||
| pause = false; | pause = false; | ||||
| } | } | ||||
| pause_cond.notify_all(); | pause_cond.notify_all(); | ||||
| wait(); | wait(); | ||||
| } | } | ||||
| if (params.write_render_cb) { | if (params.write_render_cb) { | ||||
| /* tonemap and write out image if requested */ | /* Copy to display buffer and write out image if requested */ | ||||
| delete display; | delete display; | ||||
| display = new DisplayBuffer(device, false); | display = new DisplayBuffer(device, false); | ||||
| display->reset(buffers->params); | display->reset(buffers->params); | ||||
| tonemap(params.samples); | copy_to_display_buffer(params.samples); | ||||
| int w = display->draw_width; | int w = display->draw_width; | ||||
| int h = display->draw_height; | int h = display->draw_height; | ||||
| uchar4 *pixels = display->rgba_byte.copy_from_device(0, w, h); | uchar4 *pixels = display->rgba_byte.copy_from_device(0, w, h); | ||||
| params.write_render_cb((uchar *)pixels, w, h, 4); | params.write_render_cb((uchar *)pixels, w, h, 4); | ||||
| } | } | ||||
| /* clean up */ | /* clean up */ | ||||
| Show All 36 Lines | void Session::reset_gpu(BufferParams &buffer_params, int samples) | ||||
| thread_scoped_lock display_lock(display_mutex); | thread_scoped_lock display_lock(display_mutex); | ||||
| thread_scoped_lock buffers_lock(buffers_mutex); | thread_scoped_lock buffers_lock(buffers_mutex); | ||||
| display_outdated = true; | display_outdated = true; | ||||
| reset_time = time_dt(); | reset_time = time_dt(); | ||||
| reset_(buffer_params, samples); | reset_(buffer_params, samples); | ||||
| gpu_need_tonemap = false; | gpu_need_display_buffer_update = false; | ||||
| gpu_need_tonemap_cond.notify_all(); | gpu_need_display_buffer_update_cond.notify_all(); | ||||
| pause_cond.notify_all(); | pause_cond.notify_all(); | ||||
| } | } | ||||
| bool Session::draw_gpu(BufferParams &buffer_params, DeviceDrawParams &draw_params) | bool Session::draw_gpu(BufferParams &buffer_params, DeviceDrawParams &draw_params) | ||||
| { | { | ||||
| /* block for buffer access */ | /* block for buffer access */ | ||||
| thread_scoped_lock display_lock(display_mutex); | thread_scoped_lock display_lock(display_mutex); | ||||
| /* first check we already rendered something */ | /* first check we already rendered something */ | ||||
| if (gpu_draw_ready) { | if (gpu_draw_ready) { | ||||
| /* then verify the buffers have the expected size, so we don't | /* then verify the buffers have the expected size, so we don't | ||||
| * draw previous results in a resized window */ | * draw previous results in a resized window */ | ||||
| if (!buffer_params.modified(display->params)) { | if (!buffer_params.modified(display->params)) { | ||||
| /* for CUDA we need to do tone-mapping still, since we can | /* for CUDA we need to do tone-mapping still, since we can | ||||
| * only access GL buffers from the main thread. */ | * only access GL buffers from the main thread. */ | ||||
| if (gpu_need_tonemap) { | if (gpu_need_display_buffer_update) { | ||||
| thread_scoped_lock buffers_lock(buffers_mutex); | thread_scoped_lock buffers_lock(buffers_mutex); | ||||
| tonemap(tile_manager.state.sample); | copy_to_display_buffer(tile_manager.state.sample); | ||||
| gpu_need_tonemap = false; | gpu_need_display_buffer_update = false; | ||||
| gpu_need_tonemap_cond.notify_all(); | gpu_need_display_buffer_update_cond.notify_all(); | ||||
| } | } | ||||
| display->draw(device, draw_params); | display->draw(device, draw_params); | ||||
| if (display_outdated && (time_dt() - reset_time) > params.text_timeout) | if (display_outdated && (time_dt() - reset_time) > params.text_timeout) | ||||
| return false; | return false; | ||||
| return true; | return true; | ||||
| ▲ Show 20 Lines • Show All 100 Lines • ▼ Show 20 Lines | if (!no_tiles) { | ||||
| device->task_wait(); | device->task_wait(); | ||||
| if (!device->error_message().empty()) | if (!device->error_message().empty()) | ||||
| progress.set_cancel(device->error_message()); | progress.set_cancel(device->error_message()); | ||||
| /* update status and timing */ | /* update status and timing */ | ||||
| update_status_time(); | update_status_time(); | ||||
| gpu_need_tonemap = true; | gpu_need_display_buffer_update = true; | ||||
| gpu_draw_ready = true; | gpu_draw_ready = true; | ||||
| progress.set_update(); | progress.set_update(); | ||||
| /* wait for tonemap */ | /* wait for until display buffer is updated */ | ||||
| if (!params.background) { | if (!params.background) { | ||||
| while (gpu_need_tonemap) { | while (gpu_need_display_buffer_update) { | ||||
| if (progress.get_cancel()) | if (progress.get_cancel()) | ||||
| break; | break; | ||||
| gpu_need_tonemap_cond.wait(buffers_lock); | gpu_need_display_buffer_update_cond.wait(buffers_lock); | ||||
| } | } | ||||
| } | } | ||||
| if (!device->error_message().empty()) | if (!device->error_message().empty()) | ||||
| progress.set_error(device->error_message()); | progress.set_error(device->error_message()); | ||||
| tiles_written = update_progressive_refine(progress.get_cancel()); | tiles_written = update_progressive_refine(progress.get_cancel()); | ||||
| ▲ Show 20 Lines • Show All 227 Lines • ▼ Show 20 Lines | last_update_time = time_dt(); | ||||
| reset_(delayed_reset.params, delayed_reset.samples); | reset_(delayed_reset.params, delayed_reset.samples); | ||||
| delayed_reset.do_reset = false; | delayed_reset.do_reset = false; | ||||
| } | } | ||||
| while (!progress.get_cancel()) { | while (!progress.get_cancel()) { | ||||
| /* advance to next tile */ | /* advance to next tile */ | ||||
| bool no_tiles = !tile_manager.next(); | bool no_tiles = !tile_manager.next(); | ||||
| bool need_tonemap = false; | bool need_copy_to_display_buffer = false; | ||||
| DeviceKernelStatus kernel_state = DEVICE_KERNEL_UNKNOWN; | DeviceKernelStatus kernel_state = DEVICE_KERNEL_UNKNOWN; | ||||
| if (no_tiles) { | if (no_tiles) { | ||||
| kernel_state = device->get_active_kernel_switch_state(); | kernel_state = device->get_active_kernel_switch_state(); | ||||
| } | } | ||||
| if (params.background) { | if (params.background) { | ||||
| /* if no work left and in background mode, we can stop immediately */ | /* if no work left and in background mode, we can stop immediately */ | ||||
| ▲ Show 20 Lines • Show All 72 Lines • ▼ Show 20 Lines | if (!no_tiles) { | ||||
| /* render */ | /* render */ | ||||
| render(); | render(); | ||||
| /* update status and timing */ | /* update status and timing */ | ||||
| update_status_time(); | update_status_time(); | ||||
| if (!params.background) | if (!params.background) | ||||
| need_tonemap = true; | need_copy_to_display_buffer = true; | ||||
| if (!device->error_message().empty()) | if (!device->error_message().empty()) | ||||
| progress.set_error(device->error_message()); | progress.set_error(device->error_message()); | ||||
| } | } | ||||
| device->task_wait(); | device->task_wait(); | ||||
| { | { | ||||
| thread_scoped_lock reset_lock(delayed_reset.mutex); | thread_scoped_lock reset_lock(delayed_reset.mutex); | ||||
| thread_scoped_lock buffers_lock(buffers_mutex); | thread_scoped_lock buffers_lock(buffers_mutex); | ||||
| thread_scoped_lock display_lock(display_mutex); | thread_scoped_lock display_lock(display_mutex); | ||||
| if (delayed_reset.do_reset) { | if (delayed_reset.do_reset) { | ||||
| /* reset rendering if request from main thread */ | /* reset rendering if request from main thread */ | ||||
| delayed_reset.do_reset = false; | delayed_reset.do_reset = false; | ||||
| reset_(delayed_reset.params, delayed_reset.samples); | reset_(delayed_reset.params, delayed_reset.samples); | ||||
| } | } | ||||
| else if (need_tonemap) { | else if (need_copy_to_display_buffer) { | ||||
| /* tonemap only if we do not reset, we don't we don't | /* Only copy to display_buffer if we do not reset, we don't | ||||
| * want to show the result of an incomplete sample */ | * want to show the result of an incomplete sample */ | ||||
| tonemap(tile_manager.state.sample); | copy_to_display_buffer(tile_manager.state.sample); | ||||
| } | } | ||||
| if (!device->error_message().empty()) | if (!device->error_message().empty()) | ||||
| progress.set_error(device->error_message()); | progress.set_error(device->error_message()); | ||||
| tiles_written = update_progressive_refine(progress.get_cancel()); | tiles_written = update_progressive_refine(progress.get_cancel()); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 356 Lines • ▼ Show 20 Lines | if (params.run_denoising) { | ||||
| task.denoising_from_render = true; | task.denoising_from_render = true; | ||||
| task.denoising_do_filter = params.full_denoising; | task.denoising_do_filter = params.full_denoising; | ||||
| task.denoising_write_passes = params.write_denoising_passes; | task.denoising_write_passes = params.write_denoising_passes; | ||||
| } | } | ||||
| device->task_add(task); | device->task_add(task); | ||||
| } | } | ||||
| void Session::tonemap(int sample) | void Session::copy_to_display_buffer(int sample) | ||||
| { | { | ||||
| /* add tonemap task */ | /* add film conversion task */ | ||||
| DeviceTask task(DeviceTask::FILM_CONVERT); | DeviceTask task(DeviceTask::FILM_CONVERT); | ||||
| task.x = tile_manager.state.buffer.full_x; | task.x = tile_manager.state.buffer.full_x; | ||||
| task.y = tile_manager.state.buffer.full_y; | task.y = tile_manager.state.buffer.full_y; | ||||
| task.w = tile_manager.state.buffer.width; | task.w = tile_manager.state.buffer.width; | ||||
| task.h = tile_manager.state.buffer.height; | task.h = tile_manager.state.buffer.height; | ||||
| task.rgba_byte = display->rgba_byte.device_pointer; | task.rgba_byte = display->rgba_byte.device_pointer; | ||||
| task.rgba_half = display->rgba_half.device_pointer; | task.rgba_half = display->rgba_half.device_pointer; | ||||
| ▲ Show 20 Lines • Show All 107 Lines • Show Last 20 Lines | |||||