kmsdrm: free memory for plane, crtc and connector property tables on VideoQuit.

This commit is contained in:
Manuel Alfayate Corchete 2020-08-05 15:28:51 +02:00
parent 2d69ce08ba
commit fc722b2d21
1 changed files with 38 additions and 17 deletions

View File

@ -216,7 +216,9 @@ static int add_plane_property(drmModeAtomicReq *req, uint32_t obj_id,
return KMSDRM_drmModeAtomicAddProperty(req, obj_id, prop_id, value);
}
/*static void get_plane_properties() {
#if 0
static void get_plane_properties() {
uint32_t i;
dispdata->plane_ = drmModeObjectGetProperties(viddata->drm_fd,
plane->plane_id, DRM_MODE_OBJECT_PLANE);
@ -234,10 +236,7 @@ static int add_plane_property(drmModeAtomicReq *req, uint32_t obj_id,
dispdata->type->props->props[i]);
}
return props;
}*/
}
void print_plane_info(_THIS, drmModePlanePtr plane)
{
@ -332,10 +331,11 @@ void get_planes_info(_THIS)
KMSDRM_drmModeFreePlaneResources(plane_resources);
}
#endif
/* Get a plane that is PRIMARY (there's no guarantee that we have overlays in all hardware!)
and can use the CRTC we have chosen. That's all. */
int get_plane_id(_THIS)
uint32_t get_plane_id(_THIS)
{
drmModePlaneResPtr plane_resources;
uint32_t i, j;
@ -916,7 +916,9 @@ KMSDRM_VideoInit(_THIS)
#endif
/* DRM mode index for the desktop mode is needed to complete desktop mode init NOW,
so look for it in the DRM modes array. */
so look for it in the DRM modes array.
This is needed because SetDisplayMode() uses the mode index, and some programs
change to fullscreen desktop video mode as they start. */
for (int i = 0; i < dispdata->connector->count_modes; i++) {
if (!SDL_memcmp(dispdata->connector->modes + i, &dispdata->crtc->mode, sizeof(drmModeModeInfo))) {
SDL_DisplayModeData *modedata = SDL_calloc(1, sizeof(SDL_DisplayModeData));
@ -947,8 +949,6 @@ KMSDRM_VideoInit(_THIS)
goto cleanup;
}
dispdata->plane_id = get_plane_id(_this);
if (!dispdata->plane_id) {
ret = SDL_SetError("could not find a suitable plane.");
@ -957,7 +957,10 @@ KMSDRM_VideoInit(_THIS)
dispdata->plane = KMSDRM_drmModeGetPlane(viddata->drm_fd, dispdata->plane_id);
//get_planes_info(_this);
/* Use this if you ever need to see info on all available planes. */
#if 0
get_planes_info(_this);
#endif
/* We only do single plane to single crtc to single connector, no
* fancy multi-monitor or multi-plane stuff. So just grab the
@ -968,19 +971,19 @@ KMSDRM_VideoInit(_THIS)
dispdata->plane_props = KMSDRM_drmModeObjectGetProperties(viddata->drm_fd,
dispdata->plane_id, DRM_MODE_OBJECT_PLANE);
dispdata->plane_props_info = calloc(dispdata->plane_props->count_props,
dispdata->plane_props_info = SDL_calloc(dispdata->plane_props->count_props,
sizeof(dispdata->plane_props_info));
for (int i = 0; i < dispdata->plane_props->count_props; i++) {
dispdata->plane_props_info[i] = KMSDRM_drmModeGetProperty(viddata->drm_fd,
dispdata->plane_props->props[i]);
dispdata->plane_props->props[i]);
}
/* Get CRTC properties */
dispdata->crtc_props = KMSDRM_drmModeObjectGetProperties(viddata->drm_fd,
dispdata->crtc_id, DRM_MODE_OBJECT_CRTC);
dispdata->crtc_props_info = calloc(dispdata->crtc_props->count_props,
dispdata->crtc_props_info = SDL_calloc(dispdata->crtc_props->count_props,
sizeof(dispdata->crtc_props_info));
for (int i = 0; i < dispdata->crtc_props->count_props; i++) {
@ -992,7 +995,7 @@ KMSDRM_VideoInit(_THIS)
dispdata->connector_props = KMSDRM_drmModeObjectGetProperties(viddata->drm_fd,
dispdata->connector_id, DRM_MODE_OBJECT_CONNECTOR);
dispdata->connector_props_info = calloc(dispdata->connector_props->count_props,
dispdata->connector_props_info = SDL_calloc(dispdata->connector_props->count_props,
sizeof(dispdata->connector_props_info));
for (int i = 0; i < dispdata->connector_props->count_props; i++) {
@ -1071,6 +1074,24 @@ KMSDRM_VideoQuit(_THIS)
SDL_LogWarn(SDL_LOG_CATEGORY_VIDEO, "Could not restore original CRTC mode");
}
}
/****************/
/* Atomic block */
/****************/
if (dispdata && dispdata->connector_props_info) {
SDL_free(dispdata->connector_props_info);
dispdata->connector_props_info = NULL;
}
if (dispdata && dispdata->crtc_props_info) {
SDL_free(dispdata->crtc_props_info);
dispdata->crtc_props_info = NULL;
}
if (dispdata && dispdata->plane_props_info) {
SDL_free(dispdata->plane_props_info);
dispdata->plane_props_info = NULL;
}
/*********************/
/* Atomic block ends */
/*********************/
if (dispdata && dispdata->connector) {
KMSDRM_drmModeFreeConnector(dispdata->connector);
dispdata->connector = NULL;