@@ -69,12 +69,17 @@ alloc_shader_storage(BeamformerCtx *ctx, Arena a)
69
69
glDeleteBuffers (ARRAY_COUNT (cs -> rf_data_ssbos ), cs -> rf_data_ssbos );
70
70
glGenBuffers (ARRAY_COUNT (cs -> rf_data_ssbos ), cs -> rf_data_ssbos );
71
71
72
+ i32 storage_flags = GL_DYNAMIC_STORAGE_BIT ;
73
+ if (ctx -> gl_vendor_id == GL_VENDOR_INTEL )
74
+ storage_flags |= GL_MAP_WRITE_BIT ;
72
75
glDeleteBuffers (1 , & cs -> raw_data_ssbo );
73
- glGenBuffers (1 , & cs -> raw_data_ssbo );
76
+ glCreateBuffers (1 , & cs -> raw_data_ssbo );
77
+ glNamedBufferStorage (cs -> raw_data_ssbo , ARRAY_COUNT (cs -> raw_data_fences ) * rf_raw_size , 0 ,
78
+ storage_flags );
74
79
75
- glBindBuffer ( GL_SHADER_STORAGE_BUFFER , cs -> raw_data_ssbo );
76
- glBufferStorage ( GL_SHADER_STORAGE_BUFFER , ARRAY_COUNT (cs -> raw_data_fences ) * rf_raw_size ,
77
- 0 , GL_MAP_WRITE_BIT );
80
+ /* TODO: allow this to grow if the raw data has been resized */
81
+ if (cs -> raw_data_arena . beg == 0 )
82
+ cs -> raw_data_arena = os_new_arena ( rf_raw_size );
78
83
79
84
for (u32 i = 0 ; i < ARRAY_COUNT (cs -> rf_data_ssbos ); i ++ ) {
80
85
glBindBuffer (GL_SHADER_STORAGE_BUFFER , cs -> rf_data_ssbos [i ]);
@@ -538,7 +543,8 @@ do_beamformer(BeamformerCtx *ctx, Arena arena)
538
543
BeamformerParameters * bp = & ctx -> params -> raw ;
539
544
/* NOTE: Check for and Load RF Data into GPU */
540
545
if (os_poll_pipe (ctx -> data_pipe )) {
541
- if (!uv4_equal (ctx -> csctx .dec_data_dim , bp -> dec_data_dim ) || ctx -> flags & ALLOC_SSBOS )
546
+ ComputeShaderCtx * cs = & ctx -> csctx ;
547
+ if (!uv4_equal (cs -> dec_data_dim , bp -> dec_data_dim ) || ctx -> flags & ALLOC_SSBOS )
542
548
alloc_shader_storage (ctx , arena );
543
549
if (!uv4_equal (ctx -> out_data_dim , bp -> output_points ) || ctx -> flags & ALLOC_OUT_TEX )
544
550
alloc_output_image (ctx );
@@ -547,31 +553,39 @@ do_beamformer(BeamformerCtx *ctx, Arena arena)
547
553
/* NOTE: if this times out it means the command queue is more than 3 frames behind.
548
554
* In that case we need to re-evaluate the buffer size */
549
555
if (ctx -> csctx .raw_data_fences [raw_index ]) {
550
- i32 result = glClientWaitSync (ctx -> csctx . raw_data_fences [raw_index ], 0 , 10000 );
556
+ i32 result = glClientWaitSync (cs -> raw_data_fences [raw_index ], 0 , 10000 );
551
557
if (result == GL_TIMEOUT_EXPIRED ) {
552
558
//ASSERT(0);
553
559
}
554
- glDeleteSync (ctx -> csctx . raw_data_fences [raw_index ]);
555
- ctx -> csctx . raw_data_fences [raw_index ] = NULL ;
560
+ glDeleteSync (cs -> raw_data_fences [raw_index ]);
561
+ cs -> raw_data_fences [raw_index ] = NULL ;
556
562
}
557
563
558
- uv2 rf_raw_dim = ctx -> csctx . rf_raw_dim ;
564
+ uv2 rf_raw_dim = cs -> rf_raw_dim ;
559
565
size rf_raw_size = rf_raw_dim .x * rf_raw_dim .y * sizeof (i16 );
560
566
561
- glBindBuffer (GL_SHADER_STORAGE_BUFFER , ctx -> csctx .raw_data_ssbo );
562
- void * rf_data_buf = glMapBufferRange (GL_SHADER_STORAGE_BUFFER ,
563
- raw_index * rf_raw_size , rf_raw_size ,
564
- GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_WRITE_BIT );
565
- if (!rf_data_buf ) {
566
- rlCheckErrors ();
567
- ASSERT (0 );
567
+ if (ctx -> gl_vendor_id == GL_VENDOR_INTEL ) {
568
+ /* TODO: intel complains about this buffer being busy even with
569
+ * MAP_UNSYNCHRONIZED_BIT */
570
+ void * rf_data_buf = glMapNamedBufferRange (cs -> raw_data_ssbo ,
571
+ raw_index * rf_raw_size ,
572
+ rf_raw_size ,
573
+ GL_MAP_WRITE_BIT );
574
+ size rlen = os_read_pipe_data (ctx -> data_pipe , rf_data_buf , rf_raw_size );
575
+ glUnmapNamedBuffer (cs -> raw_data_ssbo );
576
+ if (rlen == rf_raw_size ) ctx -> flags |= DO_COMPUTE ;
577
+ else ctx -> partial_transfer_count ++ ;
578
+ } else {
579
+ void * rf_data_buf = cs -> raw_data_arena .beg + raw_index * rf_raw_size ;
580
+ size rlen = os_read_pipe_data (ctx -> data_pipe , rf_data_buf , rf_raw_size );
581
+ if (rlen == rf_raw_size ) {
582
+ ctx -> flags |= DO_COMPUTE ;
583
+ glNamedBufferSubData (cs -> raw_data_ssbo , raw_index * rf_raw_size ,
584
+ rf_raw_size , rf_data_buf );
585
+ } else {
586
+ ctx -> partial_transfer_count ++ ;
587
+ }
568
588
}
569
- size rlen = os_read_pipe_data (ctx -> data_pipe , rf_data_buf , rf_raw_size );
570
-
571
- glUnmapBuffer (GL_SHADER_STORAGE_BUFFER );
572
-
573
- if (rlen == rf_raw_size ) ctx -> flags |= DO_COMPUTE ;
574
- else ctx -> partial_transfer_count ++ ;
575
589
}
576
590
577
591
if (ctx -> flags & UPLOAD_FILTER )
0 commit comments