diff --git a/base/sources/libs/kong/backends/spirv.c b/base/sources/libs/kong/backends/spirv.c index f72bf4b9..4bdd72f6 100644 --- a/base/sources/libs/kong/backends/spirv.c +++ b/base/sources/libs/kong/backends/spirv.c @@ -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);