drm, wlserver: Send active display info on bind
This commit is contained in:
parent
71c4b55ef4
commit
bbf337de7b
3 changed files with 32 additions and 13 deletions
33
src/drm.cpp
33
src/drm.cpp
|
|
@ -111,28 +111,35 @@ static uint32_t get_conn_display_info_flags(struct drm_t *drm, struct connector
|
|||
return flags;
|
||||
}
|
||||
|
||||
static void update_connector_display_info_wl(struct drm_t *drm)
|
||||
void drm_send_gamescope_control(wl_resource *control, struct drm_t *drm)
|
||||
{
|
||||
// assumes wlserver_lock HELD!
|
||||
|
||||
if ( !drm->connector )
|
||||
return;
|
||||
|
||||
auto& conn = drm->connector;
|
||||
|
||||
uint32_t flags = get_conn_display_info_flags( drm, drm->connector );
|
||||
|
||||
struct wl_array display_rates;
|
||||
wl_array_init(&display_rates);
|
||||
if ( conn->valid_display_rates.size() )
|
||||
{
|
||||
size_t size = conn->valid_display_rates.size() * sizeof(uint32_t);
|
||||
uint32_t *ptr = (uint32_t *)wl_array_add( &display_rates, size );
|
||||
memcpy( ptr, conn->valid_display_rates.data(), size );
|
||||
}
|
||||
gamescope_control_send_active_display_info( control, drm->connector->name, drm->connector->make, drm->connector->model, flags, &display_rates );
|
||||
wl_array_release(&display_rates);
|
||||
}
|
||||
|
||||
static void update_connector_display_info_wl(struct drm_t *drm)
|
||||
{
|
||||
wlserver_lock();
|
||||
for ( const auto &control : wlserver.gamescope_controls )
|
||||
{
|
||||
uint32_t flags = get_conn_display_info_flags( drm, drm->connector );
|
||||
|
||||
struct wl_array display_rates;
|
||||
wl_array_init(&display_rates);
|
||||
if ( conn->valid_display_rates.size() )
|
||||
{
|
||||
size_t size = conn->valid_display_rates.size() * sizeof(uint32_t);
|
||||
uint32_t *ptr = (uint32_t *)wl_array_add( &display_rates, size );
|
||||
memcpy( ptr, conn->valid_display_rates.data(), size );
|
||||
}
|
||||
gamescope_control_send_active_display_info( control, drm->connector->name, drm->connector->make, drm->connector->model, flags, &display_rates );
|
||||
wl_array_release(&display_rates);
|
||||
drm_send_gamescope_control(control, drm);
|
||||
}
|
||||
wlserver_unlock();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,6 +51,11 @@ inline bool ColorspaceIsHDR( GamescopeAppTextureColorspace colorspace )
|
|||
colorspace == GAMESCOPE_APP_TEXTURE_COLORSPACE_HDR10_PQ;
|
||||
}
|
||||
|
||||
extern "C"
|
||||
{
|
||||
struct wl_resource;
|
||||
}
|
||||
|
||||
extern struct drm_t g_DRM;
|
||||
void drm_destroy_blob(struct drm_t *drm, uint32_t blob);
|
||||
|
||||
|
|
@ -408,3 +413,5 @@ extern bool g_bSupportsAsyncFlips;
|
|||
|
||||
const char* drm_get_patched_edid_path();
|
||||
void drm_update_patched_edid(drm_t *drm);
|
||||
|
||||
void drm_send_gamescope_control(wl_resource *control, struct drm_t *drm);
|
||||
|
|
|
|||
|
|
@ -892,6 +892,11 @@ static void gamescope_control_bind( struct wl_client *client, void *data, uint32
|
|||
gamescope_control_send_feature_support( resource, GAMESCOPE_CONTROL_FEATURE_PIXEL_FILTER, 1, 0 );
|
||||
gamescope_control_send_feature_support( resource, GAMESCOPE_CONTROL_FEATURE_DONE, 0, 0 );
|
||||
|
||||
if ( !BIsNested() )
|
||||
{
|
||||
drm_send_gamescope_control( resource, &g_DRM );
|
||||
}
|
||||
|
||||
wlserver.gamescope_controls.push_back(resource);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue