diff options
Diffstat (limited to 'src/gallium/state_trackers')
-rw-r--r-- | src/gallium/state_trackers/clover/api/kernel.cpp | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/src/gallium/state_trackers/clover/api/kernel.cpp b/src/gallium/state_trackers/clover/api/kernel.cpp index 44eeb277127..ab4982d2951 100644 --- a/src/gallium/state_trackers/clover/api/kernel.cpp +++ b/src/gallium/state_trackers/clover/api/kernel.cpp @@ -223,16 +223,23 @@ namespace { if (!grid_size || any_of(is_zero<size_t>(), grid_size, grid_size + dims)) throw error(CL_INVALID_GLOBAL_WORK_SIZE); - if (block_size && any_of([](size_t b, size_t max) { - return b == 0 || b > max; - }, block_size, block_size + dims, - q->dev.max_block_size().begin())) - throw error(CL_INVALID_WORK_ITEM_SIZE); - - if (block_size && any_of([](size_t b, size_t g) { - return g % b; - }, block_size, block_size + dims, grid_size)) - throw error(CL_INVALID_WORK_GROUP_SIZE); + if (block_size) { + if (any_of([](size_t b, size_t max) { + return b == 0 || b > max; + }, block_size, block_size + dims, + q->dev.max_block_size().begin())) + throw error(CL_INVALID_WORK_ITEM_SIZE); + + if (any_of([](size_t b, size_t g) { + return g % b; + }, block_size, block_size + dims, grid_size)) + throw error(CL_INVALID_WORK_GROUP_SIZE); + + if (fold(std::multiplies<size_t>(), 1u, + block_size, block_size + dims) > + q->dev.max_threads_per_block()) + throw error(CL_INVALID_WORK_GROUP_SIZE); + } } /// |