Commit: 4e9d162efecc9a21d0917aa054d5acb4e97367f3
Parent: 933c75ad2e71058d22204a97ef57cf1536acb3b6
Author: Randy Palamar
Date: Wed, 14 Aug 2024 20:21:27 -0600
make amd and intel share the same code path
It looks like NVIDIA is the special snowflake in this case - not
Intel. This could also possibly be a Mesa thing.
Diffstat:
M | beamformer.c | | | 63 | ++++++++++++++++++++++++++++++++++++--------------------------- |
1 file changed, 36 insertions(+), 27 deletions(-)
diff --git a/beamformer.c b/beamformer.c
@@ -67,16 +67,33 @@ alloc_shader_storage(BeamformerCtx *ctx, Arena a)
glCreateBuffers(ARRAY_COUNT(cs->rf_data_ssbos), cs->rf_data_ssbos);
i32 storage_flags = GL_DYNAMIC_STORAGE_BIT;
- if (ctx->gl_vendor_id == GL_VENDOR_INTEL)
- storage_flags |= GL_MAP_WRITE_BIT;
+ switch (ctx->gl_vendor_id) {
+ case GL_VENDOR_INTEL:
+ case GL_VENDOR_AMD:
+ glUnmapNamedBuffer(cs->raw_data_ssbo);
+ storage_flags |= GL_MAP_WRITE_BIT|GL_MAP_PERSISTENT_BIT;
+ case GL_VENDOR_NVIDIA:
+ break;
+ }
+
+ size full_rf_buf_size = ARRAY_COUNT(cs->raw_data_fences) * rf_raw_size;
glDeleteBuffers(1, &cs->raw_data_ssbo);
glCreateBuffers(1, &cs->raw_data_ssbo);
- glNamedBufferStorage(cs->raw_data_ssbo, ARRAY_COUNT(cs->raw_data_fences) * rf_raw_size, 0,
- storage_flags);
-
- /* TODO: allow this to grow if the raw data has been resized */
- if (cs->raw_data_arena.beg == 0)
- cs->raw_data_arena = os_new_arena(rf_raw_size);
+ glNamedBufferStorage(cs->raw_data_ssbo, full_rf_buf_size, 0, storage_flags);
+
+ i32 map_flags = GL_MAP_WRITE_BIT|GL_MAP_PERSISTENT_BIT|GL_MAP_UNSYNCHRONIZED_BIT;
+ switch (ctx->gl_vendor_id) {
+ case GL_VENDOR_INTEL:
+ case GL_VENDOR_AMD:
+ cs->raw_data_arena.beg = glMapNamedBufferRange(cs->raw_data_ssbo, 0,
+ full_rf_buf_size, map_flags);
+ break;
+ case GL_VENDOR_NVIDIA:
+ /* TODO: allow this to grow if the raw data has been resized */
+ if (cs->raw_data_arena.beg == 0)
+ cs->raw_data_arena = os_new_arena(rf_raw_size);
+ break;
+ }
for (u32 i = 0; i < ARRAY_COUNT(cs->rf_data_ssbos); i++)
glNamedBufferStorage(cs->rf_data_ssbos[i], rf_decoded_size, 0, 0);
@@ -558,28 +575,20 @@ do_beamformer(BeamformerCtx *ctx, Arena arena)
uv2 rf_raw_dim = cs->rf_raw_dim;
size rf_raw_size = rf_raw_dim.x * rf_raw_dim.y * sizeof(i16);
- if (ctx->gl_vendor_id == GL_VENDOR_INTEL) {
+ void *rf_data_buf = cs->raw_data_arena.beg + raw_index * rf_raw_size;
+ size rlen = os_read_pipe_data(ctx->data_pipe, rf_data_buf, rf_raw_size);
+ switch (ctx->gl_vendor_id) {
+ case GL_VENDOR_INTEL:
/* TODO: intel complains about this buffer being busy even with
* MAP_UNSYNCHRONIZED_BIT */
- void *rf_data_buf = glMapNamedBufferRange(cs->raw_data_ssbo,
- raw_index * rf_raw_size,
- rf_raw_size,
- GL_MAP_WRITE_BIT);
- size rlen = os_read_pipe_data(ctx->data_pipe, rf_data_buf, rf_raw_size);
- glUnmapNamedBuffer(cs->raw_data_ssbo);
- if (rlen == rf_raw_size) ctx->flags |= DO_COMPUTE;
- else ctx->partial_transfer_count++;
- } else {
- void *rf_data_buf = cs->raw_data_arena.beg + raw_index * rf_raw_size;
- size rlen = os_read_pipe_data(ctx->data_pipe, rf_data_buf, rf_raw_size);
- if (rlen == rf_raw_size) {
- ctx->flags |= DO_COMPUTE;
- glNamedBufferSubData(cs->raw_data_ssbo, raw_index * rf_raw_size,
- rf_raw_size, rf_data_buf);
- } else {
- ctx->partial_transfer_count++;
- }
+ case GL_VENDOR_AMD:
+ break;
+ case GL_VENDOR_NVIDIA:
+ glNamedBufferSubData(cs->raw_data_ssbo, raw_index * rf_raw_size,
+ rf_raw_size, rf_data_buf);
}
+ if (rlen == rf_raw_size) ctx->flags |= DO_COMPUTE;
+ else ctx->partial_transfer_count++;
}
if (ctx->flags & UPLOAD_FILTER)