Files
armorpaint/base/sources/libs/kong/functions.c
T
2025-09-11 16:23:20 +02:00

993 lines
33 KiB
C

#include "functions.h"
#include "errors.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
static function *functions = NULL;
////
// static function_id functions_size = 1024;
static function_id functions_size = 128;
////
////
// static function_id next_function_index = 0;
function_id next_function_index = 0;
////
////
static void add_func_float2_float2(char *name) {
function_id func = add_function(add_name(name));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float2"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("a");
init_type_ref(&f->parameter_types[0], add_name("float2"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameters_size = 1;
f->block = NULL;
}
static void add_func_float3_float3_float_float(char *name) {
function_id func = add_function(add_name(name));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float3"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("a");
init_type_ref(&f->parameter_types[0], add_name("float3"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("b");
init_type_ref(&f->parameter_types[1], add_name("float"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameter_names[2] = add_name("c");
init_type_ref(&f->parameter_types[2], add_name("float"));
f->parameter_types[2].type = find_type_by_ref(&f->parameter_types[2]);
f->parameters_size = 3;
f->block = NULL;
}
static void add_func_float3_float3_float3_float(char *name) {
function_id func = add_function(add_name(name));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float3"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("a");
init_type_ref(&f->parameter_types[0], add_name("float3"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("b");
init_type_ref(&f->parameter_types[1], add_name("float3"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameter_names[2] = add_name("c");
init_type_ref(&f->parameter_types[2], add_name("float"));
f->parameter_types[2].type = find_type_by_ref(&f->parameter_types[2]);
f->parameters_size = 3;
f->block = NULL;
}
static void add_func_float4_float4_float4_float(char *name) {
function_id func = add_function(add_name(name));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float4"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("a");
init_type_ref(&f->parameter_types[0], add_name("float4"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("b");
init_type_ref(&f->parameter_types[1], add_name("float4"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameter_names[2] = add_name("c");
init_type_ref(&f->parameter_types[2], add_name("float"));
f->parameter_types[2].type = find_type_by_ref(&f->parameter_types[2]);
f->parameters_size = 3;
f->block = NULL;
}
static void add_func_float3x3_float3x3(char *name) {
function_id func = add_function(add_name(name));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float3x3"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("a");
init_type_ref(&f->parameter_types[0], add_name("float3x3"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameters_size = 1;
f->block = NULL;
}
////
static void add_func_int(char *name) {
function_id func = add_function(add_name(name));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("int"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameters_size = 0;
f->block = NULL;
}
static void add_func_float3_float_float_float(char *name) {
function_id func = add_function(add_name(name));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float3"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("a");
f->parameter_names[1] = add_name("b");
f->parameter_names[2] = add_name("c");
for (int i = 0; i < 3; ++i) {
init_type_ref(&f->parameter_types[i], add_name("float"));
f->parameter_types[i].type = find_type_by_ref(&f->parameter_types[i]);
}
f->parameters_size = 3;
f->block = NULL;
}
static void add_func_float(char *name) {
function_id func = add_function(add_name(name));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameters_size = 0;
f->block = NULL;
}
static void add_func_float3(char *name) {
function_id func = add_function(add_name(name));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float3"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameters_size = 0;
f->block = NULL;
}
static void add_func_float3x3(char *name) {
function_id func = add_function(add_name(name));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float3x3"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameters_size = 0;
f->block = NULL;
}
static void add_func_uint(char *name) {
function_id func = add_function(add_name(name));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("uint"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameters_size = 0;
f->block = NULL;
}
static void add_func_uint3(char *name) {
function_id func = add_function(add_name(name));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("uint3"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameters_size = 0;
f->block = NULL;
}
static void add_func_float_float(char *name) {
function_id func = add_function(add_name(name));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("a");
init_type_ref(&f->parameter_types[0], add_name("float"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameters_size = 1;
f->block = NULL;
}
static void add_func_float_float_float(char *name) {
function_id func = add_function(add_name(name));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("a");
init_type_ref(&f->parameter_types[0], add_name("float"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("b");
init_type_ref(&f->parameter_types[1], add_name("float"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameters_size = 2;
f->block = NULL;
}
static void add_func_float_float_float_float(char *name) {
function_id func = add_function(add_name(name));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("a");
init_type_ref(&f->parameter_types[0], add_name("float"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("b");
init_type_ref(&f->parameter_types[1], add_name("float"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameter_names[2] = add_name("c");
init_type_ref(&f->parameter_types[2], add_name("float"));
f->parameter_types[2].type = find_type_by_ref(&f->parameter_types[2]);
f->parameters_size = 3;
f->block = NULL;
}
static void add_func_float_float2(char *name) {
function_id func = add_function(add_name(name));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("a");
init_type_ref(&f->parameter_types[0], add_name("float2"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameters_size = 1;
f->block = NULL;
}
static void add_func_float_float3_float3(char *name) {
function_id func = add_function(add_name(name));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("a");
init_type_ref(&f->parameter_types[0], add_name("float3"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("b");
init_type_ref(&f->parameter_types[1], add_name("float3"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameters_size = 2;
f->block = NULL;
}
static void add_func_float3_float3(char *name) {
function_id func = add_function(add_name(name));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float3"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("a");
init_type_ref(&f->parameter_types[0], add_name("float3"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameters_size = 1;
f->block = NULL;
}
static void add_func_float3_float3_float3(char *name) {
function_id func = add_function(add_name(name));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float3"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("a");
init_type_ref(&f->parameter_types[0], add_name("float3"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("b");
init_type_ref(&f->parameter_types[1], add_name("float3"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameters_size = 2;
f->block = NULL;
}
static void add_func_float4_float4_float4(char *name) {
function_id func = add_function(add_name(name));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float4"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("a");
init_type_ref(&f->parameter_types[0], add_name("float4"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("b");
init_type_ref(&f->parameter_types[1], add_name("float4"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameters_size = 2;
f->block = NULL;
}
static void add_func_void_uint_uint(char *name) {
function_id func = add_function(add_name(name));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("void"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("a");
f->parameter_names[1] = add_name("b");
for (int i = 0; i < 2; ++i) {
init_type_ref(&f->parameter_types[i], add_name("uint"));
f->parameter_types[i].type = find_type_by_ref(&f->parameter_types[i]);
}
f->parameters_size = 2;
f->block = NULL;
}
void functions_init(void) {
function *new_functions = realloc(functions, functions_size * sizeof(function));
debug_context context = {0};
check(new_functions != NULL, context, "Could not allocate functions");
functions = new_functions;
next_function_index = 0;
{
function_id func = add_function(add_name("sample"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float4"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("tex_coord");
init_type_ref(&f->parameter_types[0], add_name("float2"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameters_size = 1;
f->block = NULL;
}
{
function_id func = add_function(add_name("sample_lod"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float4"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("tex_coord");
init_type_ref(&f->parameter_types[0], add_name("float2"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameters_size = 1;
f->block = NULL;
}
{
function_id func = add_function(add_name("float"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("float"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameters_size = 1;
f->block = NULL;
}
{
function_id func = add_function(add_name("float2"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float2"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("float"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("y");
init_type_ref(&f->parameter_types[1], add_name("float"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameters_size = 2;
f->block = NULL;
}
{
function_id func = add_function(add_name("float3"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float3"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("float"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("y");
init_type_ref(&f->parameter_types[1], add_name("float"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameter_names[2] = add_name("z");
init_type_ref(&f->parameter_types[2], add_name("float"));
f->parameter_types[2].type = find_type_by_ref(&f->parameter_types[2]);
f->parameters_size = 3;
f->block = NULL;
}
{
function_id func = add_function(add_name("float4"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float4"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("float"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("y");
init_type_ref(&f->parameter_types[1], add_name("float"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameter_names[2] = add_name("z");
init_type_ref(&f->parameter_types[2], add_name("float"));
f->parameter_types[2].type = find_type_by_ref(&f->parameter_types[2]);
f->parameter_names[3] = add_name("w");
init_type_ref(&f->parameter_types[3], add_name("float"));
f->parameter_types[3].type = find_type_by_ref(&f->parameter_types[3]);
f->parameters_size = 4;
f->block = NULL;
}
{
function_id func = add_function(add_name("float2x2"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float2x2"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("float2"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("y");
init_type_ref(&f->parameter_types[1], add_name("float2"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameters_size = 2;
f->block = NULL;
}
{
function_id func = add_function(add_name("float3x3"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float3x3"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("float3"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("y");
init_type_ref(&f->parameter_types[1], add_name("float3"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameter_names[2] = add_name("z");
init_type_ref(&f->parameter_types[2], add_name("float3"));
f->parameter_types[2].type = find_type_by_ref(&f->parameter_types[2]);
f->parameters_size = 3;
f->block = NULL;
}
{
function_id func = add_function(add_name("float4x4"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("float4x4"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("float4"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("y");
init_type_ref(&f->parameter_types[1], add_name("float4"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameter_names[2] = add_name("z");
init_type_ref(&f->parameter_types[2], add_name("float4"));
f->parameter_types[2].type = find_type_by_ref(&f->parameter_types[2]);
f->parameter_names[3] = add_name("w");
init_type_ref(&f->parameter_types[3], add_name("float4"));
f->parameter_types[3].type = find_type_by_ref(&f->parameter_types[3]);
f->parameters_size = 4;
f->block = NULL;
}
{
function_id func = add_function(add_name("int"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("int"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("int"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameters_size = 1;
f->block = NULL;
}
{
function_id func = add_function(add_name("int2"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("int2"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("int"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("y");
init_type_ref(&f->parameter_types[1], add_name("int"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameters_size = 2;
f->block = NULL;
}
{
function_id func = add_function(add_name("int3"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("int3"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("int"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("y");
init_type_ref(&f->parameter_types[1], add_name("int"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameter_names[2] = add_name("z");
init_type_ref(&f->parameter_types[2], add_name("int"));
f->parameter_types[2].type = find_type_by_ref(&f->parameter_types[2]);
f->parameters_size = 3;
f->block = NULL;
}
{
function_id func = add_function(add_name("int4"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("int4"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("int"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("y");
init_type_ref(&f->parameter_types[1], add_name("int"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameter_names[2] = add_name("z");
init_type_ref(&f->parameter_types[2], add_name("int"));
f->parameter_types[2].type = find_type_by_ref(&f->parameter_types[2]);
f->parameter_names[3] = add_name("w");
init_type_ref(&f->parameter_types[3], add_name("int"));
f->parameter_types[3].type = find_type_by_ref(&f->parameter_types[3]);
f->parameters_size = 4;
f->block = NULL;
}
{
function_id func = add_function(add_name("uint"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("uint"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("uint"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameters_size = 1;
f->block = NULL;
}
{
function_id func = add_function(add_name("uint2"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("uint2"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("uint"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("y");
init_type_ref(&f->parameter_types[1], add_name("uint"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameters_size = 2;
f->block = NULL;
}
{
function_id func = add_function(add_name("uint3"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("uint3"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("uint"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("y");
init_type_ref(&f->parameter_types[1], add_name("uint"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameter_names[2] = add_name("z");
init_type_ref(&f->parameter_types[2], add_name("uint"));
f->parameter_types[2].type = find_type_by_ref(&f->parameter_types[2]);
f->parameters_size = 3;
f->block = NULL;
}
{
function_id func = add_function(add_name("uint4"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("uint4"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("uint"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("y");
init_type_ref(&f->parameter_types[1], add_name("uint"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameter_names[2] = add_name("z");
init_type_ref(&f->parameter_types[2], add_name("uint"));
f->parameter_types[2].type = find_type_by_ref(&f->parameter_types[2]);
f->parameter_names[3] = add_name("w");
init_type_ref(&f->parameter_types[3], add_name("uint"));
f->parameter_types[3].type = find_type_by_ref(&f->parameter_types[3]);
f->parameters_size = 4;
f->block = NULL;
}
{
function_id func = add_function(add_name("bool"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("bool"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("bool"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameters_size = 1;
f->block = NULL;
}
{
function_id func = add_function(add_name("bool2"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("bool2"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("bool"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("y");
init_type_ref(&f->parameter_types[1], add_name("bool"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameters_size = 2;
f->block = NULL;
}
{
function_id func = add_function(add_name("bool3"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("bool3"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("bool"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("y");
init_type_ref(&f->parameter_types[1], add_name("bool"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameter_names[2] = add_name("z");
init_type_ref(&f->parameter_types[2], add_name("bool"));
f->parameter_types[2].type = find_type_by_ref(&f->parameter_types[2]);
f->parameters_size = 3;
f->block = NULL;
}
{
function_id func = add_function(add_name("bool4"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("bool4"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("bool"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("y");
init_type_ref(&f->parameter_types[1], add_name("bool"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameter_names[2] = add_name("z");
init_type_ref(&f->parameter_types[2], add_name("bool"));
f->parameter_types[2].type = find_type_by_ref(&f->parameter_types[2]);
f->parameter_names[3] = add_name("w");
init_type_ref(&f->parameter_types[3], add_name("bool"));
f->parameter_types[3].type = find_type_by_ref(&f->parameter_types[3]);
f->parameters_size = 4;
f->block = NULL;
}
{
function_id func = add_function(add_name("trace_ray"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("void"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("scene");
init_type_ref(&f->parameter_types[0], add_name("bvh"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameters_size += 1;
f->parameter_names[1] = add_name("ray");
init_type_ref(&f->parameter_types[1], add_name("ray"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameters_size += 1;
f->parameter_names[2] = add_name("payload");
init_type_ref(&f->parameter_types[2], add_name("void"));
f->parameter_types[2].type = find_type_by_ref(&f->parameter_types[2]);
f->parameters_size += 1;
f->block = NULL;
}
{
function_id func = add_function(add_name("dispatch_mesh"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("void"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("uint"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameters_size += 1;
f->parameter_names[1] = add_name("y");
init_type_ref(&f->parameter_types[1], add_name("uint"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameters_size += 1;
f->parameter_names[2] = add_name("z");
init_type_ref(&f->parameter_types[2], add_name("uint"));
f->parameter_types[2].type = find_type_by_ref(&f->parameter_types[2]);
f->parameters_size += 1;
f->parameter_names[3] = add_name("payload");
init_type_ref(&f->parameter_types[3], add_name("void"));
f->parameter_types[3].type = find_type_by_ref(&f->parameter_types[3]);
f->parameters_size += 1;
f->block = NULL;
}
add_func_uint3("group_id");
add_func_uint3("group_thread_id");
add_func_uint3("dispatch_thread_id");
add_func_int("group_index");
add_func_int("instance_id");
add_func_int("vertex_id");
////
// add_func_float3_float_float_float("lerp");
add_func_float_float_float_float("lerp");
////
add_func_float3("world_ray_origin");
add_func_float3("world_ray_direction");
add_func_float("ray_length");
add_func_float3_float3("normalize");
add_func_float_float("sin");
add_func_float_float("cos");
add_func_float_float("asin");
add_func_float_float("acos");
add_func_float_float("atan");
add_func_float_float_float("atan2");
add_func_float_float2("length");
add_func_float_float3_float3("distance");
add_func_uint3("ray_index");
add_func_float3("ray_dimensions");
add_func_float_float("frac");
add_func_float3x3("object_to_world3x3");
add_func_float3_float3_float3("reflect");
add_func_uint("primitive_index");
////
// add_func_float3_float3("abs");
add_func_float_float("abs");
add_func_float_float("tan");
add_func_float_float("log");
add_func_float_float("exp");
add_func_float_float("sign");
add_func_float_float("trunc");
add_func_float_float("sinh");
add_func_float_float("cosh");
add_func_float_float("tanh");
add_func_float_float("radians");
add_func_float_float("degrees");
////
add_func_float_float_float("floor");
add_func_float_float_float("ceil");
add_func_float_float_float("round");
add_func_float_float_float("sqrt");
add_func_float_float_float("rsqrt");
add_func_float_float_float("min");
add_func_float_float_float("max");
add_func_float_float_float_float("clamp");
add_func_float_float_float("step");
add_func_float_float_float("smoothstep");
add_func_float_float_float("pow");
add_func_float_float3_float3("dot");
add_func_float3_float3_float3("cross");
add_func_float3_float3("saturate3");
add_func_float_float("saturate");
add_func_float_float("ddx");
add_func_float_float("ddy");
////
add_func_float2_float2("ddx2");
add_func_float2_float2("ddy2");
add_func_float3_float3("ddx3");
add_func_float3_float3("ddy3");
add_func_float3_float3_float_float("clamp3");
add_func_float3_float3_float3("min3");
add_func_float3_float3_float3("max3");
add_func_float4_float4_float4("max4");
add_func_float3_float3_float3("step3");
add_func_float3_float3_float3("pow3");
add_func_float3_float3_float3("floor3");
add_func_float3_float3_float3("ceil3");
add_func_float3_float3("abs3");
add_func_float3_float3("frac3");
add_func_float3_float3_float3_float("lerp3");
add_func_float4_float4_float4_float("lerp4");
add_func_float3x3_float3x3("transpose");
////
add_func_void_uint_uint("set_mesh_output_counts");
{
function_id func = add_function(add_name("set_mesh_triangle"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("void"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("uint"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("y");
init_type_ref(&f->parameter_types[1], add_name("uint3"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameters_size = 2;
f->block = NULL;
}
{
function_id func = add_function(add_name("set_mesh_vertex"));
function *f = get_function(func);
init_type_ref(&f->return_type, add_name("void"));
f->return_type.type = find_type_by_ref(&f->return_type);
f->parameter_names[0] = add_name("x");
init_type_ref(&f->parameter_types[0], add_name("uint"));
f->parameter_types[0].type = find_type_by_ref(&f->parameter_types[0]);
f->parameter_names[1] = add_name("y");
init_type_ref(&f->parameter_types[1], add_name("void"));
f->parameter_types[1].type = find_type_by_ref(&f->parameter_types[1]);
f->parameters_size = 2;
f->block = NULL;
}
}
static void grow_if_needed(uint64_t size) {
while (size >= functions_size) {
functions_size *= 2;
function *new_functions = realloc(functions, functions_size * sizeof(function));
debug_context context = {0};
check(new_functions != NULL, context, "Could not allocate functions");
functions = new_functions;
}
}
function_id add_function(name_id name) {
grow_if_needed(next_function_index + 1);
function_id f = next_function_index;
++next_function_index;
functions[f].name = name;
functions[f].attributes.attributes_count = 0;
init_type_ref(&functions[f].return_type, NO_NAME);
functions[f].parameters_size = 0;
memset(functions[f].parameter_attributes, 0, sizeof(functions[f].parameter_attributes));
functions[f].block = NULL;
memset(functions[f].code.o, 0, sizeof(functions[f].code.o));
functions[f].code.size = 0;
functions[f].descriptor_set_group_index = UINT32_MAX;
functions[f].used_builtins = (builtins){0};
functions[f].used_capabilities = (capabilities){0};
return f;
}
function_id find_function(name_id name) {
for (function_id i = 0; i < next_function_index; ++i) {
if (functions[i].name == name) {
return i;
}
}
return NO_FUNCTION;
}
function *get_function(function_id function) {
if (function >= next_function_index) {
return NULL;
}
return &functions[function];
}