Python: Crash when bpy.ops.wm.previews_ensure() called after queuing asset_generate_preview() job #105325

Closed
opened 2023-03-01 02:00:19 +01:00 by Colin Basnett · 7 comments
Member

System Information
Operating system: Windows 11
Graphics card: NVIDIA RTX 3060 Ti

Blender Version
Broken: 3.6.0

Short description of error

A crash can be triggered by running the following script in a headless session:

import bpy

for object in bpy.data.objects:
    object.asset_generate_preview()

bpy.ops.wm.previews_ensure()

This however does not crash:

import bpy

for object in bpy.data.objects:
    object.preview_ensure()

bpy.ops.wm.previews_ensure()

The console output is this:

C:\Users\Owner>"C:\Program Files\Blender Foundation\Blender 3.4\blender.exe" --python "C:\Users\Owner\Desktop\previews_ensure_bug.py" --background
Blender 3.4.0 (hash a95bf1ac01be built 2022-12-07 02:06:25)
Read prefs: C:\Users\Owner\AppData\Roaming\Blender Foundation\Blender\3.4\config\userpref.blend
Error   : EXCEPTION_ACCESS_VIOLATION
Address : 0x00007FFE5076893E
Module  : OPENGL32.DLL
Thread  : 0000a70c
Writing: C:\Users\Owner\AppData\Local\Temp\blender.crash.txt

Exact steps for others to reproduce the error

blender.exe --python ./previews_ensure_bug.py --background
**System Information** Operating system: Windows 11 Graphics card: NVIDIA RTX 3060 Ti **Blender Version** Broken: 3.6.0 **Short description of error** A crash can be triggered by running the following script in a headless session: ``` import bpy for object in bpy.data.objects: object.asset_generate_preview() bpy.ops.wm.previews_ensure() ``` This however does not crash: ``` import bpy for object in bpy.data.objects: object.preview_ensure() bpy.ops.wm.previews_ensure() ``` The console output is this: ``` C:\Users\Owner>"C:\Program Files\Blender Foundation\Blender 3.4\blender.exe" --python "C:\Users\Owner\Desktop\previews_ensure_bug.py" --background Blender 3.4.0 (hash a95bf1ac01be built 2022-12-07 02:06:25) Read prefs: C:\Users\Owner\AppData\Roaming\Blender Foundation\Blender\3.4\config\userpref.blend Error : EXCEPTION_ACCESS_VIOLATION Address : 0x00007FFE5076893E Module : OPENGL32.DLL Thread : 0000a70c Writing: C:\Users\Owner\AppData\Local\Temp\blender.crash.txt ``` **Exact steps for others to reproduce the error** ``` blender.exe --python ./previews_ensure_bug.py --background ```
Colin Basnett added the
Priority
Normal
Status
Needs Triage
Type
Report
labels 2023-03-01 02:00:19 +01:00
Iliya Katushenock added the
Interest
Python API
Interest
Render Pipeline
labels 2023-03-01 05:26:04 +01:00
Brecht Van Lommel removed the
Interest
Render Pipeline
label 2023-03-01 08:58:08 +01:00
Member

Can confirm.

Interestingly, using object.preview_ensure() in the loop instead of object.asset_generate_preview() does not crash.

Somehow, the GPUBackend is NULL in GPU_render_begin (but this is the case for both of the above, so preview_ensure() seems to do something to prevent the crash later)

Not sure if these really help, but here are some traces:

headless previews_ensure after preview_ensure (GPUBackend is NOT there)

1   GPU_render_begin                gpu_context.cc     200  0x1d676fce 
2   RE_PreviewRender                pipeline.cc        2364 0xa792873  
3   shader_preview_render           render_preview.cc  1198 0x1093d582 
4   shader_preview_startjob         render_preview.cc  1238 0x1093dd91 
5   icon_preview_startjob           render_preview.cc  1477 0x10940d16 
6   common_preview_startjob         render_preview.cc  1498 0x10941052 
7   other_id_types_preview_render   render_preview.cc  1550 0x10941e04 
8   icon_preview_startjob_all_sizes render_preview.cc  1646 0x10942ba1 
9   ED_preview_icon_render          render_preview.cc  1968 0x1094601a 
10  icon_set_image                  interface_icons.cc 1467 0xa379622  
11  ui_id_preview_image_render_size interface_icons.cc 2029 0xa37f554  
12  UI_icon_render_id_ex            interface_icons.cc 2042 0xa37f751  
13  UI_icon_render_id               interface_icons.cc 2067 0xa37f974  
14  previews_id_ensure              wm_operators.c     3456 0x3c9b080  
15  previews_id_ensure_callback     wm_operators.c     3474 0x3c9b6ea  
16  BKE_lib_query_foreachid_process lib_query.c        87   0xe7bbef   
17  scene_foreach_id                scene.cc           810  0x16518b1  
18  library_foreach_ID_link         lib_query.c        335  0xe7e069   
19  BKE_library_foreach_ID_link     lib_query.c        354  0xe7e1f9   
20  previews_ensure_exec            wm_operators.c     3499 0x3c9bea6 

headless previews_ensure after asset_generate_preview (GPUBackend is NOT there)

1  GPU_render_begin                gpu_context.cc      199  0x1d676fc5 
2  RE_PreviewRender                pipeline.cc         2364 0xa792873  
3  shader_preview_render           render_preview.cc   1198 0x1093d582 
4  shader_preview_startjob         render_preview.cc   1238 0x1093dd91 
5  icon_preview_startjob           render_preview.cc   1477 0x10940d16 
6  common_preview_startjob         render_preview.cc   1498 0x10941052 
7  other_id_types_preview_render   render_preview.cc   1550 0x10941e04 
8  icon_preview_startjob_all_sizes render_preview.cc   1646 0x10942ba1 
9  ED_preview_icon_render          render_preview.cc   1968 0x1094601a 
10 icon_set_image                  interface_icons.cc  1467 0xa379622  
11 ui_id_preview_image_render_size interface_icons.cc  2029 0xa37f554  
12 UI_icon_render_id_ex            interface_icons.cc  2042 0xa37f751  
13 UI_icon_render_id               interface_icons.cc  2067 0xa37f974  
14 previews_id_ensure              wm_operators.c      3456 0x3c9b080  
15 previews_id_ensure_callback     wm_operators.c      3474 0x3c9b6ea  
16 BKE_lib_query_foreachid_process lib_query.c         87   0xe7bbef   
17 scene_foreach_id                scene.cc            810  0x16518b1  
18 library_foreach_ID_link         lib_query.c         335  0xe7e069   
19 BKE_library_foreach_ID_link     lib_query.c         354  0xe7e1f9   
20 previews_ensure_exec            wm_operators.c      3499 0x3c9bea6  

headless regular image render (GPUBackend is there)

1  GPU_render_begin          gpu_context.cc 200  0x1d676fce 
2  DRW_render_context_enable draw_manager.c 3114 0x498c1eb  
3  engine_render_view_layer  engine.cc      939  0xa75175c  
4  RE_engine_render          engine.cc      1110 0xa754676  
5  do_render_engine          pipeline.cc    988  0xa77f116  
6  do_render_compositor      pipeline.cc    1122 0xa7818d9  
7  do_render_full_pipeline   pipeline.cc    1375 0xa78620d  
8  RE_RenderAnim             pipeline.cc    2281 0xa7917ff  
9  arg_handle_render_frame   creator_args.c 1679 0x947673   
10 BLI_args_parse            BLI_args.c     295  0x1fcc5bd4 
11 main_args_setup_post      creator_args.c 2358 0x94c61b   
12 main                      creator.c      550  0x93f192  
Can confirm. Interestingly, using `object.preview_ensure()` in the loop instead of `object.asset_generate_preview()` does not crash. Somehow, the GPUBackend is NULL in `GPU_render_begin` (but this is the case for both of the above, so `preview_ensure()` seems to do something to prevent the crash later) Not sure if these really help, but here are some traces: headless previews_ensure after preview_ensure (GPUBackend is NOT there) ``` 1 GPU_render_begin gpu_context.cc 200 0x1d676fce 2 RE_PreviewRender pipeline.cc 2364 0xa792873 3 shader_preview_render render_preview.cc 1198 0x1093d582 4 shader_preview_startjob render_preview.cc 1238 0x1093dd91 5 icon_preview_startjob render_preview.cc 1477 0x10940d16 6 common_preview_startjob render_preview.cc 1498 0x10941052 7 other_id_types_preview_render render_preview.cc 1550 0x10941e04 8 icon_preview_startjob_all_sizes render_preview.cc 1646 0x10942ba1 9 ED_preview_icon_render render_preview.cc 1968 0x1094601a 10 icon_set_image interface_icons.cc 1467 0xa379622 11 ui_id_preview_image_render_size interface_icons.cc 2029 0xa37f554 12 UI_icon_render_id_ex interface_icons.cc 2042 0xa37f751 13 UI_icon_render_id interface_icons.cc 2067 0xa37f974 14 previews_id_ensure wm_operators.c 3456 0x3c9b080 15 previews_id_ensure_callback wm_operators.c 3474 0x3c9b6ea 16 BKE_lib_query_foreachid_process lib_query.c 87 0xe7bbef 17 scene_foreach_id scene.cc 810 0x16518b1 18 library_foreach_ID_link lib_query.c 335 0xe7e069 19 BKE_library_foreach_ID_link lib_query.c 354 0xe7e1f9 20 previews_ensure_exec wm_operators.c 3499 0x3c9bea6 ``` headless previews_ensure after asset_generate_preview (GPUBackend is NOT there) ``` 1 GPU_render_begin gpu_context.cc 199 0x1d676fc5 2 RE_PreviewRender pipeline.cc 2364 0xa792873 3 shader_preview_render render_preview.cc 1198 0x1093d582 4 shader_preview_startjob render_preview.cc 1238 0x1093dd91 5 icon_preview_startjob render_preview.cc 1477 0x10940d16 6 common_preview_startjob render_preview.cc 1498 0x10941052 7 other_id_types_preview_render render_preview.cc 1550 0x10941e04 8 icon_preview_startjob_all_sizes render_preview.cc 1646 0x10942ba1 9 ED_preview_icon_render render_preview.cc 1968 0x1094601a 10 icon_set_image interface_icons.cc 1467 0xa379622 11 ui_id_preview_image_render_size interface_icons.cc 2029 0xa37f554 12 UI_icon_render_id_ex interface_icons.cc 2042 0xa37f751 13 UI_icon_render_id interface_icons.cc 2067 0xa37f974 14 previews_id_ensure wm_operators.c 3456 0x3c9b080 15 previews_id_ensure_callback wm_operators.c 3474 0x3c9b6ea 16 BKE_lib_query_foreachid_process lib_query.c 87 0xe7bbef 17 scene_foreach_id scene.cc 810 0x16518b1 18 library_foreach_ID_link lib_query.c 335 0xe7e069 19 BKE_library_foreach_ID_link lib_query.c 354 0xe7e1f9 20 previews_ensure_exec wm_operators.c 3499 0x3c9bea6 ``` headless regular image render (GPUBackend is there) ``` 1 GPU_render_begin gpu_context.cc 200 0x1d676fce 2 DRW_render_context_enable draw_manager.c 3114 0x498c1eb 3 engine_render_view_layer engine.cc 939 0xa75175c 4 RE_engine_render engine.cc 1110 0xa754676 5 do_render_engine pipeline.cc 988 0xa77f116 6 do_render_compositor pipeline.cc 1122 0xa7818d9 7 do_render_full_pipeline pipeline.cc 1375 0xa78620d 8 RE_RenderAnim pipeline.cc 2281 0xa7917ff 9 arg_handle_render_frame creator_args.c 1679 0x947673 10 BLI_args_parse BLI_args.c 295 0x1fcc5bd4 11 main_args_setup_post creator_args.c 2358 0x94c61b 12 main creator.c 550 0x93f192 ```
Philipp Oeser added
Status
Confirmed
and removed
Status
Needs Triage
labels 2023-03-02 13:35:15 +01:00
Philipp Oeser changed title from Python: Crash when bpy.ops.wm.previews_ensure() called after queuing preview render job to Python: Crash when bpy.ops.wm.previews_ensure() called after queuing asset_generate_preview() 2023-03-02 13:36:27 +01:00
Philipp Oeser changed title from Python: Crash when bpy.ops.wm.previews_ensure() called after queuing asset_generate_preview() to Python: Crash when bpy.ops.wm.previews_ensure() called after queuing asset_generate_preview() job 2023-03-02 13:51:49 +01:00
Member

Ah, OK, this is indeed caused by the fact that ED_asset_generate_preview calls UI_icon_render_id as a job, whereas previews_id_ensure doesnt...

Ah, OK, this is indeed caused by the fact that `ED_asset_generate_preview` calls `UI_icon_render_id` as a job, whereas `previews_id_ensure` doesnt...
Member

The following would fix this (would need to check if this is a common way do in background mode...)



diff --git a/source/blender/editors/asset/intern/asset_mark_clear.cc b/source/blender/editors/asset/intern/asset_mark_clear.cc
index 276b2f9a2f6..6d3860d57c0 100644
--- a/source/blender/editors/asset/intern/asset_mark_clear.cc
+++ b/source/blender/editors/asset/intern/asset_mark_clear.cc
@@ -10,6 +10,7 @@
 
 #include "BKE_asset.h"
 #include "BKE_context.h"
+#include "BKE_global.h"
 #include "BKE_icons.h"
 #include "BKE_idtype.h"
 #include "BKE_lib_id.h"
@@ -52,7 +53,7 @@ void ED_asset_generate_preview(const bContext *C, ID *id)
     BKE_previewimg_clear(preview);
   }
 
-  UI_icon_render_id(C, nullptr, id, ICON_SIZE_PREVIEW, true);
+  UI_icon_render_id(C, nullptr, id, ICON_SIZE_PREVIEW, (G.background == false));
 }
 
 bool ED_asset_clear_id(ID *id)

@dr.sybren , @mont29 : opinions?

The following would fix this (would need to check if this is a common way do in background mode...) ``` diff --git a/source/blender/editors/asset/intern/asset_mark_clear.cc b/source/blender/editors/asset/intern/asset_mark_clear.cc index 276b2f9a2f6..6d3860d57c0 100644 --- a/source/blender/editors/asset/intern/asset_mark_clear.cc +++ b/source/blender/editors/asset/intern/asset_mark_clear.cc @@ -10,6 +10,7 @@ #include "BKE_asset.h" #include "BKE_context.h" +#include "BKE_global.h" #include "BKE_icons.h" #include "BKE_idtype.h" #include "BKE_lib_id.h" @@ -52,7 +53,7 @@ void ED_asset_generate_preview(const bContext *C, ID *id) BKE_previewimg_clear(preview); } - UI_icon_render_id(C, nullptr, id, ICON_SIZE_PREVIEW, true); + UI_icon_render_id(C, nullptr, id, ICON_SIZE_PREVIEW, (G.background == false)); } bool ED_asset_clear_id(ID *id) ``` @dr.sybren , @mont29 : opinions?
Philipp Oeser added the
Module
Pipeline, Assets & IO
label 2023-03-02 14:12:41 +01:00
Member

OTOH, asking this on the sideline: does it really make sense to call bpy.ops.wm.previews_ensure() after we have looped and generated previews already? This seems to do the same thing again?

In any case, preventing a crash is always a good thing imo.

OTOH, asking this on the sideline: does it really make sense to call `bpy.ops.wm.previews_ensure()` after we have looped and generated previews already? This seems to do the same thing **again**? In any case, preventing a crash is always a good thing imo.
Author
Member

bpy.ops.wm.previews_ensure() does not generate previews for objects, which is arguably a bug or oversight since there's no other way to ensure that previews are generated for object assets.

`bpy.ops.wm.previews_ensure()` does not generate previews for objects, which is arguably a bug or oversight since there's no other way to ensure that previews are generated for object assets.
Member

bpy.ops.wm.previews_ensure() does not generate previews for objects, which is arguably a bug or oversight since there's no other way to ensure that previews are generated for object assets.

Sorry, yeah, that is only for materials, textures, images, worlds and lights.

> `bpy.ops.wm.previews_ensure()` does not generate previews for objects, which is arguably a bug or oversight since there's no other way to ensure that previews are generated for object assets. Sorry, yeah, that is only for materials, textures, images, worlds and lights.
Member

Will just submit a PR for the suggested fix (so will put on my desk)

Will just submit a PR for the suggested fix (so will put on my desk)
Philipp Oeser self-assigned this 2023-03-23 14:11:24 +01:00
Blender Bot added
Status
Resolved
and removed
Status
Confirmed
labels 2023-03-24 09:17:15 +01:00
Sign in to join this conversation.
No Label
Interest
Alembic
Interest
Animation & Rigging
Interest
Asset Browser
Interest
Asset Browser Project Overview
Interest
Audio
Interest
Automated Testing
Interest
Blender Asset Bundle
Interest
BlendFile
Interest
Collada
Interest
Compatibility
Interest
Compositing
Interest
Core
Interest
Cycles
Interest
Dependency Graph
Interest
Development Management
Interest
EEVEE
Interest
EEVEE & Viewport
Interest
Freestyle
Interest
Geometry Nodes
Interest
Grease Pencil
Interest
ID Management
Interest
Images & Movies
Interest
Import Export
Interest
Line Art
Interest
Masking
Interest
Metal
Interest
Modeling
Interest
Modifiers
Interest
Motion Tracking
Interest
Nodes & Physics
Interest
OpenGL
Interest
Overlay
Interest
Overrides
Interest
Performance
Interest
Physics
Interest
Pipeline, Assets & IO
Interest
Platforms, Builds & Tests
Interest
Python API
Interest
Render & Cycles
Interest
Render Pipeline
Interest
Sculpt, Paint & Texture
Interest
Text Editor
Interest
Translations
Interest
Triaging
Interest
Undo
Interest
USD
Interest
User Interface
Interest
UV Editing
Interest
VFX & Video
Interest
Video Sequencer
Interest
Virtual Reality
Interest
Vulkan
Interest
Wayland
Interest
Workbench
Interest: X11
Legacy
Blender 2.8 Project
Legacy
Milestone 1: Basic, Local Asset Browser
Legacy
OpenGL Error
Meta
Good First Issue
Meta
Papercut
Meta
Retrospective
Meta
Security
Module
Animation & Rigging
Module
Core
Module
Development Management
Module
EEVEE & Viewport
Module
Grease Pencil
Module
Modeling
Module
Nodes & Physics
Module
Pipeline, Assets & IO
Module
Platforms, Builds & Tests
Module
Python API
Module
Render & Cycles
Module
Sculpt, Paint & Texture
Module
Triaging
Module
User Interface
Module
VFX & Video
Platform
FreeBSD
Platform
Linux
Platform
macOS
Platform
Windows
Priority
High
Priority
Low
Priority
Normal
Priority
Unbreak Now!
Status
Archived
Status
Confirmed
Status
Duplicate
Status
Needs Info from Developers
Status
Needs Information from User
Status
Needs Triage
Status
Resolved
Type
Bug
Type
Design
Type
Known Issue
Type
Patch
Type
Report
Type
To Do
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: blender/blender#105325
No description provided.