panfrost: add support for forcing sample-counts

This implements a D3D11-style forcing of the sample-counts, which will
be used by the line-smoothing code we're about to add.

Even though we don't actually use the single-sample mode, I left it in
for completeness, as it's documented in the TRM.

Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26904>
This commit is contained in:
Erik Faye-Lund
2024-01-05 10:05:03 +01:00
committed by Marge Bot
parent 550cc685a7
commit e9ada4c0a2
2 changed files with 23 additions and 2 deletions

View File

@@ -732,8 +732,28 @@ GENX(pan_emit_fbd)(const struct panfrost_device *dev,
cfg.z_clear = fb->zs.clear_value.depth;
cfg.s_clear = fb->zs.clear_value.stencil;
cfg.color_buffer_allocation = cbuf_allocation;
cfg.sample_count = fb->nr_samples;
cfg.sample_pattern = pan_sample_pattern(fb->nr_samples);
/* The force_samples setting dictates the sample-count that is used
* for rasterization, and works like D3D11's ForcedSampleCount feature:
*
* - If force_samples == 0: Let nr_samples dictate sample count
* - If force_samples == 1: force single-sampled rasterization
* - If force_samples >= 1: force multi-sampled rasterization
*
* This can be used to read SYSTEM_VALUE_SAMPLE_MASK_IN from the
* fragment shader, even when performing single-sampled rendering.
*/
if (!fb->force_samples) {
cfg.sample_count = fb->nr_samples;
cfg.sample_pattern = pan_sample_pattern(fb->nr_samples);
} else if (fb->force_samples == 1) {
cfg.sample_count = fb->nr_samples;
cfg.sample_pattern = pan_sample_pattern(1);
} else {
cfg.sample_count = 1;
cfg.sample_pattern = pan_sample_pattern(fb->force_samples);
}
cfg.z_write_enable = (fb->zs.view.zs && !fb->zs.discard.z);
cfg.s_write_enable = (fb->zs.view.s && !fb->zs.discard.s);
cfg.has_zs_crc_extension = has_zs_crc_ext;

View File

@@ -111,6 +111,7 @@ struct pan_fb_info {
unsigned minx, miny, maxx, maxy;
} extent;
unsigned nr_samples;
unsigned force_samples; /* samples used for rasterization */
unsigned rt_count;
struct pan_fb_color_attachment rts[8];
struct pan_fb_zs_attachment zs;