-layout(std430, set = 0, binding = 0) uniform uniformBuffer {
+layout(std430, push_constant) uniform uniformBuffer {
PrimitiveUniforms primitive_uniforms;
};
-layout (set = 0, binding = 1) uniform sampler bilinear_sampler;
+layout (set = 0, binding = 0) uniform sampler bilinear_sampler;
-layout (set = 0, binding = 2) uniform texture2D glyph_atlas;
+layout (set = 0, binding = 1) uniform texture2D glyph_atlas;
-layout(std430, set = 0, binding = 3) readonly buffer glyphBuffer {
+layout(std430, set = 0, binding = 2) readonly buffer glyphBuffer {
Glyph glyphs[];
};
-layout(std430, set = 0, binding = 4) readonly buffer glyphInstanceBuffer {
+layout(std430, set = 0, binding = 3) readonly buffer glyphInstanceBuffer {
GlyphInstance glyph_instances[];
};
-layout(std430, set = 0, binding = 5) readonly buffer primitiveInstanceBuffer {
+layout(std430, set = 0, binding = 4) readonly buffer primitiveInstanceBuffer {
PrimitiveInstance primitive_instances[];
};
-layout(std430, set = 0, binding = 6) readonly buffer coarseTileBufferRead {
+layout(std430, set = 0, binding = 5) readonly buffer coarseTileBufferRead {
uint coarse_bitmap_ro[];
};
-layout(std430, set = 0, binding = 6) writeonly buffer coarseTileBufferWrite {
+layout(std430, set = 0, binding = 5) writeonly buffer coarseTileBufferWrite {
uint coarse_bitmap_wo[];
};
-layout(std430, set = 0, binding = 7) readonly buffer fineTileBufferRead {
+layout(std430, set = 0, binding = 6) readonly buffer fineTileBufferRead {
uint fine_bitmap_ro[];
};
-layout(std430, set = 0, binding = 7) writeonly buffer fineTileBufferWrite {
+layout(std430, set = 0, binding = 6) writeonly buffer fineTileBufferWrite {
uint fine_bitmap_wo[];
};
-layout (set = 0, binding = 8, rgba16f) uniform writeonly image2D ui_image;
+layout (set = 0, binding = 7, rgba16f) uniform writeonly image2D ui_image;
ImageAspectFlags, ImageBarrier, ImageDesc, ImageDimension, ImageFormat, ImageLayout,
ImageSubresourceRange, ImageTiling, ImageUsageFlags, IndexType, LoadOp, MemoryLocation,
Offset2d, PersistentBuffer, PresentMode, RenderingAttachment, RenderingDesc, Sampler,
- SamplerAddressMode, SamplerDesc, SamplerFilter, Scissor, StoreOp, SwapchainConfigurator,
- SwapchainImage, ThreadToken, TypedBind, Viewport,
+ SamplerAddressMode, SamplerDesc, SamplerFilter, Scissor, ShaderStageFlags, StoreOp,
+ SwapchainConfigurator, SwapchainImage, ThreadToken, TypedBind, Viewport,
};
use narcissus_image as image;
use narcissus_maths::{
// Render UI
{
+ gpu.cmd_set_pipeline(cmd_encoder, self.primitive_2d_pipeline.coarse_bin_pipeline);
+
let num_primitives = ui_state.primitive_instances.len() as u32;
let num_primitives_32 = (num_primitives + 31) / 32;
let num_primitives_1024 = (num_primitives_32 + 31) / 32;
- let uniforms_buffer = gpu.request_transient_buffer_with_data(
- frame,
- thread_token,
- BufferUsageFlags::UNIFORM,
+
+ gpu.cmd_push_constants(
+ cmd_encoder,
+ ShaderStageFlags::COMPUTE,
+ 0,
&PrimitiveUniforms {
screen_resolution_x: self.width,
screen_resolution_y: self.height,
_pad0: 0,
},
);
+
let glyph_buffer = gpu.request_transient_buffer_with_data(
frame,
thread_token,
&[0u32],
);
- gpu.cmd_set_pipeline(cmd_encoder, self.primitive_2d_pipeline.coarse_bin_pipeline);
-
gpu.cmd_set_bind_group(
frame,
cmd_encoder,
Bind {
binding: 0,
array_element: 0,
- typed: TypedBind::UniformBuffer(&[uniforms_buffer.to_arg()]),
- },
- Bind {
- binding: 1,
- array_element: 0,
typed: TypedBind::Sampler(&[self.samplers[SamplerRes::Bilinear]]),
},
Bind {
- binding: 2,
+ binding: 1,
array_element: 0,
typed: TypedBind::SampledImage(&[(
ImageLayout::Optimal,
)]),
},
Bind {
- binding: 3,
+ binding: 2,
array_element: 0,
typed: TypedBind::StorageBuffer(&[glyph_buffer.to_arg()]),
},
Bind {
- binding: 4,
+ binding: 3,
array_element: 0,
typed: TypedBind::StorageBuffer(&[glyph_instance_buffer.to_arg()]),
},
Bind {
- binding: 5,
+ binding: 4,
array_element: 0,
typed: TypedBind::StorageBuffer(&[primitive_instance_buffer.to_arg()]),
},
Bind {
- binding: 6,
+ binding: 5,
array_element: 0,
typed: TypedBind::StorageBuffer(&[self
.coarse_tile_bitmap_buffer
.to_arg()]),
},
Bind {
- binding: 7,
+ binding: 6,
array_element: 0,
typed: TypedBind::StorageBuffer(&[self
.fine_tile_bitmap_buffer
.to_arg()]),
},
Bind {
- binding: 8,
+ binding: 7,
array_element: 0,
typed: TypedBind::StorageImage(&[(
ImageLayout::General,
use narcissus_font::TouchedGlyphIndex;
use narcissus_gpu::{
BindDesc, BindGroupLayout, BindingType, ComputePipelineDesc, Pipeline, PipelineLayout,
- ShaderDesc, ShaderStageFlags,
+ PushConstantRange, ShaderDesc, ShaderStageFlags,
};
use crate::Gpu;
impl Primitive2dPipeline {
pub fn new(gpu: &Gpu) -> Self {
let bind_group_layout = gpu.create_bind_group_layout(&[
- // Uniforms
- BindDesc::new(ShaderStageFlags::COMPUTE, BindingType::UniformBuffer),
// Sampler
BindDesc::new(ShaderStageFlags::COMPUTE, BindingType::Sampler),
// Glyph Atlas
let layout = &PipelineLayout {
bind_group_layouts: &[bind_group_layout],
- push_constant_ranges: &[],
+ push_constant_ranges: &[PushConstantRange {
+ stage_flags: ShaderStageFlags::COMPUTE,
+ offset: 0,
+ size: std::mem::size_of::<PrimitiveUniforms>() as u32,
+ }],
};
let coarse_bin_pipeline = gpu.create_compute_pipeline(&ComputePipelineDesc {