blob: e83fb90aec575d3e5c7b8dc54b3f54ab9a05ce02 [file] [log] [blame]
// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <inttypes.h>
#include "iree/base/tracing.h"
#include "iree/hal/allocator.h"
#include "iree/hal/command_buffer.h"
#include "iree/hal/device.h"
typedef struct {
iree_hal_resource_t resource;
iree_hal_device_t* device;
iree_hal_command_buffer_t* target_command_buffer;
iree_hal_command_category_t allowed_categories;
bool is_recording;
// TODO(benvanik): current executable layout/descriptor set layout info.
// TODO(benvanik): valid push constant bit ranges.
} iree_hal_validating_command_buffer_t;
static const iree_hal_command_buffer_vtable_t
iree_hal_validating_command_buffer_vtable;
// Returns success iff the queue supports the given command categories.
static iree_status_t iree_hal_command_buffer_validate_categories(
const iree_hal_validating_command_buffer_t* command_buffer,
iree_hal_command_category_t required_categories) {
if (!iree_all_bits_set(command_buffer->allowed_categories,
required_categories)) {
return iree_make_status(
IREE_STATUS_FAILED_PRECONDITION,
"operation requires categories %s but command buffer only supports %s",
iree_hal_command_category_string(required_categories),
iree_hal_command_category_string(command_buffer->allowed_categories));
}
return iree_ok_status();
}
// Returns success iff the buffer is compatible with the device.
static iree_status_t iree_hal_command_buffer_validate_buffer_compatibility(
const iree_hal_validating_command_buffer_t* command_buffer,
iree_hal_buffer_t* buffer,
iree_hal_buffer_compatibility_t required_compatibility,
iree_hal_buffer_usage_t intended_usage) {
iree_hal_buffer_compatibility_t allowed_compatibility =
iree_hal_allocator_query_buffer_compatibility(
iree_hal_device_allocator(command_buffer->device),
iree_hal_buffer_memory_type(buffer),
iree_hal_buffer_allowed_usage(buffer), intended_usage,
iree_hal_buffer_allocation_size(buffer));
if (!iree_all_bits_set(allowed_compatibility, required_compatibility)) {
// Buffer cannot be used on the queue for the given usage.
return iree_make_status(
IREE_STATUS_PERMISSION_DENIED,
"requested buffer usage is not supported for the buffer on this queue; "
"buffer allows %s, operation requires %s",
iree_hal_buffer_usage_string(iree_hal_buffer_allowed_usage(buffer)),
iree_hal_buffer_usage_string(intended_usage));
}
return iree_ok_status();
}
// Returns success iff the currently bound descriptor sets are valid for the
// given executable entry point.
static iree_status_t iree_hal_command_buffer_validate_dispatch_bindings(
iree_hal_validating_command_buffer_t* command_buffer,
iree_hal_executable_t* executable, int32_t entry_point) {
// TODO(benvanik): validate buffers referenced have compatible memory types,
// access rights, and usage.
// TODO(benvanik): validate no aliasing between inputs/outputs.
return iree_ok_status();
}
IREE_API_EXPORT iree_status_t IREE_API_CALL
iree_hal_command_buffer_wrap_validation(
iree_hal_device_t* device, iree_hal_command_buffer_t* target_command_buffer,
iree_hal_command_buffer_t** out_command_buffer) {
IREE_ASSERT_ARGUMENT(target_command_buffer);
IREE_ASSERT_ARGUMENT(out_command_buffer);
*out_command_buffer = NULL;
IREE_TRACE_ZONE_BEGIN(z0);
iree_hal_validating_command_buffer_t* command_buffer = NULL;
iree_status_t status =
iree_allocator_malloc(iree_hal_device_host_allocator(device),
sizeof(*command_buffer), (void**)&command_buffer);
if (iree_status_is_ok(status)) {
iree_hal_resource_initialize(&iree_hal_validating_command_buffer_vtable,
&command_buffer->resource);
command_buffer->device = device;
iree_hal_device_retain(command_buffer->device);
command_buffer->target_command_buffer = target_command_buffer;
iree_hal_command_buffer_retain(command_buffer->target_command_buffer);
command_buffer->allowed_categories =
iree_hal_command_buffer_allowed_categories(
command_buffer->target_command_buffer);
command_buffer->is_recording = false;
}
*out_command_buffer = (iree_hal_command_buffer_t*)command_buffer;
IREE_TRACE_ZONE_END(z0);
return status;
}
static void iree_hal_validating_command_buffer_destroy(
iree_hal_command_buffer_t* base_command_buffer) {
IREE_TRACE_ZONE_BEGIN(z0);
iree_hal_validating_command_buffer_t* command_buffer =
(iree_hal_validating_command_buffer_t*)base_command_buffer;
iree_allocator_t host_allocator =
iree_hal_device_host_allocator(command_buffer->device);
iree_hal_command_buffer_release(command_buffer->target_command_buffer);
iree_hal_device_release(command_buffer->device);
iree_allocator_free(host_allocator, command_buffer);
IREE_TRACE_ZONE_END(z0);
}
static iree_hal_command_category_t
iree_hal_validating_command_buffer_allowed_categories(
const iree_hal_command_buffer_t* base_command_buffer) {
iree_hal_validating_command_buffer_t* command_buffer =
(iree_hal_validating_command_buffer_t*)base_command_buffer;
return command_buffer->allowed_categories;
}
static iree_status_t iree_hal_validating_command_buffer_begin(
iree_hal_command_buffer_t* base_command_buffer) {
iree_hal_validating_command_buffer_t* command_buffer =
(iree_hal_validating_command_buffer_t*)base_command_buffer;
if (command_buffer->is_recording) {
return iree_make_status(IREE_STATUS_FAILED_PRECONDITION,
"command buffer is already in a recording state");
}
command_buffer->is_recording = true;
return iree_hal_command_buffer_begin(command_buffer->target_command_buffer);
}
static iree_status_t iree_hal_validating_command_buffer_end(
iree_hal_command_buffer_t* base_command_buffer) {
iree_hal_validating_command_buffer_t* command_buffer =
(iree_hal_validating_command_buffer_t*)base_command_buffer;
if (!command_buffer->is_recording) {
return iree_make_status(IREE_STATUS_FAILED_PRECONDITION,
"command buffer is not in a recording state");
}
command_buffer->is_recording = false;
return iree_hal_command_buffer_end(command_buffer->target_command_buffer);
}
static iree_status_t iree_hal_validating_command_buffer_execution_barrier(
iree_hal_command_buffer_t* base_command_buffer,
iree_hal_execution_stage_t source_stage_mask,
iree_hal_execution_stage_t target_stage_mask,
iree_hal_execution_barrier_flags_t flags,
iree_host_size_t memory_barrier_count,
const iree_hal_memory_barrier_t* memory_barriers,
iree_host_size_t buffer_barrier_count,
const iree_hal_buffer_barrier_t* buffer_barriers) {
iree_hal_validating_command_buffer_t* command_buffer =
(iree_hal_validating_command_buffer_t*)base_command_buffer;
IREE_RETURN_IF_ERROR(iree_hal_command_buffer_validate_categories(
command_buffer, IREE_HAL_COMMAND_CATEGORY_ANY));
// TODO(benvanik): additional synchronization validation.
return iree_hal_command_buffer_execution_barrier(
command_buffer->target_command_buffer, source_stage_mask,
target_stage_mask, flags, memory_barrier_count, memory_barriers,
buffer_barrier_count, buffer_barriers);
}
static iree_status_t iree_hal_validating_command_buffer_signal_event(
iree_hal_command_buffer_t* base_command_buffer, iree_hal_event_t* event,
iree_hal_execution_stage_t source_stage_mask) {
iree_hal_validating_command_buffer_t* command_buffer =
(iree_hal_validating_command_buffer_t*)base_command_buffer;
IREE_RETURN_IF_ERROR(iree_hal_command_buffer_validate_categories(
command_buffer, IREE_HAL_COMMAND_CATEGORY_DISPATCH));
// TODO(benvanik): additional synchronization validation.
return iree_hal_command_buffer_signal_event(
command_buffer->target_command_buffer, event, source_stage_mask);
}
static iree_status_t iree_hal_validating_command_buffer_reset_event(
iree_hal_command_buffer_t* base_command_buffer, iree_hal_event_t* event,
iree_hal_execution_stage_t source_stage_mask) {
iree_hal_validating_command_buffer_t* command_buffer =
(iree_hal_validating_command_buffer_t*)base_command_buffer;
IREE_RETURN_IF_ERROR(iree_hal_command_buffer_validate_categories(
command_buffer, IREE_HAL_COMMAND_CATEGORY_DISPATCH));
// TODO(benvanik): additional synchronization validation.
return iree_hal_command_buffer_reset_event(
command_buffer->target_command_buffer, event, source_stage_mask);
}
static iree_status_t iree_hal_validating_command_buffer_wait_events(
iree_hal_command_buffer_t* base_command_buffer,
iree_host_size_t event_count, const iree_hal_event_t** events,
iree_hal_execution_stage_t source_stage_mask,
iree_hal_execution_stage_t target_stage_mask,
iree_host_size_t memory_barrier_count,
const iree_hal_memory_barrier_t* memory_barriers,
iree_host_size_t buffer_barrier_count,
const iree_hal_buffer_barrier_t* buffer_barriers) {
iree_hal_validating_command_buffer_t* command_buffer =
(iree_hal_validating_command_buffer_t*)base_command_buffer;
IREE_RETURN_IF_ERROR(iree_hal_command_buffer_validate_categories(
command_buffer, IREE_HAL_COMMAND_CATEGORY_DISPATCH));
// TODO(benvanik): additional synchronization validation.
return iree_hal_command_buffer_wait_events(
command_buffer->target_command_buffer, event_count, events,
source_stage_mask, target_stage_mask, memory_barrier_count,
memory_barriers, buffer_barrier_count, buffer_barriers);
}
static iree_status_t iree_hal_validating_command_buffer_discard_buffer(
iree_hal_command_buffer_t* base_command_buffer, iree_hal_buffer_t* buffer) {
iree_hal_validating_command_buffer_t* command_buffer =
(iree_hal_validating_command_buffer_t*)base_command_buffer;
IREE_RETURN_IF_ERROR(iree_hal_command_buffer_validate_categories(
command_buffer, IREE_HAL_COMMAND_CATEGORY_TRANSFER));
IREE_RETURN_IF_ERROR(iree_hal_buffer_validate_memory_type(
iree_hal_buffer_memory_type(buffer),
IREE_HAL_MEMORY_TYPE_DEVICE_VISIBLE));
return iree_hal_command_buffer_discard_buffer(
command_buffer->target_command_buffer, buffer);
}
static iree_status_t iree_hal_validating_command_buffer_fill_buffer(
iree_hal_command_buffer_t* base_command_buffer,
iree_hal_buffer_t* target_buffer, iree_device_size_t target_offset,
iree_device_size_t length, const void* pattern,
iree_host_size_t pattern_length) {
iree_hal_validating_command_buffer_t* command_buffer =
(iree_hal_validating_command_buffer_t*)base_command_buffer;
IREE_RETURN_IF_ERROR(iree_hal_command_buffer_validate_categories(
command_buffer, IREE_HAL_COMMAND_CATEGORY_TRANSFER));
IREE_RETURN_IF_ERROR(iree_hal_command_buffer_validate_buffer_compatibility(
command_buffer, target_buffer,
IREE_HAL_BUFFER_COMPATIBILITY_QUEUE_TRANSFER,
IREE_HAL_BUFFER_USAGE_TRANSFER));
IREE_RETURN_IF_ERROR(iree_hal_buffer_validate_memory_type(
iree_hal_buffer_memory_type(target_buffer),
IREE_HAL_MEMORY_ACCESS_WRITE));
IREE_RETURN_IF_ERROR(iree_hal_buffer_validate_access(
iree_hal_buffer_allowed_access(target_buffer),
IREE_HAL_MEMORY_ACCESS_WRITE));
IREE_RETURN_IF_ERROR(iree_hal_buffer_validate_usage(
iree_hal_buffer_allowed_usage(target_buffer),
IREE_HAL_BUFFER_USAGE_TRANSFER));
IREE_RETURN_IF_ERROR(
iree_hal_buffer_validate_range(target_buffer, target_offset, length));
// Ensure the value length is supported.
if (pattern_length != 1 && pattern_length != 2 && pattern_length != 4) {
return iree_make_status(IREE_STATUS_INVALID_ARGUMENT,
"fill value length is not one of the supported "
"values (pattern_length=%zu)",
pattern_length);
}
// Ensure the offset and length have an alignment matching the value length.
if ((target_offset % pattern_length) != 0 || (length % pattern_length) != 0) {
return iree_make_status(
IREE_STATUS_INVALID_ARGUMENT,
"fill offset and/or length do not match the natural alignment of the "
"fill value (target_offset=%" PRIu64 ", length=%" PRIu64
", pattern_length=%zu)",
target_offset, length, pattern_length);
}
return iree_hal_command_buffer_fill_buffer(
command_buffer->target_command_buffer, target_buffer, target_offset,
length, pattern, pattern_length);
}
static iree_status_t iree_hal_validating_command_buffer_update_buffer(
iree_hal_command_buffer_t* base_command_buffer, const void* source_buffer,
iree_host_size_t source_offset, iree_hal_buffer_t* target_buffer,
iree_device_size_t target_offset, iree_device_size_t length) {
iree_hal_validating_command_buffer_t* command_buffer =
(iree_hal_validating_command_buffer_t*)base_command_buffer;
IREE_RETURN_IF_ERROR(iree_hal_command_buffer_validate_categories(
command_buffer, IREE_HAL_COMMAND_CATEGORY_TRANSFER));
IREE_RETURN_IF_ERROR(iree_hal_command_buffer_validate_buffer_compatibility(
command_buffer, target_buffer,
IREE_HAL_BUFFER_COMPATIBILITY_QUEUE_TRANSFER,
IREE_HAL_BUFFER_USAGE_TRANSFER));
IREE_RETURN_IF_ERROR(iree_hal_buffer_validate_memory_type(
iree_hal_buffer_memory_type(target_buffer),
IREE_HAL_MEMORY_TYPE_DEVICE_VISIBLE));
IREE_RETURN_IF_ERROR(iree_hal_buffer_validate_access(
iree_hal_buffer_allowed_access(target_buffer),
IREE_HAL_MEMORY_ACCESS_WRITE));
IREE_RETURN_IF_ERROR(iree_hal_buffer_validate_usage(
iree_hal_buffer_allowed_usage(target_buffer),
IREE_HAL_BUFFER_USAGE_TRANSFER));
IREE_RETURN_IF_ERROR(
iree_hal_buffer_validate_range(target_buffer, target_offset, length));
return iree_hal_command_buffer_update_buffer(
command_buffer->target_command_buffer, source_buffer, source_offset,
target_buffer, target_offset, length);
}
static iree_status_t iree_hal_validating_command_buffer_copy_buffer(
iree_hal_command_buffer_t* base_command_buffer,
iree_hal_buffer_t* source_buffer, iree_device_size_t source_offset,
iree_hal_buffer_t* target_buffer, iree_device_size_t target_offset,
iree_device_size_t length) {
iree_hal_validating_command_buffer_t* command_buffer =
(iree_hal_validating_command_buffer_t*)base_command_buffer;
IREE_RETURN_IF_ERROR(iree_hal_command_buffer_validate_categories(
command_buffer, IREE_HAL_COMMAND_CATEGORY_TRANSFER));
IREE_RETURN_IF_ERROR(iree_hal_command_buffer_validate_buffer_compatibility(
command_buffer, source_buffer,
IREE_HAL_BUFFER_COMPATIBILITY_QUEUE_TRANSFER,
IREE_HAL_BUFFER_USAGE_TRANSFER));
IREE_RETURN_IF_ERROR(iree_hal_command_buffer_validate_buffer_compatibility(
command_buffer, target_buffer,
IREE_HAL_BUFFER_COMPATIBILITY_QUEUE_TRANSFER,
IREE_HAL_BUFFER_USAGE_TRANSFER));
IREE_RETURN_IF_ERROR(iree_hal_buffer_validate_access(
iree_hal_buffer_allowed_access(source_buffer),
IREE_HAL_MEMORY_ACCESS_READ));
IREE_RETURN_IF_ERROR(iree_hal_buffer_validate_usage(
iree_hal_buffer_allowed_usage(source_buffer),
IREE_HAL_BUFFER_USAGE_TRANSFER));
IREE_RETURN_IF_ERROR(
iree_hal_buffer_validate_range(source_buffer, source_offset, length));
IREE_RETURN_IF_ERROR(iree_hal_buffer_validate_usage(
iree_hal_buffer_allowed_usage(target_buffer),
IREE_HAL_BUFFER_USAGE_TRANSFER));
IREE_RETURN_IF_ERROR(iree_hal_buffer_validate_access(
iree_hal_buffer_allowed_access(target_buffer),
IREE_HAL_MEMORY_ACCESS_WRITE));
IREE_RETURN_IF_ERROR(
iree_hal_buffer_validate_range(target_buffer, target_offset, length));
// At least source or destination must be device-visible to enable
// host->device, device->host, and device->device.
// TODO(b/117338171): host->host copies.
if (!iree_any_bit_set(iree_hal_buffer_memory_type(source_buffer),
IREE_HAL_MEMORY_TYPE_DEVICE_VISIBLE) &&
!iree_any_bit_set(iree_hal_buffer_memory_type(target_buffer),
IREE_HAL_MEMORY_TYPE_DEVICE_VISIBLE)) {
return iree_make_status(
IREE_STATUS_PERMISSION_DENIED,
"at least one buffer must be device-visible for a copy; "
"source_buffer=%s, target_buffer=%s",
iree_hal_memory_type_string(iree_hal_buffer_memory_type(source_buffer)),
iree_hal_memory_type_string(
iree_hal_buffer_memory_type(target_buffer)));
}
// Check for overlap - just like memcpy we don't handle that.
if (iree_hal_buffer_test_overlap(source_buffer, source_offset, length,
target_buffer, target_offset, length) !=
IREE_HAL_BUFFER_OVERLAP_DISJOINT) {
return iree_make_status(
IREE_STATUS_INVALID_ARGUMENT,
"source and target ranges overlap within the same buffer");
}
return iree_hal_command_buffer_copy_buffer(
command_buffer->target_command_buffer, source_buffer, source_offset,
target_buffer, target_offset, length);
}
static iree_status_t iree_hal_validating_command_buffer_push_constants(
iree_hal_command_buffer_t* base_command_buffer,
iree_hal_executable_layout_t* executable_layout, iree_host_size_t offset,
const void* values, iree_host_size_t values_length) {
iree_hal_validating_command_buffer_t* command_buffer =
(iree_hal_validating_command_buffer_t*)base_command_buffer;
IREE_RETURN_IF_ERROR(iree_hal_command_buffer_validate_categories(
command_buffer, IREE_HAL_COMMAND_CATEGORY_DISPATCH));
if (IREE_UNLIKELY((values_length % 4) != 0)) {
return iree_make_status(IREE_STATUS_INVALID_ARGUMENT,
"invalid alignment %zu, must be 4-byte aligned",
values_length);
}
// TODO(benvanik): validate offset and value count with layout.
return iree_hal_command_buffer_push_constants(
command_buffer->target_command_buffer, executable_layout, offset, values,
values_length);
}
static iree_status_t iree_hal_validating_command_buffer_push_descriptor_set(
iree_hal_command_buffer_t* base_command_buffer,
iree_hal_executable_layout_t* executable_layout, uint32_t set,
iree_host_size_t binding_count,
const iree_hal_descriptor_set_binding_t* bindings) {
iree_hal_validating_command_buffer_t* command_buffer =
(iree_hal_validating_command_buffer_t*)base_command_buffer;
IREE_RETURN_IF_ERROR(iree_hal_command_buffer_validate_categories(
command_buffer, IREE_HAL_COMMAND_CATEGORY_DISPATCH));
// TODO(benvanik): validate set index.
// TODO(benvanik): validate binding_offset.
// TODO(benvanik): validate bindings.
return iree_hal_command_buffer_push_descriptor_set(
command_buffer->target_command_buffer, executable_layout, set,
binding_count, bindings);
}
static iree_status_t iree_hal_validating_command_buffer_bind_descriptor_set(
iree_hal_command_buffer_t* base_command_buffer,
iree_hal_executable_layout_t* executable_layout, uint32_t set,
iree_hal_descriptor_set_t* descriptor_set,
iree_host_size_t dynamic_offset_count,
const iree_device_size_t* dynamic_offsets) {
iree_hal_validating_command_buffer_t* command_buffer =
(iree_hal_validating_command_buffer_t*)base_command_buffer;
IREE_RETURN_IF_ERROR(iree_hal_command_buffer_validate_categories(
command_buffer, IREE_HAL_COMMAND_CATEGORY_DISPATCH));
// TODO(benvanik): validate set index.
// TODO(benvanik): validate dynamic offsets (both count and offsets).
return iree_hal_command_buffer_bind_descriptor_set(
command_buffer->target_command_buffer, executable_layout, set,
descriptor_set, dynamic_offset_count, dynamic_offsets);
}
static iree_status_t iree_hal_validating_command_buffer_dispatch(
iree_hal_command_buffer_t* base_command_buffer,
iree_hal_executable_t* executable, int32_t entry_point,
uint32_t workgroup_x, uint32_t workgroup_y, uint32_t workgroup_z) {
iree_hal_validating_command_buffer_t* command_buffer =
(iree_hal_validating_command_buffer_t*)base_command_buffer;
IREE_RETURN_IF_ERROR(iree_hal_command_buffer_validate_categories(
command_buffer, IREE_HAL_COMMAND_CATEGORY_DISPATCH));
IREE_RETURN_IF_ERROR(iree_hal_command_buffer_validate_dispatch_bindings(
command_buffer, executable, entry_point));
return iree_hal_command_buffer_dispatch(command_buffer->target_command_buffer,
executable, entry_point, workgroup_x,
workgroup_y, workgroup_z);
}
static iree_status_t iree_hal_validating_command_buffer_dispatch_indirect(
iree_hal_command_buffer_t* base_command_buffer,
iree_hal_executable_t* executable, int32_t entry_point,
iree_hal_buffer_t* workgroups_buffer,
iree_device_size_t workgroups_offset) {
iree_hal_validating_command_buffer_t* command_buffer =
(iree_hal_validating_command_buffer_t*)base_command_buffer;
IREE_RETURN_IF_ERROR(iree_hal_command_buffer_validate_categories(
command_buffer, IREE_HAL_COMMAND_CATEGORY_DISPATCH));
IREE_RETURN_IF_ERROR(iree_hal_command_buffer_validate_buffer_compatibility(
command_buffer, workgroups_buffer,
IREE_HAL_BUFFER_COMPATIBILITY_QUEUE_DISPATCH,
IREE_HAL_BUFFER_USAGE_DISPATCH));
IREE_RETURN_IF_ERROR(iree_hal_buffer_validate_memory_type(
iree_hal_buffer_memory_type(workgroups_buffer),
IREE_HAL_MEMORY_TYPE_DEVICE_VISIBLE));
IREE_RETURN_IF_ERROR(iree_hal_buffer_validate_access(
iree_hal_buffer_allowed_access(workgroups_buffer),
IREE_HAL_MEMORY_ACCESS_READ));
IREE_RETURN_IF_ERROR(iree_hal_buffer_validate_usage(
iree_hal_buffer_allowed_usage(workgroups_buffer),
IREE_HAL_BUFFER_USAGE_DISPATCH));
IREE_RETURN_IF_ERROR(iree_hal_buffer_validate_range(
workgroups_buffer, workgroups_offset, sizeof(uint32_t) * 3));
IREE_RETURN_IF_ERROR(iree_hal_command_buffer_validate_dispatch_bindings(
command_buffer, executable, entry_point));
return iree_hal_command_buffer_dispatch_indirect(
command_buffer->target_command_buffer, executable, entry_point,
workgroups_buffer, workgroups_offset);
}
static const iree_hal_command_buffer_vtable_t
iree_hal_validating_command_buffer_vtable = {
.destroy = iree_hal_validating_command_buffer_destroy,
.allowed_categories =
iree_hal_validating_command_buffer_allowed_categories,
.begin = iree_hal_validating_command_buffer_begin,
.end = iree_hal_validating_command_buffer_end,
.execution_barrier =
iree_hal_validating_command_buffer_execution_barrier,
.signal_event = iree_hal_validating_command_buffer_signal_event,
.reset_event = iree_hal_validating_command_buffer_reset_event,
.wait_events = iree_hal_validating_command_buffer_wait_events,
.discard_buffer = iree_hal_validating_command_buffer_discard_buffer,
.fill_buffer = iree_hal_validating_command_buffer_fill_buffer,
.update_buffer = iree_hal_validating_command_buffer_update_buffer,
.copy_buffer = iree_hal_validating_command_buffer_copy_buffer,
.push_constants = iree_hal_validating_command_buffer_push_constants,
.push_descriptor_set =
iree_hal_validating_command_buffer_push_descriptor_set,
.bind_descriptor_set =
iree_hal_validating_command_buffer_bind_descriptor_set,
.dispatch = iree_hal_validating_command_buffer_dispatch,
.dispatch_indirect =
iree_hal_validating_command_buffer_dispatch_indirect,
};