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:
38
Codegen.jai
38
Codegen.jai
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
@@ -196,6 +196,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -924,16 +928,14 @@ 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;
|
||||||
type_var := declare_struct(checker, node, name);
|
type_var := declare_struct(checker, node, name);
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -941,8 +943,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;
|
||||||
}
|
}
|
||||||
@@ -1246,6 +1248,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;
|
||||||
@@ -1728,7 +1741,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);
|
||||||
|
|||||||
@@ -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, "properties", xx 1);
|
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;
|
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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user