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} 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: {F9922588}
Timing patch for master: {F9922593}
Timing patch for temp-compositor-scheduling: {F9922596}
###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 |