Fix #82483: Random Cycles baking hangs with node editor open

CTX_data_ensure_evaluated_depsgraph should not be used in drawing code.
This triggered a depsgraph updated which in turn called
DRW_notify_view_update. This would bind the GPU context a second time
and hang due to recursive mutex calls.
This commit is contained in:
Brecht Van Lommel
2024-06-10 16:41:38 +02:00
parent 28f7a467fa
commit 6cccbc8df9
4 changed files with 37 additions and 25 deletions

View File

@@ -40,14 +40,16 @@ static void node_shader_buts_normal_map(uiLayout *layout, bContext *C, PointerRN
if (obptr.data && RNA_enum_get(&obptr, "type") == OB_MESH) {
PointerRNA eval_obptr;
Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
DEG_get_evaluated_rna_pointer(depsgraph, &obptr, &eval_obptr);
PointerRNA dataptr = RNA_pointer_get(&eval_obptr, "data");
uiItemPointerR(layout, ptr, "uv_map", &dataptr, "uv_layers", "", ICON_GROUP_UVS);
}
else {
uiItemR(layout, ptr, "uv_map", UI_ITEM_R_SPLIT_EMPTY_NAME, "", ICON_NONE);
Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C);
if (depsgraph) {
DEG_get_evaluated_rna_pointer(depsgraph, &obptr, &eval_obptr);
PointerRNA dataptr = RNA_pointer_get(&eval_obptr, "data");
uiItemPointerR(layout, ptr, "uv_map", &dataptr, "uv_layers", "", ICON_GROUP_UVS);
return;
}
}
uiItemR(layout, ptr, "uv_map", UI_ITEM_R_SPLIT_EMPTY_NAME, "", ICON_NONE);
}
}

View File

@@ -31,14 +31,16 @@ static void node_shader_buts_tangent(uiLayout *layout, bContext *C, PointerRNA *
if (obptr.data && RNA_enum_get(&obptr, "type") == OB_MESH) {
PointerRNA eval_obptr;
Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
DEG_get_evaluated_rna_pointer(depsgraph, &obptr, &eval_obptr);
PointerRNA dataptr = RNA_pointer_get(&eval_obptr, "data");
uiItemPointerR(layout, ptr, "uv_map", &dataptr, "uv_layers", "", ICON_GROUP_UVS);
}
else {
uiItemR(layout, ptr, "uv_map", UI_ITEM_R_SPLIT_EMPTY_NAME, "", ICON_GROUP_UVS);
Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C);
if (depsgraph) {
DEG_get_evaluated_rna_pointer(depsgraph, &obptr, &eval_obptr);
PointerRNA dataptr = RNA_pointer_get(&eval_obptr, "data");
uiItemPointerR(layout, ptr, "uv_map", &dataptr, "uv_layers", "", ICON_GROUP_UVS);
return;
}
}
uiItemR(layout, ptr, "uv_map", UI_ITEM_R_SPLIT_EMPTY_NAME, "", ICON_GROUP_UVS);
}
else {
uiItemR(

View File

@@ -33,11 +33,17 @@ static void node_shader_buts_uvmap(uiLayout *layout, bContext *C, PointerRNA *pt
if (obptr.data && RNA_enum_get(&obptr, "type") == OB_MESH) {
PointerRNA eval_obptr;
Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
DEG_get_evaluated_rna_pointer(depsgraph, &obptr, &eval_obptr);
PointerRNA dataptr = RNA_pointer_get(&eval_obptr, "data");
uiItemPointerR(layout, ptr, "uv_map", &dataptr, "uv_layers", "", ICON_GROUP_UVS);
Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C);
if (depsgraph) {
DEG_get_evaluated_rna_pointer(depsgraph, &obptr, &eval_obptr);
PointerRNA dataptr = RNA_pointer_get(&eval_obptr, "data");
uiItemPointerR(layout, ptr, "uv_map", &dataptr, "uv_layers", "", ICON_GROUP_UVS);
return;
}
}
uiItemR(layout, ptr, "uv_map", UI_ITEM_R_SPLIT_EMPTY_NAME, nullptr, ICON_GROUP_UVS);
}
}

View File

@@ -28,14 +28,16 @@ static void node_shader_buts_vertex_color(uiLayout *layout, bContext *C, Pointer
if (obptr.data && RNA_enum_get(&obptr, "type") == OB_MESH) {
PointerRNA eval_obptr;
Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
DEG_get_evaluated_rna_pointer(depsgraph, &obptr, &eval_obptr);
PointerRNA dataptr = RNA_pointer_get(&eval_obptr, "data");
uiItemPointerR(layout, ptr, "layer_name", &dataptr, "color_attributes", "", ICON_GROUP_VCOL);
}
else {
uiItemL(layout, RPT_("No mesh in active object"), ICON_ERROR);
Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C);
if (depsgraph) {
DEG_get_evaluated_rna_pointer(depsgraph, &obptr, &eval_obptr);
PointerRNA dataptr = RNA_pointer_get(&eval_obptr, "data");
uiItemPointerR(layout, ptr, "layer_name", &dataptr, "color_attributes", "", ICON_GROUP_VCOL);
}
}
uiItemR(layout, ptr, "layer_name", UI_ITEM_R_SPLIT_EMPTY_NAME, nullptr, ICON_GROUP_VCOL);
uiItemL(layout, RPT_("No mesh in active object"), ICON_ERROR);
}
static void node_shader_init_vertex_color(bNodeTree * /*ntree*/, bNode *node)