mirror of
https://github.com/gfx-rs/wgpu.git
synced 2025-02-17 01:12:41 +00:00
hal/vk: debug markers, bind groups, viewports
This commit is contained in:
parent
bc6bb0c3df
commit
67dfdb9193
@ -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(),
|
||||
|
@ -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) {
|
||||
|
@ -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,
|
||||
|
@ -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(
|
||||
|
@ -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>,
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user