Grigori Goronzy <g...@chown.ath.cx> writes: > According to spec, CL_MEM_USE_HOST_PTR should directly use host memory, > if possible. This is just what userptr is for, so use it. > > In case the memory cannot be mapped, a fallback similar to > CL_MEM_COPY_HOST_PTR is used. > --- > src/gallium/state_trackers/clover/core/memory.cpp | 2 +- > src/gallium/state_trackers/clover/core/resource.cpp | 17 ++++++++++++++--- > 2 files changed, 15 insertions(+), 4 deletions(-) > > diff --git a/src/gallium/state_trackers/clover/core/memory.cpp > b/src/gallium/state_trackers/clover/core/memory.cpp > index 905ebc0..055336a 100644 > --- a/src/gallium/state_trackers/clover/core/memory.cpp > +++ b/src/gallium/state_trackers/clover/core/memory.cpp > @@ -30,7 +30,7 @@ memory_obj::memory_obj(clover::context &ctx, cl_mem_flags > flags, > size_t size, void *host_ptr) : > context(ctx), _flags(flags), > _size(size), _host_ptr(host_ptr) { > - if (flags & (CL_MEM_COPY_HOST_PTR | CL_MEM_USE_HOST_PTR)) > + if (flags & CL_MEM_COPY_HOST_PTR) > data.append((char *)host_ptr, size); > } > > diff --git a/src/gallium/state_trackers/clover/core/resource.cpp > b/src/gallium/state_trackers/clover/core/resource.cpp > index 8ed4c42..8e51b3c 100644 > --- a/src/gallium/state_trackers/clover/core/resource.cpp > +++ b/src/gallium/state_trackers/clover/core/resource.cpp > @@ -118,6 +118,8 @@ root_resource::root_resource(clover::device &dev, > memory_obj &obj, > command_queue &q, const std::string &data) : > resource(dev, obj) { > pipe_resource info {}; > + bool user_ptr_support = (bool)dev.pipe->get_param(dev.pipe,
Let's make this variable "const", and remove the cast to bool, it shouldn't be necessary. With that fixed: Reviewed-by: Francisco Jerez <curroje...@riseup.net> > + PIPE_CAP_RESOURCE_FROM_USER_MEMORY); > > if (image *img = dynamic_cast<image *>(&obj)) { > info.format = translate_format(img->format()); > @@ -137,7 +139,15 @@ root_resource::root_resource(clover::device &dev, > memory_obj &obj, > PIPE_BIND_TRANSFER_READ | > PIPE_BIND_TRANSFER_WRITE); > > - if (obj.flags() & CL_MEM_ALLOC_HOST_PTR) { > + if (obj.flags() & CL_MEM_USE_HOST_PTR && user_ptr_support) { > + // Page alignment is normally required for this, just try, hope for the > + // best and fall back if it fails. > + pipe = dev.pipe->resource_from_user_memory(dev.pipe, &info, > obj.host_ptr()); > + if (pipe) > + return; > + } > + > + if (obj.flags() & (CL_MEM_ALLOC_HOST_PTR | CL_MEM_USE_HOST_PTR)) { > info.usage = PIPE_USAGE_STAGING; > } > > @@ -145,12 +155,13 @@ root_resource::root_resource(clover::device &dev, > memory_obj &obj, > if (!pipe) > throw error(CL_OUT_OF_RESOURCES); > > - if (!data.empty()) { > + if (obj.flags() & (CL_MEM_USE_HOST_PTR | CL_MEM_COPY_HOST_PTR)) { > + const void *data_ptr = !data.empty() ? data.data() : obj.host_ptr(); > box rect { {{ 0, 0, 0 }}, {{ info.width0, info.height0, info.depth0 }} > }; > unsigned cpp = util_format_get_blocksize(info.format); > > q.pipe->transfer_inline_write(q.pipe, pipe, 0, PIPE_TRANSFER_WRITE, > - rect, data.data(), cpp * info.width0, > + rect, data_ptr, cpp * info.width0, > cpp * info.width0 * info.height0); > } > } > -- > 1.9.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
signature.asc
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev