Skip to content

Commit 155a308

Browse files
committed
refactor(renderer): improve error handling and memory management in shader and vertex buffer creation
- Enhanced error handling in GL_CreateShaderProgram and GL_CreateVertexBuffer functions to ensure proper resource cleanup on allocation failures. - Replaced nullptr with 0 for shader program and shader pointers to maintain consistency in memory management practices. - Introduced error logging for failed memory allocations to aid in debugging and improve overall robustness of the rendering system.
1 parent 81071d7 commit 155a308

3 files changed

Lines changed: 50 additions & 4 deletions

File tree

src/common/crash_verbose.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@
1111
// Crash logs directory
1212
#define CRASH_LOG_DIR "logs"
1313

14+
// Maximum backtrace depth - can be increased if needed for very deep call stacks
15+
#define MAX_BACKTRACE_DEPTH 256
16+
1417
void append_verbose_crash_context(void) {
15-
void* buffer[256];
18+
void* buffer[MAX_BACKTRACE_DEPTH];
1619
int nptrs = backtrace(buffer, sizeof(buffer) / sizeof(void*));
1720
if (nptrs <= 0) return;
1821

src/renderers/opengl/gl_shader.c

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,17 +105,17 @@ GL_ShaderShutdown
105105
void GL_ShaderShutdown(void) {
106106
if (shaderManager.defaultProgram.program) {
107107
qglDeleteProgram(shaderManager.defaultProgram.program);
108-
shaderManager.defaultProgram.program = nullptr;
108+
shaderManager.defaultProgram.program = 0;
109109
}
110110

111111
if (shaderManager.defaultProgram.vertexShader) {
112112
qglDeleteShader(shaderManager.defaultProgram.vertexShader);
113-
shaderManager.defaultProgram.vertexShader = nullptr;
113+
shaderManager.defaultProgram.vertexShader = 0;
114114
}
115115

116116
if (shaderManager.defaultProgram.fragmentShader) {
117117
qglDeleteShader(shaderManager.defaultProgram.fragmentShader);
118-
shaderManager.defaultProgram.fragmentShader = nullptr;
118+
shaderManager.defaultProgram.fragmentShader = 0;
119119
}
120120

121121
Com_Memset(&shaderManager, 0, sizeof(shaderManager));
@@ -128,6 +128,10 @@ GL_CreateShaderProgram
128128
*/
129129
shaderProgram_t *GL_CreateShaderProgram(const char *vertexSource, const char *fragmentSource) {
130130
shaderProgram_t *program = ri.Malloc(sizeof(shaderProgram_t));
131+
if (!program) {
132+
ri.Printf(PRINT_ERROR, "GL_CreateShaderProgram: Failed to allocate shader program structure\n");
133+
return nullptr;
134+
}
131135
Com_Memset(program, 0, sizeof(shaderProgram_t));
132136

133137
program->vertexShader = qglCreateShader(GL_VERTEX_SHADER);
@@ -140,6 +144,19 @@ shaderProgram_t *GL_CreateShaderProgram(const char *vertexSource, const char *fr
140144

141145
program->compiled = qtrue;
142146
program->linked = qtrue;
147+
} else {
148+
// Compilation/linking failed - clean up OpenGL objects
149+
if (program->program) {
150+
qglDeleteProgram(program->program);
151+
}
152+
if (program->vertexShader) {
153+
qglDeleteShader(program->vertexShader);
154+
}
155+
if (program->fragmentShader) {
156+
qglDeleteShader(program->fragmentShader);
157+
}
158+
ri.Free(program);
159+
return nullptr;
143160
}
144161

145162
return program;

src/renderers/opengl/gl_vertex.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,10 @@ GL_CreateVertexBuffer
9797
*/
9898
vertexBuffer_t *GL_CreateVertexBuffer(int maxVertices, int maxIndices, qboolean dynamic) {
9999
vertexBuffer_t *buffer = ri.Malloc(sizeof(vertexBuffer_t));
100+
if (!buffer) {
101+
ri.Printf(PRINT_ERROR, "GL_CreateVertexBuffer: Failed to allocate vertex buffer structure\n");
102+
return nullptr;
103+
}
100104
Com_Memset(buffer, 0, sizeof(vertexBuffer_t));
101105

102106
buffer->maxVertices = maxVertices;
@@ -113,8 +117,30 @@ vertexBuffer_t *GL_CreateVertexBuffer(int maxVertices, int maxIndices, qboolean
113117

114118
// Allocate memory
115119
buffer->vertices = ri.Malloc(sizeof(vertex_t) * maxVertices);
120+
if (!buffer->vertices) {
121+
ri.Printf(PRINT_ERROR, "GL_CreateVertexBuffer: Failed to allocate vertex data (%d vertices)\n", maxVertices);
122+
// Clean up OpenGL objects
123+
qglDeleteVertexArrays(1, &buffer->vao);
124+
qglDeleteBuffers(1, &buffer->vbo);
125+
if (maxIndices > 0) {
126+
qglDeleteBuffers(1, &buffer->ibo);
127+
}
128+
ri.Free(buffer);
129+
return nullptr;
130+
}
131+
116132
if (maxIndices > 0) {
117133
buffer->indices = ri.Malloc(sizeof(GLuint) * maxIndices);
134+
if (!buffer->indices) {
135+
ri.Printf(PRINT_ERROR, "GL_CreateVertexBuffer: Failed to allocate index data (%d indices)\n", maxIndices);
136+
// Clean up everything
137+
ri.Free(buffer->vertices);
138+
qglDeleteVertexArrays(1, &buffer->vao);
139+
qglDeleteBuffers(1, &buffer->vbo);
140+
qglDeleteBuffers(1, &buffer->ibo);
141+
ri.Free(buffer);
142+
return nullptr;
143+
}
118144
}
119145

120146
return buffer;

0 commit comments

Comments
 (0)