mirror of
https://github.com/brl/mutter.git
synced 2024-11-28 11:00:54 -05:00
3832c6b607
Mutter recently gained the ability to deal with multiple GPUs rendering at different displays. These GPUs would have a display connected to them, and Mutter was adapted in order to be aware of different GPUs and their outputs. However, one specific edge case appeared: PRIME systems. PRIME systems have two GPUs: * The integrated GPU (iGPU), usually Intel, which has connectors and deals with the routine load. * The dedicated GPU (dGPU), usually AMD or NVidia, which has no connectors at all and are there just to aid heavy loads. On those systems, the dGPU is aggressively put to sleep by the kernel to avoid energy waste. Waking it up is a costly operation. With Mutter's adaptation to deal with multiple GPUs, Mutter began wakening the dGPU every time some rendering had to be done. This was causing stuttering every time the dGPU was put to sleep, and Mutter asked it to wake up again. To fix this situation, this commit ignores GPUs with no connectors attached. Issue: #77
96 lines
3.3 KiB
C
96 lines
3.3 KiB
C
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
|
|
/*
|
|
* Copyright (C) 2017 Red Hat
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 2 of the
|
|
* License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
* 02111-1307, USA.
|
|
*/
|
|
|
|
#ifndef META_GPU_KMS_H
|
|
#define META_GPU_KMS_H
|
|
|
|
#include <glib-object.h>
|
|
#include <xf86drm.h>
|
|
#include <xf86drmMode.h>
|
|
|
|
#include "backends/meta-gpu.h"
|
|
#include "backends/native/meta-monitor-manager-kms.h"
|
|
|
|
typedef enum
|
|
{
|
|
META_GPU_KMS_ERROR_NO_CONNECTORS,
|
|
} MetaGpuKmsError;
|
|
|
|
#define META_GPU_KMS_ERROR (meta_gpu_kms_error_quark ())
|
|
GQuark meta_gpu_kms_error_quark (void);
|
|
|
|
#define META_TYPE_GPU_KMS (meta_gpu_kms_get_type ())
|
|
G_DECLARE_FINAL_TYPE (MetaGpuKms, meta_gpu_kms, META, GPU_KMS, MetaGpu)
|
|
|
|
typedef struct _MetaKmsResources
|
|
{
|
|
drmModeRes *resources;
|
|
drmModeEncoder **encoders;
|
|
unsigned int n_encoders;
|
|
} MetaKmsResources;
|
|
|
|
typedef void (*MetaKmsFlipCallback) (void *user_data);
|
|
|
|
MetaGpuKms * meta_gpu_kms_new (MetaMonitorManagerKms *monitor_manager_kms,
|
|
const char *kms_file_path,
|
|
GError **error);
|
|
|
|
gboolean meta_gpu_kms_apply_crtc_mode (MetaGpuKms *gpu_kms,
|
|
MetaCrtc *crtc,
|
|
int x,
|
|
int y,
|
|
uint32_t fb_id);
|
|
|
|
gboolean meta_gpu_kms_is_crtc_active (MetaGpuKms *gpu_kms,
|
|
MetaCrtc *crtc);
|
|
|
|
gboolean meta_gpu_kms_flip_crtc (MetaGpuKms *gpu_kms,
|
|
MetaCrtc *crtc,
|
|
int x,
|
|
int y,
|
|
uint32_t fb_id,
|
|
GClosure *flip_closure,
|
|
gboolean *fb_in_use);
|
|
|
|
gboolean meta_gpu_kms_wait_for_flip (MetaGpuKms *gpu_kms,
|
|
GError **error);
|
|
|
|
int meta_gpu_kms_get_fd (MetaGpuKms *gpu_kms);
|
|
|
|
const char * meta_gpu_kms_get_file_path (MetaGpuKms *gpu_kms);
|
|
|
|
void meta_gpu_kms_get_max_buffer_size (MetaGpuKms *gpu_kms,
|
|
int *max_width,
|
|
int *max_height);
|
|
|
|
void meta_gpu_kms_set_power_save_mode (MetaGpuKms *gpu_kms,
|
|
uint64_t state);
|
|
|
|
MetaCrtcMode * meta_gpu_kms_get_mode_from_drm_mode (MetaGpuKms *gpu_kms,
|
|
const drmModeModeInfo *drm_mode);
|
|
|
|
gboolean meta_drm_mode_equal (const drmModeModeInfo *one,
|
|
const drmModeModeInfo *two);
|
|
|
|
float meta_calculate_drm_mode_refresh_rate (const drmModeModeInfo *mode);
|
|
|
|
#endif /* META_GPU_KMS_H */
|