diff options
author | Chad Versace <[email protected]> | 2013-11-06 19:52:11 -0800 |
---|---|---|
committer | Chad Versace <[email protected]> | 2013-11-22 15:27:03 -0800 |
commit | 315b06ff62357d2196d9f1d4926c517d098e5647 (patch) | |
tree | 41acd7f0bba85b30c94044840b5f559005443420 | |
parent | 95ebabbc5fceec6a9c37dbb4d8f3282a86fe02ce (diff) |
i965: Let driconf clamp_max_samples affect context version
Commit 2f89662 added the driconf option 'clamp_max_samples'. In that
commit, the option did not alter the context version. The neglect to
alter the context version is a fatal issue for some apps.
For example, consider running Chromium with clamp_max_samples=0.
Pre-patch, Mesa creates a GL 3.0 context but clamps GL_MAX_SAMPLES to
0. This violates the GL 3.0 spec, which requires GL_MAX_SAMPLES >= 4.
The spec violation causes WebGL context creation to fail in many
scenarios because Chromium correctly assumes that a GL 3.0 context
supports at least 4 samples.
Since the driconf option was introduced largely for Chromium, the issue
really needs fixing.
This patch fixes calculation of the context version to respect the
post-clamped value of GL_MAX_SAMPLES. This in turn fixes WebGL on
Chromium when clamp_max_samples=0.
Reviewed-by: Kenneth Graunke <[email protected]>
Signed-off-by: Chad Versace <[email protected]>
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_context.c | 60 |
1 files changed, 20 insertions, 40 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index 125bc557b55..6e090770683 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -277,38 +277,6 @@ brw_init_driver_functions(struct brw_context *brw, functions->GetSamplePosition = gen6_get_sample_position; } -/** - * Override GL_MAX_SAMPLES and related constants according to value of driconf - * option 'clamp_max_samples'. - */ -static void -brw_override_max_samples(struct brw_context *brw) -{ - const int clamp_max_samples = driQueryOptioni(&brw->optionCache, - "clamp_max_samples"); - if (clamp_max_samples < 0) - return; - - const int *supported_msaa_modes = - intel_supported_msaa_modes(brw->intelScreen); - int max_samples = 0; - - /* Select the largest supported MSAA mode that does not exceed - * clamp_max_samples. - */ - for (int i = 0; supported_msaa_modes[i] != -1; ++i) { - if (supported_msaa_modes[i] <= clamp_max_samples) { - max_samples = supported_msaa_modes[i]; - break; - } - } - - brw->ctx.Const.MaxSamples = max_samples; - brw->ctx.Const.MaxColorTextureSamples = max_samples; - brw->ctx.Const.MaxDepthTextureSamples = max_samples; - brw->ctx.Const.MaxIntegerSamples = max_samples; -} - static void brw_initialize_context_constants(struct brw_context *brw) { @@ -374,8 +342,26 @@ brw_initialize_context_constants(struct brw_context *brw) ctx->Const.AlwaysUseGetTransformFeedbackVertexCount = true; - const int max_samples = - intel_supported_msaa_modes(brw->intelScreen)[0]; + int max_samples; + const int *msaa_modes = intel_supported_msaa_modes(brw->intelScreen); + const int clamp_max_samples = + driQueryOptioni(&brw->optionCache, "clamp_max_samples"); + + if (clamp_max_samples < 0) { + max_samples = msaa_modes[0]; + } else { + /* Select the largest supported MSAA mode that does not exceed + * clamp_max_samples. + */ + max_samples = 0; + for (int i = 0; msaa_modes[i] != 0; ++i) { + if (msaa_modes[i] <= clamp_max_samples) { + max_samples = msaa_modes[i]; + break; + } + } + } + ctx->Const.MaxSamples = max_samples; ctx->Const.MaxColorTextureSamples = max_samples; ctx->Const.MaxDepthTextureSamples = max_samples; @@ -775,12 +761,6 @@ brwCreateContext(gl_api api, _mesa_compute_version(ctx); - /* Here we override context constants. We apply the overrides after - * calculation of the context version because we do not want the overridden - * constants to change the version. - */ - brw_override_max_samples(brw); - _mesa_initialize_dispatch_tables(ctx); _mesa_initialize_vbo_vtxfmt(ctx); |