diff options
author | Zoltan Gilian <[email protected]> | 2015-07-27 11:34:07 +0200 |
---|---|---|
committer | Zoltan Gilian <[email protected]> | 2015-08-03 13:31:16 +0200 |
commit | 9ef5b7a23348291893a6bf61fcce7a306e787add (patch) | |
tree | e28c88b9a3be2b4bd87492907fd7ee9f404a1618 /src/gallium/state_trackers/clover/core | |
parent | d2cd2c69b20fcb3f1fc3b7671745c5c84ef200cb (diff) |
clover: pass image attributes to the kernel
Read-only and write-only image arguments are recognized and
distinguished.
Attributes of the image arguments are passed to the kernel as implicit
arguments.
Diffstat (limited to 'src/gallium/state_trackers/clover/core')
-rw-r--r-- | src/gallium/state_trackers/clover/core/kernel.cpp | 28 | ||||
-rw-r--r-- | src/gallium/state_trackers/clover/core/kernel.hpp | 15 | ||||
-rw-r--r-- | src/gallium/state_trackers/clover/core/module.hpp | 4 |
3 files changed, 42 insertions, 5 deletions
diff --git a/src/gallium/state_trackers/clover/core/kernel.cpp b/src/gallium/state_trackers/clover/core/kernel.cpp index 0756f068553..955ff7b3955 100644 --- a/src/gallium/state_trackers/clover/core/kernel.cpp +++ b/src/gallium/state_trackers/clover/core/kernel.cpp @@ -182,6 +182,34 @@ kernel::exec_context::bind(intrusive_ptr<command_queue> _q, } break; } + case module::argument::image_size: { + auto img = dynamic_cast<image_argument &>(**(explicit_arg - 1)).get(); + std::vector<cl_uint> image_size{ + static_cast<cl_uint>(img->width()), + static_cast<cl_uint>(img->height()), + static_cast<cl_uint>(img->depth())}; + for (auto x : image_size) { + auto arg = argument::create(marg); + + arg->set(sizeof(x), &x); + arg->bind(*this, marg); + } + break; + } + case module::argument::image_format: { + auto img = dynamic_cast<image_argument &>(**(explicit_arg - 1)).get(); + cl_image_format fmt = img->format(); + std::vector<cl_uint> image_format{ + static_cast<cl_uint>(fmt.image_channel_data_type), + static_cast<cl_uint>(fmt.image_channel_order)}; + for (auto x : image_format) { + auto arg = argument::create(marg); + + arg->set(sizeof(x), &x); + arg->bind(*this, marg); + } + break; + } } } diff --git a/src/gallium/state_trackers/clover/core/kernel.hpp b/src/gallium/state_trackers/clover/core/kernel.hpp index d6432a4df8d..4ba6ff467b7 100644 --- a/src/gallium/state_trackers/clover/core/kernel.hpp +++ b/src/gallium/state_trackers/clover/core/kernel.hpp @@ -190,7 +190,16 @@ namespace clover { pipe_surface *st; }; - class image_rd_argument : public argument { + class image_argument : public argument { + public: + const image *get() const { + return img; + } + protected: + image *img; + }; + + class image_rd_argument : public image_argument { public: virtual void set(size_t size, const void *value); virtual void bind(exec_context &ctx, @@ -198,11 +207,10 @@ namespace clover { virtual void unbind(exec_context &ctx); private: - image *img; pipe_sampler_view *st; }; - class image_wr_argument : public argument { + class image_wr_argument : public image_argument { public: virtual void set(size_t size, const void *value); virtual void bind(exec_context &ctx, @@ -210,7 +218,6 @@ namespace clover { virtual void unbind(exec_context &ctx); private: - image *img; pipe_surface *st; }; diff --git a/src/gallium/state_trackers/clover/core/module.hpp b/src/gallium/state_trackers/clover/core/module.hpp index 9d656885945..5db0548872c 100644 --- a/src/gallium/state_trackers/clover/core/module.hpp +++ b/src/gallium/state_trackers/clover/core/module.hpp @@ -72,7 +72,9 @@ namespace clover { enum semantic { general, grid_dimension, - grid_offset + grid_offset, + image_size, + image_format }; argument(enum type type, size_t size, |