Skip to content

Commit 05fedd4

Browse files
committed
making VK_EXT_external_memory_host support optional
1 parent 94a14e5 commit 05fedd4

File tree

6 files changed

+27
-4
lines changed

6 files changed

+27
-4
lines changed

include/shady/runtime.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ Command* launch_kernel(Program*, Device*, const char* entry_point, int dimx, int
3636
bool wait_completion(Command*);
3737

3838
Buffer* allocate_buffer_device(Device*, size_t);
39+
bool can_import_host_memory(Device*);
3940
Buffer* import_buffer_host(Device*, void*, size_t);
4041
void destroy_buffer(Buffer*);
4142

src/runtime/runtime.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ Command* launch_kernel(Program* p, Device* d, const char* entry_point, int dimx,
7474

7575
bool wait_completion(Command* cmd) { return cmd->wait_for_completion(cmd); }
7676

77+
bool can_import_host_memory(Device* device) { return device->can_import_host_memory(device); }
78+
7779
Buffer* allocate_buffer_device(Device* device, size_t bytes) { return device->allocate_buffer(device, bytes); }
7880
Buffer* import_buffer_host(Device* device, void* ptr, size_t bytes) { return device->import_host_memory_as_buffer(device, ptr, bytes); }
7981

src/runtime/runtime_private.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ struct Device_ {
2828
Command* (*launch_kernel)(Device*, Program*, const char* entry_point, int dimx, int dimy, int dimz, int args_count, void** args);
2929
Buffer* (*allocate_buffer)(Device*, size_t bytes);
3030
Buffer* (*import_host_memory_as_buffer)(Device*, void* base, size_t bytes);
31+
bool (*can_import_host_memory)(Device*);
3132
};
3233

3334
struct Program_ {

src/runtime/vulkan/vk_runtime_buffer.c

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,27 @@ VkrBuffer* vkr_allocate_buffer_device(VkrDevice* device, size_t size) {
100100
return NULL;
101101
}
102102

103-
VkrBuffer* vkr_import_buffer_host(VkrDevice* device, void* ptr, size_t size) {
103+
static bool vkr_can_import_host_memory_(VkrDevice* device, bool log) {
104+
if (!device->caps.supported_extensions[ShadySupportsEXT_external_memory_host]) {
105+
if (log)
106+
error_print("host imported buffers require VK_EXT_external_memory_host\n");
107+
return false;
108+
}
104109
if (!device->caps.features.buffer_device_address.bufferDeviceAddress) {
105-
error_print("host imported buffers require VK_KHR_buffer_device_address\n");
106-
return NULL;
110+
if (log)
111+
error_print("host imported buffers require VK_KHR_buffer_device_address\n");
112+
return false;
113+
}
114+
return true;
115+
}
116+
117+
bool vkr_can_import_host_memory(VkrDevice* device) {
118+
return vkr_can_import_host_memory_(device, false);
119+
}
120+
121+
VkrBuffer* vkr_import_buffer_host(VkrDevice* device, void* ptr, size_t size) {
122+
if (!vkr_can_import_host_memory_(device, true)) {
123+
error_die();
107124
}
108125

109126
VkrBuffer* buffer = calloc(sizeof(VkrBuffer), 1);

src/runtime/vulkan/vk_runtime_device.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ bool probe_vkr_devices(VkrBackend* runtime) {
315315
.allocate_buffer = (Buffer*(*)(Device*, size_t)) vkr_allocate_buffer_device,
316316
.import_host_memory_as_buffer = (Buffer*(*)(Device*, void*, size_t)) vkr_import_buffer_host,
317317
.launch_kernel = (Command*(*)(Device*, Program*, String, int, int, int, int, void**)) vkr_launch_kernel,
318+
.can_import_host_memory = vkr_can_import_host_memory,
318319
};
319320
append_list(Device*, runtime->base.runtime->devices, device);
320321
}

src/runtime/vulkan/vk_runtime_private.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ X(0, KHR_spirv_1_4, empty_fns) \
3434
X(0, KHR_portability_subset, empty_fns) \
3535
X(0, KHR_shader_subgroup_extended_types, empty_fns) \
3636
X(0, EXT_external_memory, empty_fns) \
37-
X(1, EXT_external_memory_host, external_memory_host_fns) \
37+
X(0, EXT_external_memory_host, external_memory_host_fns) \
3838
X(0, EXT_subgroup_size_control, empty_fns) \
3939
X(0, KHR_shader_float16_int8, empty_fns) \
4040
X(0, KHR_8bit_storage, empty_fns) \
@@ -169,6 +169,7 @@ typedef struct VkrBuffer_ {
169169

170170
VkrBuffer* vkr_allocate_buffer_device(VkrDevice* device, size_t size);
171171
VkrBuffer* vkr_import_buffer_host(VkrDevice* device, void* ptr, size_t size);
172+
bool vkr_can_import_host_memory(VkrDevice* device);
172173

173174
typedef struct VkrCommand_ VkrCommand;
174175

0 commit comments

Comments
 (0)