docs: explain state emission in Anv

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16220>
This commit is contained in:
Lionel Landwerlin 2022-04-30 00:16:20 +03:00 committed by Marge Bot
parent 797a8850b9
commit 5a2dd4a44d
1 changed files with 42 additions and 0 deletions

View File

@ -230,3 +230,45 @@ is a byte offset from the descriptor set memory to the associated
binding. ``anv_descriptor_set_binding_layout::array_size`` is the
number of ``anv_*_descriptor`` elements in the descriptor set memory
from that offset for the binding.
Pipeline state emission
-----------------------
Vulkan initially started by baking as much state as possible in
pipelines. But extension after extension, more and more state has
become potentially dynamic.
Anv tries to limit the amount of time an instruction has to be packed
to reprogram part of the 3D pipeline state. The packing is happening
in 2 places :
- ``genX_pipeline.c`` where the non dynamic state is emitted in the
pipeline batch. This batch is copied into the command buffer batch
when calling ``vkCmdBindPipeline()``
- ``genX_cmd_buffer.c`` in the ``cmd_buffer_flush_state`` function
which ends up calling into ``gfx8_cmd_buffer.c`` &
``gfx7_cmd_buffer.c``
The rule to know where to emit an instruction programming the 3D
pipeline is as follow :
- If any field of the instruction can be made dynamic, it should be
emitted in ``genX_cmd_buffer.c``, ``gfx8_cmd_buffer.c`` or
``gfx7_cmd_buffer.c``
- Otherwise, the instruction can be emitted in ``genX_pipeline.c``
When a piece of state programming is dynamic, it should have a
corresponding field in ``anv_dynamic_state`` and the
``anv_dynamic_state_copy()`` function should be updated to ensure we
minimize the amount of time an instruction should be emitted. Each
instruction should have a associated ``ANV_CMD_DIRTY_*`` mask so that
the dynamic emission code can tell when to re-emit an instruction.
An instruction can also be re-emitted when a pipeline changes by
checking for ``ANV_CMD_DIRTY_PIPELINE``. It should only do so if it
requires to know some value that is coming from the
``anv_graphics_pipeline`` object that is not available from
``anv_dynamic_state``.