[Mesa-dev] [RFC PATCH] gallium: add interface for advanced MSAA
Nicolai Hähnle
nhaehnle at gmail.com
Thu May 24 08:11:31 UTC 2018
On 18.05.2018 06:05, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> The interface only uses general MSAA terms, so it's "advanced MSAA" and not
> something vendor-specific.
>
> It's a proper subset of EQAA, and a proper superset of CSAA, so it's neither.
>
> Changes:
> - pipe_resource is changed
> - is_format_supported is changed
> - a new CAP is added
> ---
> src/gallium/docs/source/screen.rst | 31 ++++++++++++++++++++++++++--
> src/gallium/include/pipe/p_defines.h | 1 +
> src/gallium/include/pipe/p_screen.h | 1 +
> src/gallium/include/pipe/p_state.h | 18 +++++++++++++---
> 4 files changed, 46 insertions(+), 5 deletions(-)
>
> diff --git a/src/gallium/docs/source/screen.rst b/src/gallium/docs/source/screen.rst
> index 5bc6ee99f08..cf4787a1c49 100644
> --- a/src/gallium/docs/source/screen.rst
> +++ b/src/gallium/docs/source/screen.rst
> @@ -398,20 +398,25 @@ The integer capabilities:
> * ``PIPE_CAP_LOAD_CONSTBUF``: True if the driver supports TGSI_OPCODE_LOAD use
> with constant buffers.
> * ``PIPE_CAP_TGSI_ANY_REG_AS_ADDRESS``: Any TGSI register can be used as
> an address for indirect register indexing.
> * ``PIPE_CAP_TILE_RASTER_ORDER``: Whether the driver supports
> GL_MESA_tile_raster_order, using the tile_raster_order_* fields in
> pipe_rasterizer_state.
> * ``PIPE_CAP_MAX_COMBINED_SHADER_OUTPUT_RESOURCES``: Limit on combined shader
> output resources (images + buffers + fragment outputs). If 0 the state
> tracker works it out.
> +* ``PIPE_CAP_FRAMEBUFFER_MIXED_SAMPLES``: Framebuffer attachments can have
> + different number of samples each with the following restriction:
> + color.nr_samples >= zs.nr_samples >= color.nr_storage_samples
> + If 0 is returned, the following restriction applies:
> + color.nr_samples == zs.nr_samples >= color.nr_storage_samples
I like it, but you probably want to be explicit about what happens with
multiple color attachments, both for samples and for storage samples.
Cheers,
Nicolai
> * ``PIPE_CAP_SIGNED_VERTEX_BUFFER_OFFSET``:
> Whether pipe_vertex_buffer::buffer_offset is treated as signed. The u_vbuf
> module needs this for optimal performance in workstation applications.
> * ``PIPE_CAP_CONTEXT_PRIORITY_MASK``: For drivers that support per-context
> priorities, this returns a bitmask of PIPE_CONTEXT_PRIORITY_x for the
> supported priority levels. A driver that does not support prioritized
> contexts can return 0.
> * ``PIPE_CAP_FENCE_SIGNAL``: True if the driver supports signaling semaphores
> using fence_server_signal().
> * ``PIPE_CAP_CONSTBUF0_FLAGS``: The bits of pipe_resource::flags that must be
> @@ -718,20 +723,23 @@ is_format_supported
>
> Determine if a resource in the given format can be used in a specific manner.
>
> **format** the resource format
>
> **target** one of the PIPE_TEXTURE_x flags
>
> **sample_count** the number of samples. 0 and 1 mean no multisampling,
> the maximum allowed legal value is 32.
>
> +**storage_sample_count** the number of storage samples. This must be <=
> +sample_count. See the documentation of ``pipe_resource::nr_storage_samples``.
> +
> **bindings** is a bitmask of :ref:`PIPE_BIND` flags.
>
> Returns TRUE if all usages can be satisfied.
>
>
> can_create_resource
> ^^^^^^^^^^^^^^^^^^^
>
> Check if a resource can actually be created (but don't actually allocate any
> memory). This is used to implement OpenGL's proxy textures. Typically, a
> @@ -761,22 +769,41 @@ Modern APIs allow using buffers as shader resources.
> (1 for 1D or 1D array textures).
>
> **depth0** the depth of the base mip level of the texture
> (1 for everything else).
>
> **array_size** the array size for 1D and 2D array textures.
> For cube maps this must be 6, for other textures 1.
>
> **last_level** the last mip map level present.
>
> -**nr_samples** the nr of msaa samples. 0 (or 1) specifies a resource
> -which isn't multisampled.
> +**nr_samples**: Number of samples determining quality, driving the rasterizer,
> +shading, and framebuffer. It is the number of samples seen by the whole
> +graphics pipeline. 0 and 1 specify a resource which isn't multisampled.
> +
> +**nr_storage_samples**: Only color buffers can set this lower than nr_samples.
> +Multiple samples within a pixel can have the same color. ``nr_storage_samples``
> +determines how many slots for different colors there are per pixel.
> +If there are not enough slots to store all sample colors, some samples will
> +have an undefined color (called "undefined samples").
> +
> +The resolve blit behavior is driver-specific, but can be one of these two:
> +1. Only defined samples will be averaged. Undefined samples will be ignored.
> +2. Undefined samples will be approximated by looking at surrounding defined
> + samples (even in different pixels).
> +
> +Blits and MSAA texturing: If the sample being fetched is undefined, one of
> +the defined samples is returned instead.
> +
> +Sample shading (``set_min_samples``) will operate at a sample frequency that
> +is at most ``nr_storage_samples``. Greater ``min_samples`` values will be
> +replaced by ``nr_storage_samples``.
>
> **usage** one of the :ref:`PIPE_USAGE` flags.
>
> **bind** bitmask of the :ref:`PIPE_BIND` flags.
>
> **flags** bitmask of PIPE_RESOURCE_FLAG flags.
>
>
>
> resource_changed
> diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
> index 6b2f33b9e37..5693396c9e9 100644
> --- a/src/gallium/include/pipe/p_defines.h
> +++ b/src/gallium/include/pipe/p_defines.h
> @@ -794,20 +794,21 @@ enum pipe_cap
> PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION,
> PIPE_CAP_POST_DEPTH_COVERAGE,
> PIPE_CAP_BINDLESS_TEXTURE,
> PIPE_CAP_NIR_SAMPLERS_AS_DEREF,
> PIPE_CAP_QUERY_SO_OVERFLOW,
> PIPE_CAP_MEMOBJ,
> PIPE_CAP_LOAD_CONSTBUF,
> PIPE_CAP_TGSI_ANY_REG_AS_ADDRESS,
> PIPE_CAP_TILE_RASTER_ORDER,
> PIPE_CAP_MAX_COMBINED_SHADER_OUTPUT_RESOURCES,
> + PIPE_CAP_FRAMEBUFFER_MIXED_SAMPLES,
> PIPE_CAP_SIGNED_VERTEX_BUFFER_OFFSET,
> PIPE_CAP_CONTEXT_PRIORITY_MASK,
> PIPE_CAP_FENCE_SIGNAL,
> PIPE_CAP_CONSTBUF0_FLAGS,
> PIPE_CAP_PACKED_UNIFORMS,
> PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_TRIANGLES,
> PIPE_CAP_CONSERVATIVE_RASTER_POST_SNAP_POINTS_LINES,
> PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_TRIANGLES,
> PIPE_CAP_CONSERVATIVE_RASTER_PRE_SNAP_POINTS_LINES,
> PIPE_CAP_MAX_CONSERVATIVE_RASTER_SUBPIXEL_PRECISION_BIAS,
> diff --git a/src/gallium/include/pipe/p_screen.h b/src/gallium/include/pipe/p_screen.h
> index 101e229088b..94c61dfab2e 100644
> --- a/src/gallium/include/pipe/p_screen.h
> +++ b/src/gallium/include/pipe/p_screen.h
> @@ -150,20 +150,21 @@ struct pipe_screen {
>
> /**
> * Check if the given pipe_format is supported as a texture or
> * drawing surface.
> * \param bindings bitmask of PIPE_BIND_*
> */
> boolean (*is_format_supported)( struct pipe_screen *,
> enum pipe_format format,
> enum pipe_texture_target target,
> unsigned sample_count,
> + unsigned storage_sample_count,
> unsigned bindings );
>
> /**
> * Check if the given pipe_format is supported as output for this codec/profile.
> * \param profile profile to check, may also be PIPE_VIDEO_PROFILE_UNKNOWN
> */
> boolean (*is_video_format_supported)( struct pipe_screen *,
> enum pipe_format format,
> enum pipe_video_profile profile,
> enum pipe_video_entrypoint entrypoint );
> diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h
> index db9fa1a8e9f..1baa497b227 100644
> --- a/src/gallium/include/pipe/p_state.h
> +++ b/src/gallium/include/pipe/p_state.h
> @@ -511,41 +511,53 @@ struct pipe_box
> int16_t depth;
> };
>
>
> /**
> * A memory object/resource such as a vertex buffer or texture.
> */
> struct pipe_resource
> {
> struct pipe_reference reference;
> - struct pipe_screen *screen; /**< screen that this texture belongs to */
>
> unsigned width0; /**< Used by both buffers and textures. */
> uint16_t height0; /* Textures: The maximum height/depth/array_size is 16k. */
> uint16_t depth0;
> uint16_t array_size;
>
> enum pipe_format format:16; /**< PIPE_FORMAT_x */
> enum pipe_texture_target target:8; /**< PIPE_TEXTURE_x */
> unsigned last_level:8; /**< Index of last mipmap level present/defined */
> - unsigned nr_samples:8; /**< for multisampled surfaces, nr of samples */
> - unsigned usage:8; /**< PIPE_USAGE_x (not a bitmask) */
>
> + /** Number of samples determining quality, driving rasterizer, shading,
> + * and framebuffer.
> + */
> + unsigned nr_samples:8;
> +
> + /** Multiple samples within a pixel can have the same value.
> + * nr_storage_samples determines how many slots for different values
> + * there are per pixel. Only color buffers can set this lower than
> + * nr_samples.
> + */
> + unsigned nr_storage_samples:8;
> +
> + unsigned usage:8; /**< PIPE_USAGE_x (not a bitmask) */
> unsigned bind; /**< bitmask of PIPE_BIND_x */
> unsigned flags; /**< bitmask of PIPE_RESOURCE_FLAG_x */
>
> /**
> * For planar images, ie. YUV EGLImage external, etc, pointer to the
> * next plane.
> */
> struct pipe_resource *next;
> + /* The screen pointer should be last for optimal structure packing. */
> + struct pipe_screen *screen; /**< screen that this texture belongs to */
> };
>
>
> /**
> * Transfer object. For data transfer to/from a resource.
> */
> struct pipe_transfer
> {
> struct pipe_resource *resource; /**< resource to transfer to/from */
> unsigned level; /**< texture mipmap level */
>
--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
More information about the mesa-dev
mailing list