From e06121b661a8dcf1ce10e81af2fa71da40dd2665 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Thu, 26 Nov 2015 17:30:01 +0100 Subject: [PATCH] Move more common code to drm_common.c --- gfx/common/drm_common.c | 9 ++- gfx/common/drm_common.h | 8 ++- gfx/drivers/exynos_gfx.c | 115 ++++++++++++----------------- gfx/drivers_context/drm_egl_ctx.c | 116 ++++++++++++++---------------- 4 files changed, 114 insertions(+), 134 deletions(-) diff --git a/gfx/common/drm_common.c b/gfx/common/drm_common.c index be219ba28a..1741302460 100644 --- a/gfx/common/drm_common.c +++ b/gfx/common/drm_common.c @@ -16,8 +16,15 @@ #include "drm_common.h" uint32_t g_connector_id; -drmModeCrtc *g_orig_crtc; int g_drm_fd; +uint32_t g_crtc_id; + +drmModeCrtc *g_orig_crtc; + +drmModeRes *g_drm_resources; +drmModeConnector *g_drm_connector; +drmModeEncoder *g_drm_encoder; +drmModeModeInfo *g_drm_mode; /* Restore the original CRTC. */ void drm_restore_crtc(void) diff --git a/gfx/common/drm_common.h b/gfx/common/drm_common.h index b8dd8c0b56..2a6c6498e1 100644 --- a/gfx/common/drm_common.h +++ b/gfx/common/drm_common.h @@ -26,8 +26,14 @@ extern "C" { #endif extern uint32_t g_connector_id; -extern drmModeCrtc *g_orig_crtc; extern int g_drm_fd; +extern uint32_t g_crtc_id; + +extern drmModeCrtc *g_orig_crtc; +extern drmModeRes *g_drm_resources; +extern drmModeConnector *g_drm_connector; +extern drmModeEncoder *g_drm_encoder; +extern drmModeModeInfo *g_drm_mode; /* Restore the original CRTC. */ void drm_restore_crtc(void); diff --git a/gfx/drivers/exynos_gfx.c b/gfx/drivers/exynos_gfx.c index afaa2e2f19..bb79c25a86 100644 --- a/gfx/drivers/exynos_gfx.c +++ b/gfx/drivers/exynos_gfx.c @@ -115,21 +115,11 @@ struct exynos_fliphandler drmEventContext evctx; }; -struct exynos_drm -{ - drmModeRes *resources; - drmModeConnector *connector; - drmModeEncoder *encoder; - drmModeModeInfo *mode; - uint32_t crtc_id; -}; - struct exynos_data { char drmname[32]; struct exynos_device *device; - struct exynos_drm *drm; struct exynos_fliphandler *fliphandler; /* G2D is used for scaling to framebuffer dimensions. */ @@ -208,17 +198,16 @@ static int exynos_get_device_index(void) } -static void exynos_clean_up_drm(struct exynos_drm *d, int fd) +static void exynos_clean_up_drm(void) { - if (d->encoder) - drmModeFreeEncoder(d->encoder); - if (d->connector) - drmModeFreeConnector(d->connector); - if (d->resources) - drmModeFreeResources(d->resources); + if (g_drm_encoder) + drmModeFreeEncoder(g_drm_encoder); + if (g_drm_connector) + drmModeFreeConnector(g_drm_connector); + if (g_drm_resources) + drmModeFreeResources(g_drm_resources); - free(d); - close(fd); + close(g_drm_fd); } /* The main pageflip handler, which the DRM executes @@ -597,58 +586,49 @@ static int exynos_open(struct exynos_data *pdata) return -1; } - drm = (struct exynos_drm*)calloc(1, sizeof(struct exynos_drm)); - - if (!drm) - { - RARCH_ERR("[video_exynos]: failed to allocate DRM.\n"); - close(fd); - return -1; - } - - drm->resources = drmModeGetResources(fd); - if (!drm->resources) + g_drm_resources = drmModeGetResources(fd); + if (!g_drm_resources) { RARCH_ERR("[video_exynos]: failed to get DRM resources\n"); goto fail; } - for (i = 0; i < drm->resources->count_connectors; ++i) + for (i = 0; i < g_drm_resources->count_connectors; ++i) { if (settings->video.monitor_index != 0 && settings->video.monitor_index - 1 != i) continue; - drm->connector = drmModeGetConnector(fd, drm->resources->connectors[i]); + g_drm_connector = drmModeGetConnector(fd, g_drm_resources->connectors[i]); if (!drm->connecto) continue; - if (drm->connector->connection == DRM_MODE_CONNECTED && - drm->connector->count_modes > 0) + if (g_drm_connector->connection == DRM_MODE_CONNECTED && + g_drm_connector->count_modes > 0) break; - drmModeFreeConnector(drm->connector); - drm->connector = NULL; + drmModeFreeConnector(g_drm_connector); + g_drm_connector = NULL; } - if (i == drm->resources->count_connectors) + if (i == g_drm_resources->count_connectors) { RARCH_ERR("[video_exynos]: no currently active connector found.\n"); goto fail; } - for (i = 0; i < drm->resources->count_encoders; i++) + for (i = 0; i < g_drm_resources->count_encoders; i++) { - drm->encoder = drmModeGetEncoder(fd, drm->resources->encoders[i]); + g_drm_encoder = drmModeGetEncoder(fd, g_drm_resources->encoders[i]); - if (!drm->encoder) + if (!g_drm_encoder) continue; - if (drm->encoder->encoder_id == drm->connector->encoder_id) + if (g_drm_encoder->encoder_id == g_drm_connector->encoder_id) break; - drmModeFreeEncoder(drm->encoder); - drm->encoder = NULL; + drmModeFreeEncoder(g_drm_encoder); + g_drm_encoder = NULL; } fliphandler = (struct exynos_fliphandler*)calloc(1, sizeof(struct exynos_fliphandler)); @@ -668,17 +648,16 @@ static int exynos_open(struct exynos_data *pdata) strncpy(pdata->drmname, buf, sizeof(buf)); g_drm_fd = fd; - pdata->drm = drm; pdata->fliphandler = fliphandler; RARCH_LOG("[video_exynos]: using DRM device \"%s\" with connector id %u.\n", - pdata->drmname, pdata->drm->connector->connector_id); + pdata->drmname, g_drm_connector->connector_id); return 0; fail: free(fliphandler); - exynos_clean_up_drm(drm, fd); + exynos_clean_up_drm(); return -1; } @@ -691,31 +670,29 @@ static void exynos_close(struct exynos_data *pdata) memset(pdata->drmname, 0, sizeof(char) * 32); - exynos_clean_up_drm(pdata->drm, g_drm_fd); + exynos_clean_up_drm(); g_drm_fd = -1; - pdata->drm = NULL; } static int exynos_init(struct exynos_data *pdata, unsigned bpp) { unsigned i; - struct exynos_drm *drm = pdata->drm; settings_t *settings = config_get_ptr(); if (settings->video.fullscreen_x != 0 && settings->video.fullscreen_y != 0) { - for (i = 0; i < drm->connector->count_modes; i++) + for (i = 0; i < g_drm_connector->count_modes; i++) { - if (drm->connector->modes[i].hdisplay == settings->video.fullscreen_x && - drm->connector->modes[i].vdisplay == settings->video.fullscreen_y) + if (g_drm_connector->modes[i].hdisplay == settings->video.fullscreen_x && + g_drm_connector->modes[i].vdisplay == settings->video.fullscreen_y) { - drm->mode = &drm->connector->modes[i]; + g_drm_mode = &g_drm_connector->modes[i]; break; } } - if (!drm->mode) + if (!g_drm_mode) { RARCH_ERR("[video_exynos]: requested resolution (%ux%u) not available\n", settings->video.fullscreen_x, settings->video.fullscreen_y); @@ -726,26 +703,26 @@ static int exynos_init(struct exynos_data *pdata, unsigned bpp) else { /* Select first mode, which is the native one. */ - drm->mode = &drm->connector->modes[0]; + g_drm_mode = &g_drm_connector->modes[0]; } - if (drm->mode->hdisplay == 0 || drm->mode->vdisplay == 0) + if (g_drm_mode->hdisplay == 0 || g_drm_mode->vdisplay == 0) { RARCH_ERR("[video_exynos]: failed to select sane resolution\n"); goto fail; } - drm->crtc_id = drm->encoder->crtc_id; - g_connector_id = drm->connector->connector_id; - g_orig_crtc = drmModeGetCrtc(g_drm_fd, drm->crtc_id); + g_crtc_id = g_drm_encoder->crtc_id; + g_connector_id = g_drm_connector->connector_id; + g_orig_crtc = drmModeGetCrtc(g_drm_fd, g_crtc_id); if (!g_orig_crtc) RARCH_WARN("[video_exynos]: cannot find original crtc\n"); - pdata->width = drm->mode->hdisplay; - pdata->height = drm->mode->vdisplay; + pdata->width = g_drm_mode->hdisplay; + pdata->height = g_drm_mode->vdisplay; - pdata->aspect = (float)drm->mode->hdisplay / (float)drm->mode->vdisplay; + pdata->aspect = (float)g_drm_mode->hdisplay / (float)g_drm_mode->vdisplay; /* Always use triple buffering to reduce chance of tearing. */ pdata->num_pages = 3; @@ -762,7 +739,7 @@ static int exynos_init(struct exynos_data *pdata, unsigned bpp) fail: drm_restore_crtc(); - drm->mode = NULL; + g_drm_mode = NULL; return -1; } @@ -770,12 +747,8 @@ fail: /* Counterpart to exynos_init. */ static void exynos_deinit(struct exynos_data *pdata) { - struct exynos_drm *drm = pdata->drm; - drm_restore_crtc(); - drm = NULL; - pdata->width = 0; pdata->height = 0; pdata->num_pages = 0; @@ -867,9 +840,9 @@ static int exynos_alloc(struct exynos_data *pdata) } /* Setup CRTC: display the last allocated page. */ - if (drmModeSetCrtc(g_drm_fd, pdata->drm->crtc_id, + if (drmModeSetCrtc(g_drm_fd, g_crtc_id, pages[pdata->num_pages - 1].buf_id, - 0, 0, &pdata->drm->connector_id, 1, pdata->drm->mode)) + 0, 0, &g_drm_connector_id, 1, g_drm_mode)) { RARCH_ERR("[video_exynos]: initial CRTC setup failed.\n"); goto fail; @@ -895,7 +868,7 @@ static void exynos_free(struct exynos_data *pdata) unsigned i; /* Disable the CRTC. */ - if (drmModeSetCrtc(g_drm_fd, pdata->drm->crtc_id, 0, + if (drmModeSetCrtc(g_drm_fd, g_crtc_id, 0, 0, 0, NULL, 0, NULL)) RARCH_WARN("[video_exynos]: failed to disable the CRTC.\n"); @@ -1116,7 +1089,7 @@ static int exynos_flip(struct exynos_data *pdata, struct exynos_page *page) exynos_wait_flip(pdata->fliphandler); /* Issue a page flip at the next vblank interval. */ - if (drmModePageFlip(g_drm_fd, pdata->drm->crtc_id, page->buf_id, + if (drmModePageFlip(g_drm_fd, g_crtc_id, page->buf_id, DRM_MODE_PAGE_FLIP_EVENT, page) != 0) { RARCH_ERR("[video_exynos]: failed to issue page flip\n"); diff --git a/gfx/drivers_context/drm_egl_ctx.c b/gfx/drivers_context/drm_egl_ctx.c index 7b61d61f54..944000c5f2 100644 --- a/gfx/drivers_context/drm_egl_ctx.c +++ b/gfx/drivers_context/drm_egl_ctx.c @@ -55,15 +55,9 @@ typedef struct gfx_ctx_drm_egl_data { RFILE *g_drm; - uint32_t g_crtc_id; unsigned g_fb_width; unsigned g_fb_height; - drmModeModeInfo *g_drm_mode; - drmModeRes *g_resources; - drmModeConnector *g_connector; - drmModeEncoder *g_encoder; - struct gbm_bo *g_bo; struct gbm_bo *g_next_bo; struct gbm_device *g_gbm_dev; @@ -225,7 +219,7 @@ static bool queue_flip(gfx_ctx_drm_egl_data_t *drm) fb = (struct drm_fb*)drm_fb_get_from_bo(drm, drm->g_next_bo); - if (drmModePageFlip(g_drm_fd, drm->g_crtc_id, fb->fb_id, + if (drmModePageFlip(g_drm_fd, g_crtc_id, fb->fb_id, DRM_MODE_PAGE_FLIP_EVENT, &waiting_for_flip) == 0) return true; @@ -304,23 +298,23 @@ static void free_drm_resources(gfx_ctx_drm_egl_data_t *drm) if (drm->g_gbm_dev) gbm_device_destroy(drm->g_gbm_dev); - if (drm->g_encoder) - drmModeFreeEncoder(drm->g_encoder); + if (g_drm_encoder) + drmModeFreeEncoder(g_drm_encoder); - if (drm->g_connector) - drmModeFreeConnector(drm->g_connector); + if (g_drm_connector) + drmModeFreeConnector(g_drm_connector); - if (drm->g_resources) - drmModeFreeResources(drm->g_resources); + if (g_drm_resources) + drmModeFreeResources(g_drm_resources); if (g_drm_fd >= 0) retro_fclose(drm->g_drm); drm->g_gbm_surface = NULL; drm->g_gbm_dev = NULL; - drm->g_encoder = NULL; - drm->g_connector = NULL; - drm->g_resources = NULL; + g_drm_encoder = NULL; + g_drm_connector = NULL; + g_drm_resources = NULL; g_drm_fd = -1; } @@ -338,8 +332,8 @@ static void gfx_ctx_drm_egl_destroy_resources(gfx_ctx_drm_egl_data_t *drm) drm_restore_crtc(); free_drm_resources(drm); - drm->g_drm_mode = NULL; - drm->g_crtc_id = 0; + g_drm_mode = NULL; + g_crtc_id = 0; g_connector_id = 0; drm->g_fb_width = 0; @@ -386,8 +380,8 @@ nextgpu: g_drm_fd = retro_get_fd(drm->g_drm); - drm->g_resources = drmModeGetResources(g_drm_fd); - if (!drm->g_resources) + g_drm_resources = drmModeGetResources(g_drm_fd); + if (!g_drm_resources) { RARCH_WARN("[KMS/EGL]: Couldn't get device resources.\n"); goto nextgpu; @@ -396,12 +390,12 @@ nextgpu: /* Enumerate all connectors. */ monitor_index = 0; RARCH_LOG("[KMS/EGL]: Found %d connectors.\n", - drm->g_resources->count_connectors); + g_drm_resources->count_connectors); - for (i = 0; i < drm->g_resources->count_connectors; i++) + for (i = 0; i < g_drm_resources->count_connectors; i++) { drmModeConnectorPtr conn = drmModeGetConnector( - g_drm_fd, drm->g_resources->connectors[i]); + g_drm_fd, g_drm_resources->connectors[i]); if (conn) { @@ -418,72 +412,72 @@ nextgpu: } monitor_index = 0; - for (i = 0; i < drm->g_resources->count_connectors; i++) + for (i = 0; i < g_drm_resources->count_connectors; i++) { - drm->g_connector = drmModeGetConnector(g_drm_fd, - drm->g_resources->connectors[i]); + g_drm_connector = drmModeGetConnector(g_drm_fd, + g_drm_resources->connectors[i]); - if (!drm->g_connector) + if (!g_drm_connector) continue; - if (drm->g_connector->connection == DRM_MODE_CONNECTED - && drm->g_connector->count_modes > 0) + if (g_drm_connector->connection == DRM_MODE_CONNECTED + && g_drm_connector->count_modes > 0) { monitor_index++; if (monitor_index == monitor) break; } - drmModeFreeConnector(drm->g_connector); - drm->g_connector = NULL; + drmModeFreeConnector(g_drm_connector); + g_drm_connector = NULL; } - if (!drm->g_connector) + if (!g_drm_connector) { RARCH_WARN("[KMS/EGL]: Couldn't get device connector.\n"); goto nextgpu; } - for (i = 0; i < drm->g_resources->count_encoders; i++) + for (i = 0; i < g_drm_resources->count_encoders; i++) { - drm->g_encoder = drmModeGetEncoder(g_drm_fd, - drm->g_resources->encoders[i]); + g_drm_encoder = drmModeGetEncoder(g_drm_fd, + g_drm_resources->encoders[i]); - if (!drm->g_encoder) + if (!g_drm_encoder) continue; - if (drm->g_encoder->encoder_id == drm->g_connector->encoder_id) + if (g_drm_encoder->encoder_id == g_drm_connector->encoder_id) break; - drmModeFreeEncoder(drm->g_encoder); - drm->g_encoder = NULL; + drmModeFreeEncoder(g_drm_encoder); + g_drm_encoder = NULL; } - if (!drm->g_encoder) + if (!g_drm_encoder) { RARCH_WARN("[KMS/EGL]: Couldn't find DRM encoder.\n"); goto nextgpu; } - for (i = 0; i < drm->g_connector->count_modes; i++) + for (i = 0; i < g_drm_connector->count_modes; i++) { RARCH_LOG("[KMS/EGL]: Mode %d: (%s) %d x %d, %u Hz\n", i, - drm->g_connector->modes[i].name, - drm->g_connector->modes[i].hdisplay, - drm->g_connector->modes[i].vdisplay, - drm->g_connector->modes[i].vrefresh); + g_drm_connector->modes[i].name, + g_drm_connector->modes[i].hdisplay, + g_drm_connector->modes[i].vdisplay, + g_drm_connector->modes[i].vrefresh); } - drm->g_crtc_id = drm->g_encoder->crtc_id; - g_orig_crtc = drmModeGetCrtc(g_drm_fd, drm->g_crtc_id); + g_crtc_id = g_drm_encoder->crtc_id; + g_orig_crtc = drmModeGetCrtc(g_drm_fd, g_crtc_id); if (!g_orig_crtc) RARCH_WARN("[KMS/EGL]: Cannot find original CRTC.\n"); - g_connector_id = drm->g_connector->connector_id; + g_connector_id = g_drm_connector->connector_id; /* First mode is assumed to be the "optimal" * one for get_video_size() purposes. */ - drm->g_fb_width = drm->g_connector->modes[0].hdisplay; - drm->g_fb_height = drm->g_connector->modes[0].vdisplay; + drm->g_fb_width = g_drm_connector->modes[0].hdisplay; + drm->g_fb_height = g_drm_connector->modes[0].vdisplay; drm->g_gbm_dev = gbm_create_device(g_drm_fd); @@ -654,7 +648,7 @@ static bool gfx_ctx_drm_egl_set_video_mode(void *data, * If not fullscreen, we get desired windowed size, * which is not appropriate. */ if ((width == 0 && height == 0) || !fullscreen) - drm->g_drm_mode = &drm->g_connector->modes[0]; + g_drm_mode = &g_drm_connector->modes[0]; else { /* Try to match settings->video.refresh_rate as closely as possible. @@ -664,32 +658,32 @@ static bool gfx_ctx_drm_egl_set_video_mode(void *data, float minimum_fps_diff = 0.0f; /* Find best match. */ - for (i = 0; i < drm->g_connector->count_modes; i++) + for (i = 0; i < g_drm_connector->count_modes; i++) { float diff; - if (width != drm->g_connector->modes[i].hdisplay || - height != drm->g_connector->modes[i].vdisplay) + if (width != g_drm_connector->modes[i].hdisplay || + height != g_drm_connector->modes[i].vdisplay) continue; - diff = fabsf(refresh_mod * drm->g_connector->modes[i].vrefresh + diff = fabsf(refresh_mod * g_drm_connector->modes[i].vrefresh - settings->video.refresh_rate); - if (!drm->g_drm_mode || diff < minimum_fps_diff) + if (!g_drm_mode || diff < minimum_fps_diff) { - drm->g_drm_mode = &drm->g_connector->modes[i]; + g_drm_mode = &g_drm_connector->modes[i]; minimum_fps_diff = diff; } } } - if (!drm->g_drm_mode) + if (!g_drm_mode) { RARCH_ERR("[KMS/EGL]: Did not find suitable video mode for %u x %u.\n", width, height); goto error; } - drm->g_fb_width = drm->g_drm_mode->hdisplay; - drm->g_fb_height = drm->g_drm_mode->vdisplay; + drm->g_fb_width = g_drm_mode->hdisplay; + drm->g_fb_height = g_drm_mode->vdisplay; /* Create GBM surface. */ drm->g_gbm_surface = gbm_surface_create( @@ -732,7 +726,7 @@ static bool gfx_ctx_drm_egl_set_video_mode(void *data, fb = drm_fb_get_from_bo(drm, drm->g_bo); ret = drmModeSetCrtc(g_drm_fd, - drm->g_crtc_id, fb->fb_id, 0, 0, &g_connector_id, 1, drm->g_drm_mode); + g_crtc_id, fb->fb_id, 0, 0, &g_connector_id, 1, g_drm_mode); if (ret < 0) goto error;