More accurate refresh rates (mHz)
This commit is contained in:
		
							parent
							
								
									c436e76240
								
							
						
					
					
						commit
						3000b8615f
					
				|  | @ -249,6 +249,20 @@ static struct wlr_output_impl output_impl = { | ||||||
| 	.destroy = wlr_drm_output_destroy, | 	.destroy = wlr_drm_output_destroy, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | static uint32_t calculate_refresh_rate(drmModeModeInfo *mode) { | ||||||
|  | 	uint32_t refresh = (mode->clock * 1000000LL / mode->htotal + | ||||||
|  | 		mode->vtotal / 2) / mode->vtotal; | ||||||
|  | 
 | ||||||
|  | 	if (mode->flags & DRM_MODE_FLAG_INTERLACE) | ||||||
|  | 		refresh *= 2; | ||||||
|  | 	if (mode->flags & DRM_MODE_FLAG_DBLSCAN) | ||||||
|  | 		refresh /= 2; | ||||||
|  | 	if (mode->vscan > 1) | ||||||
|  | 		refresh /= mode->vscan; | ||||||
|  | 
 | ||||||
|  | 	return refresh; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void wlr_drm_scan_connectors(struct wlr_backend_state *state) { | void wlr_drm_scan_connectors(struct wlr_backend_state *state) { | ||||||
| 	wlr_log(L_INFO, "Scanning DRM connectors"); | 	wlr_log(L_INFO, "Scanning DRM connectors"); | ||||||
| 
 | 
 | ||||||
|  | @ -321,14 +335,12 @@ void wlr_drm_scan_connectors(struct wlr_backend_state *state) { | ||||||
| 				struct wlr_output_mode *mode = calloc(1, | 				struct wlr_output_mode *mode = calloc(1, | ||||||
| 						sizeof(struct wlr_output_mode)); | 						sizeof(struct wlr_output_mode)); | ||||||
| 				mode->width = _state->mode.hdisplay; | 				mode->width = _state->mode.hdisplay; | ||||||
| 				// TODO: Calculate more accurate refresh rate
 |  | ||||||
| 				// TODO: Check that this refresh rate is mHz
 |  | ||||||
| 				mode->height = _state->mode.vdisplay; | 				mode->height = _state->mode.vdisplay; | ||||||
|  | 				mode->refresh = calculate_refresh_rate(&_state->mode); | ||||||
| 				mode->state = _state; | 				mode->state = _state; | ||||||
| 
 | 
 | ||||||
| 				wlr_log(L_INFO, "  %"PRIu16"@%"PRIu16"@%"PRIu32, | 				wlr_log(L_INFO, "  %"PRIu32"@%"PRIu32"@%"PRIu32, | ||||||
| 					_state->mode.hdisplay, _state->mode.vdisplay, | 					mode->width, mode->height, mode->refresh); | ||||||
| 					_state->mode.vrefresh); |  | ||||||
| 
 | 
 | ||||||
| 				list_add(wlr_output->modes, mode); | 				list_add(wlr_output->modes, mode); | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|  | @ -10,8 +10,8 @@ struct wlr_output_mode_state; | ||||||
| struct wlr_output_mode { | struct wlr_output_mode { | ||||||
| 	struct wlr_output_mode_state *state; | 	struct wlr_output_mode_state *state; | ||||||
| 	uint32_t flags; // enum wl_output_mode
 | 	uint32_t flags; // enum wl_output_mode
 | ||||||
| 	int32_t width, height; | 	uint32_t width, height; | ||||||
| 	int32_t refresh; // mHz
 | 	uint32_t refresh; // mHz
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct wlr_output_impl; | struct wlr_output_impl; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue