[FFmpeg-cvslog] opencl: Print compilation log

Timothy Gu git at videolan.org
Sat Oct 17 10:16:57 CEST 2015


ffmpeg | branch: master | Timothy Gu <timothygu99 at gmail.com> | Mon Oct 12 02:41:15 2015 -0700| [893a648182e4d6f5b93a7627229bac7492a184ab] | committer: Timothy Gu

opencl: Print compilation log

Useful when debugging.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=893a648182e4d6f5b93a7627229bac7492a184ab
---

 libavutil/opencl.c |   33 ++++++++++++++++++++++++++++++---
 1 file changed, 30 insertions(+), 3 deletions(-)

diff --git a/libavutil/opencl.c b/libavutil/opencl.c
index c2956fd..f720ce0 100644
--- a/libavutil/opencl.c
+++ b/libavutil/opencl.c
@@ -449,12 +449,14 @@ end:
 cl_program av_opencl_compile(const char *program_name, const char *build_opts)
 {
     int i;
-    cl_int status;
+    cl_int status, build_status;
     int kernel_code_idx = 0;
     const char *kernel_source;
     size_t kernel_code_len;
     char* ptr = NULL;
     cl_program program = NULL;
+    size_t log_size;
+    char *log = NULL;
 
     LOCK_OPENCL;
     for (i = 0; i < opencl_ctx.kernel_code_count; i++) {
@@ -481,11 +483,36 @@ cl_program av_opencl_compile(const char *program_name, const char *build_opts)
         program = NULL;
         goto end;
     }
-    status = clBuildProgram(program, 1, &(opencl_ctx.device_id), build_opts, NULL, NULL);
+
+    build_status = clBuildProgram(program, 1, &(opencl_ctx.device_id), build_opts, NULL, NULL);
+    status = clGetProgramBuildInfo(program, opencl_ctx.device_id,
+                                   CL_PROGRAM_BUILD_LOG, 0, NULL, &log_size);
     if (status != CL_SUCCESS) {
+        av_log(&opencl_ctx, AV_LOG_WARNING,
+               "Failed to get compilation log: %s\n",
+               av_opencl_errstr(status));
+    } else {
+        log = av_malloc(log_size);
+        if (log) {
+            status = clGetProgramBuildInfo(program, opencl_ctx.device_id,
+                                           CL_PROGRAM_BUILD_LOG, log_size,
+                                           log, NULL);
+            if (status != CL_SUCCESS) {
+                av_log(&opencl_ctx, AV_LOG_WARNING,
+                       "Failed to get compilation log: %s\n",
+                       av_opencl_errstr(status));
+            } else {
+                int level = build_status == CL_SUCCESS ? AV_LOG_DEBUG :
+                                                         AV_LOG_ERROR;
+                av_log(&opencl_ctx, level, "Compilation log:\n%s\n", log);
+            }
+        }
+        av_freep(&log);
+    }
+    if (build_status != CL_SUCCESS) {
         av_log(&opencl_ctx, AV_LOG_ERROR,
                "Compilation failed with OpenCL program '%s': %s\n",
-               program_name, av_opencl_errstr(status));
+               program_name, av_opencl_errstr(build_status));
         program = NULL;
         goto end;
     }



More information about the ffmpeg-cvslog mailing list