This started out with tweaking the WorkScheduler of the compositor and tying out different scheduling strategies.
- Fix work packages that ran multiple time due to race condition.
- Keep the relation with parent/child WorkPackages around.
- Cleaner scheduling code.
- Enables access to write buffers by operators. See D10861: Compositor: Merge SingleThreadedOperation with WriteBufferOperation. with an example.
Scheduling modes:
- Input to output: mode where input nodes are calculated and after finished their child nodes.
- Output to input: same behavior as master where tiles are prioritized to show something to the user.
These modes can be switched in COM_defines.h COM_SCHEDULING_MODE.
Scheduling Back-ends:
- BLI_task
- pthread queue
The back-end can be switched in COM_WorkScheduler.cc COM_threading_model.
Test File:
Timing patch for master:
Timing patch for temp-compositor-scheduling:
AMD Ryzen 1700, Linux
| branch | scheduling mode | scheduling backend | time ExecutionSystem.execute |
| master | Output to input | pthread_queue | 3.15s |
| temp-compositor-scheduling | Output to input | pthread_queue | 3.09s |
| temp-compositor-scheduling | Input to output | pthread_queue | 3.49s |
| temp-compositor-scheduling | Output to input | BLI_task | 3.35s |
| temp-compositor-scheduling | Input to output | BLI_task | 3.09s |