[Mesa-dev] [RFC PATCH 14/17] clover: Accept SPIR-V binaries in clCreateProgramWithBinary
Pierre Moreau
pierre.morrow at free.fr
Wed May 3 21:57:02 UTC 2017
Signed-off-by: Pierre Moreau <pierre.morrow at free.fr>
---
src/gallium/state_trackers/clover/api/program.cpp | 35 ++++++++++++++++-------
1 file changed, 25 insertions(+), 10 deletions(-)
diff --git a/src/gallium/state_trackers/clover/api/program.cpp b/src/gallium/state_trackers/clover/api/program.cpp
index 9d59668f8f..5f5971078d 100644
--- a/src/gallium/state_trackers/clover/api/program.cpp
+++ b/src/gallium/state_trackers/clover/api/program.cpp
@@ -22,6 +22,8 @@
#include "api/util.hpp"
#include "core/program.hpp"
+#include "spirv/invocation.hpp"
+#include "spirv/spirv_utils.h"
#include "util/u_debug.h"
#include <sstream>
@@ -92,22 +94,35 @@ clCreateProgramWithBinary(cl_context d_ctx, cl_uint n,
// Deserialize the provided binaries,
std::vector<std::pair<cl_int, module>> result = map(
- [](const unsigned char *p, size_t l) -> std::pair<cl_int, module> {
+ [](const unsigned char *p, size_t l, device &dev) -> std::pair<cl_int, module> {
if (!p || !l)
return { CL_INVALID_VALUE, {} };
- try {
- std::stringbuf bin( { (char*)p, l } );
- std::istream s(&bin);
-
- return { CL_SUCCESS, module::deserialize(s) };
-
- } catch (std::istream::failure &e) {
- return { CL_INVALID_BINARY, {} };
+ if (spirv_is_binary_spirv(reinterpret_cast<const char *>(p))) {
+ if (!dev.supports_ir(PIPE_SHADER_IR_SPIRV))
+ return { CL_INVALID_BINARY, {} };
+
+ try {
+ std::string log;
+ return { CL_SUCCESS, spirv::process_program(p, l, true, log) };
+ } catch (build_error &e) {
+ return { CL_INVALID_BINARY, {} };
+ }
+ } else {
+ try {
+ std::stringbuf bin( { (char*)p, l } );
+ std::istream s(&bin);
+
+ return { CL_SUCCESS, module::deserialize(s) };
+
+ } catch (std::istream::failure &e) {
+ return { CL_INVALID_BINARY, {} };
+ }
}
},
range(binaries, n),
- range(lengths, n));
+ range(lengths, n),
+ devs);
// update the status array,
if (r_status)
--
2.12.2
More information about the mesa-dev
mailing list