backend/drm: don't insert duplicate custom modes, fix refresh rate

This commit is contained in:
emersion 2018-12-16 11:06:46 +01:00
parent 6d4bfa3226
commit ff6c4f80b2
No known key found for this signature in database
GPG key ID: 0FDE7BE0E88F5E48
3 changed files with 11 additions and 4 deletions

View file

@ -550,11 +550,18 @@ bool wlr_drm_connector_add_mode(struct wlr_output *output,
const drmModeModeInfo *modeinfo) { const drmModeModeInfo *modeinfo) {
struct wlr_drm_connector *conn = get_drm_connector_from_output(output); struct wlr_drm_connector *conn = get_drm_connector_from_output(output);
assert(modeinfo);
if (modeinfo->type != DRM_MODE_TYPE_USERDEF) { if (modeinfo->type != DRM_MODE_TYPE_USERDEF) {
return false; return false;
} }
struct wlr_output_mode *wlr_mode;
wl_list_for_each(wlr_mode, &conn->output.modes, link) {
struct wlr_drm_mode *mode = (struct wlr_drm_mode *)wlr_mode;
if (memcmp(&mode->drm_mode, modeinfo, sizeof(*modeinfo)) == 0) {
return true;
}
}
struct wlr_drm_mode *mode = calloc(1, sizeof(*mode)); struct wlr_drm_mode *mode = calloc(1, sizeof(*mode));
if (!mode) { if (!mode) {
return false; return false;
@ -563,7 +570,7 @@ bool wlr_drm_connector_add_mode(struct wlr_output *output,
mode->wlr_mode.width = mode->drm_mode.hdisplay; mode->wlr_mode.width = mode->drm_mode.hdisplay;
mode->wlr_mode.height = mode->drm_mode.vdisplay; mode->wlr_mode.height = mode->drm_mode.vdisplay;
mode->wlr_mode.refresh = mode->drm_mode.vrefresh; mode->wlr_mode.refresh = calculate_refresh_rate(modeinfo);
wlr_log(WLR_INFO, "Registered custom mode " wlr_log(WLR_INFO, "Registered custom mode "
"%"PRId32"x%"PRId32"@%"PRId32, "%"PRId32"x%"PRId32"@%"PRId32,

View file

@ -6,7 +6,7 @@
#include <wlr/util/log.h> #include <wlr/util/log.h>
#include "backend/drm/util.h" #include "backend/drm/util.h"
int32_t calculate_refresh_rate(drmModeModeInfo *mode) { int32_t calculate_refresh_rate(const drmModeModeInfo *mode) {
int32_t refresh = (mode->clock * 1000000LL / mode->htotal + int32_t refresh = (mode->clock * 1000000LL / mode->htotal +
mode->vtotal / 2) / mode->vtotal; mode->vtotal / 2) / mode->vtotal;

View file

@ -7,7 +7,7 @@
#include <xf86drmMode.h> #include <xf86drmMode.h>
// Calculates a more accurate refresh rate (mHz) than what mode itself provides // Calculates a more accurate refresh rate (mHz) than what mode itself provides
int32_t calculate_refresh_rate(drmModeModeInfo *mode); int32_t calculate_refresh_rate(const drmModeModeInfo *mode);
// Populates the make/model/phys_{width,height} of output from the edid data // Populates the make/model/phys_{width,height} of output from the edid data
void parse_edid(struct wlr_output *restrict output, size_t len, void parse_edid(struct wlr_output *restrict output, size_t len,
const uint8_t *data); const uint8_t *data);