diff options
| -rw-r--r-- | sokol_gfx.h | 35 | ||||
| -rw-r--r-- | util/sokol_gfx_imgui.h | 1 |
2 files changed, 26 insertions, 10 deletions
diff --git a/sokol_gfx.h b/sokol_gfx.h index 636acd6d..3cbaeacf 100644 --- a/sokol_gfx.h +++ b/sokol_gfx.h @@ -2565,12 +2565,17 @@ typedef struct sg_pass { - 0..1 index buffer offsets - 0..N vertex shader stage images - 0..N vertex shader stage samplers + - 0..N vertex shader storage buffers - 0..N fragment shader stage images - 0..N fragment shader stage samplers + - 0..N fragment shader storage buffers - The max number of vertex buffer and shader stage images - are defined by the SG_MAX_VERTEX_BUFFERS and - SG_MAX_SHADERSTAGE_IMAGES configuration constants. + For the max number of bindings, see the constant definitions: + + - SG_MAX_VERTEX_BUFFERS + - SG_MAX_SHADERSTAGE_IMAGES + - SG_MAX_SHADERSTAGE_SAMPLERS + - SG_MAX_SHADERSTAGE_STORAGE_BUFFERS The optional buffer offsets can be used to put different unrelated chunks of vertex- and/or index-data into the same buffer objects. @@ -3310,6 +3315,7 @@ typedef struct sg_frame_stats_metal_bindings { uint32_t num_set_vertex_buffer; uint32_t num_set_vertex_texture; uint32_t num_set_vertex_sampler_state; + uint32_t num_set_fragment_buffer; uint32_t num_set_fragment_texture; uint32_t num_set_fragment_sampler_state; } sg_frame_stats_metal_bindings; @@ -5504,6 +5510,8 @@ typedef struct { sg_image cur_fs_image_ids[SG_MAX_SHADERSTAGE_IMAGES]; sg_sampler cur_vs_sampler_ids[SG_MAX_SHADERSTAGE_SAMPLERS]; sg_sampler cur_fs_sampler_ids[SG_MAX_SHADERSTAGE_SAMPLERS]; + sg_buffer cur_vs_storagebuffer_ids[SG_MAX_SHADERSTAGE_STORAGE_BUFFERS]; + sg_buffer cur_fs_storagebuffer_ids[SG_MAX_SHADERSTAGE_STORAGE_BUFFERS]; } _sg_mtl_state_cache_t; typedef struct { @@ -12748,12 +12756,15 @@ _SOKOL_PRIVATE bool _sg_mtl_apply_bindings(_sg_bindings_t* bnd) { // apply vertex stage storage buffers // FIXME: move start slot after UBs (?) - // FIXME: caching for (NSUInteger slot = 0; slot < (NSUInteger)bnd->num_vs_sbufs; slot++) { const _sg_buffer_t* sbuf = bnd->vs_sbufs[slot]; - const NSUInteger mtl_slot = SG_MAX_SHADERSTAGE_UBS + SG_MAX_VERTEX_BUFFERS + slot; - [_sg.mtl.cmd_encoder setVertexBuffer:_sg_mtl_id(sbuf->mtl.buf[sbuf->cmn.active_slot]) offset:0 atIndex:mtl_slot]; - _sg_stats_add(metal.bindings.num_set_vertex_buffer, 1); + if (_sg.mtl.state_cache.cur_vs_storagebuffer_ids[slot].id != sbuf->slot.id) { + _sg.mtl.state_cache.cur_vs_storagebuffer_ids[slot].id = sbuf->slot.id; + SOKOL_ASSERT(sbuf->mtl.buf[sbuf->cmn.active_slot] != _SG_MTL_INVALID_SLOT_INDEX); + const NSUInteger mtl_slot = SG_MAX_SHADERSTAGE_UBS + SG_MAX_VERTEX_BUFFERS + slot; + [_sg.mtl.cmd_encoder setVertexBuffer:_sg_mtl_id(sbuf->mtl.buf[sbuf->cmn.active_slot]) offset:0 atIndex:mtl_slot]; + _sg_stats_add(metal.bindings.num_set_vertex_buffer, 1); + } } // apply fragment stage images @@ -12781,9 +12792,13 @@ _SOKOL_PRIVATE bool _sg_mtl_apply_bindings(_sg_bindings_t* bnd) { // apply fragment stage storage buffers for (NSUInteger slot = 0; slot < (NSUInteger)bnd->num_fs_sbufs; slot++) { const _sg_buffer_t* sbuf = bnd->fs_sbufs[slot]; - const NSUInteger mtl_slot = SG_MAX_SHADERSTAGE_UBS + slot; - [_sg.mtl.cmd_encoder setFragmentBuffer:_sg_mtl_id(sbuf->mtl.buf[sbuf->cmn.active_slot]) offset:0 atIndex:mtl_slot]; - // FIXME: _sg_stats_add(metal.bindings.num_set_fragment_buffer, 1); + if (_sg.mtl.state_cache.cur_fs_storagebuffer_ids[slot].id != sbuf->slot.id) { + _sg.mtl.state_cache.cur_fs_storagebuffer_ids[slot].id = sbuf->slot.id; + SOKOL_ASSERT(sbuf->mtl.buf[sbuf->cmn.active_slot] != _SG_MTL_INVALID_SLOT_INDEX); + const NSUInteger mtl_slot = SG_MAX_SHADERSTAGE_UBS + slot; + [_sg.mtl.cmd_encoder setFragmentBuffer:_sg_mtl_id(sbuf->mtl.buf[sbuf->cmn.active_slot]) offset:0 atIndex:mtl_slot]; + _sg_stats_add(metal.bindings.num_set_fragment_buffer, 1); + } } return true; diff --git a/util/sokol_gfx_imgui.h b/util/sokol_gfx_imgui.h index eed45e3a..30c293f0 100644 --- a/util/sokol_gfx_imgui.h +++ b/util/sokol_gfx_imgui.h @@ -4309,6 +4309,7 @@ _SOKOL_PRIVATE void _sgimgui_draw_frame_stats_panel(sgimgui_t* ctx) { _sgimgui_frame_stats(metal.bindings.num_set_vertex_buffer); _sgimgui_frame_stats(metal.bindings.num_set_vertex_texture); _sgimgui_frame_stats(metal.bindings.num_set_vertex_sampler_state); + _sgimgui_frame_stats(metal.bindings.num_set_fragment_buffer); _sgimgui_frame_stats(metal.bindings.num_set_fragment_texture); _sgimgui_frame_stats(metal.bindings.num_set_fragment_sampler_state); _sgimgui_frame_stats(metal.uniforms.num_set_vertex_buffer_offset); |