From 3cb96be239a8315cb27bc6cdb2ee41b9f12e4f66 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Thu, 15 Jul 2021 22:28:00 +1000 Subject: [PATCH] glsl: replace some C++ code with C This replaces some new/delete uses with malloc/free. This is more consistent with most of the other glsl IR code but more importantly it allows the game "Battle Block Theater" to start working on some mesa drivers. The game overrides new and ends up throwing an assert and crashing when it sees this function calling new [0]. Note: The game still crashes with radeonsi due to similar conflicts with LLVM. CC: mesa-stable Reviewed-by: Ian Romanick Part-of: (cherry picked from commit 749251391d967ce5450a6adfeb64cb773cce2508) --- .pick_status.json | 2 +- src/compiler/glsl/linker.cpp | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 01ea7e35ce6..4d6f697713e 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -805,7 +805,7 @@ "description": "glsl: replace some C++ code with C", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index df1bf920a76..a5ae7a30bf0 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -1200,7 +1200,7 @@ static bool interstage_cross_validate_uniform_blocks(struct gl_shader_program *prog, bool validate_ssbo) { - int *InterfaceBlockStageIndex[MESA_SHADER_STAGES]; + int *ifc_blk_stage_idx[MESA_SHADER_STAGES]; struct gl_uniform_block *blks = NULL; unsigned *num_blks = validate_ssbo ? &prog->data->NumShaderStorageBlocks : &prog->data->NumUniformBlocks; @@ -1221,9 +1221,10 @@ interstage_cross_validate_uniform_blocks(struct gl_shader_program *prog, for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { struct gl_linked_shader *sh = prog->_LinkedShaders[i]; - InterfaceBlockStageIndex[i] = new int[max_num_buffer_blocks]; + ifc_blk_stage_idx[i] = + (int *) malloc(sizeof(int) * max_num_buffer_blocks); for (unsigned int j = 0; j < max_num_buffer_blocks; j++) - InterfaceBlockStageIndex[i][j] = -1; + ifc_blk_stage_idx[i][j] = -1; if (sh == NULL) continue; @@ -1247,7 +1248,7 @@ interstage_cross_validate_uniform_blocks(struct gl_shader_program *prog, "definitions\n", sh_blks[j]->Name); for (unsigned k = 0; k <= i; k++) { - delete[] InterfaceBlockStageIndex[k]; + free(ifc_blk_stage_idx[k]); } /* Reset the block count. This will help avoid various segfaults @@ -1258,7 +1259,7 @@ interstage_cross_validate_uniform_blocks(struct gl_shader_program *prog, return false; } - InterfaceBlockStageIndex[i][index] = j; + ifc_blk_stage_idx[i][index] = j; } } @@ -1267,7 +1268,7 @@ interstage_cross_validate_uniform_blocks(struct gl_shader_program *prog, */ for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { for (unsigned j = 0; j < *num_blks; j++) { - int stage_index = InterfaceBlockStageIndex[i][j]; + int stage_index = ifc_blk_stage_idx[i][j]; if (stage_index != -1) { struct gl_linked_shader *sh = prog->_LinkedShaders[i]; @@ -1283,7 +1284,7 @@ interstage_cross_validate_uniform_blocks(struct gl_shader_program *prog, } for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { - delete[] InterfaceBlockStageIndex[i]; + free(ifc_blk_stage_idx[i]); } if (validate_ssbo)