[Mesa-dev] [PATCH 00/25] anv: A major rework of color attachment surface states

Jason Ekstrand jason at jlekstrand.net
Thu Nov 10 02:43:23 UTC 2016


On Wed, Nov 9, 2016 at 5:09 PM, Nanley Chery <nanleychery at gmail.com> wrote:

> On Sat, Oct 22, 2016 at 10:50:31AM -0700, Jason Ekstrand wrote:
> > This series does some fairly major surgery on color attachment surface
> > state allocation and fill-out in the Intel Vulkan driver.  This is in
> > preparation for doing color compression, fast-clears, and HiZ-capable
> input
> > attachments.  Naturally, as with everything else I've done in the last 2
> > months, it also involves some non-trivial blorp work.
> >
> > Let's start off at the beginning...  For a variety of reasons, we can't
> > really know 100% of the details of an attachment's surface state at any
> > other places than vkCmdBeginRenderPass and vkCmdNextSubpss.  The same
> > applies for depth buffers if you consider 3DSTATE_DEPTH_BUFFER and
> friends
> > to be the depth and stencil buffer's "surface state".  That's a fairly
> > strong statement, but there are a couple of reasons for this:
> >
> >  1) In order for fast-clears to work, the surface state has to contain
> the
> >     clear color.  (This is it's own packet for HiZ but not for color.)
> We
> >     don't know the clear value until BeginRenderPass.  This means we
> can't
> >     fully fill out the surface state in vkCmdCreateImageView.
> >
> >  2) The Vulkan spec requires that you be able to call
> vkBeginCommandBuffer
> >     on a secondary command buffer with USAGE_RENDER_PASS_CONTINUE_BIT set
> >     but with a null framebuffer.  In this case, the secondary is supposed
> >     to inherit the framebuffer from the primary.  (This is not something
> we
> >     have properly implemented until now.)  This means that anything that
> is
> >     callable from a render-pass-continuing secondary command buffer has
> to
> >     be able to operate without knowing any surface details that aren't
> part
> >     of the VkRenderPass object.  Basically, all you know is the Vulkan
> >     format (not the isl format) and the sample count.
> >
> > Between the two of those, about the only two entrypoints left at which we
> > actually know surface details are vkCmdBeginRenderPass and
> vkCmdNextSubpass
> > so we have to figure out how to do everything there.  As it turns out,
> this
> > works out surprisingly well.  The format and the sample count turn out to
> > be exactly the data we actually need in order to do all of our pipeline
> > programming.  The only hard part is refactoring things so that it pulls
> the
> > data from the render pass instead of the framebuffer.  There are a number
> > of places where we were grabbing the image view for an attachment because
> > we either wanted to shove something into blorp or because we wanted the
> > format and we were lazy.
> >
> > The approach taken in this patch series is the following:
> >
> >  1) Instead of allocating render target surface states in
> vkCreateImageView,
> >     we allocate them as part of render pass setup in
> vkCmdBeginRenderPass.
> >     All of the surface states we will ever need (including a null surface
> >     state) are allocated up-front out of a single contiguous block.
> >
> >  2) For secondary command buffers with USAGE_RENDER_PASS_CONTINUE_BIT
> set,
> >     we allocate storage for all of the surface states but don't actually
> >     fill them out.  In the secondary command buffer, all binding tables
> >     refer to these surface states rather than the ones in the primary.
> >
> >  3) A blorp entrypoint is added that performs a clear operation without
> >     touching the depth/stencil buffer state and with a color attachment
> >     binding table explicitly provided by the caller.  This means that
> even
> >     our blorp clears are using the surface states allocated in
> >     vkCmdBeginRenderPass.  Unfortunately, this turned out to be more work
> >     than expected because I had to add vertex shader support to blorp
> along
> >     the way.
> >
> >  4) Here's the tricky bit.  When vkCmdExecuteCommands is called during a
> >     render pass, we use transform feedback (yeah, crazy) to copy the
> block
> >     of surface states from the primary into the secondary right before
> >     executing the secondary.
>
> Could we perform a CPU memcpy at this stage?
>

We can but only if the secondary is created with the SIMULTANEOUS_USE_BIT
unset.  If SIMULTANEOUS_USE_BIT is set, then it may be used in multiple
primaries at the same time.  In this case, since we don't know the order
they will be submitted to the GPU, we have to do the copy at the last
minute.  It may be a bit more performant to do the CPU memcpy in that case.

I didn't do that yet because I wanted to let it bake for a while with just
the GPU memcpy.  The CPU memcpy is guaranteed to be reliable but the GPU
memcpy isn't.  By leaving it as just GPU memcpy, we'll get better tests
coverage of the crazy path.  If we find that it's causing problems, doing a
CPU copy is a nice little optimization to have in our back pockets.

--Jason


> - Nanley
>
> >
> > It's kind of a crazy scheme but I like the end result quite a bit.
> >
> > Cc: Kristian Høgsberg Kristensen <krh at bitplanet.net>
> > Cc: Chad Versace <chadversary at chromium.org>
> > Cc: Nanley Chery <nanley.g.chery at intel.com>
> > Cc: Topi Pohjolainen <topi.pohjolainen at intel.com>
> >
> > Jason Ekstrand (25):
> >   intel/isl: Add some basic info about RENDER_SURFACE_STATE to
> >     isl_device
> >   intel/genxml: Add SO_WRITE_OFFSET registers for gen7-9
> >   anv: Add a helper for doing buffer copies with nothing but VF and SOL.
> >   anv/cmd_buffer: Use the surface state alloc helper in
> >     null_surface_state
> >   anv/cmd_buffer: Expose add_surface_state_reloc as an inline helper
> >   anv: Rework the way render target surfaces are allocated
> >   anv/cmd_buffer: Stop relying on the framebuffer for 3DSTATE_SF on gen7
> >   intel/genxml: Make some VS/GS fields consistent across gens
> >   intel/blorp: Make the number of samples an explicit parameter
> >   intel/blorp: Add a shader type to make keys more unique
> >   intel/blorp: Remove NIR support for uniforms
> >   intel/blorp: Rename compile_nir_shader to compile_fs
> >   intel/blorp: Rework our usage of ralloc when compiling shaders
> >   intel/blorp: Handle NIR clear inputs the same way as blit inputs
> >   blorp/exec: Use uint32_t for copying varying data
> >   intel/blorp: Use an actual chunk of vertex buffer for the VUE header
> >   intel/blorp: Add support for vertex shaders
> >   intel/blorp: Add capability to use pre-baked binding tables
> >   intel/blorp: Add a clear_attachments entrypoint
> >   anv: Bring back anv_cmd_buffer_emit_state_base_address
> >   anv/blorp: Break the guts of alloc_binding_table into a shared helper
> >   anv/blorp: Use the new clear_attachments entrypoint for attachment
> >     clears
> >   anv: Set framebuffer to NULL in secondary command buffers
> >   Allocate a null state whenever there is depth/stencil
> >   anv/blorp: Handle VK_ATTACHMENT_UNUSED in CmdClearAttachments
> >
> >  src/intel/blorp/blorp.c                          |  74 ++++----
> >  src/intel/blorp/blorp.h                          |  11 ++
> >  src/intel/blorp/blorp_blit.c                     |  34 ++--
> >  src/intel/blorp/blorp_clear.c                    | 189
> +++++++++++++++++--
> >  src/intel/blorp/blorp_genX_exec.h                | 196
> ++++++++++---------
> >  src/intel/blorp/blorp_priv.h                     |  52 ++++-
> >  src/intel/genxml/gen6.xml                        |   6 +-
> >  src/intel/genxml/gen7.xml                        |  22 ++-
> >  src/intel/genxml/gen75.xml                       |  22 ++-
> >  src/intel/genxml/gen8.xml                        |  16 ++
> >  src/intel/genxml/gen9.xml                        |  16 ++
> >  src/intel/isl/isl.c                              |  19 ++
> >  src/intel/isl/isl.h                              |  11 ++
> >  src/intel/vulkan/Makefile.sources                |   4 +
> >  src/intel/vulkan/anv_batch_chain.c               |   4 +-
> >  src/intel/vulkan/anv_blorp.c                     | 125 +++++++++----
> >  src/intel/vulkan/anv_cmd_buffer.c                |  74 ++------
> >  src/intel/vulkan/anv_genX.h                      |   5 +
> >  src/intel/vulkan/anv_image.c                     |  22 ---
> >  src/intel/vulkan/anv_private.h                   |  42 ++++-
> >  src/intel/vulkan/gen7_cmd_buffer.c               |  43 +++--
> >  src/intel/vulkan/gen7_pipeline.c                 |   6 +-
> >  src/intel/vulkan/genX_blorp_exec.c               |  18 +-
> >  src/intel/vulkan/genX_cmd_buffer.c               | 229
> +++++++++++++++++------
> >  src/intel/vulkan/genX_gpu_memcpy.c               | 223
> ++++++++++++++++++++++
> >  src/mesa/drivers/dri/i965/brw_wm_surface_state.c |  56 +++---
> >  26 files changed, 1105 insertions(+), 414 deletions(-)
> >  create mode 100644 src/intel/vulkan/genX_gpu_memcpy.c
> >
> > --
> > 2.5.0.400.gff86faf
> >
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20161109/08cc3623/attachment-0001.html>


More information about the mesa-dev mailing list