On 18.05.2018 06:05, Marek Olšák wrote:
From: Marek Olšák <marek.ol...@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.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to