This looks reasonable to me. Roland
Am 18.05.2018 um 06:05 schrieb Marek Olšák: > 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 > * ``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 */ > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev