Adding iree_hal_queue_affinity_* utilities.
diff --git a/runtime/src/iree/hal/command_buffer.h b/runtime/src/iree/hal/command_buffer.h
index e6523f2..82fdd61 100644
--- a/runtime/src/iree/hal/command_buffer.h
+++ b/runtime/src/iree/hal/command_buffer.h
@@ -443,10 +443,15 @@
// An RGBA color.
typedef struct iree_hal_label_color_t {
- uint8_t r;
- uint8_t g;
- uint8_t b;
- uint8_t a;
+ union {
+ struct {
+ uint8_t r;
+ uint8_t g;
+ uint8_t b;
+ uint8_t a;
+ };
+ uint32_t value;
+ };
} iree_hal_label_color_t;
// A source location attached to debug labels.
@@ -457,7 +462,7 @@
// An unspecified color; debugging tools are to choose their own.
static inline iree_hal_label_color_t iree_hal_label_color_unspecified() {
- iree_hal_label_color_t color = {0, 0, 0, 0};
+ iree_hal_label_color_t color = {{{0, 0, 0, 0}}};
return color;
}
diff --git a/runtime/src/iree/hal/queue.h b/runtime/src/iree/hal/queue.h
index 4e54e0b..b52627e 100644
--- a/runtime/src/iree/hal/queue.h
+++ b/runtime/src/iree/hal/queue.h
@@ -36,6 +36,60 @@
#define IREE_HAL_QUEUE_AFFINITY_ANY ((iree_hal_queue_affinity_t)(-1))
#define IREE_HAL_MAX_QUEUES (sizeof(iree_hal_queue_affinity_t) / 8)
+// Returns true if the |queue_affinity| is empty (none specified).
+#define iree_hal_queue_affinity_is_empty(queue_affinity) ((queue_affinity) == 0)
+
+// Returns true if the |queue_affinity| is indicating any/all queues.
+#define iree_hal_queue_affinity_is_any(queue_affinity) \
+ ((queue_affinity) == IREE_HAL_QUEUE_AFFINITY_ANY)
+
+// Returns the total number of queues specified in the |queue_affinity| mask.
+#define iree_hal_queue_affinity_count(queue_affinity) \
+ iree_math_count_ones_u64(queue_affinity)
+
+// Returns the index of the first set bit in |queue_affinity|.
+// Requires that at least one bit be set.
+#define iree_hal_queue_affinity_find_first_set(queue_affinity) \
+ iree_math_count_trailing_zeros_u64(queue_affinity)
+
+// Logically shifts the queue affinity to the right by the given amount.
+#define iree_hal_queue_affinity_shr(queue_affinity, amount) \
+ iree_shr((queue_affinity), (amount))
+
+// Updates |inout_affinity| to only include those bits set in |mask_affinity|.
+#define iree_hal_queue_affinity_and_into(inout_affinity, mask_affinity) \
+ (inout_affinity) = ((inout_affinity) & (mask_affinity))
+
+// Updates |inout_affinity| to include bits set in |mask_affinity|.
+#define iree_hal_queue_affinity_or_into(inout_affinity, mask_affinity) \
+ (inout_affinity) = ((inout_affinity) | (mask_affinity))
+
+// Loops over each queue in the given |queue_affinity| bitmap.
+//
+// The following variables are available within the loop:
+// queue_count: total number of queues used
+// queue_index: loop index (0 to queue_count)
+// queue_ordinal: queue ordinal (0 to the total number of queues)
+//
+// Example:
+// IREE_HAL_FOR_QUEUE_AFFINITY(my_queue_affinity) {
+// compact_queue_list[queue_index]; // 0 to my_queue_affinity count
+// full_queue_list[queue_ordinal]; // 0 to available queues
+// }
+#define IREE_HAL_FOR_QUEUE_AFFINITY(queue_affinity) \
+ iree_hal_queue_affinity_t _queue_bits = (queue_affinity); \
+ for (int queue_index = 0, _queue_ordinal_base = 0, \
+ queue_count = iree_hal_queue_affinity_count(_queue_bits), \
+ _bit_offset = 0, \
+ queue_ordinal = \
+ iree_hal_queue_affinity_find_first_set(_queue_bits); \
+ queue_index < queue_count; \
+ ++queue_index, _queue_ordinal_base += _bit_offset + 1, \
+ _queue_bits = \
+ iree_hal_queue_affinity_shr(_queue_bits, _bit_offset + 1), \
+ _bit_offset = iree_hal_queue_affinity_find_first_set(_queue_bits), \
+ queue_ordinal = _queue_ordinal_base + _bit_offset)
+
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
diff --git a/runtime/src/iree/hal/semaphore.h b/runtime/src/iree/hal/semaphore.h
index 52571ed..5320666 100644
--- a/runtime/src/iree/hal/semaphore.h
+++ b/runtime/src/iree/hal/semaphore.h
@@ -102,7 +102,8 @@
}
// Frees an iree_status_t encoded in a semaphore |value|, if any.
-static inline void iree_hal_semaphore_failure_free(uint64_t value) {
+IREE_ATTRIBUTE_ALWAYS_INLINE static inline void iree_hal_semaphore_failure_free(
+ uint64_t value) {
if (value & IREE_HAL_SEMAPHORE_FAILURE_VALUE_STATUS_BIT) {
iree_status_free((iree_status_t)(((int64_t)value << 1) >> 1));
}