|
@@ -6392,20 +6392,21 @@ typedef struct {
|
|
|
|
|
|
typedef enum {
|
|
typedef enum {
|
|
_SG_WGPU_BINDGROUPSCACHEITEMTYPE_NONE = 0,
|
|
_SG_WGPU_BINDGROUPSCACHEITEMTYPE_NONE = 0,
|
|
- _SG_WGPU_BINDGROUPSCACHEITEMTYPE_IMAGE = 0x00001111,
|
|
|
|
- _SG_WGPU_BINDGROUPSCACHEITEMTYPE_SAMPLER = 0x00002222,
|
|
|
|
- _SG_WGPU_BINDGROUPSCACHEITEMTYPE_STORAGEBUFFER = 0x00003333,
|
|
|
|
- _SG_WGPU_BINDGROUPSCACHEITEMTYPE_PIPELINE = 0x00004444,
|
|
|
|
|
|
+ _SG_WGPU_BINDGROUPSCACHEITEMTYPE_IMAGE = 1,
|
|
|
|
+ _SG_WGPU_BINDGROUPSCACHEITEMTYPE_SAMPLER = 2,
|
|
|
|
+ _SG_WGPU_BINDGROUPSCACHEITEMTYPE_STORAGEBUFFER = 3,
|
|
|
|
+ _SG_WGPU_BINDGROUPSCACHEITEMTYPE_PIPELINE = 4,
|
|
} _sg_wgpu_bindgroups_cache_item_type_t;
|
|
} _sg_wgpu_bindgroups_cache_item_type_t;
|
|
|
|
|
|
#define _SG_WGPU_BINDGROUPSCACHEKEY_NUM_ITEMS (1 + _SG_WGPU_MAX_IMG_SMP_SBUF_BINDGROUP_ENTRIES)
|
|
#define _SG_WGPU_BINDGROUPSCACHEKEY_NUM_ITEMS (1 + _SG_WGPU_MAX_IMG_SMP_SBUF_BINDGROUP_ENTRIES)
|
|
typedef struct {
|
|
typedef struct {
|
|
uint64_t hash;
|
|
uint64_t hash;
|
|
- // the format of cache key items is BBBBTTTTIIIIIIII
|
|
|
|
|
|
+ // the format of cache key items is BBTCCCCCIIIIIIII
|
|
// where
|
|
// where
|
|
- // - BBBB is 2x the WGPU binding
|
|
|
|
- // - TTTT is the _sg_wgpu_bindgroups_cache_item_type_t
|
|
|
|
- // - IIIIIIII is the resource id
|
|
|
|
|
|
+ // - BB: 8 bits WGPU binding
|
|
|
|
+ // - T: 3 bits _sg_wgpu_bindgroups_cache_item_type_t
|
|
|
|
+ // - CCCCC: 21 bits slot.uninit_count
|
|
|
|
+ // - IIIIIIII: 32 bits slot.id
|
|
//
|
|
//
|
|
// where the item type is a per-resource-type bit pattern
|
|
// where the item type is a per-resource-type bit pattern
|
|
uint64_t items[_SG_WGPU_BINDGROUPSCACHEKEY_NUM_ITEMS];
|
|
uint64_t items[_SG_WGPU_BINDGROUPSCACHEKEY_NUM_ITEMS];
|
|
@@ -16155,28 +16156,28 @@ _SOKOL_PRIVATE uint64_t _sg_wgpu_hash(const void* key, int len, uint64_t seed) {
|
|
return h;
|
|
return h;
|
|
}
|
|
}
|
|
|
|
|
|
-_SOKOL_PRIVATE uint64_t _sg_wgpu_bindgroups_cache_item(_sg_wgpu_bindgroups_cache_item_type_t type, uint8_t wgpu_binding, uint32_t id) {
|
|
|
|
- // key pattern is bbbbttttiiiiiiii
|
|
|
|
- const uint64_t bb = (uint64_t)wgpu_binding;
|
|
|
|
- const uint64_t tttt = (uint64_t)type;
|
|
|
|
- const uint64_t iiiiiiii = (uint64_t)id;
|
|
|
|
- return (bb << 56) | (bb << 48) | (tttt << 32) | iiiiiiii;
|
|
|
|
|
|
+_SOKOL_PRIVATE uint64_t _sg_wgpu_bindgroups_cache_item(_sg_wgpu_bindgroups_cache_item_type_t type, uint8_t wgpu_binding, uint32_t id, uint32_t uninit_count) {
|
|
|
|
+ const uint64_t bb = wgpu_binding;
|
|
|
|
+ const uint64_t t = type & 7;
|
|
|
|
+ const uint64_t ccccc = uninit_count & ((1 << 21) - 1);
|
|
|
|
+ const uint64_t iiiiiiii = id;
|
|
|
|
+ return (bb << 56) | (t << 53) | (ccccc << 32) | iiiiiiii;
|
|
}
|
|
}
|
|
|
|
|
|
-_SOKOL_PRIVATE uint64_t _sg_wgpu_bindgroups_cache_pip_item(uint32_t id) {
|
|
|
|
- return _sg_wgpu_bindgroups_cache_item(_SG_WGPU_BINDGROUPSCACHEITEMTYPE_PIPELINE, 0xFF, id);
|
|
|
|
|
|
+_SOKOL_PRIVATE uint64_t _sg_wgpu_bindgroups_cache_pip_item(const _sg_slot_t* slot) {
|
|
|
|
+ return _sg_wgpu_bindgroups_cache_item(_SG_WGPU_BINDGROUPSCACHEITEMTYPE_PIPELINE, 0xFF, slot->id, slot->uninit_count);
|
|
}
|
|
}
|
|
|
|
|
|
-_SOKOL_PRIVATE uint64_t _sg_wgpu_bindgroups_cache_image_item(uint8_t wgpu_binding, uint32_t id) {
|
|
|
|
- return _sg_wgpu_bindgroups_cache_item(_SG_WGPU_BINDGROUPSCACHEITEMTYPE_IMAGE, wgpu_binding, id);
|
|
|
|
|
|
+_SOKOL_PRIVATE uint64_t _sg_wgpu_bindgroups_cache_image_item(uint8_t wgpu_binding, const _sg_slot_t* slot) {
|
|
|
|
+ return _sg_wgpu_bindgroups_cache_item(_SG_WGPU_BINDGROUPSCACHEITEMTYPE_IMAGE, wgpu_binding, slot->id, slot->uninit_count);
|
|
}
|
|
}
|
|
|
|
|
|
-_SOKOL_PRIVATE uint64_t _sg_wgpu_bindgroups_cache_sampler_item(uint8_t wgpu_binding, uint32_t id) {
|
|
|
|
- return _sg_wgpu_bindgroups_cache_item(_SG_WGPU_BINDGROUPSCACHEITEMTYPE_SAMPLER, wgpu_binding, id);
|
|
|
|
|
|
+_SOKOL_PRIVATE uint64_t _sg_wgpu_bindgroups_cache_sampler_item(uint8_t wgpu_binding, const _sg_slot_t* slot) {
|
|
|
|
+ return _sg_wgpu_bindgroups_cache_item(_SG_WGPU_BINDGROUPSCACHEITEMTYPE_SAMPLER, wgpu_binding, slot->id, slot->uninit_count);
|
|
}
|
|
}
|
|
|
|
|
|
-_SOKOL_PRIVATE uint64_t _sg_wgpu_bindgroups_cache_sbuf_item(uint8_t wgpu_binding, uint32_t id) {
|
|
|
|
- return _sg_wgpu_bindgroups_cache_item(_SG_WGPU_BINDGROUPSCACHEITEMTYPE_STORAGEBUFFER, wgpu_binding, id);
|
|
|
|
|
|
+_SOKOL_PRIVATE uint64_t _sg_wgpu_bindgroups_cache_sbuf_item(uint8_t wgpu_binding, const _sg_slot_t* slot) {
|
|
|
|
+ return _sg_wgpu_bindgroups_cache_item(_SG_WGPU_BINDGROUPSCACHEITEMTYPE_STORAGEBUFFER, wgpu_binding, slot->id, slot->uninit_count);
|
|
}
|
|
}
|
|
|
|
|
|
_SOKOL_PRIVATE void _sg_wgpu_init_bindgroups_cache_key(_sg_wgpu_bindgroups_cache_key_t* key, const _sg_bindings_ptrs_t* bnd) {
|
|
_SOKOL_PRIVATE void _sg_wgpu_init_bindgroups_cache_key(_sg_wgpu_bindgroups_cache_key_t* key, const _sg_bindings_ptrs_t* bnd) {
|
|
@@ -16185,7 +16186,7 @@ _SOKOL_PRIVATE void _sg_wgpu_init_bindgroups_cache_key(_sg_wgpu_bindgroups_cache
|
|
const _sg_shader_t* shd = _sg_shader_ref_ptr(&bnd->pip->cmn.shader);
|
|
const _sg_shader_t* shd = _sg_shader_ref_ptr(&bnd->pip->cmn.shader);
|
|
|
|
|
|
_sg_clear(key->items, sizeof(key->items));
|
|
_sg_clear(key->items, sizeof(key->items));
|
|
- key->items[0] = _sg_wgpu_bindgroups_cache_pip_item(bnd->pip->slot.id);
|
|
|
|
|
|
+ key->items[0] = _sg_wgpu_bindgroups_cache_pip_item(&bnd->pip->slot);
|
|
for (size_t i = 0; i < SG_MAX_IMAGE_BINDSLOTS; i++) {
|
|
for (size_t i = 0; i < SG_MAX_IMAGE_BINDSLOTS; i++) {
|
|
if (shd->cmn.images[i].stage == SG_SHADERSTAGE_NONE) {
|
|
if (shd->cmn.images[i].stage == SG_SHADERSTAGE_NONE) {
|
|
continue;
|
|
continue;
|
|
@@ -16195,8 +16196,7 @@ _SOKOL_PRIVATE void _sg_wgpu_init_bindgroups_cache_key(_sg_wgpu_bindgroups_cache
|
|
SOKOL_ASSERT(item_idx < _SG_WGPU_BINDGROUPSCACHEKEY_NUM_ITEMS);
|
|
SOKOL_ASSERT(item_idx < _SG_WGPU_BINDGROUPSCACHEKEY_NUM_ITEMS);
|
|
SOKOL_ASSERT(0 == key->items[item_idx]);
|
|
SOKOL_ASSERT(0 == key->items[item_idx]);
|
|
const uint8_t wgpu_binding = shd->wgpu.img_grp1_bnd_n[i];
|
|
const uint8_t wgpu_binding = shd->wgpu.img_grp1_bnd_n[i];
|
|
- const uint32_t id = bnd->imgs[i]->slot.id;
|
|
|
|
- key->items[item_idx] = _sg_wgpu_bindgroups_cache_image_item(wgpu_binding, id);
|
|
|
|
|
|
+ key->items[item_idx] = _sg_wgpu_bindgroups_cache_image_item(wgpu_binding, &bnd->imgs[i]->slot);
|
|
}
|
|
}
|
|
for (size_t i = 0; i < SG_MAX_SAMPLER_BINDSLOTS; i++) {
|
|
for (size_t i = 0; i < SG_MAX_SAMPLER_BINDSLOTS; i++) {
|
|
if (shd->cmn.samplers[i].stage == SG_SHADERSTAGE_NONE) {
|
|
if (shd->cmn.samplers[i].stage == SG_SHADERSTAGE_NONE) {
|
|
@@ -16207,8 +16207,7 @@ _SOKOL_PRIVATE void _sg_wgpu_init_bindgroups_cache_key(_sg_wgpu_bindgroups_cache
|
|
SOKOL_ASSERT(item_idx < _SG_WGPU_BINDGROUPSCACHEKEY_NUM_ITEMS);
|
|
SOKOL_ASSERT(item_idx < _SG_WGPU_BINDGROUPSCACHEKEY_NUM_ITEMS);
|
|
SOKOL_ASSERT(0 == key->items[item_idx]);
|
|
SOKOL_ASSERT(0 == key->items[item_idx]);
|
|
const uint8_t wgpu_binding = shd->wgpu.smp_grp1_bnd_n[i];
|
|
const uint8_t wgpu_binding = shd->wgpu.smp_grp1_bnd_n[i];
|
|
- const uint32_t id = bnd->smps[i]->slot.id;
|
|
|
|
- key->items[item_idx] = _sg_wgpu_bindgroups_cache_sampler_item(wgpu_binding, id);
|
|
|
|
|
|
+ key->items[item_idx] = _sg_wgpu_bindgroups_cache_sampler_item(wgpu_binding, &bnd->smps[i]->slot);
|
|
}
|
|
}
|
|
for (size_t i = 0; i < SG_MAX_STORAGEBUFFER_BINDSLOTS; i++) {
|
|
for (size_t i = 0; i < SG_MAX_STORAGEBUFFER_BINDSLOTS; i++) {
|
|
if (shd->cmn.storage_buffers[i].stage == SG_SHADERSTAGE_NONE) {
|
|
if (shd->cmn.storage_buffers[i].stage == SG_SHADERSTAGE_NONE) {
|
|
@@ -16219,8 +16218,7 @@ _SOKOL_PRIVATE void _sg_wgpu_init_bindgroups_cache_key(_sg_wgpu_bindgroups_cache
|
|
SOKOL_ASSERT(item_idx < _SG_WGPU_BINDGROUPSCACHEKEY_NUM_ITEMS);
|
|
SOKOL_ASSERT(item_idx < _SG_WGPU_BINDGROUPSCACHEKEY_NUM_ITEMS);
|
|
SOKOL_ASSERT(0 == key->items[item_idx]);
|
|
SOKOL_ASSERT(0 == key->items[item_idx]);
|
|
const uint8_t wgpu_binding = shd->wgpu.sbuf_grp1_bnd_n[i];
|
|
const uint8_t wgpu_binding = shd->wgpu.sbuf_grp1_bnd_n[i];
|
|
- const uint32_t id = bnd->sbufs[i]->slot.id;
|
|
|
|
- key->items[item_idx] = _sg_wgpu_bindgroups_cache_sbuf_item(wgpu_binding, id);
|
|
|
|
|
|
+ key->items[item_idx] = _sg_wgpu_bindgroups_cache_sbuf_item(wgpu_binding, &bnd->sbufs[i]->slot);
|
|
}
|
|
}
|
|
key->hash = _sg_wgpu_hash(&key->items, (int)sizeof(key->items), 0x1234567887654321);
|
|
key->hash = _sg_wgpu_hash(&key->items, (int)sizeof(key->items), 0x1234567887654321);
|
|
}
|
|
}
|
|
@@ -16375,9 +16373,9 @@ _SOKOL_PRIVATE uint32_t _sg_wgpu_bindgroups_cache_get(uint64_t hash) {
|
|
|
|
|
|
// called from wgpu resource destroy functions to also invalidate any
|
|
// called from wgpu resource destroy functions to also invalidate any
|
|
// bindgroups cache slot and bindgroup referencing that resource
|
|
// bindgroups cache slot and bindgroup referencing that resource
|
|
-_SOKOL_PRIVATE void _sg_wgpu_bindgroups_cache_invalidate(_sg_wgpu_bindgroups_cache_item_type_t type, uint32_t id) {
|
|
|
|
- const uint64_t key_mask = 0x0000FFFFFFFFFFFF;
|
|
|
|
- const uint64_t key_item = _sg_wgpu_bindgroups_cache_item(type, 0, id) & key_mask;
|
|
|
|
|
|
+_SOKOL_PRIVATE void _sg_wgpu_bindgroups_cache_invalidate(_sg_wgpu_bindgroups_cache_item_type_t type, const _sg_slot_t* slot) {
|
|
|
|
+ const uint64_t key_mask = _sg_wgpu_bindgroups_cache_item(type, 0xFF, 0xFFFFFFFF, 0xFFFFFFFF);
|
|
|
|
+ const uint64_t key_item = _sg_wgpu_bindgroups_cache_item(type, 0, slot->id, slot->uninit_count) & key_mask;
|
|
SOKOL_ASSERT(_sg.wgpu.bindgroups_cache.items);
|
|
SOKOL_ASSERT(_sg.wgpu.bindgroups_cache.items);
|
|
for (uint32_t cache_item_idx = 0; cache_item_idx < _sg.wgpu.bindgroups_cache.num; cache_item_idx++) {
|
|
for (uint32_t cache_item_idx = 0; cache_item_idx < _sg.wgpu.bindgroups_cache.num; cache_item_idx++) {
|
|
const uint32_t bg_id = _sg.wgpu.bindgroups_cache.items[cache_item_idx].id;
|
|
const uint32_t bg_id = _sg.wgpu.bindgroups_cache.items[cache_item_idx].id;
|
|
@@ -16678,7 +16676,7 @@ _SOKOL_PRIVATE sg_resource_state _sg_wgpu_create_buffer(_sg_buffer_t* buf, const
|
|
_SOKOL_PRIVATE void _sg_wgpu_discard_buffer(_sg_buffer_t* buf) {
|
|
_SOKOL_PRIVATE void _sg_wgpu_discard_buffer(_sg_buffer_t* buf) {
|
|
SOKOL_ASSERT(buf);
|
|
SOKOL_ASSERT(buf);
|
|
if (buf->cmn.usage.storage_buffer) {
|
|
if (buf->cmn.usage.storage_buffer) {
|
|
- _sg_wgpu_bindgroups_cache_invalidate(_SG_WGPU_BINDGROUPSCACHEITEMTYPE_STORAGEBUFFER, buf->slot.id);
|
|
|
|
|
|
+ _sg_wgpu_bindgroups_cache_invalidate(_SG_WGPU_BINDGROUPSCACHEITEMTYPE_STORAGEBUFFER, &buf->slot);
|
|
}
|
|
}
|
|
if (buf->wgpu.buf) {
|
|
if (buf->wgpu.buf) {
|
|
wgpuBufferRelease(buf->wgpu.buf);
|
|
wgpuBufferRelease(buf->wgpu.buf);
|
|
@@ -16819,7 +16817,7 @@ _SOKOL_PRIVATE sg_resource_state _sg_wgpu_create_image(_sg_image_t* img, const s
|
|
|
|
|
|
_SOKOL_PRIVATE void _sg_wgpu_discard_image(_sg_image_t* img) {
|
|
_SOKOL_PRIVATE void _sg_wgpu_discard_image(_sg_image_t* img) {
|
|
SOKOL_ASSERT(img);
|
|
SOKOL_ASSERT(img);
|
|
- _sg_wgpu_bindgroups_cache_invalidate(_SG_WGPU_BINDGROUPSCACHEITEMTYPE_IMAGE, img->slot.id);
|
|
|
|
|
|
+ _sg_wgpu_bindgroups_cache_invalidate(_SG_WGPU_BINDGROUPSCACHEITEMTYPE_IMAGE, &img->slot);
|
|
if (img->wgpu.view) {
|
|
if (img->wgpu.view) {
|
|
wgpuTextureViewRelease(img->wgpu.view);
|
|
wgpuTextureViewRelease(img->wgpu.view);
|
|
img->wgpu.view = 0;
|
|
img->wgpu.view = 0;
|
|
@@ -16865,7 +16863,7 @@ _SOKOL_PRIVATE sg_resource_state _sg_wgpu_create_sampler(_sg_sampler_t* smp, con
|
|
|
|
|
|
_SOKOL_PRIVATE void _sg_wgpu_discard_sampler(_sg_sampler_t* smp) {
|
|
_SOKOL_PRIVATE void _sg_wgpu_discard_sampler(_sg_sampler_t* smp) {
|
|
SOKOL_ASSERT(smp);
|
|
SOKOL_ASSERT(smp);
|
|
- _sg_wgpu_bindgroups_cache_invalidate(_SG_WGPU_BINDGROUPSCACHEITEMTYPE_SAMPLER, smp->slot.id);
|
|
|
|
|
|
+ _sg_wgpu_bindgroups_cache_invalidate(_SG_WGPU_BINDGROUPSCACHEITEMTYPE_SAMPLER, &smp->slot);
|
|
if (smp->wgpu.smp) {
|
|
if (smp->wgpu.smp) {
|
|
wgpuSamplerRelease(smp->wgpu.smp);
|
|
wgpuSamplerRelease(smp->wgpu.smp);
|
|
smp->wgpu.smp = 0;
|
|
smp->wgpu.smp = 0;
|
|
@@ -17306,7 +17304,7 @@ _SOKOL_PRIVATE sg_resource_state _sg_wgpu_create_pipeline(_sg_pipeline_t* pip, c
|
|
|
|
|
|
_SOKOL_PRIVATE void _sg_wgpu_discard_pipeline(_sg_pipeline_t* pip) {
|
|
_SOKOL_PRIVATE void _sg_wgpu_discard_pipeline(_sg_pipeline_t* pip) {
|
|
SOKOL_ASSERT(pip);
|
|
SOKOL_ASSERT(pip);
|
|
- _sg_wgpu_bindgroups_cache_invalidate(_SG_WGPU_BINDGROUPSCACHEITEMTYPE_PIPELINE, pip->slot.id);
|
|
|
|
|
|
+ _sg_wgpu_bindgroups_cache_invalidate(_SG_WGPU_BINDGROUPSCACHEITEMTYPE_PIPELINE, &pip->slot);
|
|
if (pip->wgpu.rpip) {
|
|
if (pip->wgpu.rpip) {
|
|
wgpuRenderPipelineRelease(pip->wgpu.rpip);
|
|
wgpuRenderPipelineRelease(pip->wgpu.rpip);
|
|
pip->wgpu.rpip = 0;
|
|
pip->wgpu.rpip = 0;
|