Initial commit
This commit is contained in:
commit
cf6eaa2f10
9 changed files with 283 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
/target
|
||||
Cargo.lock
|
45
.vscode/launch.json
vendored
Normal file
45
.vscode/launch.json
vendored
Normal file
|
@ -0,0 +1,45 @@
|
|||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Debug executable 'fractal'",
|
||||
"cargo": {
|
||||
"args": [
|
||||
"build",
|
||||
"--bin=fractal",
|
||||
"--package=fractal"
|
||||
],
|
||||
"filter": {
|
||||
"name": "fractal",
|
||||
"kind": "bin"
|
||||
}
|
||||
},
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}"
|
||||
},
|
||||
{
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Debug unit tests in executable 'fractal'",
|
||||
"cargo": {
|
||||
"args": [
|
||||
"test",
|
||||
"--no-run",
|
||||
"--bin=fractal",
|
||||
"--package=fractal"
|
||||
],
|
||||
"filter": {
|
||||
"name": "fractal",
|
||||
"kind": "bin"
|
||||
}
|
||||
},
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}"
|
||||
}
|
||||
]
|
||||
}
|
10
Cargo.toml
Normal file
10
Cargo.toml
Normal file
|
@ -0,0 +1,10 @@
|
|||
[package]
|
||||
name = "fractal"
|
||||
version = "0.1.0"
|
||||
authors = ["hodasemi <michaelh.95@t-online.de>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
context = { git = "http://gavania.de:80/Gavania/Context.git", features = ["bundle_sdl2"] }
|
7
src/fractal.frag
Normal file
7
src/fractal.frag
Normal file
|
@ -0,0 +1,7 @@
|
|||
#version 450
|
||||
|
||||
layout (location = 0) out vec4 color;
|
||||
|
||||
void main() {
|
||||
color = vec4(1.0, 0.0, 0.0, 1.0);
|
||||
}
|
BIN
src/fractal.frag.spv
Normal file
BIN
src/fractal.frag.spv
Normal file
Binary file not shown.
181
src/fractal.rs
Normal file
181
src/fractal.rs
Normal file
|
@ -0,0 +1,181 @@
|
|||
use std::{mem, sync::Arc};
|
||||
|
||||
use context::{prelude::*, ContextObject};
|
||||
|
||||
pub struct Fractal {
|
||||
context: Arc<Context>,
|
||||
|
||||
descriptor_set: Arc<DescriptorSet>,
|
||||
pipeline: Arc<Pipeline>,
|
||||
render_target: RenderTarget,
|
||||
vertex_buffer: Arc<Buffer<[f32; 2]>>,
|
||||
}
|
||||
|
||||
impl Fractal {
|
||||
pub fn new(context: &Arc<Context>) -> VerboseResult<Arc<Self>> {
|
||||
let render_core = context.render_core();
|
||||
|
||||
let render_target = RenderTarget::builder()
|
||||
.add_sub_pass(
|
||||
SubPass::builder(render_core.width(), render_core.height())
|
||||
.set_prepared_targets(
|
||||
render_core.images()?.single()?,
|
||||
0,
|
||||
[0.0, 0.0, 0.0, 0.0],
|
||||
true,
|
||||
)
|
||||
.build(context.device(), context.queue())?,
|
||||
)
|
||||
.build(context.device())?;
|
||||
|
||||
let descriptor_layout = DescriptorSetLayout::builder()
|
||||
.add_layout_binding(
|
||||
0,
|
||||
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
|
||||
VK_SHADER_STAGE_FRAGMENT_BIT,
|
||||
0,
|
||||
)
|
||||
.build(context.device().clone())?;
|
||||
|
||||
let pipeline_layout = PipelineLayout::builder()
|
||||
.add_descriptor_set_layout(&descriptor_layout)
|
||||
.build(context.device().clone())?;
|
||||
|
||||
let pipeline = Pipeline::new_graphics()
|
||||
.default_rasterization(VK_CULL_MODE_FRONT_BIT, VK_FRONT_FACE_COUNTER_CLOCKWISE)
|
||||
.default_multisample(VK_SAMPLE_COUNT_1_BIT)
|
||||
.input_assembly(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, false)
|
||||
.default_color_blend(vec![VkPipelineColorBlendAttachmentState::default()])
|
||||
.set_vertex_shader(
|
||||
ShaderModule::from_slice(
|
||||
context.device().clone(),
|
||||
include_bytes!("fractal.vert.spv"),
|
||||
ShaderType::Vertex,
|
||||
)?,
|
||||
vec![VkVertexInputBindingDescription {
|
||||
binding: 0,
|
||||
inputRate: VK_VERTEX_INPUT_RATE_VERTEX,
|
||||
stride: mem::size_of::<[f32; 2]>() as u32,
|
||||
}],
|
||||
vec![VkVertexInputAttributeDescription {
|
||||
location: 0,
|
||||
binding: 0,
|
||||
format: VK_FORMAT_R32G32_SFLOAT,
|
||||
offset: 0,
|
||||
}],
|
||||
)
|
||||
.set_fragment_shader(ShaderModule::from_slice(
|
||||
context.device().clone(),
|
||||
include_bytes!("fractal.frag.spv"),
|
||||
ShaderType::Fragment,
|
||||
)?)
|
||||
.add_viewport(VkViewport {
|
||||
x: 0.0,
|
||||
y: 0.0,
|
||||
width: render_core.width() as f32,
|
||||
height: render_core.height() as f32,
|
||||
minDepth: 0.0,
|
||||
maxDepth: 1.0,
|
||||
})
|
||||
.add_scissor(VkRect2D {
|
||||
offset: VkOffset2D { x: 0, y: 0 },
|
||||
extent: VkExtent2D {
|
||||
width: render_core.width(),
|
||||
height: render_core.height(),
|
||||
},
|
||||
})
|
||||
.build(
|
||||
context.device().clone(),
|
||||
&pipeline_layout,
|
||||
render_target.render_pass(),
|
||||
0,
|
||||
)?;
|
||||
|
||||
let descriptor_set = DescriptorPool::builder()
|
||||
.set_layout(descriptor_layout)
|
||||
.build(context.device().clone())?
|
||||
.prepare_set()
|
||||
.allocate()?;
|
||||
|
||||
let vertex_buffer = Buffer::builder()
|
||||
.set_data(&[
|
||||
[-1.0, -1.0],
|
||||
[1.0, -1.0],
|
||||
[1.0, 1.0],
|
||||
[1.0, 1.0],
|
||||
[-1.0, 1.0],
|
||||
[-1.0, -1.0],
|
||||
])
|
||||
.set_memory_usage(MemoryUsage::CpuOnly)
|
||||
.set_usage(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)
|
||||
.build(context.device().clone())?;
|
||||
|
||||
Ok(Arc::new(Self {
|
||||
context: context.clone(),
|
||||
|
||||
descriptor_set,
|
||||
pipeline,
|
||||
render_target,
|
||||
vertex_buffer,
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
impl ContextObject for Fractal {
|
||||
fn name(&self) -> &str {
|
||||
"Fractal"
|
||||
}
|
||||
|
||||
fn update(&self) -> VerboseResult<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn event(&self, event: Event) -> VerboseResult<()> {
|
||||
match event {
|
||||
Event::KeyDown(key) => match key {
|
||||
Keycode::Escape => self.context.close()?,
|
||||
|
||||
_ => (),
|
||||
},
|
||||
|
||||
_ => (),
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl TScene for Fractal {
|
||||
fn update(&self) -> VerboseResult<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn process(
|
||||
&self,
|
||||
buffer_recorder: &mut CommandBufferRecorder<'_>,
|
||||
indices: &TargetMode<usize>,
|
||||
) -> VerboseResult<()> {
|
||||
match indices {
|
||||
TargetMode::Single(index) => {
|
||||
self.render_target
|
||||
.begin(buffer_recorder, VK_SUBPASS_CONTENTS_INLINE, *index);
|
||||
|
||||
buffer_recorder.bind_pipeline(&self.pipeline)?;
|
||||
buffer_recorder.bind_descriptor_sets_minimal(&[&self.descriptor_set])?;
|
||||
buffer_recorder.bind_vertex_buffer(&self.vertex_buffer);
|
||||
buffer_recorder.draw_complete_single_instance(self.vertex_buffer.size() as u32);
|
||||
|
||||
self.render_target.end(buffer_recorder);
|
||||
}
|
||||
TargetMode::Stereo(_, _) => unimplemented!(),
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn resize(&self) -> VerboseResult<()> {
|
||||
println!("resize of FB is still missing");
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
7
src/fractal.vert
Normal file
7
src/fractal.vert
Normal file
|
@ -0,0 +1,7 @@
|
|||
#version 450
|
||||
|
||||
layout (location = 0) in vec2 position;
|
||||
|
||||
void main() {
|
||||
gl_Position = vec4(position, 0.0, 1.0);
|
||||
}
|
BIN
src/fractal.vert.spv
Normal file
BIN
src/fractal.vert.spv
Normal file
Binary file not shown.
31
src/main.rs
Normal file
31
src/main.rs
Normal file
|
@ -0,0 +1,31 @@
|
|||
use context::prelude::*;
|
||||
|
||||
mod fractal;
|
||||
|
||||
use fractal::Fractal;
|
||||
|
||||
fn main() -> VerboseResult<()> {
|
||||
let context = Context::new()
|
||||
.set_vulkan_debug_info(VulkanDebugInfo {
|
||||
debugging: true,
|
||||
steam_layer: false,
|
||||
verbose: false,
|
||||
renderdoc: false,
|
||||
use_util: false,
|
||||
})
|
||||
.set_render_core_info(
|
||||
VK_FORMAT_R8G8B8_UNORM,
|
||||
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
|
||||
true,
|
||||
)
|
||||
.build()?;
|
||||
|
||||
let fractal = Fractal::new(&context)?;
|
||||
|
||||
context.set_context_object(Some(fractal.clone()))?;
|
||||
context.render_core().add_scene(fractal)?;
|
||||
|
||||
context.run()?;
|
||||
|
||||
Ok(())
|
||||
}
|
Loading…
Reference in a new issue