Signed-off-by: Ap, Kamal <kamal...@intel.com>
---
 tools/intel_framebuffer_dump.c | 45 +++++++++++++++++++++++++++++-------------
 1 file changed, 31 insertions(+), 14 deletions(-)

diff --git a/tools/intel_framebuffer_dump.c b/tools/intel_framebuffer_dump.c
index 624a961..8fb311f 100644
--- a/tools/intel_framebuffer_dump.c
+++ b/tools/intel_framebuffer_dump.c
@@ -41,28 +41,42 @@
 int main(int argc, char **argv)
 {
        drmModeResPtr res;
-       int fd, n;
+       drmModePlaneRes *plane_resources;
+       drmModePlane *ovr;
+
+       int fd, i;
+
+       fd = drm_open_driver(DRIVER_INTEL);
 
-       fd = drmOpen("i915", NULL);
        if (fd < 0)
                return ENOENT;
 
+       drmSetClientCap(fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
+
        res = drmModeGetResources(fd);
+
        if (res == NULL)
                return ENOMEM;
 
-       for (n = 0; n < res->count_crtcs; n++) {
-               struct drm_gem_open open_arg;
-               struct drm_gem_flink flink;
-               drmModeCrtcPtr crtc;
+       plane_resources = drmModeGetPlaneResources(fd);
+
+       if (!plane_resources) {
+               return 0;
+       }
+
+       for (i = 0; i < plane_resources->count_planes; i++) {
                drmModeFBPtr fb;
+               struct drm_gem_flink flink;
+               struct drm_gem_open open_arg;
 
-               crtc = drmModeGetCrtc(fd, res->crtcs[n]);
-               if (crtc == NULL)
+               ovr = drmModeGetPlane(fd, plane_resources->planes[i]);
+               if (!ovr) {
+                       printf("GetPlane failed: %s\n",
+                       strerror(errno));
                        continue;
+               }
 
-               fb = drmModeGetFB(fd, crtc->buffer_id);
-               drmModeFreeCrtc(crtc);
+               fb = drmModeGetFB(fd, ovr->fb_id);
                if (fb == NULL)
                        continue;
 
@@ -73,18 +87,21 @@ int main(int argc, char **argv)
                }
 
                open_arg.name = flink.name;
+
                if (drmIoctl(fd, DRM_IOCTL_GEM_OPEN, &open_arg) == 0) {
                        struct drm_i915_gem_mmap_gtt mmap_arg;
                        void *ptr;
 
-                                               mmap_arg.handle = 
open_arg.handle;
+                       mmap_arg.handle = open_arg.handle;
                        if (drmIoctl(fd, DRM_IOCTL_I915_GEM_MMAP_GTT, 
&mmap_arg) == 0 &&
                            (ptr = mmap(0, open_arg.size, PROT_READ, 
MAP_SHARED, fd, mmap_arg.offset)) != (void *)-1) {
                                cairo_surface_t *surface;
                                cairo_format_t format;
                                char name[80];
 
-                               snprintf(name, sizeof(name), "fb-%d.png",  
fb->fb_id);
+                               snprintf(name, sizeof(name),
+                                   "p-%d_w-%d_h-%d_fb-%d.png", ovr->plane_id,
+                                   fb->width, fb->height, fb->fb_id);
 
                                switch (fb->depth) {
                                case 16: format = CAIRO_FORMAT_RGB16_565; break;
@@ -98,14 +115,14 @@ int main(int argc, char **argv)
                                                                              
fb->width, fb->height, fb->pitch);
                                cairo_surface_write_to_png(surface, name);
                                cairo_surface_destroy(surface);
-
                                munmap(ptr, open_arg.size);
                        }
                        drmIoctl(fd, DRM_IOCTL_GEM_CLOSE, &open_arg.handle);
                }
 
                drmModeFreeFB(fb);
+               drmModeFreePlane(ovr);
        }
-
+       drmClose(fd);
        return 0;
 }
-- 
1.9.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to