From 2710c40e3c817e269fde6fd3bb2727e0ee8d3598 Mon Sep 17 00:00:00 2001 From: "Kristian H. Kristensen" Date: Tue, 6 Nov 2018 13:08:32 -0800 Subject: [PATCH 1/1] gallium: Add new PIPE_CAP_SURFACE_SAMPLE_COUNT This new pipe cap and the new nr_samples field in pipe_surface lets a state tracker bind a render target with a different sample count than the resource. This allows for implementing EXT_multisampled_render_to_texture and EXT_multisampled_render_to_texture2. Reviewed-by: Eric Anholt Signed-off-by: Kristian H. Kristensen --- src/gallium/auxiliary/util/u_framebuffer.c | 10 ++++++++-- src/gallium/docs/source/screen.rst | 3 +++ src/gallium/include/pipe/p_defines.h | 1 + src/gallium/include/pipe/p_state.h | 7 +++++++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/gallium/auxiliary/util/u_framebuffer.c b/src/gallium/auxiliary/util/u_framebuffer.c index 5bafddc726f..f569511393b 100644 --- a/src/gallium/auxiliary/util/u_framebuffer.c +++ b/src/gallium/auxiliary/util/u_framebuffer.c @@ -229,13 +229,19 @@ util_framebuffer_get_num_samples(const struct pipe_framebuffer_state *fb) if (!(fb->nr_cbufs || fb->zsbuf)) return MAX2(fb->samples, 1); + /** + * If a driver doesn't advertise PIPE_CAP_SURFACE_SAMPLE_COUNT, + * pipe_surface::nr_samples will always be 0. + */ for (i = 0; i < fb->nr_cbufs; i++) { if (fb->cbufs[i]) { - return MAX2(1, fb->cbufs[i]->texture->nr_samples); + return MAX3(1, fb->cbufs[i]->texture->nr_samples, + fb->cbufs[i]->nr_samples); } } if (fb->zsbuf) { - return MAX2(1, fb->zsbuf->texture->nr_samples); + return MAX3(1, fb->zsbuf->texture->nr_samples, + fb->zsbuf->nr_samples); } return 1; diff --git a/src/gallium/docs/source/screen.rst b/src/gallium/docs/source/screen.rst index 0abd164494c..24a4d5031e5 100644 --- a/src/gallium/docs/source/screen.rst +++ b/src/gallium/docs/source/screen.rst @@ -477,6 +477,9 @@ subpixel precision bias in bits during conservative rasterization. 0 means no limit. * ``PIPE_CAP_MAX_VERTEX_ELEMENT_SRC_OFFSET``: The maximum supported value for of pipe_vertex_element::src_offset. +* ``PIPE_CAP_SURFACE_SAMPLE_COUNT_TEXTURE``: Whether the driver + supports pipe_surface overrides of resource nr_samples. If set, will + enable EXT_multisampled_render_to_texture. .. _pipe_capf: diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h index e99895d30d8..6d96f1ccb5b 100644 --- a/src/gallium/include/pipe/p_defines.h +++ b/src/gallium/include/pipe/p_defines.h @@ -832,6 +832,7 @@ enum pipe_cap PIPE_CAP_MAX_COMBINED_HW_ATOMIC_COUNTER_BUFFERS, PIPE_CAP_MAX_TEXTURE_UPLOAD_MEMORY_BUDGET, PIPE_CAP_MAX_VERTEX_ELEMENT_SRC_OFFSET, + PIPE_CAP_SURFACE_SAMPLE_COUNT, }; /** diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h index fd670345aad..38052e5fd3d 100644 --- a/src/gallium/include/pipe/p_state.h +++ b/src/gallium/include/pipe/p_state.h @@ -443,6 +443,13 @@ struct pipe_surface uint16_t width; /**< logical width in pixels */ uint16_t height; /**< logical height in pixels */ + /** + * Number of samples for the surface. This will be 0 if rendering + * should use the resource's nr_samples, or another value if the resource + * is bound using FramebufferTexture2DMultisampleEXT. + */ + unsigned nr_samples:8; + union pipe_surface_desc u; }; -- 2.30.2