hal/vk: debug markers, bind groups, viewports

This commit is contained in:
Dzmitry Malyshau 2021-06-16 02:05:34 -04:00
parent bc6bb0c3df
commit 67dfdb9193
5 changed files with 142 additions and 17 deletions

View File

@ -722,7 +722,6 @@ impl crate::Adapter<super::Api> for super::Adapter {
extension_fns: super::DeviceExtensionFunctions {
draw_indirect_count: indirect_count_fn,
},
features,
vendor_id: self.phd_capabilities.properties.vendor_id,
downlevel_flags: self.downlevel_flags,
private_caps: self.private_caps.clone(),

View File

@ -1,10 +1,10 @@
use super::conv;
use arrayvec::ArrayVec;
use ash::{version::DeviceV1_0, vk};
use ash::{extensions::ext, version::DeviceV1_0, vk};
use inplace_it::inplace_or_alloc_from_iter;
use std::{mem, ops::Range};
use std::{ffi::CStr, mem, ops::Range, slice};
const ALLOCATION_GRANULARITY: u32 = 16;
const DST_IMAGE_LAYOUT: vk::ImageLayout = vk::ImageLayout::TRANSFER_DST_OPTIMAL;
@ -39,6 +39,12 @@ impl super::Texture {
}
}
impl super::DeviceShared {
fn debug_messenger(&self) -> Option<&ext::DebugUtils> {
Some(&self.instance.debug_utils.as_ref()?.extension)
}
}
impl crate::CommandEncoder<super::Api> for super::CommandEncoder {
unsafe fn begin_encoding(&mut self, label: crate::Label) -> Result<(), crate::DeviceError> {
if self.free.is_empty() {
@ -75,6 +81,7 @@ impl crate::CommandEncoder<super::Api> for super::CommandEncoder {
where
I: Iterator<Item = super::CommandBuffer>,
{
self.marker.clear();
self.free
.extend(cmd_bufs.into_iter().map(|cmd_buf| cmd_buf.raw));
self.free.extend(self.discarded.drain(..));
@ -365,6 +372,19 @@ impl crate::CommandEncoder<super::Api> for super::CommandEncoder {
height: fb_key.extent.height,
},
};
let vk_viewports = [vk::Viewport {
x: 0.0,
y: if self.device.private_caps.flip_y_requires_shift {
fb_key.extent.height as f32
} else {
0.0
},
width: fb_key.extent.width as f32,
height: -(fb_key.extent.height as f32),
min_depth: 0.0,
max_depth: 1.0,
}];
let vk_scissors = [render_area];
let raw_pass = self.device.make_render_pass(rp_key).unwrap();
@ -385,9 +405,17 @@ impl crate::CommandEncoder<super::Api> for super::CommandEncoder {
vk_info = vk_info.push_next(&mut vk_attachment_info);
}
self.device
.raw
.cmd_set_viewport(self.active, 0, &vk_viewports);
self.device
.raw
.cmd_set_scissor(self.active, 0, &vk_scissors);
self.device
.raw
.cmd_begin_render_pass(self.active, &vk_info, vk::SubpassContents::INLINE);
self.bind_point = vk::PipelineBindPoint::GRAPHICS;
}
unsafe fn end_render_pass(&mut self) {
self.device.raw.cmd_end_render_pass(self.active);
@ -400,6 +428,15 @@ impl crate::CommandEncoder<super::Api> for super::CommandEncoder {
group: &super::BindGroup,
dynamic_offsets: &[wgt::DynamicOffset],
) {
let sets = [*group.set.raw()];
self.device.raw.cmd_bind_descriptor_sets(
self.active,
self.bind_point,
layout.raw,
index,
&sets,
dynamic_offsets,
);
}
unsafe fn set_push_constants(
&mut self,
@ -408,11 +445,40 @@ impl crate::CommandEncoder<super::Api> for super::CommandEncoder {
offset: u32,
data: &[u32],
) {
self.device.raw.cmd_push_constants(
self.active,
layout.raw,
conv::map_shader_stage(stages),
offset,
slice::from_raw_parts(data.as_ptr() as _, data.len() * 4),
);
}
unsafe fn insert_debug_marker(&mut self, label: &str) {}
unsafe fn begin_debug_marker(&mut self, group_label: &str) {}
unsafe fn end_debug_marker(&mut self) {}
unsafe fn insert_debug_marker(&mut self, label: &str) {
if let Some(ext) = self.device.debug_messenger() {
self.marker.clear();
self.marker.extend_from_slice(label.as_bytes());
self.marker.push(0);
let cstr = CStr::from_bytes_with_nul_unchecked(&self.marker);
let vk_label = vk::DebugUtilsLabelEXT::builder().label_name(&cstr).build();
ext.cmd_insert_debug_utils_label(self.active, &vk_label);
}
}
unsafe fn begin_debug_marker(&mut self, group_label: &str) {
if let Some(ext) = self.device.debug_messenger() {
self.marker.clear();
self.marker.extend_from_slice(group_label.as_bytes());
self.marker.push(0);
let cstr = CStr::from_bytes_with_nul_unchecked(&self.marker);
let vk_label = vk::DebugUtilsLabelEXT::builder().label_name(&cstr).build();
ext.cmd_begin_debug_utils_label(self.active, &vk_label);
}
}
unsafe fn end_debug_marker(&mut self) {
if let Some(ext) = self.device.debug_messenger() {
ext.cmd_end_debug_utils_label(self.active);
}
}
unsafe fn set_render_pipeline(&mut self, pipeline: &super::RenderPipeline) {
self.device.raw.cmd_bind_pipeline(
@ -427,17 +493,72 @@ impl crate::CommandEncoder<super::Api> for super::CommandEncoder {
binding: crate::BufferBinding<'a, super::Api>,
format: wgt::IndexFormat,
) {
self.device.raw.cmd_bind_index_buffer(
self.active,
binding.buffer.raw,
binding.offset,
conv::map_index_format(format),
);
}
unsafe fn set_vertex_buffer<'a>(
&mut self,
index: u32,
binding: crate::BufferBinding<'a, super::Api>,
) {
let vk_buffers = [binding.buffer.raw];
let vk_offsets = [binding.offset];
self.device
.raw
.cmd_bind_vertex_buffers(self.active, index, &vk_buffers, &vk_offsets);
}
unsafe fn set_viewport(&mut self, rect: &crate::Rect<f32>, depth_range: Range<f32>) {
let vk_viewports = [vk::Viewport {
x: rect.x,
y: if self.device.private_caps.flip_y_requires_shift {
rect.y + rect.h
} else {
rect.y
},
width: rect.w,
height: -rect.h, // flip Y
min_depth: depth_range.start,
max_depth: depth_range.end,
}];
self.device
.raw
.cmd_set_viewport(self.active, 0, &vk_viewports);
}
unsafe fn set_scissor_rect(&mut self, rect: &crate::Rect<u32>) {
let vk_scissors = [vk::Rect2D {
offset: vk::Offset2D {
x: rect.x as i32,
y: rect.y as i32,
},
extent: vk::Extent2D {
width: rect.w,
height: rect.h,
},
}];
self.device
.raw
.cmd_set_scissor(self.active, 0, &vk_scissors);
}
unsafe fn set_stencil_reference(&mut self, value: u32) {
self.device
.raw
.cmd_set_stencil_reference(self.active, vk::StencilFaceFlags::all(), value);
}
unsafe fn set_blend_constants(&mut self, color: &wgt::Color) {
let vk_constants = [
color.r as f32,
color.g as f32,
color.b as f32,
color.a as f32,
];
self.device
.raw
.cmd_set_blend_constants(self.active, &vk_constants);
}
unsafe fn set_viewport(&mut self, rect: &crate::Rect<f32>, depth_range: Range<f32>) {}
unsafe fn set_scissor_rect(&mut self, rect: &crate::Rect<u32>) {}
unsafe fn set_stencil_reference(&mut self, value: u32) {}
unsafe fn set_blend_constants(&mut self, color: &wgt::Color) {}
unsafe fn draw(
&mut self,
@ -491,7 +612,9 @@ impl crate::CommandEncoder<super::Api> for super::CommandEncoder {
// compute
unsafe fn begin_compute_pass(&mut self, desc: &crate::ComputePassDescriptor) {}
unsafe fn begin_compute_pass(&mut self, desc: &crate::ComputePassDescriptor) {
self.bind_point = vk::PipelineBindPoint::COMPUTE;
}
unsafe fn end_compute_pass(&mut self) {}
unsafe fn set_compute_pipeline(&mut self, pipeline: &super::ComputePipeline) {

View File

@ -548,7 +548,7 @@ pub fn map_subresource_layers(
) -> (vk::ImageSubresourceLayers, vk::Offset3D) {
let (base_array_layer, offset) = map_origin(base.origin, texture_dim);
let subresource = vk::ImageSubresourceLayers {
aspect_mask: map_aspects(crate::FormatAspect::from(base.aspect) & texture_aspect),
aspect_mask: map_aspects(base.aspect & texture_aspect),
mip_level: base.mip_level,
base_array_layer,
layer_count,

View File

@ -806,6 +806,8 @@ impl crate::Device<super::Api> for super::Device {
raw,
device: Arc::clone(&self.shared),
active: vk::CommandBuffer::null(),
bind_point: vk::PipelineBindPoint::default(),
marker: Vec::new(),
free: Vec::new(),
discarded: Vec::new(),
})
@ -1009,12 +1011,12 @@ impl crate::Device<super::Api> for super::Device {
}
self.shared.raw.update_descriptor_sets(&writes, &[]);
Ok(super::BindGroup { raw: set })
Ok(super::BindGroup { set })
}
unsafe fn destroy_bind_group(&self, group: super::BindGroup) {
self.desc_allocator
.lock()
.free(&*self.shared, Some(group.raw));
.free(&*self.shared, Some(group.set));
}
unsafe fn create_shader_module(

View File

@ -50,6 +50,7 @@ impl crate::Api for Api {
struct DebugUtils {
extension: ext::DebugUtils,
#[allow(dead_code)]
messenger: vk::DebugUtilsMessengerEXT,
}
@ -58,7 +59,6 @@ struct InstanceShared {
flags: crate::InstanceFlag,
debug_utils: Option<DebugUtils>,
get_physical_device_properties: Option<vk::KhrGetPhysicalDeviceProperties2Fn>,
//debug_messenger: Option<DebugMessenger>,
}
pub struct Instance {
@ -206,7 +206,6 @@ struct DeviceShared {
raw: ash::Device,
instance: Arc<InstanceShared>,
extension_fns: DeviceExtensionFunctions,
features: wgt::Features,
vendor_id: u32,
_timestamp_period: f32,
downlevel_flags: wgt::DownlevelFlags,
@ -277,13 +276,15 @@ pub struct PipelineLayout {
#[derive(Debug)]
pub struct BindGroup {
raw: gpu_descriptor::DescriptorSet<vk::DescriptorSet>,
set: gpu_descriptor::DescriptorSet<vk::DescriptorSet>,
}
pub struct CommandEncoder {
raw: vk::CommandPool,
device: Arc<DeviceShared>,
active: vk::CommandBuffer,
bind_point: vk::PipelineBindPoint,
marker: Vec<u8>,
free: Vec<vk::CommandBuffer>,
discarded: Vec<vk::CommandBuffer>,
}