implcrate::CommandEncoder forsuper::CommandEncoder { type A = super::Api;
unsafefn begin_encoding(&mutself, label: crate::Label) -> Result<(), crate::DeviceError> { ifself.free.is_empty() { let vk_info = vk::CommandBufferAllocateInfo::default()
.command_pool(self.raw)
.command_buffer_count(ALLOCATION_GRANULARITY); let cmd_buf_vec = unsafe { self.device
.raw
.allocate_command_buffers(&vk_info)
.map_err(super::map_host_device_oom_err)?
}; self.free.extend(cmd_buf_vec);
} let raw = self.free.pop().unwrap();
// Set the name unconditionally, since there might be a // previous name assigned to this. unsafe { self.device.set_object_name(raw, label.unwrap_or_default()) };
// Reset this in case the last renderpass was never ended. self.rpass_debug_marker_active = false;
unsafefn end_encoding(&mutself) -> Result<super::CommandBuffer, crate::DeviceError> { let raw = self.active; self.active = vk::CommandBuffer::null(); unsafe { self.device.raw.end_command_buffer(raw) }.map_err(map_err)?; fn map_err(err: vk::Result) -> crate::DeviceError { // We don't use VK_KHR_video_encode_queue // VK_ERROR_INVALID_VIDEO_STD_PARAMETERS_KHR super::map_host_device_oom_err(err)
}
Ok(super::CommandBuffer { raw })
}
unsafefn discard_encoding(&mutself) { // Safe use requires this is not called in the "closed" state, so the buffer // shouldn't be null. Assert this to make sure we're not pushing null // buffers to the discard pile.
assert_ne!(self.active, vk::CommandBuffer::null());
unsafefn transition_buffers<'a, T>(&mut self, barriers: T) where
T: Iterator<Item = crate::BufferBarrier<'a, super::Buffer>>,
{ //Note: this is done so that we never end up with empty stage flags letmut src_stages = vk::PipelineStageFlags::TOP_OF_PIPE; letmut dst_stages = vk::PipelineStageFlags::BOTTOM_OF_PIPE; let vk_barriers = &mutself.temp.buffer_barriers;
vk_barriers.clear();
for bar in barriers { let (src_stage, src_access) = conv::map_buffer_usage_to_barrier(bar.usage.from);
src_stages |= src_stage; let (dst_stage, dst_access) = conv::map_buffer_usage_to_barrier(bar.usage.to);
dst_stages |= dst_stage;
for bar in barriers { let range = conv::map_subresource_range_combined_aspect(
&bar.range,
bar.texture.format,
&self.device.private_caps,
); let (src_stage, src_access) = conv::map_texture_usage_to_barrier(bar.usage.from); let src_layout = conv::derive_image_layout(bar.usage.from, bar.texture.format);
src_stages |= src_stage; let (dst_stage, dst_access) = conv::map_texture_usage_to_barrier(bar.usage.to); let dst_layout = conv::derive_image_layout(bar.usage.to, bar.texture.format);
dst_stages |= dst_stage;
let ray_tracing_functions = self
.device
.extension_fns
.ray_tracing
.as_ref()
.expect("Feature `RAY_TRACING` not enabled");
let get_device_address = |buffer: Option<&super::Buffer>| unsafe { match buffer {
Some(buffer) => ray_tracing_functions
.buffer_device_address
.get_buffer_device_address(
&vk::BufferDeviceAddressInfo::default().buffer(buffer.raw),
),
None => panic!("Buffers are required to build acceleration structures"),
}
};
// storage to all the data required for cmd_build_acceleration_structures letmut ranges_storage = smallvec::SmallVec::<
[smallvec::SmallVec<[vk::AccelerationStructureBuildRangeInfoKHR; CAPACITY_INNER]>;
CAPACITY_OUTER],
>::with_capacity(descriptor_count); letmut geometries_storage = smallvec::SmallVec::<
[smallvec::SmallVec<[vk::AccelerationStructureGeometryKHR; CAPACITY_INNER]>;
CAPACITY_OUTER],
>::with_capacity(descriptor_count);
// pointers to all the data required for cmd_build_acceleration_structures letmut geometry_infos = smallvec::SmallVec::<
[vk::AccelerationStructureBuildGeometryInfoKHR; CAPACITY_OUTER],
>::with_capacity(descriptor_count); letmut ranges_ptrs = smallvec::SmallVec::<
[&[vk::AccelerationStructureBuildRangeInfoKHR]; CAPACITY_OUTER],
>::with_capacity(descriptor_count);
for desc in descriptors { let (geometries, ranges) = match *desc.entries { crate::AccelerationStructureEntries::Instances(ref instances) => { let instance_data = vk::AccelerationStructureGeometryInstancesDataKHR::default( // TODO: Code is so large that rustfmt refuses to treat this... :(
)
.data(vk::DeviceOrHostAddressConstKHR {
device_address: get_device_address(instances.buffer),
});
let geometry = vk::AccelerationStructureGeometryKHR::default()
.geometry_type(vk::GeometryTypeKHR::INSTANCES)
.geometry(vk::AccelerationStructureGeometryDataKHR {
instances: instance_data,
});
let range = vk::AccelerationStructureBuildRangeInfoKHR::default()
.primitive_count(instances.count)
.primitive_offset(instances.offset);
(smallvec::smallvec![geometry], smallvec::smallvec![range])
} crate::AccelerationStructureEntries::Triangles(ref in_geometries) => { letmut ranges = smallvec::SmallVec::<
[vk::AccelerationStructureBuildRangeInfoKHR; CAPACITY_INNER],
>::with_capacity(in_geometries.len()); letmut geometries = smallvec::SmallVec::<
[vk::AccelerationStructureGeometryKHR; CAPACITY_INNER],
>::with_capacity(in_geometries.len()); for triangles in in_geometries { letmut triangle_data =
vk::AccelerationStructureGeometryTrianglesDataKHR::default() // IndexType::NONE_KHR is not set by default (due to being provided by VK_KHR_acceleration_structure) but unless there is an // index buffer we need to have IndexType::NONE_KHR as our index type.
.index_type(vk::IndexType::NONE_KHR)
.vertex_data(vk::DeviceOrHostAddressConstKHR {
device_address: get_device_address(triangles.vertex_buffer),
})
.vertex_format(conv::map_vertex_format(triangles.vertex_format))
.max_vertex(triangles.vertex_count)
.vertex_stride(triangles.vertex_stride);
letmut range = vk::AccelerationStructureBuildRangeInfoKHR::default();
range = range
.primitive_count(indices.count / 3)
.primitive_offset(indices.offset)
.first_vertex(triangles.first_vertex);
} else {
range = range
.primitive_count(triangles.vertex_count)
.first_vertex(triangles.first_vertex);
}
// Assert this attachment is valid for the detected multiview, as a sanity check // The driver crash for this is really bad on AMD, so the check is worth it iflet Some(multiview) = desc.multiview {
assert_eq!(cat.target.view.layers, multiview); iflet Some(ref resolve_target) = cat.resolve_target {
assert_eq!(resolve_target.view.layers, multiview);
}
}
} else {
rp_key.colors.push(None);
}
} iflet Some(ref ds) = desc.depth_stencil_attachment {
vk_clear_values.push(vk::ClearValue {
depth_stencil: vk::ClearDepthStencilValue {
depth: ds.clear_value.0,
stencil: ds.clear_value.1,
},
});
vk_image_views.push(ds.target.view.raw);
rp_key.depth_stencil = Some(super::DepthStencilAttachmentKey {
base: ds.target.make_attachment_key(ds.depth_ops, caps),
stencil_ops: ds.stencil_ops,
});
fb_key.attachments.push(ds.target.view.attachment.clone());
// Assert this attachment is valid for the detected multiview, as a sanity check // The driver crash for this is really bad on AMD, so the check is worth it iflet Some(multiview) = desc.multiview {
assert_eq!(ds.target.view.layers, multiview);
}
}
rp_key.sample_count = fb_key.sample_count;
rp_key.multiview = desc.multiview;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.