aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Weissflog <floooh@gmail.com>2025-07-14 10:29:35 +0200
committerAndre Weissflog <floooh@gmail.com>2025-07-14 10:29:35 +0200
commita4263fcbc784a3ccb58ee2c44de54c37e9a526bc (patch)
tree10b980d14a2df3f7d34eb13571e1a4d6d4c3e795
parent455ad1a7b0f806ca2499c8c8b775801d4b366a75 (diff)
sokol_gfx.h: sg_apply_bindings handle storage images
-rw-r--r--sokol_gfx.h36
1 files changed, 33 insertions, 3 deletions
diff --git a/sokol_gfx.h b/sokol_gfx.h
index 8f7ee4ea..cc352696 100644
--- a/sokol_gfx.h
+++ b/sokol_gfx.h
@@ -4259,7 +4259,7 @@ typedef struct sg_frame_stats {
_SG_LOGITEM_XMACRO(VALIDATE_IMAGEDESC_NONRT_PIXELFORMAT, "invalid pixel format for non-render-target image") \
_SG_LOGITEM_XMACRO(VALIDATE_IMAGEDESC_MSAA_BUT_NO_ATTACHMENT, "non-attachment images cannot be multisampled") \
_SG_LOGITEM_XMACRO(VALIDATE_IMAGEDESC_DEPTH_3D_IMAGE, "3D images cannot have a depth/stencil image format") \
- _SG_LOGITEM_XMACRO(VALIDATE_IMAGEDESC_ATTACHMENT_EXPECT_IMMUTABLE, "render/storage attachment images must be sg_image_usage.immutable") \
+ _SG_LOGITEM_XMACRO(VALIDATE_IMAGEDESC_ATTACHMENT_EXPECT_IMMUTABLE, "attachment and storage images must be sg_image_usage.immutable") \
_SG_LOGITEM_XMACRO(VALIDATE_IMAGEDESC_ATTACHMENT_EXPECT_NO_DATA, "render/storage attachment images cannot be initialized with data") \
_SG_LOGITEM_XMACRO(VALIDATE_IMAGEDESC_ATTACHMENT_PIXELFORMAT, "invalid pixel format for render attachment image") \
_SG_LOGITEM_XMACRO(VALIDATE_IMAGEDESC_ATTACHMENT_RESOLVE_EXPECT_NO_MSAA, "resolve attachment images cannot be multisampled") \
@@ -7414,6 +7414,7 @@ _SOKOL_PRIVATE void _sg_shader_common_init(_sg_shader_common_t* cmn, const sg_sh
const sg_shader_storage_image* src = &desc->storage_images[i];
_sg_shader_storage_image_t* dst = &cmn->storage_images[i];
if (src->stage != SG_SHADERSTAGE_NONE) {
+ cmn->required_bindings_and_uniforms |= required_bindings_flag;
dst->stage = src->stage;
dst->image_type = src->image_type;
dst->access_format = src->access_format;
@@ -15547,7 +15548,26 @@ _SOKOL_PRIVATE bool _sg_mtl_apply_bindings(_sg_bindings_ptrs_t* bnd) {
}
}
- // FIXME: apply storage texture bindings
+ // apply storage images (only allowed in compute passes)
+ if (_sg.cur_pass.is_compute) {
+ for (size_t i = 0; i < SG_MAX_STORAGEIMAGE_BINDSLOTS; i++) {
+ const _sg_view_t* simg_view = bnd->simg_views[i];
+ if (simg_view == 0) {
+ continue;
+ }
+ const sg_shader_stage stage = shd->cmn.storage_images[i].stage;
+ SOKOL_ASSERT(stage == SG_SHADERSTAGE_COMPUTE);
+ const NSUInteger mtl_slot = shd->mtl.simg_texture_n[i];
+ SOKOL_ASSERT(mtl_slot < _SG_MTL_MAX_STAGE_TEXTURE_BINDINGS);
+ SOKOL_ASSERT(0 == _sg_image_ref_ptr(&simg_view->cmn.img.ref)->cmn.active_slot);
+ SOKOL_ASSERT(nil != _sg.mtl.compute_cmd_encoder);
+ if (!_sg_sref_slot_eql(&_sg.mtl.state_cache.cur_cstexs[mtl_slot], &simg_view->slot)) {
+ _sg.mtl.state_cache.cur_cstexs[mtl_slot] = _sg_sref(&simg_view->slot);
+ [_sg.mtl.compute_cmd_encoder setTexture:_sg_mtl_id(simg_view->mtl.tex_view[0]) atIndex:mtl_slot];
+ _sg_stats_add(metal.bindings.num_set_compute_texture, 1);
+ }
+ }
+ }
return true;
}
@@ -21389,7 +21409,17 @@ SOKOL_API_IMPL void sg_apply_bindings(const sg_bindings* bindings) {
}
}
- // FIXME: storage images
+ for (size_t i = 0; i < SG_MAX_STORAGEIMAGE_BINDSLOTS; i++) {
+ if (shd->cmn.storage_images[i].stage != SG_SHADERSTAGE_NONE) {
+ SOKOL_ASSERT(bindings->storage_images[i].id != SG_INVALID_ID);
+ bnd.simg_views[i] = _sg_lookup_view(bindings->storage_images[i].id);
+ if (bnd.simg_views[i]) {
+ _sg.next_draw_valid &= _sg_image_ref_valid(&bnd.simg_views[i]->cmn.img.ref);
+ } else {
+ _sg.next_draw_valid = false;
+ }
+ }
+ }
if (_sg.next_draw_valid) {
_sg.next_draw_valid &= _sg_apply_bindings(&bnd);