drm: delay output destruction until vblank & page filp handlers are done
authorJunghoon <jh13.son@samsung.com>
Tue, 27 Oct 2015 09:26:25 +0000 (18:26 +0900)
committer손정훈 <jh13.son@samsung.com>
Wed, 28 Oct 2015 06:26:01 +0000 (15:26 +0900)
Change-Id: I104940fad30a9c048fa519a578f5019deb01a376

src/lib/drm/drm-internal.h
src/lib/drm/drm-output.c

index 241eeca469cd8c5c4c187bda827871080a513c97..fff127477fec8af88fb26ebee8d67fd40ba10b93 100644 (file)
@@ -120,6 +120,7 @@ struct drm_output
     int32_t                 subpixel;
     drmModeModeInfo        *mode;
 
+    pepper_bool_t           destroy_pending;
     pepper_bool_t           page_flip_pending;
     int                     vblank_pending_count;
 
index 211711c550be68af3cbfa215aafaaf4c103f820e..7d27c35305f8814571a1d8bb03f3baf9de442d72 100644 (file)
@@ -293,6 +293,9 @@ drm_output_repaint(void *o, const pepper_list_t *plane_list)
     drm_plane_t    *plane;
     int             ret;
 
+    if (output->destroy_pending)
+        return;
+
     if (!output->back)
         drm_output_render(output);
 
@@ -588,6 +591,12 @@ drm_output_destroy(void *o)
     drm_output_t *output = o;
     drm_plane_t  *plane;
 
+    if (output->page_flip_pending || (output->vblank_pending_count > 0))
+    {
+        output->destroy_pending = PEPPER_TRUE;
+        return;
+    }
+
     if (output->render_type == DRM_RENDER_TYPE_PIXMAN)
         fini_pixman_renderer(output);
     else if (output->render_type == DRM_RENDER_TYPE_GL)
@@ -639,9 +648,16 @@ drm_handle_vblank(int fd, unsigned int frame, unsigned int sec, unsigned int use
 
     if (plane->output->vblank_pending_count == 0 && !plane->output->page_flip_pending)
     {
-        ts.tv_sec = sec;
-        ts.tv_nsec = usec * 1000;
-        pepper_output_finish_frame(plane->output->base, &ts);
+        if (plane->output->destroy_pending)
+        {
+            drm_output_destroy(plane->output);
+        }
+        else
+        {
+            ts.tv_sec = sec;
+            ts.tv_nsec = usec * 1000;
+            pepper_output_finish_frame(plane->output->base, &ts);
+        }
     }
 }
 
@@ -661,8 +677,15 @@ drm_handle_page_flip(int fd, unsigned int frame, unsigned int sec, unsigned int
 
     if (output->vblank_pending_count == 0)
     {
-        ts.tv_sec = sec;
-        ts.tv_nsec = usec * 1000;
-        pepper_output_finish_frame(output->base, &ts);
+        if (output->destroy_pending)
+        {
+            drm_output_destroy(output);
+        }
+        else
+        {
+            ts.tv_sec = sec;
+            ts.tv_nsec = usec * 1000;
+            pepper_output_finish_frame(output->base, &ts);
+        }
     }
 }