summaryrefslogtreecommitdiffstats
path: root/src/gpu.rs
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2026-04-16 15:29:50 +0000
committers-ol <s+removethis@s-ol.nu>2026-05-14 14:46:13 +0000
commit5925137f3b41cb3a87f098604ef482bced91341e (patch)
tree613ee305358e319bab5d88a85cc923b4870d73f1 /src/gpu.rs
parentrefactor (diff)
downloadwgsl-view-5925137f3b41cb3a87f098604ef482bced91341e.tar.gz
wgsl-view-5925137f3b41cb3a87f098604ef482bced91341e.zip
tsv integration, split binaries
Diffstat (limited to 'src/gpu.rs')
-rw-r--r--src/gpu.rs141
1 files changed, 141 insertions, 0 deletions
diff --git a/src/gpu.rs b/src/gpu.rs
new file mode 100644
index 0000000..e6529f9
--- /dev/null
+++ b/src/gpu.rs
@@ -0,0 +1,141 @@
+use std::time::Duration;
+
+use ash::vk;
+use texture_share_vk_base::vk_device::VkDevice;
+use texture_share_vk_base::vk_entry::VkEntry;
+use texture_share_vk_base::vk_instance::VkInstance;
+use texture_share_vk_base::vk_setup::VkSetup;
+use texture_share_vk_client::VkClient;
+
+const TSV_SERVER_EXECUTABLE: &str = "/usr/bin/texture-share-vk-server";
+const TSV_SERVER_SOCKET_PATH: &str = "/tmp/vk_server/vk_server.sock";
+const TSV_SERVER_LOCK_PATH: &str = "/tmp/vk_server/vk_server.lock";
+const TSV_SHMEM_PREFIX: &str = "shmem_img_";
+
+/// Creates a wgpu instance configured for Vulkan.
+pub fn create_instance() -> wgpu::Instance {
+ wgpu::Instance::new(wgpu::InstanceDescriptor {
+ backends: wgpu::Backends::VULKAN,
+ flags: wgpu::InstanceFlags::default(),
+ backend_options: wgpu::BackendOptions::default(),
+ memory_budget_thresholds: wgpu::MemoryBudgetThresholds::default(),
+ display: None,
+ })
+}
+
+/// Requests a wgpu adapter, optionally compatible with a surface.
+pub fn create_adapter(
+ instance: &wgpu::Instance,
+ surface: Option<&wgpu::Surface<'_>>,
+) -> wgpu::Adapter {
+ pollster::block_on(instance.request_adapter(&wgpu::RequestAdapterOptions {
+ power_preference: wgpu::PowerPreference::HighPerformance,
+ compatible_surface: surface,
+ force_fallback_adapter: false,
+ }))
+ .expect("find vulkan adapter")
+}
+
+/// Requests a wgpu device + queue.
+pub fn create_device(adapter: &wgpu::Adapter) -> (wgpu::Device, wgpu::Queue) {
+ pollster::block_on(adapter.request_device(&wgpu::DeviceDescriptor {
+ label: Some("device"),
+ ..Default::default()
+ }))
+ .expect("create device")
+}
+
+/// Builds a texture-share-vk VkSetup by importing raw Vulkan handles from a wgpu device.
+/// The returned VkSetup does NOT own the Vulkan objects (import_only = true).
+fn import_vk_setup(device: &wgpu::Device) -> VkSetup {
+ // Extract raw handles from the wgpu HAL device
+ let (raw_instance, raw_device, raw_physical_device, raw_queue, queue_family_index, queue_index) = unsafe {
+ let hal = device
+ .as_hal::<wgpu_hal::api::Vulkan>()
+ .expect("vulkan HAL device");
+
+ let instance_shared = hal.shared_instance();
+ let raw_instance = instance_shared.raw_instance().handle();
+ let raw_device = hal.raw_device().handle();
+ let raw_physical_device = hal.raw_physical_device();
+ let raw_queue = hal.raw_queue();
+ let queue_family_index = hal.queue_family_index();
+ let queue_index = hal.queue_index();
+
+ (
+ raw_instance,
+ raw_device,
+ raw_physical_device,
+ raw_queue,
+ queue_family_index,
+ queue_index,
+ )
+ };
+
+ let vk_entry = Box::new(VkEntry::new().expect("vulkan entry"));
+ let vk_instance =
+ VkInstance::import_vk(Some(vk_entry), raw_instance, true).expect("import vulkan instance");
+ let vk_device = VkDevice::import_vk(
+ &vk_instance,
+ raw_device,
+ raw_physical_device,
+ raw_queue,
+ queue_family_index,
+ queue_index,
+ true,
+ )
+ .expect("import vulkan device");
+
+ VkSetup::new(vk_instance, vk_device)
+}
+
+/// Creates a VkClient connected to the texture-share-vk server,
+/// launching the server if needed.
+pub fn create_tsv_client(device: &wgpu::Device) -> VkClient {
+ let vk_setup = import_vk_setup(device);
+ let timeout = Duration::from_secs(2);
+
+ VkClient::new_with_server_launch(
+ TSV_SERVER_SOCKET_PATH,
+ Box::new(vk_setup),
+ Duration::from_secs(1),
+ TSV_SERVER_EXECUTABLE,
+ TSV_SERVER_LOCK_PATH,
+ TSV_SERVER_SOCKET_PATH,
+ TSV_SHMEM_PREFIX,
+ timeout,
+ timeout,
+ timeout,
+ timeout,
+ timeout,
+ )
+ .expect("connect to texture-share-vk server")
+}
+
+/// Image format for texture-share-vk, matching RGBA8.
+pub const TSV_FORMAT: texture_share_vk_base::ipc::platform::img_data::ImgFormat =
+ texture_share_vk_base::ipc::platform::img_data::ImgFormat::R8G8B8A8;
+
+/// Extracts the raw vk::Image handle from a wgpu Texture.
+///
+/// # Safety
+/// The returned handle must not outlive the texture.
+pub unsafe fn raw_image(texture: &wgpu::Texture) -> vk::Image {
+ let hal = texture
+ .as_hal::<wgpu_hal::api::Vulkan>()
+ .expect("vulkan HAL texture");
+ hal.raw_handle()
+}
+
+/// Creates a vk::Fence on the VkClient's device.
+pub fn create_fence(client: &VkClient) -> vk::Fence {
+ let device = &client.get_vk_setup().device.device;
+ let create_info = vk::FenceCreateInfo::default();
+ unsafe { device.create_fence(&create_info, None) }.expect("create fence")
+}
+
+/// Destroys a vk::Fence.
+pub fn destroy_fence(client: &VkClient, fence: vk::Fence) {
+ let device = &client.get_vk_setup().device.device;
+ unsafe { device.destroy_fence(fence, None) };
+}