From: Karol Herbst Date: Wed, 7 Oct 2020 21:08:43 +0000 (+0200) Subject: clover: use pipe_image_view for images instead of set_compute_resources X-Git-Tag: upstream/21.0.0~3526 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3aead7198bcbb5ed0b58b3c84119f1ce28793f70;p=platform%2Fupstream%2Fmesa.git clover: use pipe_image_view for images instead of set_compute_resources Long term we want to git rid of set_compute_resources, this is just one piece. The other bit would be to use the proper const buffer interfaces, but because that path is only hit with r600/radeonsi I won't touch it. Reviewed-by: Dave Airlie Reviewed-by: Francisco Jerez Part-of: --- diff --git a/src/gallium/frontends/clover/core/kernel.cpp b/src/gallium/frontends/clover/core/kernel.cpp index 4cc1214..76a03b1 100644 --- a/src/gallium/frontends/clover/core/kernel.cpp +++ b/src/gallium/frontends/clover/core/kernel.cpp @@ -83,6 +83,8 @@ kernel::launch(command_queue &q, q.pipe->set_sampler_views(q.pipe, PIPE_SHADER_COMPUTE, 0, exec.sviews.size(), exec.sviews.data()); + q.pipe->set_shader_images(q.pipe, PIPE_SHADER_COMPUTE, 0, + exec.iviews.size(), exec.iviews.data()); q.pipe->set_compute_resources(q.pipe, 0, exec.resources.size(), exec.resources.data()); q.pipe->set_global_binding(q.pipe, 0, exec.g_buffers.size(), @@ -99,6 +101,8 @@ kernel::launch(command_queue &q, q.pipe->set_global_binding(q.pipe, 0, exec.g_buffers.size(), NULL, NULL); q.pipe->set_compute_resources(q.pipe, 0, exec.resources.size(), NULL); + q.pipe->set_shader_images(q.pipe, PIPE_SHADER_COMPUTE, 0, + exec.iviews.size(), NULL); q.pipe->set_sampler_views(q.pipe, PIPE_SHADER_COMPUTE, 0, exec.sviews.size(), NULL); q.pipe->bind_sampler_states(q.pipe, PIPE_SHADER_COMPUTE, 0, @@ -279,6 +283,7 @@ kernel::exec_context::unbind() { input.clear(); samplers.clear(); sviews.clear(); + iviews.clear(); resources.clear(); g_buffers.clear(); g_handles.clear(); @@ -599,20 +604,17 @@ kernel::image_wr_argument::set(size_t size, const void *value) { void kernel::image_wr_argument::bind(exec_context &ctx, const module::argument &marg) { - auto v = bytes(ctx.resources.size()); + auto v = bytes(ctx.iviews.size()); extend(v, module::argument::zero_ext, marg.target_size); byteswap(v, ctx.q->device().endianness()); align(ctx.input, marg.target_align); insert(ctx.input, v); - - st = img->resource_in(*ctx.q).bind_surface(*ctx.q, true); - ctx.resources.push_back(st); + ctx.iviews.push_back(img->resource_in(*ctx.q).create_image_view(*ctx.q)); } void kernel::image_wr_argument::unbind(exec_context &ctx) { - img->resource_in(*ctx.q).unbind_surface(*ctx.q, st); } void diff --git a/src/gallium/frontends/clover/core/kernel.hpp b/src/gallium/frontends/clover/core/kernel.hpp index d7185bc..31967b6 100644 --- a/src/gallium/frontends/clover/core/kernel.hpp +++ b/src/gallium/frontends/clover/core/kernel.hpp @@ -57,6 +57,7 @@ namespace clover { std::vector input; std::vector samplers; std::vector sviews; + std::vector iviews; std::vector resources; std::vector g_buffers; std::vector g_handles; @@ -226,9 +227,6 @@ namespace clover { virtual void bind(exec_context &ctx, const module::argument &marg); virtual void unbind(exec_context &ctx); - - private: - pipe_surface *st; }; class sampler_argument : public argument { diff --git a/src/gallium/frontends/clover/core/resource.cpp b/src/gallium/frontends/clover/core/resource.cpp index c21073e..4315204 100644 --- a/src/gallium/frontends/clover/core/resource.cpp +++ b/src/gallium/frontends/clover/core/resource.cpp @@ -112,6 +112,26 @@ resource::unbind_sampler_view(command_queue &q, q.pipe->sampler_view_destroy(q.pipe, st); } +pipe_image_view +resource::create_image_view(command_queue &q) { + pipe_image_view view; + view.resource = pipe; + view.format = pipe->format; + view.access = 0; + view.shader_access = PIPE_IMAGE_ACCESS_WRITE; + + if (pipe->target == PIPE_BUFFER) { + view.u.buf.offset = 0; + view.u.buf.size = obj.size(); + } else { + view.u.tex.first_layer = 0; + view.u.tex.last_layer = 0; + view.u.tex.level = 0; + } + + return view; +} + pipe_surface * resource::bind_surface(command_queue &q, bool rw) { pipe_surface info {}; diff --git a/src/gallium/frontends/clover/core/resource.hpp b/src/gallium/frontends/clover/core/resource.hpp index d4d7615..562f410 100644 --- a/src/gallium/frontends/clover/core/resource.hpp +++ b/src/gallium/frontends/clover/core/resource.hpp @@ -75,6 +75,8 @@ namespace clover { pipe_surface *bind_surface(command_queue &q, bool rw); void unbind_surface(command_queue &q, pipe_surface *st); + pipe_image_view create_image_view(command_queue &q); + pipe_resource *pipe; vector offset;