drm: Add support for a mode set file

This commit is contained in:
Joshua Ashton 2022-09-07 11:31:40 +00:00
parent 88e5980cd9
commit 0d171a7346
2 changed files with 57 additions and 19 deletions

View file

@ -646,6 +646,32 @@ static int get_connector_priority(struct drm_t *drm, const char *name)
return drm->connector_priorities.size();
}
static bool get_saved_mode(const char *description, saved_mode &mode_info)
{
const char *mode_file = getenv("GAMESCOPE_MODE_SAVE_FILE");
if (!mode_file || !*mode_file)
return false;
FILE *file = fopen(mode_file, "r");
if (!file)
return false;
char line[256];
while (fgets(line, sizeof(line), file))
{
char saved_description[256];
bool valid = sscanf(line, "%255[^:]:%dx%d@%d", saved_description, &mode_info.width, &mode_info.height, &mode_info.refresh) == 4;
if (valid && !strcmp(saved_description, description))
{
fclose(file);
return true;
}
}
fclose(file);
return false;
}
static bool setup_best_connector(struct drm_t *drm)
{
if (drm->connector && drm->connector->connector->connection != DRM_MODE_CONNECTED) {
@ -687,25 +713,6 @@ static bool setup_best_connector(struct drm_t *drm)
return false;
}
const drmModeModeInfo *mode = nullptr;
if ( drm->preferred_width != 0 || drm->preferred_height != 0 || drm->preferred_refresh != 0 )
{
mode = find_mode(best->connector, drm->preferred_width, drm->preferred_height, drm->preferred_refresh);
}
if (!mode) {
mode = find_mode(best->connector, 0, 0, 0);
}
if (!mode) {
drm_log.errorf("could not find mode!");
return false;
}
if (!drm_set_mode(drm, mode)) {
return false;
}
char description[256];
switch (best->connector->connector_type) {
case DRM_MODE_CONNECTOR_LVDS:
@ -723,6 +730,31 @@ static bool setup_best_connector(struct drm_t *drm)
break;
}
const drmModeModeInfo *mode = nullptr;
if ( drm->preferred_width != 0 || drm->preferred_height != 0 || drm->preferred_refresh != 0 )
{
mode = find_mode(best->connector, drm->preferred_width, drm->preferred_height, drm->preferred_refresh);
}
if (!mode && drm_get_connector_type(best->connector) == DRM_SCREEN_TYPE_EXTERNAL) {
saved_mode mode_info;
if (get_saved_mode(description, mode_info))
mode = find_mode(best->connector, mode_info.width, mode_info.height, mode_info.refresh);
}
if (!mode) {
mode = find_mode(best->connector, 0, 0, 0);
}
if (!mode) {
drm_log.errorf("could not find mode!");
return false;
}
if (!drm_set_mode(drm, mode)) {
return false;
}
const struct wlserver_output_info wlserver_output_info = {
.name = best->name,
.description = description,

View file

@ -48,6 +48,12 @@ extern "C" {
#include <mutex>
#include <vector>
struct saved_mode {
int width;
int height;
int refresh;
};
struct plane {
uint32_t id;
drmModePlane *plane;