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/session')
-rw-r--r--intern/cycles/session/display_driver.h13
-rw-r--r--intern/cycles/session/session.cpp5
-rw-r--r--intern/cycles/session/tile.cpp6
-rw-r--r--intern/cycles/session/tile.h6
4 files changed, 26 insertions, 4 deletions
diff --git a/intern/cycles/session/display_driver.h b/intern/cycles/session/display_driver.h
index 77f89326fd0..5544ceee83d 100644
--- a/intern/cycles/session/display_driver.h
+++ b/intern/cycles/session/display_driver.h
@@ -54,6 +54,8 @@ class DisplayDriver {
}
};
+ virtual void next_tile_begin() = 0;
+
/* Update the render from the rendering thread.
*
* Cycles periodically updates the render to be displayed. For multithreaded updates with
@@ -97,6 +99,17 @@ class DisplayDriver {
/* Clear the entire buffer before doing partial write to it. */
bool need_clear = false;
+
+ /* Enforce re-creation of the graphics interop object.
+ *
+ * When this field is true then the graphics interop will be re-created no matter what the
+ * rest of the configuration is.
+ * When this field is false the graphics interop will be re-created if the PBO or buffer size
+ * did change.
+ *
+ * This allows to ensure graphics interop is re-created when there is a possibility that an
+ * underlying PBO was re-allocated but did not change its ID. */
+ bool need_recreate = false;
};
virtual GraphicsInterop graphics_interop_get()
diff --git a/intern/cycles/session/session.cpp b/intern/cycles/session/session.cpp
index af5c6b3f1fd..4d8e3dfbfad 100644
--- a/intern/cycles/session/session.cpp
+++ b/intern/cycles/session/session.cpp
@@ -303,7 +303,7 @@ RenderWork Session::run_update_for_next_iteration()
tile_params.update_offset_stride();
- path_trace_->reset(buffer_params_, tile_params);
+ path_trace_->reset(buffer_params_, tile_params, did_reset);
}
const int resolution = render_work.resolution_divider;
@@ -384,7 +384,8 @@ int2 Session::get_effective_tile_size() const
const int tile_size = tile_manager_.compute_render_tile_size(params.tile_size);
const int64_t actual_tile_area = static_cast<int64_t>(tile_size) * tile_size;
- if (actual_tile_area >= image_area) {
+ if (actual_tile_area >= image_area && image_width <= TileManager::MAX_TILE_SIZE &&
+ image_height <= TileManager::MAX_TILE_SIZE) {
return make_int2(image_width, image_height);
}
diff --git a/intern/cycles/session/tile.cpp b/intern/cycles/session/tile.cpp
index 3b8482fa16f..afd1f334120 100644
--- a/intern/cycles/session/tile.cpp
+++ b/intern/cycles/session/tile.cpp
@@ -341,8 +341,10 @@ int TileManager::compute_render_tile_size(const int suggested_tile_size) const
/* Must be a multiple of IMAGE_TILE_SIZE so that we can write render tiles into the image file
* aligned on image tile boundaries. We can't set IMAGE_TILE_SIZE equal to the render tile size
* because too big tile size leads to integer overflow inside OpenEXR. */
- return (suggested_tile_size <= IMAGE_TILE_SIZE) ? suggested_tile_size :
- align_up(suggested_tile_size, IMAGE_TILE_SIZE);
+ const int computed_tile_size = (suggested_tile_size <= IMAGE_TILE_SIZE) ?
+ suggested_tile_size :
+ align_up(suggested_tile_size, IMAGE_TILE_SIZE);
+ return min(computed_tile_size, MAX_TILE_SIZE);
}
void TileManager::reset_scheduling(const BufferParams &params, int2 tile_size)
diff --git a/intern/cycles/session/tile.h b/intern/cycles/session/tile.h
index eace148eb0a..7c8f7570d3e 100644
--- a/intern/cycles/session/tile.h
+++ b/intern/cycles/session/tile.h
@@ -122,6 +122,12 @@ class TileManager {
/* Tile size in the image file. */
static const int IMAGE_TILE_SIZE = 128;
+ /* Maximum supported tile size.
+ * Needs to be safe from allocation on a GPU point of view: the display driver needs to be able
+ * to allocate texture with the side size of this value.
+ * Use conservative value which is safe for most of OpenGL drivers and GPUs. */
+ static const int MAX_TILE_SIZE = 8192;
+
protected:
/* Get tile configuration for its index.
* The tile index must be within [0, state_.tile_state_). */