summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2019-12-09 16:27:17 +0200
committerVille Syrjälä <ville.syrjala@linux.intel.com>2023-02-01 15:38:11 +0200
commit9aee418de6a7aee0602c271712b76b0ffe319ab7 (patch)
tree7dadd3b9162f4ee184d9ad1956efc80cb29698d3
parent2a0d4fb1697efa48cb1a124869d8c8bf58bad2ca (diff)
downloadxorg-driver-xf86-video-intel-9aee418de6a7aee0602c271712b76b0ffe319ab7.tar.gz
sna: Eliminate sna_mode_wants_tear_free()
The modparam checks performed by sna_mode_wants_tear_free() don't generally work when the server is running as a regular user. Hence we can't rely on them to indicate whether FBC/PSR/etc is enabled. Also the "Panel Self-Refresh" connector property doesn't actually exist so we can nuke that part as well. Let's just nuke the whole thing and assume we want dirtyfb always when tearfree is not enabled. I'll anyway want to enable FBC by default across the board soonish so the check wouldn't really buy us much (would just exclude i830 and a few old desktop chipsets which don't have FBC hardware). Additionally if we don't have working dirtyfb we really should enable tearfree by default because otherwise we're going to get horrible lag due to missing frontbuffer flushes. Without WC mmaps we could in theory rely on the hw gtt tracking except the kernel no longer differentiates between GTT/WC/CPU access in its software frontbuffer tracking code so it'll just deactivate FBC even for a GTT mmap and potentially never re-enable it due to the missing frontbuffer flush from dirtyfb. So dirtyfb is always needed. v2: Rebase due to ppgtt->tear free logic Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
-rw-r--r--src/sna/sna.h1
-rw-r--r--src/sna/sna_display.c59
-rw-r--r--src/sna/sna_driver.c9
3 files changed, 2 insertions, 67 deletions
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 29d08a9b..f08f4d23 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -458,7 +458,6 @@ struct sna {
bool sna_mode_pre_init(ScrnInfoPtr scrn, struct sna *sna);
bool sna_mode_fake_init(struct sna *sna, int num_fake);
-bool sna_mode_wants_tear_free(struct sna *sna);
void sna_mode_adjust_frame(struct sna *sna, int x, int y);
extern void sna_mode_discover(struct sna *sna, bool tell);
extern void sna_mode_check(struct sna *sna);
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index a26f4906..15df51f6 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -7949,65 +7949,6 @@ bool sna_mode_pre_init(ScrnInfoPtr scrn, struct sna *sna)
return scrn->modes != NULL;
}
-bool
-sna_mode_wants_tear_free(struct sna *sna)
-{
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn);
- bool found = false;
- FILE *file;
- int i;
-
- file = fopen("/sys/module/i915/parameters/enable_fbc", "r");
- if (file) {
- int fbc_enabled = 0;
- int value;
-
- if (fscanf(file, "%d", &value) == 1)
- fbc_enabled = value > 0;
- fclose(file);
-
- DBG(("%s: module parameter 'enable_fbc' enabled? %d\n",
- __FUNCTION__, fbc_enabled));
-
- if (fbc_enabled)
- return true;
- }
-
- for (i = 0; i < sna->mode.num_real_output; i++) {
- struct sna_output *output = to_sna_output(config->output[i]);
- int id = find_property(sna, output, "Panel Self-Refresh");
- if (id == -1)
- continue;
-
- found = true;
- if (output->prop_values[id] != -1) {
- DBG(("%s: Panel Self-Refresh detected on %s\n",
- __FUNCTION__, config->output[i]->name));
- return true;
- }
- }
-
- if (!found) {
- file = fopen("/sys/module/i915/parameters/enable_psr", "r");
- if (file) {
- int psr_enabled = 0;
- int value;
-
- if (fscanf(file, "%d", &value) == 1)
- psr_enabled = value > 0;
- fclose(file);
-
- DBG(("%s: module parameter 'enable_psr' enabled? %d\n",
- __FUNCTION__, psr_enabled));
-
- if (psr_enabled)
- return true;
- }
- }
-
- return false;
-}
-
void
sna_mode_set_primary(struct sna *sna)
{
diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c
index b0e16833..137f29e8 100644
--- a/src/sna/sna_driver.c
+++ b/src/sna/sna_driver.c
@@ -470,12 +470,7 @@ static bool enable_tear_free(struct sna *sna)
if (sna->kgem.has_full_ppgtt)
return true;
- /*
- * Under certain conditions, we should enable TearFree by default,
- * for example when the hardware requires pageflipping to run within
- * its power/performance budget.
- */
- if (sna_mode_wants_tear_free(sna))
+ if (!sna->kgem.has_dirtyfb)
return true;
return ENABLE_TEAR_FREE;
@@ -675,7 +670,7 @@ static Bool sna_pre_init(ScrnInfoPtr scrn, int probe)
}
scrn->currentMode = scrn->modes;
- if (!setup_tear_free(sna) && sna_mode_wants_tear_free(sna))
+ if (!setup_tear_free(sna))
sna->kgem.needs_dirtyfb = sna->kgem.has_dirtyfb;
xf86SetGamma(scrn, zeros);