Update kong

This commit is contained in:
luboslenco
2025-06-04 20:38:42 +02:00
parent 13490333d7
commit bfc471eb34
2 changed files with 63 additions and 9 deletions
+59 -5
View File
@@ -2012,11 +2012,11 @@ static void write_function(instructions_buffer *instructions, function *f, spirv
}
else if (func == add_name("float")) {
if (o->op_call.parameters[0].type.type == int_id) {
spirv_id id = write_op_convert_s_to_f(instructions, spirv_float_type, convert_kong_index_to_spirv_id(o->op_call.parameters[0].index));
spirv_id id = write_op_convert_s_to_f(instructions, spirv_float_type, get_var(instructions, o->op_call.parameters[0]));
hmput(index_map, o->op_call.var.index, id);
}
else if (o->op_call.parameters[0].type.type == uint_id) {
spirv_id id = write_op_convert_u_to_f(instructions, spirv_float_type, convert_kong_index_to_spirv_id(o->op_call.parameters[0].index));
spirv_id id = write_op_convert_u_to_f(instructions, spirv_float_type, get_var(instructions, o->op_call.parameters[0]));
hmput(index_map, o->op_call.var.index, id);
}
else {
@@ -2066,6 +2066,15 @@ static void write_function(instructions_buffer *instructions, function *f, spirv
spirv_id id = write_op_composite_construct(instructions, spirv_float4_type, constituents, o->op_call.parameters_size);
hmput(index_map, o->op_call.var.index, id);
}
else if (func == add_name("int")) {
if (o->op_call.parameters[0].type.type == float_id) {
spirv_id id = write_op_convert_f_to_s(instructions, spirv_int_type, get_var(instructions, o->op_call.parameters[0]));
hmput(index_map, o->op_call.var.index, id);
}
else {
assert(false);
}
}
else if (func == add_name("int2")) {
if (o->op_call.parameters_size == 1) {
spirv_id constituent = convert_kong_index_to_spirv_id(o->op_call.parameters[0].index);
@@ -2107,6 +2116,15 @@ static void write_function(instructions_buffer *instructions, function *f, spirv
spirv_id id = write_op_composite_construct(instructions, spirv_int4_type, constituents, o->op_call.parameters_size);
hmput(index_map, o->op_call.var.index, id);
}
else if (func == add_name("uint")) {
if (o->op_call.parameters[0].type.type == float_id) {
spirv_id id = write_op_convert_f_to_u(instructions, spirv_uint_type, get_var(instructions, o->op_call.parameters[0]));
hmput(index_map, o->op_call.var.index, id);
}
else {
assert(false);
}
}
else if (func == add_name("uint2")) {
spirv_id constituents[2];
for (int i = 0; i < o->op_call.parameters_size; ++i) {
@@ -2381,6 +2399,12 @@ static void write_function(instructions_buffer *instructions, function *f, spirv
spirv_id operand1 = get_var(instructions, o->op_call.parameters[0]);
spirv_id operand2 = get_var(instructions, o->op_call.parameters[1]);
spirv_id operand3 = get_var(instructions, o->op_call.parameters[2]);
if (o->op_call.parameters[2].type.type == float_id) {
spirv_id operands[3] = {operand3, operand3, operand3};
operand3 = write_op_composite_construct(instructions, spirv_float3_type, operands, 3);
}
spirv_id id = write_op_ext_inst3(instructions, spirv_float3_type, glsl_import, SPIRV_GLSL_STD_FMIX, operand1, operand2, operand3);
hmput(index_map, o->op_call.var.index, id);
}
@@ -2388,6 +2412,12 @@ static void write_function(instructions_buffer *instructions, function *f, spirv
spirv_id operand1 = get_var(instructions, o->op_call.parameters[0]);
spirv_id operand2 = get_var(instructions, o->op_call.parameters[1]);
spirv_id operand3 = get_var(instructions, o->op_call.parameters[2]);
if (o->op_call.parameters[2].type.type == float_id) {
spirv_id operands[4] = {operand3, operand3, operand3, operand3};
operand3 = write_op_composite_construct(instructions, spirv_float4_type, operands, 4);
}
spirv_id id = write_op_ext_inst3(instructions, spirv_float4_type, glsl_import, SPIRV_GLSL_STD_FMIX, operand1, operand2, operand3);
hmput(index_map, o->op_call.var.index, id);
}
@@ -2880,7 +2910,7 @@ static void write_function(instructions_buffer *instructions, function *f, spirv
spirv_id result = write_op_f_ord_equal(instructions, spirv_bool_type, left, right);
hmput(index_map, o->op_binary.result.index, result);
}
else if (vector_base_type(o->op_binary.left.type.type) == int_id) {
else if (vector_base_type(o->op_binary.left.type.type) == int_id || vector_base_type(o->op_binary.left.type.type) == uint_id) {
spirv_id result = write_op_i_equal(instructions, spirv_bool_type, left, right);
hmput(index_map, o->op_binary.result.index, result);
}
@@ -2895,7 +2925,7 @@ static void write_function(instructions_buffer *instructions, function *f, spirv
spirv_id result = write_op_f_ord_not_equal(instructions, spirv_bool_type, left, right);
hmput(index_map, o->op_binary.result.index, result);
}
else if (vector_base_type(o->op_binary.left.type.type) == int_id) {
else if (vector_base_type(o->op_binary.left.type.type) == int_id || vector_base_type(o->op_binary.left.type.type) == uint_id) {
spirv_id result = write_op_i_not_equal(instructions, spirv_bool_type, left, right);
hmput(index_map, o->op_binary.result.index, result);
}
@@ -3013,7 +3043,31 @@ static void write_functions(instructions_buffer *instructions, function *main, s
parameter_types_size++;
}
function_types[i] = write_type_function(instructions, return_type, parameter_types, parameter_types_size);
int function_type_index = -1;
for (size_t j = 0; j < i; ++j) {
function *f2 = functions[j];
if (return_type.id != convert_type_to_spirv_id(f2->return_type.type).id || f->parameters_size != f2->parameters_size) {
continue;
}
bool parameters_match = true;
for (uint8_t parameter_index = 0; parameter_index < f2->parameters_size; ++parameter_index) {
if (parameter_types[parameter_index].id != convert_type_to_spirv_id(f2->parameter_types[parameter_index].type).id) {
parameters_match = false;
break;
}
}
if (parameters_match) {
function_type_index = j;
break;
}
}
if (function_type_index == -1) {
function_types[i] = write_type_function(instructions, return_type, parameter_types, parameter_types_size);
}
else {
function_types[i] = function_types[function_type_index];
}
}
}
+4 -4
View File
@@ -205,13 +205,13 @@ void transform(uint32_t flags) {
init_type_ref(&t, NO_NAME);
t.type = vector_to_size(left_type, right_size);
vec = allocate_variable(t, o->op_binary.left.kind);
vec = allocate_variable(t, VARIABLE_INTERNAL);
opcode constructor_call = {
.type = OPCODE_CALL,
.op_call =
{
.func = get_type(o->op_load_access_list.to.type.type)->name,
.func = get_type(right_type)->name,
.parameters_size = right_size,
.var = vec,
},
@@ -282,13 +282,13 @@ void transform(uint32_t flags) {
init_type_ref(&t, NO_NAME);
t.type = vector_to_size(left_type, left_size);
vec = allocate_variable(t, o->op_binary.right.kind);
vec = allocate_variable(t, VARIABLE_INTERNAL);
opcode constructor_call = {
.type = OPCODE_CALL,
.op_call =
{
.func = get_type(o->op_load_access_list.to.type.type)->name,
.func = get_type(left_type)->name,
.parameters_size = left_size,
.var = vec,
},