DRMDisplay: Use width/height/refresh rate to select mode
This commit is contained in:
parent
b811b78c09
commit
e8832bf552
|
@ -3,6 +3,7 @@
|
|||
#include "common/log.h"
|
||||
#include "common/string.h"
|
||||
#include "file_system.h"
|
||||
#include <cmath>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
@ -67,23 +68,23 @@ static uint32_t find_crtc_for_connector(int card_fd, const drmModeRes* resources
|
|||
return -1;
|
||||
}
|
||||
|
||||
bool DRMDisplay::Initialize()
|
||||
bool DRMDisplay::Initialize(u32 width, u32 height, float refresh_rate)
|
||||
{
|
||||
if (m_card_id < 0)
|
||||
{
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
if (TryOpeningCard(i))
|
||||
if (TryOpeningCard(i, width, height, refresh_rate))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return TryOpeningCard(m_card_id);
|
||||
return TryOpeningCard(m_card_id, width, height, refresh_rate);
|
||||
}
|
||||
|
||||
bool DRMDisplay::TryOpeningCard(int card)
|
||||
bool DRMDisplay::TryOpeningCard(int card, u32 width, u32 height, float refresh_rate)
|
||||
{
|
||||
if (m_card_fd >= 0)
|
||||
close(m_card_fd);
|
||||
|
@ -126,15 +127,32 @@ bool DRMDisplay::TryOpeningCard(int card)
|
|||
for (int i = 0; i < m_connector->count_modes; i++)
|
||||
{
|
||||
drmModeModeInfo* next_mode = &m_connector->modes[i];
|
||||
if (next_mode->type & DRM_MODE_TYPE_PREFERRED)
|
||||
{
|
||||
m_mode = next_mode;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!m_mode || (next_mode->hdisplay * next_mode->vdisplay) > (m_mode->hdisplay * m_mode->vdisplay))
|
||||
const float mode_refresh_rate = (static_cast<float>(next_mode->clock) * 1000.0f) /
|
||||
(static_cast<float>(next_mode->htotal) * static_cast<float>(next_mode->vtotal));
|
||||
Log_DevPrintf("Checking mode %u: %ux%u @ %f hz", i, next_mode->hdisplay, next_mode->vdisplay, mode_refresh_rate);
|
||||
|
||||
if (width == 0 && height == 0)
|
||||
{
|
||||
m_mode = next_mode;
|
||||
// use preferred mode if we're auto selecting
|
||||
if (next_mode->type & DRM_MODE_TYPE_PREFERRED)
|
||||
{
|
||||
m_mode = next_mode;
|
||||
break;
|
||||
}
|
||||
else if (!m_mode)
|
||||
{
|
||||
m_mode = next_mode;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (width == next_mode->hdisplay && height == next_mode->vdisplay &&
|
||||
(refresh_rate == 0.0f || std::abs(mode_refresh_rate - refresh_rate) < 0.1f))
|
||||
{
|
||||
m_mode = next_mode;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ public:
|
|||
DRMDisplay(int card = -1);
|
||||
~DRMDisplay();
|
||||
|
||||
bool Initialize();
|
||||
bool Initialize(u32 width, u32 height, float refresh_rate);
|
||||
|
||||
int GetCardID() const { return m_card_id; }
|
||||
int GetCardFD() const { return m_card_fd; }
|
||||
|
@ -28,7 +28,7 @@ private:
|
|||
MAX_BUFFERS = 5
|
||||
};
|
||||
|
||||
bool TryOpeningCard(int card);
|
||||
bool TryOpeningCard(int card, u32 width, u32 height, float refresh_rate);
|
||||
|
||||
int m_card_id = 0;
|
||||
int m_card_fd = -1;
|
||||
|
|
|
@ -83,7 +83,7 @@ bool ContextEGLGBM::CreateGBMDevice()
|
|||
|
||||
bool ContextEGLGBM::CreateDisplay(const WindowInfo& wi)
|
||||
{
|
||||
return m_drm_display.Initialize();
|
||||
return m_drm_display.Initialize(wi.surface_width, wi.surface_height, wi.surface_refresh_rate);
|
||||
}
|
||||
|
||||
bool ContextEGLGBM::SetDisplay()
|
||||
|
|
Loading…
Reference in New Issue