Module: Mesa Branch: master Commit: afa5c2e993494fbd2b11f9726c0cfcf311784f99 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=afa5c2e993494fbd2b11f9726c0cfcf311784f99
Author: Jason Ekstrand <[email protected]> Date: Mon Aug 31 16:43:40 2020 -0500 clover: Pull the stride from pipe_transfer for image maps Reviewed-by: Francisco Jerez <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6578> --- src/gallium/frontends/clover/api/transfer.cpp | 77 +++++++++++++++++--------- src/gallium/frontends/clover/core/resource.cpp | 10 ++++ src/gallium/frontends/clover/core/resource.hpp | 2 + 3 files changed, 63 insertions(+), 26 deletions(-) diff --git a/src/gallium/frontends/clover/api/transfer.cpp b/src/gallium/frontends/clover/api/transfer.cpp index 0e39d976a89..aa21b001ce4 100644 --- a/src/gallium/frontends/clover/api/transfer.cpp +++ b/src/gallium/frontends/clover/api/transfer.cpp @@ -204,31 +204,57 @@ namespace { /// convertible to \a void *. /// template<typename T> - struct _map { - static mapping - get(command_queue &q, T obj, cl_map_flags flags, - size_t offset, size_t size) { - return { q, obj->resource(q), flags, true, - {{ offset }}, {{ size, 1, 1 }} }; + struct _map; + + template<> + struct _map<image*> { + _map(command_queue &q, image *img, cl_map_flags flags, + vector_t offset, vector_t pitch, vector_t region) : + map(q, img->resource(q), flags, true, offset, region), + pitch(map.pitch()) + { } + + template<typename T> + operator T *() const { + return static_cast<T *>(map); } + + mapping map; + vector_t pitch; }; template<> - struct _map<void *> { - static void * - get(command_queue &q, void *obj, cl_map_flags flags, - size_t offset, size_t size) { - return (char *)obj + offset; + struct _map<buffer*> { + _map(command_queue &q, buffer *mem, cl_map_flags flags, + vector_t offset, vector_t pitch, vector_t region) : + map(q, mem->resource(q), flags, true, + {{ dot(pitch, offset) }}, {{ size(pitch, region) }}), + pitch(pitch) + { } + + template<typename T> + operator T *() const { + return static_cast<T *>(map); } + + mapping map; + vector_t pitch; }; - template<> - struct _map<const void *> { - static const void * - get(command_queue &q, const void *obj, cl_map_flags flags, - size_t offset, size_t size) { - return (const char *)obj + offset; + template<typename P> + struct _map<P *> { + _map(command_queue &q, P *ptr, cl_map_flags flags, + vector_t offset, vector_t pitch, vector_t region) : + ptr((P *)((char *)ptr + dot(pitch, offset))), pitch(pitch) + { } + + template<typename T> + operator T *() const { + return static_cast<T *>(ptr); } + + P *ptr; + vector_t pitch; }; /// @@ -242,20 +268,19 @@ namespace { S src_obj, const vector_t &src_orig, const vector_t &src_pitch, const vector_t ®ion) { return [=, &q](event &) { - auto dst = _map<T>::get(q, dst_obj, CL_MAP_WRITE, - dot(dst_pitch, dst_orig), - size(dst_pitch, region)); - auto src = _map<S>::get(q, src_obj, CL_MAP_READ, - dot(src_pitch, src_orig), - size(src_pitch, region)); + _map<T> dst = { q, dst_obj, CL_MAP_WRITE, + dst_orig, dst_pitch, region }; + _map<S> src = { q, src_obj, CL_MAP_READ, + src_orig, src_pitch, region }; + assert(src.pitch[0] == dst.pitch[0]); vector_t v = {}; for (v[2] = 0; v[2] < region[2]; ++v[2]) { for (v[1] = 0; v[1] < region[1]; ++v[1]) { std::memcpy( - static_cast<char *>(dst) + dot(dst_pitch, v), - static_cast<const char *>(src) + dot(src_pitch, v), - src_pitch[0] * region[0]); + static_cast<char *>(dst) + dot(dst.pitch, v), + static_cast<const char *>(src) + dot(src.pitch, v), + src.pitch[0] * region[0]); } } }; diff --git a/src/gallium/frontends/clover/core/resource.cpp b/src/gallium/frontends/clover/core/resource.cpp index c3c6cce5f3b..89125c7656d 100644 --- a/src/gallium/frontends/clover/core/resource.cpp +++ b/src/gallium/frontends/clover/core/resource.cpp @@ -235,3 +235,13 @@ mapping::operator=(mapping m) { std::swap(p, m.p); return *this; } + +resource::vector +mapping::pitch() const +{ + return { + util_format_get_blocksize(pres->format), + pxfer->stride, + pxfer->layer_stride, + }; +} diff --git a/src/gallium/frontends/clover/core/resource.hpp b/src/gallium/frontends/clover/core/resource.hpp index 208016dd132..009e42f0769 100644 --- a/src/gallium/frontends/clover/core/resource.hpp +++ b/src/gallium/frontends/clover/core/resource.hpp @@ -125,6 +125,8 @@ namespace clover { return (T *)p; } + resource::vector pitch() const; + private: pipe_context *pctx; pipe_transfer *pxfer; _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
