[Mesa-dev] [PATCH] gallium: add st_api feature mask to prevent advertising MS visuals
Christoph Bumiller
e0425955 at student.tuwien.ac.at
Fri May 25 04:27:29 PDT 2012
On 25.05.2012 13:24, Christoph Bumiller wrote:
> v2: use a define for the maximum sample count
> v3: also test odd sample counts (r300 supports MS3)
I'd only checked r500 docs which really doesn't support 3 samples (so it
seemed really no hw supported an odd number), but r300 seems to after
all, so, it won't hurt anyone to make a few more is_format_supported
queries.
>
> While multisample renderbuffers are supported by mesa, MS visuals
> are not, so we need a way to tell dri/st not to advertise them even
> if the gallium driver does support multisampled surfaces.
>
> Otherwise applications selecting these non-functional visuals would
> run into trouble ...
> ---
> src/gallium/include/state_tracker/st_api.h | 16 ++++++++++
> src/gallium/state_trackers/dri/common/dri_screen.c | 31 ++++++++++++-------
> src/gallium/state_trackers/vega/vg_manager.c | 1 +
> src/mesa/state_tracker/st_manager.c | 1 +
> 4 files changed, 37 insertions(+), 12 deletions(-)
>
> diff --git a/src/gallium/include/state_tracker/st_api.h b/src/gallium/include/state_tracker/st_api.h
> index 3af1dfc..86ab02d 100644
> --- a/src/gallium/include/state_tracker/st_api.h
> +++ b/src/gallium/include/state_tracker/st_api.h
> @@ -70,6 +70,17 @@ enum st_profile_type
> #define ST_PROFILE_OPENGL_ES2_MASK (1 << ST_PROFILE_OPENGL_ES2)
>
> /**
> + * Optional API/state tracker features.
> + */
> +enum st_api_feature
> +{
> + ST_API_FEATURE_MS_VISUALS /**< support for multisample visuals */
> +};
> +
> +/* for feature_mask in st_api */
> +#define ST_API_FEATURE_MS_VISUALS_MASK (1 << ST_API_FEATURE_MS_VISUALS)
> +
> +/**
> * New context flags for GL 3.0 and beyond.
> *
> * Profile information (core vs. compatibilty for OpenGL 3.2+) is communicated
> @@ -430,6 +441,11 @@ struct st_api
> unsigned profile_mask;
>
> /**
> + * The supported optional features. Tested with ST_FEATURE_*_MASK.
> + */
> + unsigned feature_mask;
> +
> + /**
> * Destroy the API.
> */
> void (*destroy)(struct st_api *stapi);
> diff --git a/src/gallium/state_trackers/dri/common/dri_screen.c b/src/gallium/state_trackers/dri/common/dri_screen.c
> index 24efbde..406e550 100644
> --- a/src/gallium/state_trackers/dri/common/dri_screen.c
> +++ b/src/gallium/state_trackers/dri/common/dri_screen.c
> @@ -41,6 +41,8 @@
>
> #include "util/u_debug.h"
>
> +#define MSAA_VISUAL_MAX_SAMPLES 8
> +
> PUBLIC const char __driConfigOptions[] =
> DRI_CONF_BEGIN
> DRI_CONF_SECTION_PERFORMANCE
> @@ -72,10 +74,10 @@ dri_fill_in_modes(struct dri_screen *screen,
> __DRIconfig **configs_x8r8g8b8 = NULL;
> uint8_t depth_bits_array[5];
> uint8_t stencil_bits_array[5];
> - uint8_t msaa_samples_array[5];
Note that these array sizes do not depend on the maximum sample count
(since you suggested to replace them as well).
> + uint8_t msaa_samples_array[MSAA_VISUAL_MAX_SAMPLES];
> unsigned depth_buffer_factor;
> unsigned back_buffer_factor;
> - unsigned msaa_samples_factor;
> + unsigned msaa_samples_factor, msaa_samples_max;
> unsigned i;
> struct pipe_screen *p_screen = screen->base.screen;
> boolean pf_r5g6b5, pf_a8r8g8b8, pf_x8r8g8b8;
> @@ -89,6 +91,9 @@ dri_fill_in_modes(struct dri_screen *screen,
> stencil_bits_array[0] = 0;
> depth_buffer_factor = 1;
>
> + msaa_samples_max = (screen->st_api->feature_mask & ST_API_FEATURE_MS_VISUALS)
> + ? MSAA_VISUAL_MAX_SAMPLES : 1;
> +
> pf_x8z24 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_Z24X8_UNORM,
> PIPE_TEXTURE_2D, 0,
> PIPE_BIND_DEPTH_STENCIL);
> @@ -146,14 +151,16 @@ dri_fill_in_modes(struct dri_screen *screen,
> msaa_samples_array[0] = 0;
> back_buffer_factor = 3;
>
> - /* also test color for msaa 2/4/6/8 - just assume it'll work for all depth buffers */
> + /* Also test for color multisample support - just assume it'll work
> + * for all depth buffers.
> + */
> if (pf_r5g6b5) {
> msaa_samples_factor = 1;
> - for (i = 1; i < 5; i++) {
> + for (i = 2; i <= msaa_samples_max; i++) {
> if (p_screen->is_format_supported(p_screen, PIPE_FORMAT_B5G6R5_UNORM,
> - PIPE_TEXTURE_2D, i*2,
> + PIPE_TEXTURE_2D, i,
> PIPE_BIND_RENDER_TARGET)) {
> - msaa_samples_array[msaa_samples_factor] = i * 2;
> + msaa_samples_array[msaa_samples_factor] = i;
> msaa_samples_factor++;
> }
> }
> @@ -168,11 +175,11 @@ dri_fill_in_modes(struct dri_screen *screen,
>
> if (pf_a8r8g8b8) {
> msaa_samples_factor = 1;
> - for (i = 1; i < 5; i++) {
> + for (i = 2; i <= msaa_samples_max; i++) {
> if (p_screen->is_format_supported(p_screen, PIPE_FORMAT_B8G8R8A8_UNORM,
> - PIPE_TEXTURE_2D, i*2,
> + PIPE_TEXTURE_2D, i,
> PIPE_BIND_RENDER_TARGET)) {
> - msaa_samples_array[msaa_samples_factor] = i * 2;
> + msaa_samples_array[msaa_samples_factor] = i;
> msaa_samples_factor++;
> }
> }
> @@ -190,11 +197,11 @@ dri_fill_in_modes(struct dri_screen *screen,
>
> if (pf_x8r8g8b8) {
> msaa_samples_factor = 1;
> - for (i = 1; i < 5; i++) {
> + for (i = 2; i <= msaa_samples_max; i++) {
> if (p_screen->is_format_supported(p_screen, PIPE_FORMAT_B8G8R8X8_UNORM,
> - PIPE_TEXTURE_2D, i*2,
> + PIPE_TEXTURE_2D, i,
> PIPE_BIND_RENDER_TARGET)) {
> - msaa_samples_array[msaa_samples_factor] = i * 2;
> + msaa_samples_array[msaa_samples_factor] = i;
> msaa_samples_factor++;
> }
> }
> diff --git a/src/gallium/state_trackers/vega/vg_manager.c b/src/gallium/state_trackers/vega/vg_manager.c
> index e88f5f1..660a7af 100644
> --- a/src/gallium/state_trackers/vega/vg_manager.c
> +++ b/src/gallium/state_trackers/vega/vg_manager.c
> @@ -369,6 +369,7 @@ static const struct st_api vg_api = {
> "Vega " VEGA_VERSION_STRING,
> ST_API_OPENVG,
> ST_PROFILE_DEFAULT_MASK,
> + 0,
> vg_api_destroy,
> vg_api_get_proc_address,
> vg_api_create_context,
> diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c
> index d54b7ed..748624f 100644
> --- a/src/mesa/state_tracker/st_manager.c
> +++ b/src/mesa/state_tracker/st_manager.c
> @@ -891,6 +891,7 @@ static const struct st_api st_gl_api = {
> ST_PROFILE_OPENGL_ES2_MASK |
> #endif
> 0,
> + 0,
> st_api_destroy,
> st_api_get_proc_address,
> st_api_create_context,
More information about the mesa-dev
mailing list