ogl_beamforming

Ultrasound Beamforming Implemented with OpenGL
git clone anongit@rnpnr.xyz:ogl_beamforming.git
Log | Files | Refs | Feed | Submodules | LICENSE

Commit: 32726a8459aa56da2a35b8f068784c6bf72f3697
Parent: 67371c4b2aa148bee09d7d2d62363b85b28d0444
Author: Randy Palamar
Date:   Tue, 28 Jan 2025 20:37:45 -0700

core: avoid crashing when w32 fails to read file

this is not the longterm fix but that will be handled after the
asynchronous commit.

Diffstat:
Mos_unix.c | 28+++++++++++++---------------
Mos_win32.c | 34++++++++++++++--------------------
Mstatic.c | 28+++++++++++++++-------------
3 files changed, 42 insertions(+), 48 deletions(-)

diff --git a/os_unix.c b/os_unix.c @@ -72,23 +72,21 @@ static PLATFORM_OPEN_FOR_WRITE_FN(os_open_for_write) } static s8 -os_read_file(Arena *a, char *fname, size fsize) +os_read_file(Arena *a, char *file, size filesize) { - if (fsize < 0) - return (s8){.len = -1}; - - i32 fd = open(fname, O_RDONLY); - if (fd < 0) - return (s8){.len = -1}; - - s8 ret = s8alloc(a, fsize); - size rlen = read(fd, ret.data, ret.len); - close(fd); - - if (rlen != ret.len) - return (s8){.len = -1}; + s8 result = {0}; + + i32 fd = open(file, O_RDONLY); + if (fd >= 0) { + result = s8alloc(a, filesize); + size rlen = read(fd, result.data, result.len); + if (rlen != result.len) { + result = (s8){0}; + } + close(fd); + } - return ret; + return result; } static PLATFORM_WRITE_NEW_FILE_FN(os_write_new_file) diff --git a/os_win32.c b/os_win32.c @@ -159,29 +159,23 @@ static PLATFORM_OPEN_FOR_WRITE_FN(os_open_for_write) } static s8 -os_read_file(Arena *a, char *fname, size fsize) +os_read_file(Arena *a, char *file, size filesize) { - if (fsize < 0) - return (s8){.len = -1}; - - if (fsize > (size)U32_MAX) { - os_write_err_msg(s8("os_read_file: files >4GB are not yet handled on win32\n")); - return (s8){.len = -1}; + s8 result = {0}; + + if (BETWEEN(filesize, 0, (size)U32_MAX)) { + s8 result = s8alloc(a, filesize); + iptr h = CreateFileA(fname, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0); + if (h >= 0) { + i32 rlen; + if (!ReadFile(h, result.data, result.len, &rlen, 0) || rlen != result.len) { + result = (s8){0}; + } + CloseHandle(h); + } } - iptr h = CreateFileA(fname, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0); - if (h == INVALID_FILE) - return (s8){.len = -1}; - - s8 ret = s8alloc(a, fsize); - - i32 rlen = 0; - b32 error = !ReadFile(h, ret.data, ret.len, &rlen, 0) || rlen != ret.len; - CloseHandle(h); - if (error) - return (s8){.len = -1}; - - return ret; + return result; } static PLATFORM_WRITE_NEW_FILE_FN(os_write_new_file) diff --git a/static.c b/static.c @@ -213,25 +213,27 @@ static FILE_WATCH_CALLBACK_FN(reload_compute_shader) s8 shader_text = os_read_file(&tmp, (c8 *)path.data, fs); shader_text.data -= header_in_arena.len; shader_text.len += header_in_arena.len; - ASSERT(shader_text.data == header_in_arena.data); - u32 shader_id = compile_shader(tmp, GL_COMPUTE_SHADER, shader_text); - if (shader_id) { - glDeleteProgram(cs->programs[ctx->shader]); - cs->programs[ctx->shader] = rlLoadComputeShaderProgram(shader_id); - glUseProgram(cs->programs[ctx->shader]); - glBindBufferBase(GL_UNIFORM_BUFFER, 0, cs->shared_ubo); - LABEL_GL_OBJECT(GL_PROGRAM, cs->programs[ctx->shader], ctx->label); + if (shader_text.data == header_in_arena.data) { + u32 shader_id = compile_shader(tmp, GL_COMPUTE_SHADER, shader_text); + if (shader_id) { + glDeleteProgram(cs->programs[ctx->shader]); + cs->programs[ctx->shader] = rlLoadComputeShaderProgram(shader_id); + glUseProgram(cs->programs[ctx->shader]); + glBindBufferBase(GL_UNIFORM_BUFFER, 0, cs->shared_ubo); + LABEL_GL_OBJECT(GL_PROGRAM, cs->programs[ctx->shader], ctx->label); - TraceLog(LOG_INFO, "%s loaded", path.data); + TraceLog(LOG_INFO, "%s loaded", path.data); - ctx->ctx->flags |= START_COMPUTE; + ctx->ctx->flags |= START_COMPUTE; + } else { + result = 0; + } + glDeleteShader(shader_id); } else { - result = 0; + TraceLog(LOG_INFO, "shader failed to load: %s", path.data); } - glDeleteShader(shader_id); - return result; }