Mesa (master): gallium: Add new PIPE_CAP_SURFACE_SAMPLE_COUNT
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Dec 7 01:02:39 UTC 2018
Module: Mesa
Branch: master
Commit: 2710c40e3c817e269fde6fd3bb2727e0ee8d3598
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=2710c40e3c817e269fde6fd3bb2727e0ee8d3598
Author: Kristian H. Kristensen <hoegsberg at chromium.org>
Date: Tue Nov 6 13:08:32 2018 -0800
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 <eric at anholt.net>
Signed-off-by: Kristian H. Kristensen <hoegsberg at chromium.org>
---
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 5bafddc726..f569511393 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 0abd164494..24a4d5031e 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 e99895d30d..6d96f1ccb5 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 fd670345aa..38052e5fd3 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;
};
More information about the mesa-commit
mailing list