Skip to content

Commit 0644506

Browse files
committed
[vk] use destructuring for cache keys
If fields are unused, they shouldn't be part of the cache key.
1 parent 2b51270 commit 0644506

File tree

2 files changed

+100
-57
lines changed

2 files changed

+100
-57
lines changed

wgpu-hal/src/vulkan/command.rs

+22-9
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,18 @@ impl super::CommandEncoder {
5959
Ok(match self.framebuffers.entry(key) {
6060
Entry::Occupied(e) => *e.get(),
6161
Entry::Vacant(e) => {
62+
let super::FramebufferKey {
63+
raw_pass,
64+
ref attachments,
65+
extent,
66+
} = *e.key();
67+
6268
let vk_info = vk::FramebufferCreateInfo::default()
63-
.render_pass(e.key().raw_pass)
64-
.width(e.key().extent.width)
65-
.height(e.key().extent.height)
66-
.layers(e.key().extent.depth_or_array_layers)
67-
.attachments(&e.key().attachments);
69+
.render_pass(raw_pass)
70+
.width(extent.width)
71+
.height(extent.height)
72+
.layers(extent.depth_or_array_layers)
73+
.attachments(attachments);
6874

6975
let raw = unsafe { self.device.raw.create_framebuffer(&vk_info, None).unwrap() };
7076
*e.insert(raw)
@@ -79,15 +85,22 @@ impl super::CommandEncoder {
7985
Ok(match self.temp_texture_views.entry(key) {
8086
Entry::Occupied(e) => *e.get(),
8187
Entry::Vacant(e) => {
88+
let super::TempTextureViewKey {
89+
texture,
90+
format,
91+
mip_level,
92+
depth_slice,
93+
} = *e.key();
94+
8295
let vk_info = vk::ImageViewCreateInfo::default()
83-
.image(e.key().texture)
96+
.image(texture)
8497
.view_type(vk::ImageViewType::TYPE_2D)
85-
.format(e.key().format)
98+
.format(format)
8699
.subresource_range(vk::ImageSubresourceRange {
87100
aspect_mask: vk::ImageAspectFlags::COLOR,
88-
base_mip_level: e.key().mip_level,
101+
base_mip_level: mip_level,
89102
level_count: 1,
90-
base_array_layer: e.key().depth_slice,
103+
base_array_layer: depth_slice,
91104
layer_count: 1,
92105
});
93106
let raw = unsafe { self.device.raw.create_image_view(&vk_info, None) }

wgpu-hal/src/vulkan/device.rs

+78-48
Original file line numberDiff line numberDiff line change
@@ -75,76 +75,106 @@ impl super::DeviceShared {
7575
Ok(match self.render_passes.lock().entry(key) {
7676
Entry::Occupied(e) => *e.get(),
7777
Entry::Vacant(e) => {
78+
let super::RenderPassKey {
79+
ref colors,
80+
ref depth_stencil,
81+
sample_count,
82+
multiview,
83+
} = *e.key();
84+
7885
let mut vk_attachments = Vec::new();
79-
let mut color_refs = Vec::with_capacity(e.key().colors.len());
86+
let mut color_refs = Vec::with_capacity(colors.len());
8087
let mut resolve_refs = Vec::with_capacity(color_refs.capacity());
8188
let mut ds_ref = None;
82-
let samples = vk::SampleCountFlags::from_raw(e.key().sample_count);
89+
let samples = vk::SampleCountFlags::from_raw(sample_count);
8390
let unused = vk::AttachmentReference {
8491
attachment: vk::ATTACHMENT_UNUSED,
8592
layout: vk::ImageLayout::UNDEFINED,
8693
};
87-
for cat in e.key().colors.iter() {
88-
let (color_ref, resolve_ref) = if let Some(cat) = cat.as_ref() {
89-
let color_ref = vk::AttachmentReference {
90-
attachment: vk_attachments.len() as u32,
91-
layout: cat.base.layout,
92-
};
93-
vk_attachments.push({
94-
let (load_op, store_op) = conv::map_attachment_ops(cat.base.ops);
95-
vk::AttachmentDescription::default()
96-
.format(cat.base.format)
97-
.samples(samples)
98-
.load_op(load_op)
99-
.store_op(store_op)
100-
.initial_layout(cat.base.layout)
101-
.final_layout(cat.base.layout)
102-
});
103-
let resolve_ref = if let Some(ref rat) = cat.resolve {
104-
let (load_op, store_op) = conv::map_attachment_ops(rat.ops);
105-
let vk_attachment = vk::AttachmentDescription::default()
106-
.format(rat.format)
107-
.samples(vk::SampleCountFlags::TYPE_1)
108-
.load_op(load_op)
109-
.store_op(store_op)
110-
.initial_layout(rat.layout)
111-
.final_layout(rat.layout);
112-
vk_attachments.push(vk_attachment);
113-
114-
vk::AttachmentReference {
115-
attachment: vk_attachments.len() as u32 - 1,
116-
layout: rat.layout,
117-
}
94+
for cat in colors.iter() {
95+
let (color_ref, resolve_ref) =
96+
if let Some(super::ColorAttachmentKey { base, resolve }) = cat {
97+
let super::AttachmentKey {
98+
format,
99+
layout,
100+
ops,
101+
} = *base;
102+
103+
let color_ref = vk::AttachmentReference {
104+
attachment: vk_attachments.len() as u32,
105+
layout,
106+
};
107+
vk_attachments.push({
108+
let (load_op, store_op) = conv::map_attachment_ops(ops);
109+
vk::AttachmentDescription::default()
110+
.format(format)
111+
.samples(samples)
112+
.load_op(load_op)
113+
.store_op(store_op)
114+
.initial_layout(layout)
115+
.final_layout(layout)
116+
});
117+
let resolve_ref = if let Some(rat) = resolve {
118+
let super::AttachmentKey {
119+
format,
120+
layout,
121+
ops,
122+
} = *rat;
123+
124+
let (load_op, store_op) = conv::map_attachment_ops(ops);
125+
let vk_attachment = vk::AttachmentDescription::default()
126+
.format(format)
127+
.samples(vk::SampleCountFlags::TYPE_1)
128+
.load_op(load_op)
129+
.store_op(store_op)
130+
.initial_layout(layout)
131+
.final_layout(layout);
132+
vk_attachments.push(vk_attachment);
133+
134+
vk::AttachmentReference {
135+
attachment: vk_attachments.len() as u32 - 1,
136+
layout,
137+
}
138+
} else {
139+
unused
140+
};
141+
142+
(color_ref, resolve_ref)
118143
} else {
119-
unused
144+
(unused, unused)
120145
};
121146

122-
(color_ref, resolve_ref)
123-
} else {
124-
(unused, unused)
125-
};
126-
127147
color_refs.push(color_ref);
128148
resolve_refs.push(resolve_ref);
129149
}
130150

131-
if let Some(ref ds) = e.key().depth_stencil {
151+
if let Some(ds) = depth_stencil {
152+
let super::DepthStencilAttachmentKey {
153+
ref base,
154+
stencil_ops,
155+
} = *ds;
156+
157+
let super::AttachmentKey {
158+
format,
159+
layout,
160+
ops,
161+
} = *base;
162+
132163
ds_ref = Some(vk::AttachmentReference {
133164
attachment: vk_attachments.len() as u32,
134-
layout: ds.base.layout,
165+
layout,
135166
});
136-
let (load_op, store_op) = conv::map_attachment_ops(ds.base.ops);
137-
let (stencil_load_op, stencil_store_op) =
138-
conv::map_attachment_ops(ds.stencil_ops);
167+
let (load_op, store_op) = conv::map_attachment_ops(ops);
168+
let (stencil_load_op, stencil_store_op) = conv::map_attachment_ops(stencil_ops);
139169
let vk_attachment = vk::AttachmentDescription::default()
140-
.format(ds.base.format)
170+
.format(format)
141171
.samples(samples)
142172
.load_op(load_op)
143173
.store_op(store_op)
144174
.stencil_load_op(stencil_load_op)
145175
.stencil_store_op(stencil_store_op)
146-
.initial_layout(ds.base.layout)
147-
.final_layout(ds.base.layout);
176+
.initial_layout(layout)
177+
.final_layout(layout);
148178
vk_attachments.push(vk_attachment);
149179
}
150180

@@ -174,7 +204,7 @@ impl super::DeviceShared {
174204

175205
let mut multiview_info;
176206
let mask;
177-
if let Some(multiview) = e.key().multiview {
207+
if let Some(multiview) = multiview {
178208
// Sanity checks, better to panic here than cause a driver crash
179209
assert!(multiview.get() <= 8);
180210
assert!(multiview.get() > 1);

0 commit comments

Comments
 (0)