title: Why does GPUImage use semaphores and processing queues instead of a thread with a runloop?
body: <p>As far as I understand GPUImage performs DAG traversal and uses
  semaphores to protect OpenGL usage while treating it as a single use resource together with the framebuffer texture cache.</p>
  
  <p>Is there a reason to use semaphores here? Do they not unecessarily complicate the situation? What benefit do they provide and what kind of problems will be encountered by using a separate thread implementation for each filter DAG instead of running on a separate thread in a runloop.
  Were there particular design considerations which informed the decision for the current GPUImage architecture?</p>