@@ -3193,7 +3193,6 @@ typedef struct sg_image_usage {
31933193 bool color_attachment;
31943194 bool resolve_attachment;
31953195 bool depth_stencil_attachment;
3196- bool storage_image;
31973196 bool immutable;
31983197 bool dynamic_update;
31993198 bool stream_update;
@@ -7264,16 +7263,6 @@ _SOKOL_PRIVATE int _sg_miplevel_dim(int base_dim, int mip_level) {
72647263 return _sg_max(base_dim >> mip_level, 1);
72657264}
72667265
7267- _SOKOL_PRIVATE sg_resource_state _sg_view_resource_state(const _sg_view_t* view) {
7268- if (_sg_buffer_ref_alive(&view->cmn.buf.ref)) {
7269- return _sg_buffer_ref_ptr(&view->cmn.buf.ref)->slot.state;
7270- } else if (_sg_image_ref_alive(&view->cmn.img.ref)) {
7271- return _sg_image_ref_ptr(&view->cmn.img.ref)->slot.state;
7272- } else {
7273- return SG_RESOURCESTATE_INVALID;
7274- }
7275- }
7276-
72777266_SOKOL_PRIVATE bool _sg_image_view_alive(const _sg_view_t* view) {
72787267 return view && _sg_image_ref_alive(&view->cmn.img.ref);
72797268}
@@ -7497,66 +7486,68 @@ _SOKOL_PRIVATE void _sg_pipeline_common_init(_sg_pipeline_common_t* cmn, const s
74977486}
74987487
74997488_SOKOL_PRIVATE void _sg_buffer_view_common_init(_sg_buffer_view_common_t* cmn, const sg_buffer_view_desc* desc, _sg_buffer_t* buf) {
7500- // NOTE: we cannot actually access any buffer properties here since it may not yet be initialized
7489+ SOKOL_ASSERT(SG_RESOURCESTATE_VALID == buf->slot.state);
75017490 cmn->ref = _sg_buffer_ref(buf);
75027491 cmn->offset = desc->offset;
75037492}
75047493
75057494_SOKOL_PRIVATE void _sg_texture_view_common_init(_sg_image_view_common_t* cmn, const sg_texture_view_desc* desc, _sg_image_t* img) {
7506- // NOTE: we cannot actually access any image properties here since it may not yet be initialized,
7507- // specifically the slice_count cannot be default-initialized from the image's number of mipmaps or slices,
7508- // so this needs to be handled in the backends!
7495+ SOKOL_ASSERT(SG_RESOURCESTATE_VALID == img->slot.state);
75097496 cmn->ref = _sg_image_ref(img);
75107497 cmn->mip_level = desc->mip_levels.base;
7498+ cmn->mip_level_count = _sg_def(desc->mip_levels.count, img->cmn.num_mipmaps - cmn->mip_level);
75117499 cmn->slice = desc->slices.base;
75127500 switch (img->cmn.type) {
7501+ case SG_IMAGETYPE_2D:
7502+ cmn->slice_count = 1;
7503+ break;
75137504 case SG_IMAGETYPE_CUBE:
7505+ cmn->slice_count = 6;
7506+ break;
75147507 case SG_IMAGETYPE_3D:
7515- cmn->slice_count = _sg_def(desc->slices.count, 1) ;
7508+ cmn->slice_count = 1 ;
75167509 break;
7517- default:
7510+ case SG_IMAGETYPE_ARRAY:
7511+ cmn->slice_count = _sg_def(desc->slices.count, img->cmn.num_slices - cmn->slice);
75187512 break;
7513+ default:
7514+ SOKOL_UNREACHABLE;
75197515 }
75207516}
75217517
75227518_SOKOL_PRIVATE void _sg_image_view_common_init(_sg_image_view_common_t* cmn, const sg_image_view_desc* desc, _sg_image_t* img) {
7519+ SOKOL_ASSERT(SG_RESOURCESTATE_VALID == img->slot.state);
75237520 cmn->ref = _sg_image_ref(img);
75247521 cmn->mip_level = desc->mip_level;
75257522 cmn->mip_level_count = 1;
75267523 cmn->slice = desc->slice;
75277524 cmn->slice_count = 1;
75287525}
75297526
7530- _SOKOL_PRIVATE void _sg_view_common_init(_sg_view_common_t* cmn, const sg_view_desc* desc) {
7527+ _SOKOL_PRIVATE void _sg_view_common_init(_sg_view_common_t* cmn, const sg_view_desc* desc, _sg_buffer_t* buf, _sg_image_t* img ) {
75317528 if (desc->texture_binding.image.id != SG_INVALID_ID) {
7532- cmn->type = SG_VIEWTYPE_TEXTURE;
7533- _sg_image_t* img = _sg_lookup_image(desc->texture_binding.image.id);
75347529 SOKOL_ASSERT(img);
7530+ cmn->type = SG_VIEWTYPE_TEXTURE;
75357531 _sg_texture_view_common_init(&cmn->img, &desc->texture_binding, img);
75367532 } else if (desc->storage_buffer_binding.buffer.id != SG_INVALID_ID) {
7537- cmn->type = SG_VIEWTYPE_STORAGEBUFFER;
7538- _sg_buffer_t* buf = _sg_lookup_buffer(desc->storage_buffer_binding.buffer.id);
75397533 SOKOL_ASSERT(buf);
7534+ cmn->type = SG_VIEWTYPE_STORAGEBUFFER;
75407535 _sg_buffer_view_common_init(&cmn->buf, &desc->storage_buffer_binding, buf);
75417536 } else if (desc->storage_image_binding.image.id != SG_INVALID_ID) {
7542- cmn->type = SG_VIEWTYPE_STORAGEIMAGE;
7543- _sg_image_t* img = _sg_lookup_image(desc->storage_image_binding.image.id);
75447537 SOKOL_ASSERT(img);
7538+ cmn->type = SG_VIEWTYPE_STORAGEIMAGE;
75457539 _sg_image_view_common_init(&cmn->img, &desc->storage_image_binding, img);
75467540 } else if (desc->color_attachment.image.id != SG_INVALID_ID) {
7547- cmn->type = SG_VIEWTYPE_COLORATTACHMENT;
7548- _sg_image_t* img = _sg_lookup_image(desc->color_attachment.image.id);
75497541 SOKOL_ASSERT(img);
7542+ cmn->type = SG_VIEWTYPE_COLORATTACHMENT;
75507543 _sg_image_view_common_init(&cmn->img, &desc->color_attachment, img);
75517544 } else if (desc->resolve_attachment.image.id != SG_INVALID_ID) {
7552- cmn->type = SG_VIEWTYPE_RESOLVEATTACHMENT;
7553- _sg_image_t* img = _sg_lookup_image(desc->resolve_attachment.image.id);
75547545 SOKOL_ASSERT(img);
7546+ cmn->type = SG_VIEWTYPE_RESOLVEATTACHMENT;
75557547 _sg_image_view_common_init(&cmn->img, &desc->resolve_attachment, img);
75567548 } else if (desc->depth_stencil_attachment.image.id != SG_INVALID_ID) {
7557- cmn->type = SG_VIEWTYPE_DEPTHSTENCILATTACHMENT;
7558- _sg_image_t* img = _sg_lookup_image(desc->depth_stencil_attachment.image.id);
75597549 SOKOL_ASSERT(img);
7550+ cmn->type = SG_VIEWTYPE_DEPTHSTENCILATTACHMENT;
75607551 _sg_image_view_common_init(&cmn->img, &desc->depth_stencil_attachment, img);
75617552 } else {
75627553 SOKOL_UNREACHABLE;
@@ -14983,39 +14974,20 @@ _SOKOL_PRIVATE void _sg_mtl_discard_pipeline(_sg_pipeline_t* pip) {
1498314974
1498414975_SOKOL_PRIVATE sg_resource_state _sg_mtl_create_view(_sg_view_t* view) {
1498514976 SOKOL_ASSERT(view);
14986- if ((view->cmn.type == SG_VIEWTYPE_TEXTURE ) || (view->cmn.type == SG_VIEWTYPE_STORAGEIMAGE )) {
14977+ if ((SG_VIEWTYPE_TEXTURE == view->cmn.type) || (SG_VIEWTYPE_STORAGEIMAGE == view->cmn.type)) {
1498714978 const _sg_image_view_common_t* cmn = &view->cmn.img;
1498814979 const _sg_image_t* img = _sg_image_ref_ptr(&cmn->ref);
14989- const int mip_level_count = _sg_def(cmn->mip_level_count, img->cmn.num_mipmaps - cmn->mip_level);
14990- // FIXME: once cubemap faces and slices are unified, just use the image num_slices as default!
14991- int slice_count;
14992- switch (img->cmn.type) {
14993- case SG_IMAGETYPE_2D:
14994- slice_count = 1;
14995- break;
14996- case SG_IMAGETYPE_CUBE:
14997- slice_count = 6;
14998- break;
14999- case SG_IMAGETYPE_3D:
15000- slice_count = 1;
15001- break;
15002- case SG_IMAGETYPE_ARRAY:
15003- slice_count = _sg_def(cmn->slice_count, img->cmn.num_slices - cmn->slice);
15004- break;
15005- default:
15006- SOKOL_UNREACHABLE;
15007- }
15008- SOKOL_ASSERT(mip_level_count >= 1);
15009- SOKOL_ASSERT(slice_count >= 1);
14980+ SOKOL_ASSERT(cmn->mip_level_count >= 1);
14981+ SOKOL_ASSERT(cmn->slice_count >= 1);
1501014982 for (size_t i = 0; i < SG_NUM_INFLIGHT_FRAMES; i++) {
1501114983 if (img->mtl.tex[i] == _SG_MTL_INVALID_SLOT_INDEX) {
1501214984 continue;
1501314985 }
1501414986 id<MTLTexture> mtl_tex_view = [_sg_mtl_id(img->mtl.tex[i])
1501514987 newTextureViewWithPixelFormat: _sg_mtl_pixel_format(img->cmn.pixel_format)
1501614988 textureType: _sg_mtl_texture_type(img->cmn.type, false)
15017- levels: NSMakeRange((NSUInteger)cmn->mip_level, (NSUInteger)mip_level_count)
15018- slices: NSMakeRange((NSUInteger)cmn->slice, (NSUInteger)slice_count)];
14989+ levels: NSMakeRange((NSUInteger)cmn->mip_level, (NSUInteger)cmn-> mip_level_count)
14990+ slices: NSMakeRange((NSUInteger)cmn->slice, (NSUInteger)cmn-> slice_count)];
1501914991 view->mtl.tex_view[i] = _sg_mtl_add_resource(mtl_tex_view);
1502014992 _SG_OBJC_RELEASE(mtl_tex_view);
1502114993 }
@@ -18562,7 +18534,7 @@ _SOKOL_PRIVATE bool _sg_validate_image_desc(const sg_image_desc* desc) {
1856218534 _SG_VALIDATE(desc->type != SG_IMAGETYPE_3D, VALIDATE_IMAGEDESC_ATTACHMENT_MSAA_3D_IMAGE);
1856318535 _SG_VALIDATE(desc->type != SG_IMAGETYPE_CUBE, VALIDATE_IMAGEDESC_ATTACHMENT_MSAA_CUBE_IMAGE);
1856418536 }
18565- } else if (usg->storage_image ) {
18537+ } else if (usg->storage_image_binding ) {
1856618538 _SG_VALIDATE(_sg_is_valid_storage_image_format(fmt), VALIDATE_IMAGEDESC_STORAGEIMAGE_PIXELFORMAT);
1856718539 // D3D11 doesn't allow multisampled UAVs (see: https://github.com/gpuweb/gpuweb/issues/513)
1856818540 _SG_VALIDATE(desc->sample_count == 1, VALIDATE_IMAGEDESC_STORAGEIMAGE_EXPECT_NO_MSAA);
@@ -19100,23 +19072,23 @@ _SOKOL_PRIVATE bool _sg_validate_view_desc(const sg_view_desc* desc) {
1910019072 buf = _sg_lookup_buffer(buf_desc->buffer.id);
1910119073 _SG_VALIDATE(buf, VALIDATE_VIEWDESC_RESOURCE_ALIVE);
1910219074 if (buf) {
19103- _SG_VALIDATE(buf->slot.state != SG_RESOURCESTATE_FAILED , VALIDATE_VIEWDESC_RESOURCE_FAILED);
19075+ _SG_VALIDATE(buf->slot.state == SG_RESOURCESTATE_VALID , VALIDATE_VIEWDESC_RESOURCE_FAILED);
1910419076 res_valid = buf->slot.state == SG_RESOURCESTATE_VALID;
1910519077 }
1910619078 } else if (img_desc) {
1910719079 SOKOL_ASSERT((tex_desc == 0) && (buf_desc == 0));
1910819080 img = _sg_lookup_image(img_desc->image.id);
1910919081 _SG_VALIDATE(img, VALIDATE_VIEWDESC_RESOURCE_ALIVE);
1911019082 if (img) {
19111- _SG_VALIDATE(img->slot.state != SG_RESOURCESTATE_FAILED , VALIDATE_VIEWDESC_RESOURCE_FAILED);
19083+ _SG_VALIDATE(img->slot.state == SG_RESOURCESTATE_VALID , VALIDATE_VIEWDESC_RESOURCE_FAILED);
1911219084 res_valid = img->slot.state == SG_RESOURCESTATE_VALID;
1911319085 }
1911419086 } else {
1911519087 SOKOL_ASSERT(tex_desc && (img_desc == 0) && (buf_desc == 0));
1911619088 img = _sg_lookup_image(tex_desc->image.id);
1911719089 _SG_VALIDATE(img, VALIDATE_VIEWDESC_RESOURCE_ALIVE);
1911819090 if (img) {
19119- _SG_VALIDATE(img->slot.state != SG_RESOURCESTATE_FAILED , VALIDATE_VIEWDESC_RESOURCE_FAILED);
19091+ _SG_VALIDATE(img->slot.state == SG_RESOURCESTATE_VALID , VALIDATE_VIEWDESC_RESOURCE_FAILED);
1912019092 res_valid = img->slot.state == SG_RESOURCESTATE_VALID;
1912119093 }
1912219094 }
@@ -20244,19 +20216,32 @@ _SOKOL_PRIVATE void _sg_init_view(_sg_view_t* view, const sg_view_desc* desc) {
2024420216 SOKOL_ASSERT(view && view->slot.state == SG_RESOURCESTATE_ALLOC);
2024520217 SOKOL_ASSERT(desc);
2024620218 if (_sg_validate_view_desc(desc)) {
20247- _sg_view_common_init(&view->cmn, desc);
20248- sg_resource_state res_state = _sg_view_resource_state(view);
20219+ uint32_t buf_id = desc->storage_buffer_binding.buffer.id;
20220+ uint32_t img_id = desc->texture_binding.image.id;
20221+ img_id = img_id ? img_id : desc->storage_image_binding.image.id;
20222+ img_id = img_id ? img_id : desc->color_attachment.image.id;
20223+ img_id = img_id ? img_id : desc->resolve_attachment.image.id;
20224+ img_id = img_id ? img_id : desc->depth_stencil_attachment.image.id;
20225+ _sg_buffer_t* buf = buf_id ? _sg_lookup_buffer(buf_id) : 0;
20226+ _sg_image_t* img = img_id ? _sg_lookup_image(img_id) : 0;
20227+ sg_resource_state res_state = SG_RESOURCESTATE_INVALID;
20228+ if (buf) {
20229+ res_state = buf->slot.state;
20230+ }
20231+ if (img) {
20232+ SOKOL_ASSERT(!buf);
20233+ res_state = img->slot.state;
20234+ }
2024920235 if (res_state == SG_RESOURCESTATE_VALID) {
20236+ _sg_view_common_init(&view->cmn, desc, buf, img);
2025020237 view->slot.state = _sg_create_view(view);
2025120238 } else {
2025220239 view->slot.state = SG_RESOURCESTATE_FAILED;
2025320240 }
2025420241 } else {
2025520242 view->slot.state = SG_RESOURCESTATE_FAILED;
2025620243 }
20257- SOKOL_ASSERT((view->slot.state == SG_RESOURCESTATE_VALID)
20258- || (view->slot.state == SG_RESOURCESTATE_FAILED)
20259- || (view->slot.state == SG_RESOURCESTATE_ALLOC));
20244+ SOKOL_ASSERT((view->slot.state == SG_RESOURCESTATE_VALID) || (view->slot.state == SG_RESOURCESTATE_FAILED));
2026020245}
2026120246
2026220247_SOKOL_PRIVATE void _sg_uninit_buffer(_sg_buffer_t* buf) {
@@ -21094,9 +21079,7 @@ SOKOL_API_IMPL sg_view sg_make_view(const sg_view_desc* desc) {
2109421079 _sg_view_t* view = _sg_view_at(view_id.id);
2109521080 SOKOL_ASSERT(view && (view->slot.state == SG_RESOURCESTATE_ALLOC));
2109621081 _sg_init_view(view, &desc_def);
21097- SOKOL_ASSERT((view->slot.state == SG_RESOURCESTATE_VALID)
21098- || (view->slot.state == SG_RESOURCESTATE_FAILED)
21099- || (view->slot.state == SG_RESOURCESTATE_ALLOC));
21082+ SOKOL_ASSERT((view->slot.state == SG_RESOURCESTATE_VALID) || (view->slot.state == SG_RESOURCESTATE_FAILED));
2110021083 }
2110121084 _SG_TRACE_ARGS(make_view, &desc_def, view_id);
2110221085 return view_id;
0 commit comments