Refactor: Make draw_lock a base render method

Also semantically separate draw_lock and draw_unlock, as it
is more clear than a single method with a boolean argument.

Should be no functional changes.
This commit is contained in:
Sergey Sharybin 2023-08-11 12:35:25 +02:00 committed by Sergey Sharybin
parent bddc790166
commit 6df46fd2fc
3 changed files with 29 additions and 21 deletions

View File

@ -842,17 +842,13 @@ static void engine_render_view_layer(Render *re,
const bool use_grease_pencil)
{
/* Lock UI so scene can't be edited while we read from it in this render thread. */
if (re->draw_lock_cb) {
re->draw_lock_cb(re->dlh, true);
}
re->draw_lock();
/* Create depsgraph with scene evaluated at render resolution. */
ViewLayer *view_layer = static_cast<ViewLayer *>(
BLI_findstring(&re->scene->view_layers, view_layer_iter->name, offsetof(ViewLayer, name)));
if (!re->prepare_viewlayer(view_layer, engine->depsgraph)) {
if (re->draw_lock_cb) {
re->draw_lock_cb(re->dlh, false);
}
re->draw_unlock();
return;
}
engine_depsgraph_init(engine, view_layer);
@ -871,9 +867,7 @@ static void engine_render_view_layer(Render *re,
}
}
if (re->draw_lock_cb) {
re->draw_lock_cb(re->dlh, false);
}
re->draw_unlock();
/* Perform render with engine. */
if (use_engine) {
@ -966,15 +960,11 @@ bool RE_engine_render(Render *re, bool do_all)
}
/* Lock drawing in UI during data phase. */
if (re->draw_lock_cb) {
re->draw_lock_cb(re->dlh, true);
}
re->draw_lock();
if ((type->flag & RE_USE_GPU_CONTEXT) && !GPU_backend_supported()) {
/* Clear UI drawing locks. */
if (re->draw_lock_cb) {
re->draw_lock_cb(re->dlh, false);
}
re->draw_unlock();
BKE_report(re->reports, RPT_ERROR, "Can not initialize the GPU");
G.is_break = true;
return true;
@ -1006,9 +996,7 @@ bool RE_engine_render(Render *re, bool do_all)
if (re->result == nullptr) {
/* Clear UI drawing locks. */
if (re->draw_lock_cb) {
re->draw_lock_cb(re->dlh, false);
}
re->draw_unlock();
/* Free engine. */
RE_engine_free(engine);
re->engine = nullptr;
@ -1041,9 +1029,7 @@ bool RE_engine_render(Render *re, bool do_all)
engine->resolution_y = re->winy;
/* Clear UI drawing locks. */
if (re->draw_lock_cb) {
re->draw_lock_cb(re->dlh, false);
}
re->draw_unlock();
/* Render view layers. */
bool delay_grease_pencil = false;

View File

@ -41,6 +41,19 @@ Render::~Render()
render_result_free(pushedresult);
}
void Render::draw_lock()
{
if (draw_lock_cb) {
draw_lock_cb(dlh, true);
}
}
void Render::draw_unlock()
{
if (draw_lock_cb) {
draw_lock_cb(dlh, false);
}
}
bool Render::test_break()
{
if (!test_break_cb) {

View File

@ -49,6 +49,9 @@ struct BaseRender {
const char *view_name) = 0;
virtual void compositor_free() = 0;
virtual void draw_lock() = 0;
virtual void draw_unlock() = 0;
/* Test whether render is to be stopped: if the function returns true rendering will be stopped
* as soon as the render pipeline allows it. */
virtual bool test_break() = 0;
@ -91,6 +94,9 @@ struct ViewRender : public BaseRender {
}
void compositor_free() override {}
void draw_lock() override {}
void draw_unlock() override {}
bool test_break() override
{
return false;
@ -122,6 +128,9 @@ struct Render : public BaseRender {
const char *view_name) override;
void compositor_free() override;
void draw_lock() override;
void draw_unlock() override;
bool test_break() override;
bool prepare_viewlayer(struct ViewLayer *view_layer, struct Depsgraph *depsgraph) override;