Merge branch 'dev' of git.nbross.com:nielsbross/Shader-Compiler into dev

This commit is contained in:
2024-07-02 22:52:06 +02:00
5 changed files with 111 additions and 22 deletions

View File

@@ -1,6 +1,7 @@
Output_Language :: enum { Output_Language :: enum {
HLSL; HLSL;
GLSL; GLSL; // @Incomplete
MLSL; // @Incomplete
} }
Codegen_State :: struct { Codegen_State :: struct {
@@ -32,6 +33,7 @@ init_codegen_state :: (state : *Codegen_State, root : *AST_Node, checker_result
state.scope_stack = checker_result.scope_stack; state.scope_stack = checker_result.scope_stack;
state.type_variables = checker_result.type_variables; state.type_variables = checker_result.type_variables;
state.current_scope = cast(Scope_Handle)1; state.current_scope = cast(Scope_Handle)1;
state.output_language = output_language;
init_string_builder(*state.builder); init_string_builder(*state.builder);
} }
@@ -48,6 +50,14 @@ emit_field :: (state : *Codegen_State, node : *AST_Node, indentation : int) {
print_to_builder(*state.builder, "% ", type_to_string(field)); print_to_builder(*state.builder, "% ", type_to_string(field));
print_to_builder(*state.builder, "%", node.name); print_to_builder(*state.builder, "%", node.name);
if field.type == .Sampler {
print_to_builder(*state.builder, " : register(s%)", field.resource_index);
}
if field.type == .Texture2D {
print_to_builder(*state.builder, " : register(t%)", field.resource_index);
}
for i :0..node.children.count - 1 { for i :0..node.children.count - 1 {
child := node.children[i]; child := node.children[i];
@@ -133,26 +143,40 @@ emit_properties :: (state : *Codegen_State, node : *AST_Node, indentation : int)
variable := h2tv(state.type_variables, find_result.type_variable); variable := h2tv(state.type_variables, find_result.type_variable);
print_to_builder(*state.builder, "cbuffer __PROPERTIES : register(b%) \n{\n", variable.buffer_index); print_to_builder(*state.builder, "cbuffer __PROPERTIES : register(b%) \n{\n", variable.resource_index);
previous_scope := state.current_scope; previous_scope := state.current_scope;
state.current_scope = variable.scope; state.current_scope = variable.scope;
resources : Static_Array(*AST_Node, 8);
for child : node.children { for child : node.children {
if child.kind == .FieldList { if child.kind == .FieldList {
for field : child.children { for field : child.children {
tv := h2tv(state.type_variables, field.type_variable);
if tv.type == .Sampler || tv.type == .Texture2D {
array_add(*resources, field);
continue;
}
emit_node(state, field, 1); emit_node(state, field, 1);
append(*state.builder, ";\n"); append(*state.builder, ";\n");
} }
} }
} }
state.current_scope = previous_scope;
append(*state.builder, "}\n\n"); append(*state.builder, "}\n\n");
for i : 0..resources.count - 1 {
resource := resources[i];
emit_node(state, resource, 0);
append(*state.builder, ";\n");
}
append(*state.builder, "\n");
state.current_scope = previous_scope;
} }
emit_function :: (state : *Codegen_State, node : *AST_Node, indentation : int, emit_body := true) { emit_function :: (state : *Codegen_State, node : *AST_Node, indentation : int, emit_body := true) {
@@ -372,7 +396,7 @@ emit_struct :: (state : *Codegen_State, node : *AST_Node, indentation : int) {
emit_cbuffer :: (state : *Codegen_State, node : *AST_Node, indentation : int) { emit_cbuffer :: (state : *Codegen_State, node : *AST_Node, indentation : int) {
variable := h2tv(state.type_variables, node.type_variable); variable := h2tv(state.type_variables, node.type_variable);
print_to_builder(*state.builder, "cbuffer % : register(b%)", variable.name, variable.buffer_index); print_to_builder(*state.builder, "cbuffer % : register(b%)", variable.name, variable.resource_index);
current_scope := state.current_scope; current_scope := state.current_scope;
state.current_scope = h2tv(state.type_variables, node.type_variable).scope; state.current_scope = h2tv(state.type_variables, node.type_variable).scope;

View File

@@ -77,7 +77,7 @@ Type_Variable :: struct {
child_count : int; child_count : int;
//@Note(niels): For constant buffers //@Note(niels): For constant buffers
buffer_index : u32; resource_index : u32;
uf_parent : Type_Variable_Handle; uf_parent : Type_Variable_Handle;
@@ -198,6 +198,10 @@ Semantic_Checker :: struct {
// type_variables : [..]Type_Variable; // type_variables : [..]Type_Variable;
constraints : [..]Type_Constraint; constraints : [..]Type_Constraint;
current_buffer_index : u32 = 0;
current_sampler_index : u32 = 0;
current_texture_index : u32 = 0;
result : Semantic_Check_Result; result : Semantic_Check_Result;
} }
@@ -926,8 +930,6 @@ declare_struct :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Variab
return declare_struct(checker, node, node.name); return declare_struct(checker, node, node.name);
} }
current_buffer_index : u32 = 0;
declare_properties :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Variable_Handle { declare_properties :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Variable_Handle {
name := ifx node.name.count == 0 then "properties" else node.name; name := ifx node.name.count == 0 then "properties" else node.name;
@@ -938,8 +940,8 @@ declare_properties :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Va
var := h2tv(checker, type_var); var := h2tv(checker, type_var);
var.type = .Properties; var.type = .Properties;
var.typename = "properties"; var.typename = "properties";
var.buffer_index = current_buffer_index; var.resource_index = checker.current_buffer_index;
current_buffer_index += 1; checker.current_buffer_index += 1;
return type_var; return type_var;
} }
@@ -947,8 +949,8 @@ declare_cbuffer :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Varia
type_var := declare_struct(checker, node); type_var := declare_struct(checker, node);
var := h2tv(checker, type_var); var := h2tv(checker, type_var);
var.type = .CBuffer; var.type = .CBuffer;
var.buffer_index = current_buffer_index; var.resource_index = checker.current_buffer_index;
current_buffer_index += 1; checker.current_buffer_index += 1;
array_add(*checker.result.constant_buffers, type_var); array_add(*checker.result.constant_buffers, type_var);
return type_var; return type_var;
} }
@@ -1252,6 +1254,17 @@ create_field :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Variable
variable.name = node.name; variable.name = node.name;
typename : string; typename : string;
variable.type = get_type_from_identifier(checker, checker.current_scope, node, *typename); variable.type = get_type_from_identifier(checker, checker.current_scope, node, *typename);
if variable.kind == .Declaration && variable.type == .Sampler {
variable.resource_index = checker.current_sampler_index;
checker.current_sampler_index += 1;
}
if variable.kind == .Declaration && variable.type == .Texture2D {
variable.resource_index = checker.current_texture_index;
checker.current_texture_index += 1;
}
variable.typename = typename; variable.typename = typename;
variable.source_node = node; variable.source_node = node;
variable.scope = checker.current_scope; variable.scope = checker.current_scope;
@@ -1761,7 +1774,9 @@ type_check :: (checker : *Semantic_Checker, root : *AST_Node) {
} }
check :: (checker : *Semantic_Checker, root : *AST_Node) -> Semantic_Check_Result { check :: (checker : *Semantic_Checker, root : *AST_Node) -> Semantic_Check_Result {
current_buffer_index = 0; checker.current_buffer_index = 0;
checker.current_sampler_index = 0;
checker.current_texture_index = 0;
array_reserve(*checker.result.messages, 16); array_reserve(*checker.result.messages, 16);
array_reserve(*checker.constraints, 1024); array_reserve(*checker.constraints, 1024);
add_hlsl_builtins(checker); add_hlsl_builtins(checker);
@@ -2037,6 +2052,7 @@ print_type_variable :: (builder : *String_Builder, variable : Type_Variable, che
} }
case .Function; #through; case .Function; #through;
case .Struct; #through; case .Struct; #through;
case .CBuffer; #through;
case .Field; { case .Field; {
if variable.struct_field_parent { if variable.struct_field_parent {
print_to_builder(builder, "%.", variable.struct_field_parent.name); print_to_builder(builder, "%.", variable.struct_field_parent.name);

View File

@@ -72,6 +72,7 @@ Field :: struct {
name : string; name : string;
type : Field_Type; type : Field_Type;
resource_index : u32;
hints : [..]Field_Hint; hints : [..]Field_Hint;
} }
@@ -240,9 +241,13 @@ type_variable_to_field :: (checker : *Semantic_Checker, variable : *Type_Variabl
} }
case .Texture2D; { case .Texture2D; {
type.kind = Field_Kind.Texture2D; type.kind = Field_Kind.Texture2D;
field.resource_index = variable.resource_index;
} }
case .Sampler; { case .Sampler; {
type.kind = Field_Kind.Sampler; type.kind = Field_Kind.Sampler;
field.resource_index = variable.resource_index;
} }
case .Struct; { case .Struct; {
type.kind = Field_Kind.Struct; type.kind = Field_Kind.Struct;
@@ -378,7 +383,7 @@ compile_file :: (compiler : *Shader_Compiler, path : string) -> Compilation_Resu
array_add(*cb.fields, field); array_add(*cb.fields, field);
} }
cb.buffer_index = variable.buffer_index; cb.buffer_index = variable.resource_index;
} }
find_result := find_symbol(*check_result.scope_stack, check_result.property_name, xx 1); find_result := find_symbol(*check_result.scope_stack, check_result.property_name, xx 1);
@@ -392,7 +397,7 @@ compile_file :: (compiler : *Shader_Compiler, path : string) -> Compilation_Resu
prop_field.base_field = field; prop_field.base_field = field;
array_add(*result.collection.properties.fields, prop_field); array_add(*result.collection.properties.fields, prop_field);
} }
result.collection.properties.buffer_index = property_variable.buffer_index; result.collection.properties.buffer_index = property_variable.resource_index;
} }
if checker.result.pixel_entry_point { if checker.result.pixel_entry_point {

View File

@@ -0,0 +1,29 @@
struct PS_Input;
cbuffer __PROPERTIES : register(b0)
{
}
Texture2D texture : register(t0);
Sampler sampler : register(s0);
struct PS_Input
{
float2 uv;
float4 pos : POSITION;
}
PS_Input vs_main(float4 pos : POSITION, float2 uv)
{
PS_Input result;
result.uv = uv;
result.pos = pos;
return result;
}
float4 ps_main(PS_Input input) : SV_TARGET
{
float4 color = texture.sample(input.uv, sampler);
return color;
}

View File

@@ -0,0 +1,15 @@
scope (global) [
[pixel__ps_main] : () -> float4
[vertex__vs_main] : (pos : float4) -> float4
[camera] : {projection : float4x4, view : float4x4}
scope (camera) [
[projection] : float4x4
[view] : float4x4
]
scope (vertex__vs_main) [
[pos] : float4
[mv] : float4
[mvp] : float4
]
scope (pixel__ps_main) []
]