Fixes for texture and sampler codegen

- Moved textures and samplers out of property cbuffer for hlsl
- Fixed register indices for resources
This commit is contained in:
2024-07-01 07:58:13 +02:00
parent 274cb379b4
commit 92c1f593c2
3 changed files with 66 additions and 22 deletions

View File

@@ -1,6 +1,7 @@
Output_Language :: enum {
HLSL;
GLSL;
GLSL; // @Incomplete
MLSL; // @Incomplete
}
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.type_variables = checker_result.type_variables;
state.current_scope = cast(Scope_Handle)1;
state.output_language = output_language;
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, "%", 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 {
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);
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;
state.current_scope = variable.scope;
resources : Static_Array(*AST_Node, 8);
for child : node.children {
if child.kind == .FieldList {
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);
append(*state.builder, ";\n");
}
}
}
state.current_scope = previous_scope;
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) {
@@ -372,7 +396,7 @@ emit_struct :: (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);
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;
state.current_scope = h2tv(state.type_variables, node.type_variable).scope;

View File

@@ -77,7 +77,7 @@ Type_Variable :: struct {
child_count : int;
//@Note(niels): For constant buffers
buffer_index : u32;
resource_index : u32;
uf_parent : Type_Variable_Handle;
@@ -196,6 +196,10 @@ Semantic_Checker :: struct {
// type_variables : [..]Type_Variable;
constraints : [..]Type_Constraint;
current_buffer_index : u32 = 0;
current_sampler_index : u32 = 0;
current_texture_index : u32 = 0;
result : Semantic_Check_Result;
}
@@ -924,16 +928,14 @@ declare_struct :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Variab
return declare_struct(checker, node, node.name);
}
current_buffer_index : u32 = 0;
declare_properties :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Variable_Handle {
name := ifx node.name.count == 0 then "properties" else node.name;
type_var := declare_struct(checker, node, name);
var := h2tv(checker, type_var);
var.type = .Properties;
var.typename = "properties";
var.buffer_index = current_buffer_index;
current_buffer_index += 1;
var.resource_index = checker.current_buffer_index;
checker.current_buffer_index += 1;
return type_var;
}
@@ -941,8 +943,8 @@ declare_cbuffer :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Varia
type_var := declare_struct(checker, node);
var := h2tv(checker, type_var);
var.type = .CBuffer;
var.buffer_index = current_buffer_index;
current_buffer_index += 1;
var.resource_index = checker.current_buffer_index;
checker.current_buffer_index += 1;
array_add(*checker.result.constant_buffers, type_var);
return type_var;
}
@@ -1246,6 +1248,17 @@ create_field :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Variable
variable.name = node.name;
typename : string;
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.source_node = node;
variable.scope = checker.current_scope;
@@ -1728,7 +1741,9 @@ type_check :: (checker : *Semantic_Checker, root : *AST_Node) {
}
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.constraints, 1024);
add_hlsl_builtins(checker);

View File

@@ -72,6 +72,7 @@ Field :: struct {
name : string;
type : Field_Type;
resource_index : u32;
hints : [..]Field_Hint;
}
@@ -240,9 +241,13 @@ type_variable_to_field :: (checker : *Semantic_Checker, variable : *Type_Variabl
}
case .Texture2D; {
type.kind = Field_Kind.Texture2D;
field.resource_index = variable.resource_index;
}
case .Sampler; {
type.kind = Field_Kind.Sampler;
field.resource_index = variable.resource_index;
}
case .Struct; {
type.kind = Field_Kind.Struct;
@@ -378,7 +383,7 @@ compile_file :: (compiler : *Shader_Compiler, path : string) -> Compilation_Resu
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, "properties", xx 1);
@@ -392,7 +397,7 @@ compile_file :: (compiler : *Shader_Compiler, path : string) -> Compilation_Resu
prop_field.base_field = 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 {