From 64b0fac5e25370224b383c748f1a56b4ef1eb2d6 Mon Sep 17 00:00:00 2001 From: Tom Stellard Date: Tue, 21 Oct 2014 10:33:21 -0400 Subject: [PATCH] clover: Fix bug when binary programs are passed to clBuildProgram() v2 This was a regression introduced by 611d66fe4513e53bde052dd2bab95d448c909a2a Passing a binary program to clBuildProgram() is legal, but passing one to clCompileProgram() is not. v2: - Code cleanups. Reviewed-by: Francisco Jerez --- .../state_trackers/clover/api/program.cpp | 18 +++++++++++++----- .../state_trackers/clover/core/program.hpp | 2 +- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/gallium/state_trackers/clover/api/program.cpp b/src/gallium/state_trackers/clover/api/program.cpp index e32312eec1b..64c4a43f4b3 100644 --- a/src/gallium/state_trackers/clover/api/program.cpp +++ b/src/gallium/state_trackers/clover/api/program.cpp @@ -171,12 +171,20 @@ CLOVER_API cl_int clBuildProgram(cl_program d_prog, cl_uint num_devs, const cl_device_id *d_devs, const char *p_opts, void (*pfn_notify)(cl_program, void *), - void *user_data) { - cl_int ret = clCompileProgram(d_prog, num_devs, d_devs, p_opts, - 0, NULL, NULL, pfn_notify, user_data); + void *user_data) try { + auto &prog = obj(d_prog); + auto devs = (d_devs ? objs(d_devs, num_devs) : + ref_vector(prog.context().devices())); + auto opts = (p_opts ? p_opts : ""); - return (ret == CL_COMPILE_PROGRAM_FAILURE ? - CL_BUILD_PROGRAM_FAILURE : ret); + validate_build_program_common(prog, num_devs, devs, pfn_notify, user_data); + + prog.build(devs, opts); + return CL_SUCCESS; +} catch (error &e) { + if (e.get() == CL_COMPILE_PROGRAM_FAILURE) + return CL_BUILD_PROGRAM_FAILURE; + return e.get(); } CLOVER_API cl_int diff --git a/src/gallium/state_trackers/clover/core/program.hpp b/src/gallium/state_trackers/clover/core/program.hpp index b5aae7e0dff..661fa03102c 100644 --- a/src/gallium/state_trackers/clover/core/program.hpp +++ b/src/gallium/state_trackers/clover/core/program.hpp @@ -48,7 +48,7 @@ namespace clover { operator=(const program &prog) = delete; void build(const ref_vector &devs, const char *opts, - const header_map &headers); + const header_map &headers = {}); const bool has_source; const std::string &source() const; -- 2.30.2