From: Tom Stellard <thomas.stell...@amd.com> This value for this CAP is the alignment to use when storing kernel arguments in the input buffer.
v2: - Allow per-type alignments --- src/gallium/docs/source/screen.rst | 17 +++++++++++++++++ src/gallium/drivers/r600/r600_pipe.c | 11 ++++++++++- src/gallium/drivers/radeonsi/radeonsi_pipe.c | 10 ++++++++++ src/gallium/include/pipe/p_defines.h | 3 ++- src/gallium/state_trackers/clover/core/device.cpp | 8 ++++++++ src/gallium/state_trackers/clover/core/device.hpp | 1 + 6 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/gallium/docs/source/screen.rst b/src/gallium/docs/source/screen.rst index f062bea..4176421 100644 --- a/src/gallium/docs/source/screen.rst +++ b/src/gallium/docs/source/screen.rst @@ -281,6 +281,23 @@ pipe_screen::get_compute_param. resource. Value type: ``uint64_t``. * ``PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE``: Maximum size of a memory object allocation in bytes. Value type: ``uint64_t``. +* ``PIPE_COMPUTE_CAP_KERNEL_ARG_ALIGNMENT``: Alignment to use when uploading + arguments to a kernel. Input is the size in bytes of the value type, + output is the size in bytes of the alignment for that type. Both input + and output Must be a power of two. Value type: ``size_t``. + +EXAMPLE: +char, short, and int all have the same alignemnt. + +kernel void align(char a, short b, int c); + +ALIGNMENT + 1 a b b c c c c + 2 a b b c c c c + 4 a b b c c c c + 8 a b b c c c c + +Byte 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 .. _pipe_bind: diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c index 5fe9d39..76717b5 100644 --- a/src/gallium/drivers/r600/r600_pipe.c +++ b/src/gallium/drivers/r600/r600_pipe.c @@ -953,7 +953,16 @@ static int r600_get_compute_param(const struct pipe_screen *screen, *max_mem_alloc_size = max_global_size / 4; } return sizeof(uint64_t); - + case PIPE_COMPUTE_CAP_KERNEL_ARG_ALIGNMENT: + if (ret) { + size_t *alignment = ret; +#if HAVE_LLVM < 0x0303 + *alignment = 1; +#else + *alignment = 4; +#endif + } + return sizeof(size_t); default: fprintf(stderr, "unknown PIPE_COMPUTE_CAP %d\n", param); return 0; diff --git a/src/gallium/drivers/radeonsi/radeonsi_pipe.c b/src/gallium/drivers/radeonsi/radeonsi_pipe.c index d2724b9..c9634a2 100644 --- a/src/gallium/drivers/radeonsi/radeonsi_pipe.c +++ b/src/gallium/drivers/radeonsi/radeonsi_pipe.c @@ -611,6 +611,16 @@ static int r600_get_compute_param(const struct pipe_screen *screen, *max_mem_alloc_size = max_global_size / 4; } return sizeof(uint64_t); + case PIPE_COMPUTE_CAP_KERNEL_ARG_ALIGNMENT: + if (ret) { + size_t *alignment = ret; +#if HAVE_LLVM < 0x0303 + *alignment = 1; +#else + *alignment = 4; +#endif + } + return sizeof(size_t); default: fprintf(stderr, "unknown PIPE_COMPUTE_CAP %d\n", param); return 0; diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h index 4828a3e..62d973d 100644 --- a/src/gallium/include/pipe/p_defines.h +++ b/src/gallium/include/pipe/p_defines.h @@ -588,7 +588,8 @@ enum pipe_compute_cap PIPE_COMPUTE_CAP_MAX_LOCAL_SIZE, PIPE_COMPUTE_CAP_MAX_PRIVATE_SIZE, PIPE_COMPUTE_CAP_MAX_INPUT_SIZE, - PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE + PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE, + PIPE_COMPUTE_CAP_KERNEL_ARG_ALIGNMENT }; /** diff --git a/src/gallium/state_trackers/clover/core/device.cpp b/src/gallium/state_trackers/clover/core/device.cpp index 94faeee..e8ed975 100644 --- a/src/gallium/state_trackers/clover/core/device.cpp +++ b/src/gallium/state_trackers/clover/core/device.cpp @@ -163,6 +163,14 @@ _cl_device_id::max_mem_alloc_size() const { PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE)[0]; } +size_t +_cl_device_id::kernel_arg_alignment(size_t type_size) const { + size_t size = type_size; + pipe->get_compute_param(pipe, PIPE_COMPUTE_CAP_KERNEL_ARG_ALIGNMENT, + &size); + return size; +} + std::vector<size_t> _cl_device_id::max_block_size() const { auto v = get_compute_param<uint64_t>(pipe, PIPE_COMPUTE_CAP_MAX_BLOCK_SIZE); diff --git a/src/gallium/state_trackers/clover/core/device.hpp b/src/gallium/state_trackers/clover/core/device.hpp index 61b690b..bfe84b0 100644 --- a/src/gallium/state_trackers/clover/core/device.hpp +++ b/src/gallium/state_trackers/clover/core/device.hpp @@ -60,6 +60,7 @@ public: cl_uint max_const_buffers() const; size_t max_threads_per_block() const; cl_ulong max_mem_alloc_size() const; + size_t kernel_arg_alignment(size_t type_size) const; std::vector<size_t> max_block_size() const; std::string device_name() const; -- 1.7.11.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev