add convert shader
This commit is contained in:
parent
9dffaea600
commit
bc58a73ef5
13
build.sh
13
build.sh
@ -25,8 +25,19 @@ out="-o"
|
|||||||
obj="${build}/vma.o"
|
obj="${build}/vma.o"
|
||||||
lib="${build}/libvma.a"
|
lib="${build}/libvma.a"
|
||||||
|
|
||||||
if ! [ -f libvma.a ]; then
|
if ! [ -f "${build}/libvma.a" ]; then
|
||||||
$cpp_compiler $flags $src $out $obj
|
$cpp_compiler $flags $src $out $obj
|
||||||
ar rcs $lib $obj
|
ar rcs $lib $obj
|
||||||
rm $obj
|
rm $obj
|
||||||
fi
|
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
56
convert.comp.glsl
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
17
vulkan.d
17
vulkan.d
@ -248,7 +248,7 @@ struct GfxPipelineInfo
|
|||||||
|
|
||||||
struct CompPipelineInfo
|
struct CompPipelineInfo
|
||||||
{
|
{
|
||||||
string shader;
|
u8[] shader;
|
||||||
Specialization spec;
|
Specialization spec;
|
||||||
PipelineLayout layout;
|
PipelineLayout layout;
|
||||||
}
|
}
|
||||||
@ -390,8 +390,10 @@ struct QueueInfo
|
|||||||
bool single_queue;
|
bool single_queue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const u8[] CONVERT_SHADER = mixin(Embed(convert_shader));
|
||||||
|
|
||||||
Vulkan
|
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;
|
bool success = true;
|
||||||
|
|
||||||
@ -552,7 +554,7 @@ InitConversionPipeline(Vulkan* vk)
|
|||||||
}
|
}
|
||||||
];
|
];
|
||||||
CompPipelineInfo conv_info = {
|
CompPipelineInfo conv_info = {
|
||||||
shader: "shaders/convert.comp.spv",
|
shader: CONVERT_SHADER,
|
||||||
layout: vk.conv_pipeline_layout,
|
layout: vk.conv_pipeline_layout,
|
||||||
spec: {
|
spec: {
|
||||||
data: &channels,
|
data: &channels,
|
||||||
@ -1857,12 +1859,9 @@ CreateComputePipeline(Vulkan* vk, CompPipelineInfo* comp_info)
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
u8[] comp_bytes = LoadAssetData(&vk.frame_arenas[0], comp_info.shader);
|
Shader comp_module;
|
||||||
assert(comp_bytes != null, "Unable to load compute shader data");
|
assert(BuildShader(vk, &comp_module, comp_info.shader), "Unable to build compute shader");
|
||||||
|
scope(exit) Destroy(vk, comp_module);
|
||||||
Result!(Shader) comp_module = BuildShader(vk, comp_bytes);
|
|
||||||
assert(comp_module.ok, "Unable to build compute shader");
|
|
||||||
scope(exit) Destroy(vk, comp_module.value);
|
|
||||||
|
|
||||||
__traits(getMember, &info.stage, "module") = comp_module.value;
|
__traits(getMember, &info.stage, "module") = comp_module.value;
|
||||||
|
|
||||||
|
|||||||
@ -278,3 +278,4 @@ AlignPow2(T)(T v, T a)
|
|||||||
{
|
{
|
||||||
return (v + a - 1) & ~(a - 1);
|
return (v + a - 1) & ~(a - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user