From ca8727c4afdfce24f62b701e3f82c79006a16297 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 12 Jan 2024 14:42:24 -0800 Subject: [PATCH] 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 --- src/raddbg/raddbg.cpp | 2 +- src/render/d3d11/render_d3d11.cpp | 27 ++- src/render/render_core.h | 2 +- src/scratch/ryan_scratch.c | 305 +----------------------------- 4 files changed, 27 insertions(+), 309 deletions(-) diff --git a/src/raddbg/raddbg.cpp b/src/raddbg/raddbg.cpp index 409a961f..8f0f7428 100644 --- a/src/raddbg/raddbg.cpp +++ b/src/raddbg/raddbg.cpp @@ -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(); diff --git a/src/render/d3d11/render_d3d11.cpp b/src/render/d3d11/render_d3d11.cpp index 09a9f15c..22a4ed70 100644 --- a/src/render/d3d11/render_d3d11.cpp +++ b/src/render/d3d11/render_d3d11.cpp @@ -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 diff --git a/src/render/render_core.h b/src/render/render_core.h index f6068185..fbd9e04e 100644 --- a/src/render/render_core.h +++ b/src/render/render_core.h @@ -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); diff --git a/src/scratch/ryan_scratch.c b/src/scratch/ryan_scratch.c index d789d8fe..b5a71af8 100644 --- a/src/scratch/ryan_scratch.c +++ b/src/scratch/ryan_scratch.c @@ -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 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; }