This is a new implementation of the draw manager using modern
rendering practices and GPU driven culling.
This only ports features that are not considered deprecated or to be
removed.
The old DRW API is kept working along side this new one, and does not
interfeer with it. However this needed some more hacking inside the
draw_view_lib.glsl. At least the create info are well separated.
The reviewer might start by looking at draw_pass_test.cc to see the
API in usage.
Important files are draw_pass.hh, draw_command.hh,
draw_command_shared.hh.
In a nutshell (for a developper used to old DRW API):
- DRWShadingGroups are replaced by Pass<T>::Sub.
- Contrary to DRWShadingGroups, all commands recorded inside a pass or sub-pass (even binds / push_constant / uniforms) will be executed in order.
- All memory is managed per object (except for Sub-Pass which are managed by their parent pass) and not from draw manager pools. So passes "can" potentially be recorded once and submitted multiple time (but this is not really encouraged for now). The only implicit link is between resource lifetime and ResourceHandles
- Sub passes can be any level deep.
- IMPORTANT: All state propagate from sub pass to subpass. There is no state stack concept anymore. Ensure the correct render state is set before drawing anything using Pass::state_set().
- The drawcalls now needs a ResourceHandle instead of an Object *. This is to remove any implicit dependency between Pass and Manager. This was a huge problem in old implementation since the manager did not know what to pull from the object. Now it is explicitly requested by the engine.
- The pases need to be submitted to a draw::Manager instance which can be retrieved using DRW_manager_get() (for now).
Internally:
- All object data are stored in contiguous storage buffers. Removing a lot of complexity in the pass submission.
- Draw calls are sorted and visibility tested on GPU. Making more modern culling and better instancing usage possible in the future.
- Unit Tests have been added for regression testing and avoid most API breakage.
- draw::View now contains culling data for all objects in the scene allowing caching for multiple views.
- Bounding box and sphere final setup is moved to GPU.
- Some global resources locations have been hardcoded to reduce complexity.
What is missing:
Workaround for lack of gl_BaseInstanceARB.DoneObject Uniform Attributes.Done (Not in this patch)- Workaround for hardware supporting a maximum of 8 SSBO.