drm, wlserver: Send active display info on bind

This commit is contained in:
Joshua Ashton 2023-11-07 20:52:30 +00:00
parent 71c4b55ef4
commit bbf337de7b
3 changed files with 32 additions and 13 deletions

View file

@ -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();
}

View file

@ -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);

View file

@ -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);
}