On 01.05.2018 01:43, Marek Olšák wrote:
From: Marek Olšák <marek.ol...@amd.com>

This is a hypothetical interface for EQAA (a superset of CSAA). CSAA could be
exposed via GL_NV_framebuffer_multisample_coverage. EQAA additionally removes
the restriction that the number of samples in all FBO attachments must match,
which means it allows arbitrary sample counts in each FBO attachment.
---
  src/gallium/docs/source/screen.rst   | 17 +++++++++++++++--
  src/gallium/include/pipe/p_defines.h |  1 +
  src/gallium/include/pipe/p_state.h   |  3 ++-
  3 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/src/gallium/docs/source/screen.rst 
b/src/gallium/docs/source/screen.rst
index 3837360fb40..28934c2f7b9 100644
--- a/src/gallium/docs/source/screen.rst
+++ b/src/gallium/docs/source/screen.rst
@@ -398,20 +398,22 @@ 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_EQAA_COLOR_SAMPLE_SUPPORT_MASK``: If the i-th bit is set, EQAA
+  supports (i+1) color samples.

The number of supported samples is currently only exposed via is_format_supported.

If there is hardware that supports more coverage samples than color samples, this interface wouldn't allow us to expose this fact, so it seems like perhaps the cap should be for the number of supported coverage samples instead?


  * ``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
@@ -743,22 +745,33 @@ 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**: For Z/S, this is the number of samples. For color, if EQAA
+is unsupported, this is the number of both coverage samples and color samples.
+If EQAA is supported, this is the number of coverage samples. 0 and 1
+specify a resource which isn't multisampled.
+
+**nr_color_samples**: This is the number of color samples for EQAA, while
+``nr_samples`` is the number of coverage samples. If the format is Z/S,
+``nr_color_samples`` is ignored. Constraints:
+* ``nr_color_samples`` must not be greater than ``nr_samples``.
+* If ``nr_color_samples`` is equal to ``nr_samples``, it is called MSAA.
+* If ``nr_color_samples`` is less than ``nr_samples``, it is called EQAA.
+* If ``nr_color_samples`` is equal to 1, the behavior of the resolve blit is
+driver-dependent.

Why the last buller?

Also, are all state trackers expected to set nr_color_samples correctly? This probably only affects nine, but still, it needs to be kept in mind.

Cheers,
Nicolai


**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 c4ae0532060..97e1a3a3d42 100644
--- a/src/gallium/include/pipe/p_defines.h
+++ b/src/gallium/include/pipe/p_defines.h
@@ -783,20 +783,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_EQAA_COLOR_SAMPLE_SUPPORT_MASK,
     PIPE_CAP_SIGNED_VERTEX_BUFFER_OFFSET,
     PIPE_CAP_CONTEXT_PRIORITY_MASK,
     PIPE_CAP_FENCE_SIGNAL,
     PIPE_CAP_CONSTBUF0_FLAGS,
     PIPE_CAP_PACKED_UNIFORMS,
  };
/**
   * Possible bits for PIPE_CAP_CONTEXT_PRIORITY_MASK param, which should
   * return a bitmask of the supported priorities.  If the driver does not
diff --git a/src/gallium/include/pipe/p_state.h 
b/src/gallium/include/pipe/p_state.h
index 4dce399f848..4010b92e67b 100644
--- a/src/gallium/include/pipe/p_state.h
+++ b/src/gallium/include/pipe/p_state.h
@@ -503,41 +503,42 @@ 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 nr_color_samples:8; /**< Number of color samples for EQAA. */
     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;
+   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