Update kong

This commit is contained in:
luboslenco
2025-06-07 17:52:34 +02:00
parent 028abe1d8e
commit fd3b7dcd9c
+46 -12
View File
@@ -194,6 +194,9 @@ typedef enum spirv_opcode {
SPIRV_OPCODE_SAMPLED_IMAGE = 86,
SPIRV_OPCODE_IMAGE_SAMPLE_IMPLICIT_LOD = 87,
SPIRV_OPCODE_IMAGE_SAMPLE_EXPLICIT_LOD = 88,
////
SPIRV_OPCODE_IMAGE_FETCH = 95,
////
SPIRV_OPCODE_IMAGE_READ = 98,
SPIRV_OPCODE_IMAGE_WRITE = 99,
SPIRV_OPCODE_CONVERT_F_TO_U = 109,
@@ -343,11 +346,11 @@ typedef enum decoration {
typedef enum builtin {
BUILTIN_POSITION = 0,
BUILTIN_VERTEX_ID = 5,
BUILTIN_WORKGROUP_SIZE = 25,
BUILTIN_WORKGROUP_ID = 26,
BUILTIN_LOCAL_INVOCATION_ID = 27,
BUILTIN_GLOBAL_INVOCATION_ID = 28,
BUILTIN_VERTEX_INDEX = 42,
} builtin;
typedef enum storage_class {
@@ -496,12 +499,14 @@ static void write_op_execution_mode3(instructions_buffer *instructions, spirv_id
static void write_capabilities(instructions_buffer *instructions, const capabilities *caps) {
write_capability(instructions, CAPABILITY_SHADER);
if (caps->image_read) {
write_capability(instructions, CAPABILITY_STORAGE_IMAGE_READ_WITHOUT_FORMAT);
}
if (caps->image_write) {
write_capability(instructions, CAPABILITY_STORAGE_IMAGE_WRITE_WITHOUT_FORMAT);
}
////
// if (caps->image_read) {
// write_capability(instructions, CAPABILITY_STORAGE_IMAGE_READ_WITHOUT_FORMAT);
// }
// if (caps->image_write) {
// write_capability(instructions, CAPABILITY_STORAGE_IMAGE_WRITE_WITHOUT_FORMAT);
// }
////
}
static spirv_id write_type_void(instructions_buffer *instructions) {
@@ -1441,6 +1446,20 @@ static spirv_id write_op_image_sample_explicit_lod(instructions_buffer *instruct
return result;
}
////
static spirv_id write_op_image_fetch(instructions_buffer *instructions, spirv_id result_type, spirv_id sampled_image, spirv_id coordinate) {
spirv_id result = allocate_index();
uint32_t operands[] = {result_type.id, result.id, sampled_image.id, coordinate.id};
write_instruction(instructions, WORD_COUNT(operands), SPIRV_OPCODE_IMAGE_FETCH, operands);
return result;
}
////
static spirv_id write_op_ext_inst(instructions_buffer *instructions, spirv_id result_type, spirv_id set, uint32_t instruction, spirv_id operand) {
spirv_id result = allocate_index();
@@ -1800,12 +1819,18 @@ static void write_function(instructions_buffer *instructions, function *f, spirv
assert(indices_size == 1);
assert(o->op_load_access_list.access_list[0].kind == ACCESS_ELEMENT);
spirv_id image = write_op_load(instructions, spirv_readwrite_image_type, convert_kong_index_to_spirv_id(o->op_load_access_list.from.index));
////
// spirv_id image = write_op_load(instructions, spirv_readwrite_image_type, convert_kong_index_to_spirv_id(o->op_load_access_list.from.index));
spirv_id image = write_op_load(instructions, spirv_image_type, convert_kong_index_to_spirv_id(o->op_load_access_list.from.index));
////
variable coordinate_var = o->op_load_access_list.access_list[0].access_element.index;
spirv_id coordinate = get_var(instructions, coordinate_var);
spirv_id value = write_op_image_read(instructions, spirv_float4_type, image, coordinate);
////
// spirv_id value = write_op_image_read(instructions, spirv_float4_type, image, coordinate);
spirv_id value = write_op_image_fetch(instructions, spirv_float4_type, image, coordinate);
////
hmput(index_map, o->op_load_access_list.to.index, value);
}
@@ -3257,6 +3282,11 @@ static void write_globals(instructions_buffer *decorations, instructions_buffer
bool readable = globals.readable[i];
bool writable = globals.writable[i];
////
readable = false;
writable = false;
////
if (base_type == sampler_type_id) {
add_to_type_map(g->type, spirv_sampler_type, false, STORAGE_CLASS_NONE);
add_to_type_map(g->type, spirv_sampler_pointer_type, false, STORAGE_CLASS_UNIFORM_CONSTANT);
@@ -3436,7 +3466,7 @@ static void write_globals(instructions_buffer *decorations, instructions_buffer
if (main->used_builtins.vertex_id) {
write_op_variable_preallocated(global_vars_block, convert_pointer_type_to_spirv_id(uint_id, STORAGE_CLASS_INPUT), vertex_id_variable,
STORAGE_CLASS_INPUT);
write_op_decorate_value(decorations, vertex_id_variable, DECORATION_BUILTIN, BUILTIN_VERTEX_ID);
write_op_decorate_value(decorations, vertex_id_variable, DECORATION_BUILTIN, BUILTIN_VERTEX_INDEX);
}
if (stage == SHADER_STAGE_COMPUTE) {
@@ -3780,8 +3810,10 @@ static void spirv_export_fragment(char *directory, function *main, bool debug) {
write_fragment_output_decorations(&decorations, output_vars, (uint32_t)output_vars_count);
type_id output_type = output->array_size > 0 ? output->base : pixel_output;
for (size_t i = 0; i < output_vars_count; ++i) {
write_op_variable_preallocated(&instructions, convert_pointer_type_to_spirv_id(float4_id, STORAGE_CLASS_OUTPUT), output_vars[i], STORAGE_CLASS_OUTPUT);
write_op_variable_preallocated(&instructions, convert_pointer_type_to_spirv_id(output_type, STORAGE_CLASS_OUTPUT), output_vars[i], STORAGE_CLASS_OUTPUT);
}
write_functions(&instructions, main, entry_point, SHADER_STAGE_FRAGMENT, NO_TYPE);
@@ -4315,8 +4347,10 @@ static char *spirv_export_fragment2(function *main, bool debug, int *size_out) {
write_fragment_output_decorations(&decorations, output_vars, (uint32_t)output_vars_count);
type_id output_type = output->array_size > 0 ? output->base : pixel_output;
for (size_t i = 0; i < output_vars_count; ++i) {
write_op_variable_preallocated(&instructions, convert_pointer_type_to_spirv_id(float4_id, STORAGE_CLASS_OUTPUT), output_vars[i], STORAGE_CLASS_OUTPUT);
write_op_variable_preallocated(&instructions, convert_pointer_type_to_spirv_id(output_type, STORAGE_CLASS_OUTPUT), output_vars[i], STORAGE_CLASS_OUTPUT);
}
write_functions(&instructions, main, entry_point, SHADER_STAGE_FRAGMENT, NO_TYPE);