Skip to content

Commit 093d551

Browse files
committed
sokol_gfx.h: a view's resource must be valid at view init time
1 parent e8ed087 commit 093d551

1 file changed

Lines changed: 49 additions & 66 deletions

File tree

sokol_gfx.h

Lines changed: 49 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)