diff options
author | Francisco Jerez <[email protected]> | 2014-06-14 21:03:02 +0200 |
---|---|---|
committer | Francisco Jerez <[email protected]> | 2014-06-19 20:17:19 +0200 |
commit | 4a39e5073a7d0cd8243c6f963567a9945265490c (patch) | |
tree | 22383d8abbb68291160e8607d0829fb2ef512b83 | |
parent | ab023c27a374bb69bd7300b5b6f0789844fc8ba9 (diff) |
clover: Calculate the serialized size of a module efficiently.
Tested-by: Tom Stellard <[email protected]>
-rw-r--r-- | src/gallium/state_trackers/clover/api/program.cpp | 5 | ||||
-rw-r--r-- | src/gallium/state_trackers/clover/core/module.cpp | 32 | ||||
-rw-r--r-- | src/gallium/state_trackers/clover/core/module.hpp | 1 |
3 files changed, 34 insertions, 4 deletions
diff --git a/src/gallium/state_trackers/clover/api/program.cpp b/src/gallium/state_trackers/clover/api/program.cpp index fedc91d531a..a14baa30e06 100644 --- a/src/gallium/state_trackers/clover/api/program.cpp +++ b/src/gallium/state_trackers/clover/api/program.cpp @@ -190,10 +190,7 @@ clGetProgramInfo(cl_program d_prog, cl_program_info param, case CL_PROGRAM_BINARY_SIZES: buf.as_vector<size_t>() = map([&](const device &dev) { - compat::ostream::buffer_t bin; - compat::ostream s(bin); - prog.binary(dev).serialize(s); - return bin.size(); + return prog.binary(dev).size(); }, prog.devices()); break; diff --git a/src/gallium/state_trackers/clover/core/module.cpp b/src/gallium/state_trackers/clover/core/module.cpp index 41de7344203..55ed91af799 100644 --- a/src/gallium/state_trackers/clover/core/module.cpp +++ b/src/gallium/state_trackers/clover/core/module.cpp @@ -52,6 +52,13 @@ namespace { return x; } + /// Calculate the size of the specified object. + template<typename T> + void + _proc(module::size_t &sz, const T &x) { + _serializer<T>::proc(sz, x); + } + /// (De)serialize a scalar value. template<typename T> struct _serializer<T, typename std::enable_if< @@ -65,6 +72,11 @@ namespace { proc(compat::istream &is, T &x) { is.read(reinterpret_cast<char *>(&x), sizeof(x)); } + + static void + proc(module::size_t &sz, const T &x) { + sz += sizeof(x); + } }; /// (De)serialize a vector. @@ -87,6 +99,14 @@ namespace { for (size_t i = 0; i < v.size(); i++) new(&v[i]) T(_proc<T>(is)); } + + static void + proc(module::size_t &sz, const compat::vector<T> &v) { + sz += sizeof(uint32_t); + + for (size_t i = 0; i < v.size(); i++) + _proc<T>(sz, v[i]); + } }; template<typename T> @@ -106,6 +126,11 @@ namespace { is.read(reinterpret_cast<char *>(v.begin()), v.size() * sizeof(T)); } + + static void + proc(module::size_t &sz, const compat::vector<T> &v) { + sz += sizeof(uint32_t) + sizeof(T) * v.size(); + } }; /// (De)serialize a module::section. @@ -170,4 +195,11 @@ namespace clover { module::deserialize(compat::istream &is) { return _proc<module>(is); } + + module::size_t + module::size() const { + size_t sz = 0; + _proc(sz, *this); + return sz; + } } diff --git a/src/gallium/state_trackers/clover/core/module.hpp b/src/gallium/state_trackers/clover/core/module.hpp index 4a8dbcb4949..18a5bfb24c3 100644 --- a/src/gallium/state_trackers/clover/core/module.hpp +++ b/src/gallium/state_trackers/clover/core/module.hpp @@ -105,6 +105,7 @@ namespace clover { void serialize(compat::ostream &os) const; static module deserialize(compat::istream &is); + size_t size() const; compat::vector<symbol> syms; compat::vector<section> secs; |