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
path: root/intern
diff options
context:
space:
mode:
authorBrecht Van Lommel <brecht@blender.org>2022-02-10 22:28:43 +0300
committerBrecht Van Lommel <brecht@blender.org>2022-02-11 16:35:10 +0300
commite2728a0056df45f87161dcb0feb2721748997732 (patch)
treebdd3c43c10cd4109b098b549da03e2a6887af4c7 /intern
parent6175c569f9c7c7b2c97fd318634c4c61873f41ad (diff)
Fix T95420: Cycles crash with stereo render and tiles
For reasons unclear, destroying and then recreating a vertex buffer in the render OpenGL context is affecting the immediate mode vertex buffer in the draw manager OpenGL context. Instead just create a single vertex buffer and use it for the lifetime of the render OpenGL context. There's not really any need to have a separate one per tile as far as I can tell. Differential Revision: https://developer.blender.org/D14084
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/blender/display_driver.cpp63
1 files changed, 41 insertions, 22 deletions
diff --git a/intern/cycles/blender/display_driver.cpp b/intern/cycles/blender/display_driver.cpp
index 3eab2bb8507..0ddc7def86c 100644
--- a/intern/cycles/blender/display_driver.cpp
+++ b/intern/cycles/blender/display_driver.cpp
@@ -480,26 +480,12 @@ class DrawTile {
return false;
}
- if (!gl_vertex_buffer) {
- glGenBuffers(1, &gl_vertex_buffer);
- if (!gl_vertex_buffer) {
- LOG(ERROR) << "Error allocating tile VBO.";
- gl_resources_destroy();
- return false;
- }
- }
-
return true;
}
void gl_resources_destroy()
{
texture.gl_resources_destroy();
-
- if (gl_vertex_buffer) {
- glDeleteBuffers(1, &gl_vertex_buffer);
- gl_vertex_buffer = 0;
- }
}
inline bool ready_to_draw() const
@@ -512,9 +498,6 @@ class DrawTile {
/* Display parameters the texture of this tile has been updated for. */
BlenderDisplayDriver::Params params;
-
- /* OpenGL resources needed for drawing. */
- uint gl_vertex_buffer = 0;
};
class DrawTileAndPBO {
@@ -560,6 +543,30 @@ struct BlenderDisplayDriver::Tiles {
tiles.clear();
}
} finished_tiles;
+
+ /* OpenGL vertex buffer needed for drawing. */
+ uint gl_vertex_buffer = 0;
+
+ bool gl_resources_ensure()
+ {
+ if (!gl_vertex_buffer) {
+ glGenBuffers(1, &gl_vertex_buffer);
+ if (!gl_vertex_buffer) {
+ LOG(ERROR) << "Error allocating tile VBO.";
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ void gl_resources_destroy()
+ {
+ if (gl_vertex_buffer) {
+ glDeleteBuffers(1, &gl_vertex_buffer);
+ gl_vertex_buffer = 0;
+ }
+ }
};
BlenderDisplayDriver::BlenderDisplayDriver(BL::RenderEngine &b_engine, BL::Scene &b_scene)
@@ -626,6 +633,12 @@ bool BlenderDisplayDriver::update_begin(const Params &params,
need_clear_ = false;
}
+ if (!tiles_->gl_resources_ensure()) {
+ tiles_->gl_resources_destroy();
+ gl_context_disable();
+ return false;
+ }
+
if (!tiles_->current_tile.gl_resources_ensure()) {
tiles_->current_tile.gl_resources_destroy();
gl_context_disable();
@@ -825,7 +838,8 @@ static void vertex_buffer_update(const DisplayDriver::Params &params)
static void draw_tile(const float2 &zoom,
const int texcoord_attribute,
const int position_attribute,
- const DrawTile &draw_tile)
+ const DrawTile &draw_tile,
+ const uint gl_vertex_buffer)
{
if (!draw_tile.ready_to_draw()) {
return;
@@ -834,9 +848,9 @@ static void draw_tile(const float2 &zoom,
const GLTexture &texture = draw_tile.texture;
DCHECK_NE(texture.gl_id, 0);
- DCHECK_NE(draw_tile.gl_vertex_buffer, 0);
+ DCHECK_NE(gl_vertex_buffer, 0);
- glBindBuffer(GL_ARRAY_BUFFER, draw_tile.gl_vertex_buffer);
+ glBindBuffer(GL_ARRAY_BUFFER, gl_vertex_buffer);
/* Draw at the parameters for which the texture has been updated for. This allows to always draw
* texture during bordered-rendered camera view without flickering. The validness of the display
@@ -956,10 +970,14 @@ void BlenderDisplayDriver::draw(const Params &params)
glEnableVertexAttribArray(texcoord_attribute);
glEnableVertexAttribArray(position_attribute);
- draw_tile(zoom_, texcoord_attribute, position_attribute, tiles_->current_tile.tile);
+ draw_tile(zoom_,
+ texcoord_attribute,
+ position_attribute,
+ tiles_->current_tile.tile,
+ tiles_->gl_vertex_buffer);
for (const DrawTile &tile : tiles_->finished_tiles.tiles) {
- draw_tile(zoom_, texcoord_attribute, position_attribute, tile);
+ draw_tile(zoom_, texcoord_attribute, position_attribute, tile, tiles_->gl_vertex_buffer);
}
display_shader_->unbind();
@@ -1062,6 +1080,7 @@ void BlenderDisplayDriver::gl_resources_destroy()
tiles_->current_tile.gl_resources_destroy();
tiles_->finished_tiles.gl_resources_destroy_and_clear();
+ tiles_->gl_resources_destroy();
gl_context_disable();