static void gfx_ctx_drm_swap_buffers(void *data) { gfx_ctx_drm_data_t *drm = (gfx_ctx_drm_data_t*)data; settings_t *settings = config_get_ptr(); switch (drm_api) { case GFX_CTX_OPENGL_API: case GFX_CTX_OPENGL_ES_API: case GFX_CTX_OPENVG_API: #ifdef HAVE_EGL egl_swap_buffers(&drm->egl); #endif break; default: break; } /* I guess we have to wait for flip to have taken * place before another flip can be queued up. * * If true, we are still waiting for a flip * (nonblocking mode, so just drop the frame). */ if (gfx_ctx_drm_wait_flip(drm->interval)) return; waiting_for_flip = gfx_ctx_drm_queue_flip(); /* Triple-buffered page flips */ if (settings->video.max_swapchain_images >= 3 && gbm_surface_has_free_buffers(g_gbm_surface)) return; gfx_ctx_drm_wait_flip(true); }
static void gfx_ctx_drm_swap_buffers(void *data) { gfx_ctx_drm_data_t *drm = (gfx_ctx_drm_data_t*)data; switch (drm_api) { case GFX_CTX_OPENGL_API: case GFX_CTX_OPENGL_ES_API: case GFX_CTX_OPENVG_API: #ifdef HAVE_EGL egl_swap_buffers(&drm->egl); #endif break; default: break; } /* I guess we have to wait for flip to have taken * place before another flip can be queued up. * * If true, we are still waiting for a flip * (nonblocking mode, so just drop the frame). */ if (gfx_ctx_drm_wait_flip(drm->interval)) return; waiting_for_flip = gfx_ctx_drm_queue_flip(); if (gbm_surface_has_free_buffers(g_gbm_surface)) return; /* We have to wait for this flip to finish. * This shouldn't happen as we have triple buffered page-flips. */ RARCH_WARN("[KMS]: Triple buffering is not working correctly ...\n"); gfx_ctx_drm_wait_flip(true); }
static void gfx_ctx_drm_destroy_resources(gfx_ctx_drm_data_t *drm) { if (!drm) return; /* Make sure we acknowledge all page-flips. */ gfx_ctx_drm_wait_flip(true); switch (drm_api) { case GFX_CTX_OPENGL_API: case GFX_CTX_OPENGL_ES_API: case GFX_CTX_OPENVG_API: #ifdef HAVE_EGL egl_destroy(&drm->egl); #endif break; case GFX_CTX_NONE: default: break; } free_drm_resources(drm); g_drm_mode = NULL; g_crtc_id = 0; g_connector_id = 0; drm->fb_width = 0; drm->fb_height = 0; g_bo = NULL; g_next_bo = NULL; }