add convert shader

This commit is contained in:
Matthew 2025-08-16 07:27:23 +10:00
parent 9dffaea600
commit bc58a73ef5
4 changed files with 77 additions and 10 deletions

View File

@ -25,8 +25,19 @@ out="-o"
obj="${build}/vma.o"
lib="${build}/libvma.a"
if ! [ -f libvma.a ]; then
if ! [ -f "${build}/libvma.a" ]; then
$cpp_compiler $flags $src $out $obj
ar rcs $lib $obj
rm $obj
fi
# Convert Shader
shader="${script_dir}/convert.comp.glsl"
shader_compiler="glslc"
shader_flags="--target-spv=spv1.5 -std=460 --target-env=vulkan1.3"
shader_out="-o${build}/"
shader_stage="-fshader-stage=comp"
base_name=$(basename -- "$shader" .glsl)
$shader_compiler $shader_flags $shader_stage $shader "${shader_out}${base_name}.spv"

56
convert.comp.glsl Normal file
View File

@ -0,0 +1,56 @@
#version 460
#extension GL_EXT_shader_8bit_storage : require
layout (constant_id = 0) const int CHANNELS = 3;
layout (local_size_x = 32, local_size_y = 32) in;
layout (push_constant) uniform Constants {
uint x;
uint y;
} PC;
layout (set = 1, binding = 0, rgba32f) uniform image2D dst;
layout (set = 1, binding = 1) buffer input_array
{
uint8_t src[];
};
void main()
{
uint x = gl_GlobalInvocationID.x;
uint y = gl_GlobalInvocationID.y;
if (x > PC.x || y > PC.y)
{
return;
}
if (CHANNELS == 1)
{
uint index = x + y * PC.x;
vec4 col = vec4(vec3(uint(src[index]) / 255.0), 1.0);
imageStore(dst, ivec2(x, y), col);
}
else if (CHANNELS == 2)
{
uint index = (x + y * PC.x) * 2;
float f = uint(src[index]) / 255.0;
float a = uint(src[index+1]) / 255.0;
vec4 col = vec4(f, f, f, a);
imageStore(dst, ivec2(x, y), col);
}
else if (CHANNELS == 3)
{
uint index = (x + y * PC.x) * 3;
vec4 col = vec4(uint(src[index]) / 255.0, uint(src[index+1]) / 255.0, uint(src[index+2]) / 255.0, 1.0);
imageStore(dst, ivec2(x, y), col);
}
}

View File

@ -248,7 +248,7 @@ struct GfxPipelineInfo
struct CompPipelineInfo
{
string shader;
u8[] shader;
Specialization spec;
PipelineLayout layout;
}
@ -390,8 +390,10 @@ struct QueueInfo
bool single_queue;
}
const u8[] CONVERT_SHADER = mixin(Embed(convert_shader));
Vulkan
Init(PlatformHandles platform_handles, u64 permanent_mem, u64 frame_mem)
Init(PlatformHandles platform_handles, u64 permanent_mem, u64 frame_mem, string convert_shader)
{
bool success = true;
@ -552,7 +554,7 @@ InitConversionPipeline(Vulkan* vk)
}
];
CompPipelineInfo conv_info = {
shader: "shaders/convert.comp.spv",
shader: CONVERT_SHADER,
layout: vk.conv_pipeline_layout,
spec: {
data: &channels,
@ -1857,12 +1859,9 @@ CreateComputePipeline(Vulkan* vk, CompPipelineInfo* comp_info)
},
};
u8[] comp_bytes = LoadAssetData(&vk.frame_arenas[0], comp_info.shader);
assert(comp_bytes != null, "Unable to load compute shader data");
Result!(Shader) comp_module = BuildShader(vk, comp_bytes);
assert(comp_module.ok, "Unable to build compute shader");
scope(exit) Destroy(vk, comp_module.value);
Shader comp_module;
assert(BuildShader(vk, &comp_module, comp_info.shader), "Unable to build compute shader");
scope(exit) Destroy(vk, comp_module);
__traits(getMember, &info.stage, "module") = comp_module.value;

View File

@ -278,3 +278,4 @@ AlignPow2(T)(T v, T a)
{
return (v + a - 1) & ~(a - 1);
}