[Mesa-dev] [PATCH 2/4] gallium/compute: Add PIPE_COMPUTE_CAP_KERNEL_ARG_ALIGNMENT

Tom Stellard tom at stellard.net
Tue Jun 25 14:45:36 PDT 2013


From: Tom Stellard <thomas.stellard at amd.com>

This value for this CAP is the alignment to use when storing kernel
arguments in the input buffer.
---
 src/gallium/docs/source/screen.rst                | 13 +++++++++++++
 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 |  6 ++++++
 src/gallium/state_trackers/clover/core/device.hpp |  1 +
 6 files changed, 42 insertions(+), 2 deletions(-)

diff --git a/src/gallium/docs/source/screen.rst b/src/gallium/docs/source/screen.rst
index 683080c..fbfd540 100644
--- a/src/gallium/docs/source/screen.rst
+++ b/src/gallium/docs/source/screen.rst
@@ -279,6 +279,19 @@ 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.  Must be a power of two.  Value type: ``size_t``.
+
+EXAMPLE:
+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 74a650a..4c5b3c6 100644
--- a/src/gallium/drivers/r600/r600_pipe.c
+++ b/src/gallium/drivers/r600/r600_pipe.c
@@ -948,7 +948,16 @@ static int r600_get_compute_param(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 3f4cd78..ec92872 100644
--- a/src/gallium/drivers/radeonsi/radeonsi_pipe.c
+++ b/src/gallium/drivers/radeonsi/radeonsi_pipe.c
@@ -597,6 +597,16 @@ static int r600_get_compute_param(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 8af1a84..28d52a0 100644
--- a/src/gallium/include/pipe/p_defines.h
+++ b/src/gallium/include/pipe/p_defines.h
@@ -584,7 +584,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 95a422c..85f30cf 100644
--- a/src/gallium/state_trackers/clover/core/device.cpp
+++ b/src/gallium/state_trackers/clover/core/device.cpp
@@ -163,6 +163,12 @@ _cl_device_id::max_mem_alloc_size() const {
                                       PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE)[0];
 }
 
+size_t
+_cl_device_id::kernel_arg_alignment() const {
+   return get_compute_param<size_t>(pipe,
+                                    PIPE_COMPUTE_CAP_KERNEL_ARG_ALIGNMENT)[0];
+}
+
 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 465af9f..20725df 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() const;
 
    std::vector<size_t> max_block_size() const;
    std::string device_name() const;
-- 
1.7.11.4



More information about the mesa-dev mailing list