spirv_to_dxil/
object.rs

1use std::ops::Deref;
2
3/// A compiled DXIL artifact.
4pub struct DxilObject {
5    inner: spirv_to_dxil_sys::dxil_spirv_object,
6}
7
8impl Drop for DxilObject {
9    fn drop(&mut self) {
10        unsafe {
11            // SAFETY:
12            // spirv_to_dxil_free frees only the interior buffer.
13            // https://gitlab.freedesktop.org/mesa/mesa/-/blob/7b0d00034201f8284a41370c0c3326736ae1134c/src/microsoft/spirv_to_dxil/spirv_to_dxil.c#L118
14            spirv_to_dxil_sys::spirv_to_dxil_free(&mut self.inner)
15        }
16    }
17}
18
19impl DxilObject {
20    pub(crate) fn new(raw: spirv_to_dxil_sys::dxil_spirv_object) -> Self {
21        Self { inner: raw }
22    }
23
24    /// Returns if the compiled shader requires runtime data to be bound.
25    pub fn requires_runtime_data(&self) -> bool {
26        self.inner.metadata.requires_runtime_data
27    }
28}
29
30impl Deref for DxilObject {
31    type Target = [u8];
32
33    fn deref(&self) -> &Self::Target {
34        unsafe {
35            std::slice::from_raw_parts(self.inner.binary.buffer.cast(), self.inner.binary.size)
36        }
37    }
38}