1use std::ptr;
2
3pub struct DummyResources {
4    pub size: blade_graphics::Extent,
5    pub white_texture: blade_graphics::Texture,
6    pub white_view: blade_graphics::TextureView,
7    pub black_texture: blade_graphics::Texture,
8    pub black_view: blade_graphics::TextureView,
9    pub red_texture: blade_graphics::Texture,
10    pub red_view: blade_graphics::TextureView,
11    staging_buf: blade_graphics::Buffer,
12}
13
14impl DummyResources {
15    pub fn new(
16        command_encoder: &mut blade_graphics::CommandEncoder,
17        gpu: &blade_graphics::Context,
18    ) -> Self {
19        let size = blade_graphics::Extent {
20            width: 1,
21            height: 1,
22            depth: 1,
23        };
24        let white_texture = gpu.create_texture(blade_graphics::TextureDesc {
25            name: "dummy/white",
26            format: blade_graphics::TextureFormat::Rgba8Unorm,
27            size,
28            array_layer_count: 1,
29            mip_level_count: 1,
30            dimension: blade_graphics::TextureDimension::D2,
31            usage: blade_graphics::TextureUsage::COPY | blade_graphics::TextureUsage::RESOURCE,
32            sample_count: 1,
33        });
34        let white_view = gpu.create_texture_view(
35            white_texture,
36            blade_graphics::TextureViewDesc {
37                name: "dummy/white",
38                format: blade_graphics::TextureFormat::Rgba8Unorm,
39                dimension: blade_graphics::ViewDimension::D2,
40                subresources: &blade_graphics::TextureSubresources::default(),
41            },
42        );
43        let black_texture = gpu.create_texture(blade_graphics::TextureDesc {
44            name: "dummy/black",
45            format: blade_graphics::TextureFormat::Rgba8Unorm,
46            size,
47            array_layer_count: 1,
48            mip_level_count: 1,
49            dimension: blade_graphics::TextureDimension::D2,
50            usage: blade_graphics::TextureUsage::COPY | blade_graphics::TextureUsage::RESOURCE,
51            sample_count: 1,
52        });
53        let black_view = gpu.create_texture_view(
54            black_texture,
55            blade_graphics::TextureViewDesc {
56                name: "dummy/black",
57                format: blade_graphics::TextureFormat::Rgba8Unorm,
58                dimension: blade_graphics::ViewDimension::D2,
59                subresources: &blade_graphics::TextureSubresources::default(),
60            },
61        );
62        let red_texture = gpu.create_texture(blade_graphics::TextureDesc {
63            name: "dummy/red",
64            format: blade_graphics::TextureFormat::Rgba8Unorm,
65            size,
66            array_layer_count: 1,
67            mip_level_count: 1,
68            dimension: blade_graphics::TextureDimension::D2,
69            usage: blade_graphics::TextureUsage::COPY | blade_graphics::TextureUsage::RESOURCE,
70            sample_count: 1,
71        });
72        let red_view = gpu.create_texture_view(
73            red_texture,
74            blade_graphics::TextureViewDesc {
75                name: "dummy/red",
76                format: blade_graphics::TextureFormat::Rgba8Unorm,
77                dimension: blade_graphics::ViewDimension::D2,
78                subresources: &blade_graphics::TextureSubresources::default(),
79            },
80        );
81
82        command_encoder.init_texture(white_texture);
83        command_encoder.init_texture(black_texture);
84        command_encoder.init_texture(red_texture);
85        let mut transfers = command_encoder.transfer("init dummy");
86        let staging_buf = gpu.create_buffer(blade_graphics::BufferDesc {
87            name: "dummy/staging",
88            size: 4 * 3,
89            memory: blade_graphics::Memory::Upload,
90        });
91        unsafe {
92            ptr::write(
93                staging_buf.data() as *mut _,
94                [!0u8, !0, !0, !0, 0, 0, 0, 0, !0, 0, 0, 0],
95            );
96        }
97        transfers.copy_buffer_to_texture(staging_buf.at(0), 4, white_texture.into(), size);
98        transfers.copy_buffer_to_texture(staging_buf.at(4), 4, black_texture.into(), size);
99        transfers.copy_buffer_to_texture(staging_buf.at(8), 4, red_texture.into(), size);
100
101        Self {
102            size,
103            white_texture,
104            white_view,
105            black_texture,
106            black_view,
107            red_texture,
108            red_view,
109            staging_buf,
110        }
111    }
112
113    pub fn destroy(&mut self, gpu: &blade_graphics::Context) {
114        gpu.destroy_texture_view(self.white_view);
115        gpu.destroy_texture(self.white_texture);
116        gpu.destroy_texture_view(self.black_view);
117        gpu.destroy_texture(self.black_texture);
118        gpu.destroy_texture_view(self.red_view);
119        gpu.destroy_texture(self.red_texture);
120        gpu.destroy_buffer(self.staging_buf);
121    }
122}