I've pushed this patch, thanks! -Tom
On Wed, Apr 29, 2015 at 08:22:02AM +0200, EdB wrote: > > --- > src/gallium/state_trackers/clover/Makefile.sources | 1 - > src/gallium/state_trackers/clover/api/program.cpp | 14 +- > .../state_trackers/clover/core/compiler.hpp | 4 +- > src/gallium/state_trackers/clover/core/error.hpp | 2 - > src/gallium/state_trackers/clover/core/kernel.cpp | 2 +- > src/gallium/state_trackers/clover/core/module.cpp | 39 +-- > src/gallium/state_trackers/clover/core/module.hpp | 19 +- > src/gallium/state_trackers/clover/core/program.cpp | 2 +- > src/gallium/state_trackers/clover/core/program.hpp | 2 +- > .../state_trackers/clover/llvm/invocation.cpp | 20 +- > .../state_trackers/clover/tgsi/compiler.cpp | 5 +- > src/gallium/state_trackers/clover/util/compat.hpp | 313 > --------------------- > 12 files changed, 56 insertions(+), 367 deletions(-) > delete mode 100644 src/gallium/state_trackers/clover/util/compat.hpp > > diff --git a/src/gallium/state_trackers/clover/Makefile.sources > b/src/gallium/state_trackers/clover/Makefile.sources > index 03eb754..fa96774 100644 > --- a/src/gallium/state_trackers/clover/Makefile.sources > +++ b/src/gallium/state_trackers/clover/Makefile.sources > @@ -45,7 +45,6 @@ CPP_SOURCES := \ > util/adaptor.hpp \ > util/algebra.hpp \ > util/algorithm.hpp \ > - util/compat.hpp \ > util/factor.hpp \ > util/functional.hpp \ > util/lazy.hpp \ > diff --git a/src/gallium/state_trackers/clover/api/program.cpp > b/src/gallium/state_trackers/clover/api/program.cpp > index 913d195..e9b1f38 100644 > --- a/src/gallium/state_trackers/clover/api/program.cpp > +++ b/src/gallium/state_trackers/clover/api/program.cpp > @@ -23,6 +23,8 @@ > #include "api/util.hpp" > #include "core/program.hpp" > > +#include <sstream> > + > using namespace clover; > > namespace { > @@ -94,12 +96,12 @@ clCreateProgramWithBinary(cl_context d_ctx, > cl_uint n, > return { CL_INVALID_VALUE, {} }; > > try { > - compat::istream::buffer_t bin(p, l); > - compat::istream s(bin); > + std::stringbuf bin( { (char*)p, l } ); > + std::istream s(&bin); > > return { CL_SUCCESS, module::deserialize(s) }; > > - } catch (compat::istream::error &e) { > + } catch (std::istream::failure &e) { > return { CL_INVALID_BINARY, {} }; > } > }, > @@ -279,10 +281,10 @@ clGetProgramInfo(cl_program d_prog, > cl_program_info param, > > case CL_PROGRAM_BINARIES: > buf.as_matrix<unsigned char>() = map([&](const device &dev) { > - compat::ostream::buffer_t bin; > - compat::ostream s(bin); > + std::stringbuf bin; > + std::ostream s(&bin); > prog.binary(dev).serialize(s); > - return bin; > + return bin.str(); > }, > prog.devices()); > break; > diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp > b/src/gallium/state_trackers/clover/core/compiler.hpp > index 62c0f47..c68aa39 100644 > --- a/src/gallium/state_trackers/clover/core/compiler.hpp > +++ b/src/gallium/state_trackers/clover/core/compiler.hpp > @@ -23,14 +23,12 @@ > #ifndef CLOVER_CORE_COMPILER_HPP > #define CLOVER_CORE_COMPILER_HPP > > -#include "util/compat.hpp" > #include "core/error.hpp" > #include "core/module.hpp" > #include "pipe/p_defines.h" > > namespace clover { > - typedef compat::vector<std::pair<std::string, > - std::string> > header_map; > + typedef std::vector<std::pair<std::string, std::string> > > header_map; > > module compile_program_llvm(const std::string &source, > const header_map &headers, > diff --git a/src/gallium/state_trackers/clover/core/error.hpp > b/src/gallium/state_trackers/clover/core/error.hpp > index 805a0ec..eb65d62 100644 > --- a/src/gallium/state_trackers/clover/core/error.hpp > +++ b/src/gallium/state_trackers/clover/core/error.hpp > @@ -27,8 +27,6 @@ > > #include <stdexcept> > > -#include "util/compat.hpp" > - > namespace clover { > class command_queue; > class context; > diff --git a/src/gallium/state_trackers/clover/core/kernel.cpp > b/src/gallium/state_trackers/clover/core/kernel.cpp > index 442762c..0756f06 100644 > --- a/src/gallium/state_trackers/clover/core/kernel.cpp > +++ b/src/gallium/state_trackers/clover/core/kernel.cpp > @@ -192,7 +192,7 @@ > kernel::exec_context::bind(intrusive_ptr<command_queue> _q, > if (st) > _q->pipe->delete_compute_state(_q->pipe, st); > > - cs.prog = msec.data.begin(); > + cs.prog = &(msec.data[0]); > cs.req_local_mem = mem_local; > cs.req_input_mem = input.size(); > st = q->pipe->create_compute_state(q->pipe, &cs); > diff --git a/src/gallium/state_trackers/clover/core/module.cpp > b/src/gallium/state_trackers/clover/core/module.cpp > index f098b05..a6c5b98 100644 > --- a/src/gallium/state_trackers/clover/core/module.cpp > +++ b/src/gallium/state_trackers/clover/core/module.cpp > @@ -21,6 +21,7 @@ > // > > #include <type_traits> > +#include <iostream> > > #include "core/module.hpp" > > @@ -33,20 +34,20 @@ namespace { > /// Serialize the specified object. > template<typename T> > void > - _proc(compat::ostream &os, const T &x) { > + _proc(std::ostream &os, const T &x) { > _serializer<T>::proc(os, x); > } > > /// Deserialize the specified object. > template<typename T> > void > - _proc(compat::istream &is, T &x) { > + _proc(std::istream &is, T &x) { > _serializer<T>::proc(is, x); > } > > template<typename T> > T > - _proc(compat::istream &is) { > + _proc(std::istream &is) { > T x; > _serializer<T>::proc(is, x); > return x; > @@ -64,12 +65,12 @@ namespace { > struct _serializer<T, typename std::enable_if< > std::is_scalar<T>::value>::type> { > static void > - proc(compat::ostream &os, const T &x) { > + proc(std::ostream &os, const T &x) { > os.write(reinterpret_cast<const char *>(&x), sizeof(x)); > } > > static void > - proc(compat::istream &is, T &x) { > + proc(std::istream &is, T &x) { > is.read(reinterpret_cast<char *>(&x), sizeof(x)); > } > > @@ -81,11 +82,11 @@ namespace { > > /// (De)serialize a vector. > template<typename T> > - struct _serializer<compat::vector<T>, > + struct _serializer<std::vector<T>, > typename std::enable_if< > !std::is_scalar<T>::value>::type> { > static void > - proc(compat::ostream &os, const compat::vector<T> &v) { > + proc(std::ostream &os, const std::vector<T> &v) { > _proc<uint32_t>(os, v.size()); > > for (size_t i = 0; i < v.size(); i++) > @@ -93,7 +94,7 @@ namespace { > } > > static void > - proc(compat::istream &is, compat::vector<T> &v) { > + proc(std::istream &is, std::vector<T> &v) { > v.resize(_proc<uint32_t>(is)); > > for (size_t i = 0; i < v.size(); i++) > @@ -101,7 +102,7 @@ namespace { > } > > static void > - proc(module::size_t &sz, const compat::vector<T> &v) { > + proc(module::size_t &sz, const std::vector<T> &v) { > sz += sizeof(uint32_t); > > for (size_t i = 0; i < v.size(); i++) > @@ -110,25 +111,25 @@ namespace { > }; > > template<typename T> > - struct _serializer<compat::vector<T>, > + struct _serializer<std::vector<T>, > typename std::enable_if< > std::is_scalar<T>::value>::type> { > static void > - proc(compat::ostream &os, const compat::vector<T> &v) { > + proc(std::ostream &os, const std::vector<T> &v) { > _proc<uint32_t>(os, v.size()); > - os.write(reinterpret_cast<const char *>(v.begin()), > + os.write(reinterpret_cast<const char *>(&v[0]), > v.size() * sizeof(T)); > } > > static void > - proc(compat::istream &is, compat::vector<T> &v) { > + proc(std::istream &is, std::vector<T> &v) { > v.resize(_proc<uint32_t>(is)); > - is.read(reinterpret_cast<char *>(v.begin()), > + is.read(reinterpret_cast<char *>(&v[0]), > v.size() * sizeof(T)); > } > > static void > - proc(module::size_t &sz, const compat::vector<T> &v) { > + proc(module::size_t &sz, const std::vector<T> &v) { > sz += sizeof(uint32_t) + sizeof(T) * v.size(); > } > }; > @@ -137,13 +138,13 @@ namespace { > template<> > struct _serializer<std::string> { > static void > - proc(compat::ostream &os, const std::string &s) { > + proc(std::ostream &os, const std::string &s) { > _proc<uint32_t>(os, s.size()); > os.write(&s[0], s.size() * sizeof(std::string::value_type)); > } > > static void > - proc(compat::istream &is, std::string &s) { > + proc(std::istream &is, std::string &s) { > s.resize(_proc<uint32_t>(is)); > is.read(&s[0], s.size() * sizeof(std::string::value_type)); > } > @@ -209,12 +210,12 @@ namespace { > > namespace clover { > void > - module::serialize(compat::ostream &os) const { > + module::serialize(std::ostream &os) const { > _proc(os, *this); > } > > module > - module::deserialize(compat::istream &is) { > + module::deserialize(std::istream &is) { > return _proc<module>(is); > } > > diff --git a/src/gallium/state_trackers/clover/core/module.hpp > b/src/gallium/state_trackers/clover/core/module.hpp > index 46112a3..9d65688 100644 > --- a/src/gallium/state_trackers/clover/core/module.hpp > +++ b/src/gallium/state_trackers/clover/core/module.hpp > @@ -23,7 +23,8 @@ > #ifndef CLOVER_CORE_MODULE_HPP > #define CLOVER_CORE_MODULE_HPP > > -#include "util/compat.hpp" > +#include <vector> > +#include <string> > > namespace clover { > struct module { > @@ -40,14 +41,14 @@ namespace clover { > }; > > section(resource_id id, enum type type, size_t size, > - const compat::vector<char> &data) : > + const std::vector<char> &data) : > id(id), type(type), size(size), data(data) { } > section() : id(0), type(text), size(0), data() { } > > resource_id id; > type type; > size_t size; > - compat::vector<char> data; > + std::vector<char> data; > }; > > struct argument { > @@ -101,22 +102,22 @@ namespace clover { > > struct symbol { > symbol(const std::string &name, resource_id section, > - size_t offset, const compat::vector<argument> &args) : > + size_t offset, const std::vector<argument> &args) : > name(name), section(section), offset(offset), > args(args) { } > symbol() : name(), section(0), offset(0), args() { } > > std::string name; > resource_id section; > size_t offset; > - compat::vector<argument> args; > + std::vector<argument> args; > }; > > - void serialize(compat::ostream &os) const; > - static module deserialize(compat::istream &is); > + void serialize(std::ostream &os) const; > + static module deserialize(std::istream &is); > size_t size() const; > > - compat::vector<symbol> syms; > - compat::vector<section> secs; > + std::vector<symbol> syms; > + std::vector<section> secs; > }; > } > > diff --git a/src/gallium/state_trackers/clover/core/program.cpp > b/src/gallium/state_trackers/clover/core/program.cpp > index 50ac01b..0d6cc40 100644 > --- a/src/gallium/state_trackers/clover/core/program.cpp > +++ b/src/gallium/state_trackers/clover/core/program.cpp > @@ -106,7 +106,7 @@ program::build_log(const device &dev) const { > return _logs.count(&dev) ? _logs.find(&dev)->second : ""; > } > > -const compat::vector<module::symbol> & > +const std::vector<module::symbol> & > program::symbols() const { > if (_binaries.empty()) > throw error(CL_INVALID_PROGRAM_EXECUTABLE); > diff --git a/src/gallium/state_trackers/clover/core/program.hpp > b/src/gallium/state_trackers/clover/core/program.hpp > index 661fa03..183145e 100644 > --- a/src/gallium/state_trackers/clover/core/program.hpp > +++ b/src/gallium/state_trackers/clover/core/program.hpp > @@ -60,7 +60,7 @@ namespace clover { > std::string build_opts(const device &dev) const; > std::string build_log(const device &dev) const; > > - const compat::vector<module::symbol> &symbols() const; > + const std::vector<module::symbol> &symbols() const; > > unsigned kernel_ref_count() const; > > diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp > b/src/gallium/state_trackers/clover/llvm/invocation.cpp > index 2157909..7d2d941 100644 > --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp > +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp > @@ -340,11 +340,11 @@ namespace { > PM.run(*mod); > } > > - compat::vector<module::argument> > + std::vector<module::argument> > get_kernel_args(const llvm::Module *mod, const std::string > &kernel_name, > const clang::LangAS::Map &address_spaces) { > > - compat::vector<module::argument> args; > + std::vector<module::argument> args; > llvm::Function *kernel_func = mod->getFunction(kernel_name); > > llvm::DataLayout TD(mod); > @@ -449,15 +449,16 @@ namespace { > > for (unsigned i = 0; i < kernels.size(); ++i) { > std::string kernel_name = kernels[i]->getName(); > - compat::vector<module::argument> args = > + std::vector<module::argument> args = > get_kernel_args(mod, kernel_name, address_spaces); > > m.syms.push_back(module::symbol(kernel_name, 0, i, args )); > } > > header.num_bytes = llvm_bitcode.size(); > - std::string data; > - data.insert(0, (char*)(&header), sizeof(header)); > + std::vector<char> data; > + data.insert(data.end(), (char*)(&header), > + (char*)(&header) + sizeof(header)); > data.insert(data.end(), llvm_bitcode.begin(), > llvm_bitcode.end()); > m.secs.push_back(module::section(0, module::section::text, > @@ -622,15 +623,16 @@ namespace { > > // Store the generated ELF binary in the module's text section. > header.num_bytes = code.size(); > - std::string data; > - data.append((char*)(&header), sizeof(header)); > - data.append(code.begin(), code.end()); > + std::vector<char> data; > + data.insert(data.end(), (char*)(&header), > + (char*)(&header) + sizeof(header)); > + data.insert(data.end(), code.begin(), code.end()); > m.secs.push_back(module::section(0, module::section::text, > header.num_bytes, data)); > > for (std::map<std::string, unsigned>::iterator i = > kernel_offsets.begin(), > e = kernel_offsets.end(); i != e; ++i) { > - compat::vector<module::argument> args = > + std::vector<module::argument> args = > get_kernel_args(mod, i->first, address_spaces); > m.syms.push_back(module::symbol(i->first, 0, i->second, > args )); > } > diff --git a/src/gallium/state_trackers/clover/tgsi/compiler.cpp > b/src/gallium/state_trackers/clover/tgsi/compiler.cpp > index 9e959f7..b70104e 100644 > --- a/src/gallium/state_trackers/clover/tgsi/compiler.cpp > +++ b/src/gallium/state_trackers/clover/tgsi/compiler.cpp > @@ -40,7 +40,7 @@ namespace { > std::istringstream ts(line); > std::string name, tok; > module::size_t offset; > - compat::vector<module::argument> args; > + std::vector<module::argument> args; > > if (!(ts >> name)) > continue; > @@ -83,7 +83,8 @@ namespace { > throw build_error("translate failed"); > > unsigned sz = tgsi_num_tokens(prog) * sizeof(tgsi_token); > - m.secs.push_back({ 0, module::section::text, sz, { (char > *)prog, sz } }); > + std::vector<char> data( (char *)prog, (char *)prog + sz ); > + m.secs.push_back({ 0, module::section::text, sz, data }); > } > } > > diff --git a/src/gallium/state_trackers/clover/util/compat.hpp > b/src/gallium/state_trackers/clover/util/compat.hpp > deleted file mode 100644 > index dc06334..0000000 > --- a/src/gallium/state_trackers/clover/util/compat.hpp > +++ /dev/null > @@ -1,313 +0,0 @@ > -// > -// Copyright 2012 Francisco Jerez > -// > -// Permission is hereby granted, free of charge, to any person > obtaining a > -// copy of this software and associated documentation files (the > "Software"), > -// to deal in the Software without restriction, including without > limitation > -// the rights to use, copy, modify, merge, publish, distribute, > sublicense, > -// and/or sell copies of the Software, and to permit persons to > whom the > -// Software is furnished to do so, subject to the following conditions: > -// > -// The above copyright notice and this permission notice shall be > included in > -// all copies or substantial portions of the Software. > -// > -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, > EXPRESS OR > -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF > MERCHANTABILITY, > -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO > EVENT SHALL > -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR > -// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR > OTHERWISE, > -// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE > USE OR > -// OTHER DEALINGS IN THE SOFTWARE. > -// > - > -#ifndef CLOVER_UTIL_COMPAT_HPP > -#define CLOVER_UTIL_COMPAT_HPP > - > -#include <new> > -#include <cstring> > -#include <cstdlib> > -#include <string> > -#include <stdint.h> > - > -namespace clover { > - namespace compat { > - // XXX - For cases where we can't rely on STL... I.e. the > - // interface between code compiled as C++98 and C++11 > - // source. Get rid of this as soon as everything can be > - // compiled as C++11. > - > - namespace detail { > - template<typename R, typename S> > - bool > - ranges_equal(const R &a, const S &b) { > - if (a.size() != b.size()) > - return false; > - > - for (size_t i = 0; i < a.size(); ++i) > - if (a[i] != b[i]) > - return false; > - > - return true; > - } > - } > - > - template<typename T> > - class vector { > - protected: > - static T * > - alloc(int n, const T *q, int m) { > - T *p = reinterpret_cast<T *>(std::malloc(n * sizeof(T))); > - > - for (int i = 0; i < m; ++i) > - new(&p[i]) T(q[i]); > - > - return p; > - } > - > - static void > - free(int n, T *p) { > - for (int i = 0; i < n; ++i) > - p[i].~T(); > - > - std::free(p); > - } > - > - public: > - typedef T *iterator; > - typedef const T *const_iterator; > - typedef T value_type; > - typedef T &reference; > - typedef const T &const_reference; > - typedef std::ptrdiff_t difference_type; > - typedef std::size_t size_type; > - > - vector() : p(NULL), _size(0), _capacity(0) { > - } > - > - vector(const vector &v) : > - p(alloc(v._size, v.p, v._size)), > - _size(v._size), _capacity(v._size) { > - } > - > - vector(const_iterator p, size_type n) : > - p(alloc(n, p, n)), _size(n), _capacity(n) { > - } > - > - template<typename C> > - vector(const C &v) : > - p(alloc(v.size(), NULL, 0)), _size(0), > - _capacity(v.size()) { > - for (typename C::const_iterator it = v.begin(); it != > v.end(); ++it) > - new(&p[_size++]) T(*it); > - } > - > - ~vector() { > - free(_size, p); > - } > - > - vector & > - operator=(const vector &v) { > - free(_size, p); > - > - p = alloc(v._size, v.p, v._size); > - _size = v._size; > - _capacity = v._size; > - > - return *this; > - } > - > - bool > - operator==(const vector &v) const { > - return detail::ranges_equal(*this, v); > - } > - > - void > - reserve(size_type n) { > - if (_capacity < n) { > - T *q = alloc(n, p, _size); > - free(_size, p); > - > - p = q; > - _capacity = n; > - } > - } > - > - void > - resize(size_type n, T x = T()) { > - if (n <= _size) { > - for (size_type i = n; i < _size; ++i) > - p[i].~T(); > - > - } else { > - reserve(n); > - > - for (size_type i = _size; i < n; ++i) > - new(&p[i]) T(x); > - } > - > - _size = n; > - } > - > - void > - push_back(const T &x) { > - reserve(_size + 1); > - new(&p[_size]) T(x); > - ++_size; > - } > - > - size_type > - size() const { > - return _size; > - } > - > - size_type > - capacity() const { > - return _capacity; > - } > - > - iterator > - begin() { > - return p; > - } > - > - const_iterator > - begin() const { > - return p; > - } > - > - iterator > - end() { > - return p + _size; > - } > - > - const_iterator > - end() const { > - return p + _size; > - } > - > - reference > - operator[](size_type i) { > - return p[i]; > - } > - > - const_reference > - operator[](size_type i) const { > - return p[i]; > - } > - > - private: > - iterator p; > - size_type _size; > - size_type _capacity; > - }; > - > - template<typename T> > - class vector_ref { > - public: > - typedef T *iterator; > - typedef const T *const_iterator; > - typedef T value_type; > - typedef T &reference; > - typedef const T &const_reference; > - typedef std::ptrdiff_t difference_type; > - typedef std::size_t size_type; > - > - vector_ref(iterator p, size_type n) : p(p), n(n) { > - } > - > - template<typename C> > - vector_ref(C &v) : p(&*v.begin()), n(v.size()) { > - } > - > - bool > - operator==(const vector_ref &v) const { > - return detail::ranges_equal(*this, v); > - } > - > - size_type > - size() const { > - return n; > - } > - > - iterator > - begin() { > - return p; > - } > - > - const_iterator > - begin() const { > - return p; > - } > - > - iterator > - end() { > - return p + n; > - } > - > - const_iterator > - end() const { > - return p + n; > - } > - > - reference > - operator[](int i) { > - return p[i]; > - } > - > - const_reference > - operator[](int i) const { > - return p[i]; > - } > - > - private: > - iterator p; > - size_type n; > - }; > - > - class istream { > - public: > - typedef vector_ref<const unsigned char> buffer_t; > - > - class error { > - public: > - virtual ~error() {} > - }; > - > - istream(const buffer_t &buf) : buf(buf), offset(0) {} > - > - void > - read(char *p, size_t n) { > - if (offset + n > buf.size()) > - throw error(); > - > - std::memcpy(p, buf.begin() + offset, n); > - offset += n; > - } > - > - private: > - const buffer_t &buf; > - size_t offset; > - }; > - > - class ostream { > - public: > - typedef vector<unsigned char> buffer_t; > - > - ostream(buffer_t &buf) : buf(buf), offset(buf.size()) {} > - > - void > - write(const char *p, size_t n) { > - buf.resize(offset + n); > - std::memcpy(buf.begin() + offset, p, n); > - offset += n; > - } > - > - private: > - buffer_t &buf; > - size_t offset; > - }; > - > - } > -} > - > -#endif > -- > 2.3.6 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev