diff --git a/src/element_creator/mod.rs b/src/element_creator/mod.rs index 4522cdb..4a8289d 100644 --- a/src/element_creator/mod.rs +++ b/src/element_creator/mod.rs @@ -109,3 +109,75 @@ impl ElementCreator { todo!() } } + +struct Generator { + device: Arc, + queue: Arc>, + + max_supported_sample_count: VkSampleCountFlags, + vertex_shader: Arc>, + fragment_shader: Arc>, +} + +impl Generator { + fn new(device: Arc, queue: Arc>) -> Result { + Ok(Self { + max_supported_sample_count: device.max_supported_sample_count(VK_SAMPLE_COUNT_16_BIT), + + vertex_shader: ShaderModule::from_slice( + device.clone(), + include_bytes!("generator.vert.spv"), + )?, + fragment_shader: ShaderModule::from_slice( + device.clone(), + include_bytes!("generator.frag.spv"), + )?, + + device, + queue, + }) + } + + fn generate(&self, definition: ElementDefinition) -> Result> { + let image = self.create_image(definition.width, definition.height)?; + + todo!() + } + + fn create_image(&self, width: u32, height: u32) -> Result> { + let image = Image::empty( + width, + height, + VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, + VK_SAMPLE_COUNT_1_BIT, + ) + .format(VK_FORMAT_R8G8B8A8_UNORM) + .attach_sampler(Sampler::nearest_sampler().build(&self.device)?) + .build(&self.device, &self.queue)?; + + image.convert_layout(VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)?; + + Ok(image) + } + + fn render_target(&self, image: &Arc) -> Result { + RenderTarget::builder() + .add_sub_pass( + SubPass::builder(image.width(), image.height()) + .add_target_info(CustomTarget { + usage: VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT.into(), + format: image.vk_format(), + clear_on_load: true, + store_on_save: true, + attach_sampler: false, + use_as_input: false, + clear_value: ClearValue::Color([0.0, 0.0, 0.0, 0.0]), + }) + .set_sample_count(self.max_supported_sample_count) + .add_resolve_targets((vec![image.clone()], true)) + .use_queue(image.queue().clone()) + .build(image.device())?, + ) + .build(image.device()) + } +} diff --git a/src/guihandler/guihandler.rs b/src/guihandler/guihandler.rs index 8ecc7ca..534b584 100644 --- a/src/guihandler/guihandler.rs +++ b/src/guihandler/guihandler.rs @@ -1581,8 +1581,8 @@ impl GuiHandler { device: &Arc, render_pass: &Arc, pipeline_layout: &Arc, - vertex_shader: Arc>, - fragment_shader: Arc>, + vertex_shader: Arc>, + fragment_shader: Arc>, sample_count: VkSampleCountFlags, sub_pass: u32, ) -> Result> {