pipe parsed command line through render layer initialization; add new command line flags for render layer - (a) to disable API calls which require debug SDKs, and (b) to force software warp driver type

This commit is contained in:
Ryan Fleury
2024-01-12 14:42:24 -08:00
parent 6304ad6955
commit ca8727c4af
4 changed files with 27 additions and 309 deletions
+1 -1
View File
@@ -946,7 +946,7 @@ entry_point(int argc, char **argv)
dasm_init();
os_graphical_init();
fp_init();
r_init();
r_init(&cmdln);
tex_init();
geo_init();
f_init();
+19 -8
View File
@@ -131,7 +131,7 @@ r_d3d11_instance_buffer_from_size(U64 size)
//- rjf: top-level layer initialization
r_hook void
r_init(void)
r_init(CmdLine *cmdln)
{
ProfBeginFunction();
HRESULT error = 0;
@@ -143,11 +143,19 @@ r_init(void)
//- rjf: create base device
UINT creation_flags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
#if !defined(NDEBUG)
creation_flags |= D3D11_CREATE_DEVICE_DEBUG;
if(!cmd_line_has_flag(cmdln, str8_lit("disable_d3d11_debug")))
{
creation_flags |= D3D11_CREATE_DEVICE_DEBUG;
}
#endif
D3D_FEATURE_LEVEL feature_levels[] = { D3D_FEATURE_LEVEL_11_0 };
D3D_DRIVER_TYPE driver_type = D3D_DRIVER_TYPE_HARDWARE;
if(cmd_line_has_flag(cmdln, str8_lit("force_d3d11_software")))
{
driver_type = D3D_DRIVER_TYPE_WARP;
}
error = D3D11CreateDevice(0,
D3D_DRIVER_TYPE_HARDWARE,
driver_type,
0,
creation_flags,
feature_levels, ArrayCount(feature_levels),
@@ -156,11 +164,14 @@ r_init(void)
//- rjf: enable break-on-error
#if !defined(NDEBUG)
ID3D11InfoQueue *info = 0;
error = r_d3d11_state->base_device->QueryInterface(__uuidof(ID3D11InfoQueue), (void **)(&info));
error = info->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_CORRUPTION, TRUE);
error = info->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_ERROR, TRUE);
info->Release();
if(!cmd_line_has_flag(cmdln, str8_lit("disable_d3d11_debug")))
{
ID3D11InfoQueue *info = 0;
error = r_d3d11_state->base_device->QueryInterface(__uuidof(ID3D11InfoQueue), (void **)(&info));
error = info->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_CORRUPTION, TRUE);
error = info->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_ERROR, TRUE);
info->Release();
}
#endif
//- rjf: get main device
+1 -1
View File
@@ -269,7 +269,7 @@ internal R_Pass *r_pass_from_kind(Arena *arena, R_PassList *list, R_PassKind kin
//~ rjf: Backend Hooks
//- rjf: top-level layer initialization
r_hook void r_init(void);
r_hook void r_init(CmdLine *cmdln);
//- rjf: window setup/teardown
r_hook R_Handle r_window_equip(OS_Handle window);
+6 -299
View File
@@ -1,307 +1,14 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#include "base/base_inc.h"
#include "os/os_inc.h"
#include "mdesk/mdesk.h"
#include "base/base_inc.c"
#include "os/os_inc.c"
#include "mdesk/mdesk.c"
typedef enum MG_StrExprOpKind
{
MG_StrExprOpKind_Null,
MG_StrExprOpKind_Prefix,
MG_StrExprOpKind_Postfix,
MG_StrExprOpKind_Binary,
MG_StrExprOpKind_COUNT
}
MG_StrExprOpKind;
typedef enum MG_StrExprOp
{
MG_StrExprOp_Null,
#define MG_StrExprOp_FirstString MG_StrExprOp_Dot
MG_StrExprOp_Dot,
MG_StrExprOp_ExpandIfTrue,
MG_StrExprOp_Concat,
MG_StrExprOp_BumpToColumn,
#define MG_StrExprOp_LastString MG_StrExprOp_BumpToColumn
#define MG_StrExprOp_FirstNumeric MG_StrExprOp_Add
MG_StrExprOp_Add,
MG_StrExprOp_Subtract,
MG_StrExprOp_Multiply,
MG_StrExprOp_Divide,
MG_StrExprOp_Modulo,
MG_StrExprOp_LeftShift,
MG_StrExprOp_RightShift,
MG_StrExprOp_BitwiseAnd,
MG_StrExprOp_BitwiseOr,
MG_StrExprOp_BitwiseXor,
MG_StrExprOp_BitwiseNegate,
MG_StrExprOp_BooleanAnd,
MG_StrExprOp_BooleanOr,
MG_StrExprOp_BooleanNot,
MG_StrExprOp_Equals,
MG_StrExprOp_DoesNotEqual,
#define MG_StrExprOp_LastNumeric MG_StrExprOp_DoesNotEqual
MG_StrExprOp_COUNT,
}
MG_StrExprOp;
read_only global String8 mg_str_expr_op_symbol_string_table[MG_StrExprOp_COUNT] =
{
str8_lit_comp(""),
str8_lit_comp("."), // MG_StrExprOp_Dot
str8_lit_comp("->"), // MG_StrExprOp_ExpandIfTrue
str8_lit_comp(".."), // MG_StrExprOp_Concat
str8_lit_comp("=>"), // MG_StrExprOp_BumpToColumn
str8_lit_comp("+"), // MG_StrExprOp_Add
str8_lit_comp("-"), // MG_StrExprOp_Subtract
str8_lit_comp("*"), // MG_StrExprOp_Multiply
str8_lit_comp("/"), // MG_StrExprOp_Divide
str8_lit_comp("%"), // MG_StrExprOp_Modulo
str8_lit_comp("<<"), // MG_StrExprOp_LeftShift
str8_lit_comp(">>"), // MG_StrExprOp_RightShift
str8_lit_comp("&"), // MG_StrExprOp_BitwiseAnd
str8_lit_comp("|"), // MG_StrExprOp_BitwiseOr
str8_lit_comp("^"), // MG_StrExprOp_BitwiseXor
str8_lit_comp("~"), // MG_StrExprOp_BitwiseNegate
str8_lit_comp("&&"), // MG_StrExprOp_BooleanAnd
str8_lit_comp("||"), // MG_StrExprOp_BooleanOr
str8_lit_comp("!"), // MG_StrExprOp_BooleanNot
str8_lit_comp("=="), // MG_StrExprOp_Equals
str8_lit_comp("!="), // MG_StrExprOp_DoesNotEqual
};
read_only global S8 mg_str_expr_op_precedence_table[MG_StrExprOp_COUNT] =
{
0,
20, // MG_StrExprOp_Dot
1, // MG_StrExprOp_ExpandIfTrue
2, // MG_StrExprOp_Concat
12, // MG_StrExprOp_BumpToColumn
5, // MG_StrExprOp_Add
5, // MG_StrExprOp_Subtract
6, // MG_StrExprOp_Multiply
6, // MG_StrExprOp_Divide
6, // MG_StrExprOp_Modulo
7, // MG_StrExprOp_LeftShift
7, // MG_StrExprOp_RightShift
8, // MG_StrExprOp_BitwiseAnd
10, // MG_StrExprOp_BitwiseOr
9, // MG_StrExprOp_BitwiseXor
11, // MG_StrExprOp_BitwiseNegate
3, // MG_StrExprOp_BooleanAnd
3, // MG_StrExprOp_BooleanOr
11, // MG_StrExprOp_BooleanNot
4, // MG_StrExprOp_Equals
4, // MG_StrExprOp_DoesNotEqual
};
read_only global MG_StrExprOpKind mg_str_expr_op_kind_table[MG_StrExprOp_COUNT] =
{
MG_StrExprOpKind_Null,
MG_StrExprOpKind_Binary, // MG_StrExprOp_Dot
MG_StrExprOpKind_Binary, // MG_StrExprOp_ExpandIfTrue
MG_StrExprOpKind_Binary, // MG_StrExprOp_Concat
MG_StrExprOpKind_Prefix, // MG_StrExprOp_BumpToColumn
MG_StrExprOpKind_Binary, // MG_StrExprOp_Add
MG_StrExprOpKind_Binary, // MG_StrExprOp_Subtract
MG_StrExprOpKind_Binary, // MG_StrExprOp_Multiply
MG_StrExprOpKind_Binary, // MG_StrExprOp_Divide
MG_StrExprOpKind_Binary, // MG_StrExprOp_Modulo
MG_StrExprOpKind_Binary, // MG_StrExprOp_LeftShift
MG_StrExprOpKind_Binary, // MG_StrExprOp_RightShift
MG_StrExprOpKind_Binary, // MG_StrExprOp_BitwiseAnd
MG_StrExprOpKind_Binary, // MG_StrExprOp_BitwiseOr
MG_StrExprOpKind_Binary, // MG_StrExprOp_BitwiseXor
MG_StrExprOpKind_Prefix, // MG_StrExprOp_BitwiseNegate
MG_StrExprOpKind_Binary, // MG_StrExprOp_BooleanAnd
MG_StrExprOpKind_Binary, // MG_StrExprOp_BooleanOr
MG_StrExprOpKind_Prefix, // MG_StrExprOp_BooleanNot
MG_StrExprOpKind_Binary, // MG_StrExprOp_Equals
MG_StrExprOpKind_Binary, // MG_StrExprOp_DoesNotEqual
};
typedef struct MG_StrExpr MG_StrExpr;
struct MG_StrExpr
{
MG_StrExpr *parent;
MG_StrExpr *left;
MG_StrExpr *right;
MG_StrExprOp op;
MD_Node *node;
};
typedef struct MG_StrExprParseResult MG_StrExprParseResult;
struct MG_StrExprParseResult
{
MG_StrExpr *root;
MD_MsgList msgs;
MD_Node *next_node;
};
global MG_StrExpr mg_str_expr_nil = {&mg_str_expr_nil, &mg_str_expr_nil, &mg_str_expr_nil};
internal MG_StrExpr *
mg_push_str_expr(Arena *arena, MG_StrExprOp op, MD_Node *node)
{
MG_StrExpr *expr = push_array(arena, MG_StrExpr, 1);
MemoryCopyStruct(expr, &mg_str_expr_nil);
expr->op = op;
expr->node = node;
return expr;
}
internal MG_StrExprParseResult
mg_str_expr_parse_from_first_opl__min_prec(Arena *arena, MD_Node *first, MD_Node *opl, S8 min_prec)
{
MG_StrExprParseResult parse = {&mg_str_expr_nil};
{
MD_Node *it = first;
//- rjf: consume prefix operators
MG_StrExpr *leafmost_op = &mg_str_expr_nil;
for(;it < opl && !md_node_is_nil(it);)
{
MG_StrExprOp found_op = MG_StrExprOp_Null;
for(MG_StrExprOp op = (MG_StrExprOp)(MG_StrExprOp_Null+1);
op < MG_StrExprOp_COUNT;
op = (MG_StrExprOp)(op+1))
{
if(mg_str_expr_op_kind_table[op] == MG_StrExprOpKind_Prefix &&
str8_match(it->string, mg_str_expr_op_symbol_string_table[op], 0) &&
mg_str_expr_op_precedence_table[op] >= min_prec)
{
found_op = op;
break;
}
}
if(found_op != MG_StrExprOp_Null)
{
MG_StrExpr *op_expr = mg_push_str_expr(arena, found_op, it);
if(leafmost_op == &mg_str_expr_nil)
{
leafmost_op = op_expr;
}
op_expr->left = parse.root;
parse.root = op_expr;
it = it->next;
}
else
{
break;
}
}
//- rjf: parse atom
{
MG_StrExpr *atom = &mg_str_expr_nil;
if(it->flags & MD_NodeFlag_Identifier|MD_NodeFlag_Numeric|MD_NodeFlag_StringLiteral &&
md_node_is_nil(it->first))
{
atom = mg_push_str_expr(arena, MG_StrExprOp_Null, it);
it = it->next;
}
else if(!md_node_is_nil(it->first))
{
MG_StrExprParseResult subparse = mg_str_expr_parse_from_first_opl__min_prec(arena, it->first, &md_nil_node, 0);
atom = subparse.root;
md_msg_list_concat_in_place(&parse.msgs, &subparse.msgs);
it = it->next;
}
if(leafmost_op != &mg_str_expr_nil)
{
leafmost_op->left = atom;
}
else
{
parse.root = atom;
}
}
//- rjf: parse binary operator extensions at this precedence level
for(;it < opl && !md_node_is_nil(it);)
{
// rjf: find binary op kind of `it`
MG_StrExprOp found_op = MG_StrExprOp_Null;
for(MG_StrExprOp op = (MG_StrExprOp)(MG_StrExprOp_Null+1);
op < MG_StrExprOp_COUNT;
op = (MG_StrExprOp)(op+1))
{
if(mg_str_expr_op_kind_table[op] == MG_StrExprOpKind_Binary &&
str8_match(it->string, mg_str_expr_op_symbol_string_table[op], 0) &&
mg_str_expr_op_precedence_table[op] >= min_prec)
{
found_op = op;
break;
}
}
// rjf: good found_op -> build binary expr
if(found_op != MG_StrExprOp_Null)
{
MG_StrExpr *op_expr = mg_push_str_expr(arena, found_op, it);
if(leafmost_op == &mg_str_expr_nil)
{
leafmost_op = op_expr;
}
op_expr->left = parse.root;
parse.root = op_expr;
it = it->next;
}
else
{
break;
}
// rjf: parse right hand side of binary operator
MG_StrExprParseResult subparse = mg_str_expr_parse_from_first_opl__min_prec(arena, it, opl, mg_str_expr_op_precedence_table[found_op]+1);
parse.root->right = subparse.root;
md_msg_list_concat_in_place(&parse.msgs, &subparse.msgs);
if(subparse.root == &mg_str_expr_nil)
{
md_msg_list_pushf(arena, &parse.msgs, it, MD_MsgKind_Error, "Missing right-hand-side of '%S'.", mg_str_expr_op_symbol_string_table[found_op]);
}
it = subparse.next_node;
}
// rjf: store next node for more caller-side parsing
parse.next_node = it;
}
return parse;
}
internal MG_StrExprParseResult
mg_str_expr_parse_from_first_opl(Arena *arena, MD_Node *first, MD_Node *opl)
{
MG_StrExprParseResult parse = mg_str_expr_parse_from_first_opl__min_prec(arena, first, opl, 0);
return parse;
}
internal MG_StrExprParseResult
mg_str_expr_parse_from_root(Arena *arena, MD_Node *root)
{
MG_StrExprParseResult parse = mg_str_expr_parse_from_first_opl__min_prec(arena, root->first, &md_nil_node, 0);
return parse;
}
#include <stdlib.h>
int main(int argument_count, char **arguments)
{
static TCTX main_thread_tctx = {0};
tctx_init_and_equip(&main_thread_tctx);
os_init(argument_count, arguments);
Arena *arena = arena_alloc();
String8 text = str8_lit("(a.vr == \"x\" -> \"DF_GFX_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_DEF(\" .. a.name_lower .. \");\")");
MD_TokenizeResult tokenize = md_tokenize_from_text(arena, text);
MD_ParseResult base_parse = md_parse_from_text_tokens(arena, str8_lit(""), text, tokenize.tokens);
MG_StrExprParseResult strexpr_parse = mg_str_expr_parse_from_root(arena, base_parse.root->first);
int *arr = malloc(sizeof(int)*1000);
for(int i = 0; i < 1001; i += 1)
{
arr[i] = i;
}
return 0;
}