Skip to content

Commit f29597e

Browse files
committed
sokol_gfx.h: less spammy and more detailed validation messages for views
1 parent 93ab761 commit f29597e

1 file changed

Lines changed: 87 additions & 67 deletions

File tree

sokol_gfx.h

Lines changed: 87 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -4389,22 +4389,22 @@ typedef struct sg_frame_stats {
43894389
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_COLORATTACHMENTVIEW_ALIVE, "sg_begin_pass: color attachment view no longer alive") \
43904390
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_COLORATTACHMENTVIEW_VALID, "sg_begin_pass: color attachment view not in valid state (SG_RESOURCESTATE_VALID)") \
43914391
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_COLORATTACHMENTVIEW_TYPE, "sg_begin_pass: color attachment views has wrong type (must be sg_view_desc.color_attachment)") \
4392-
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_COLORATTACHMENTVIEW_IMAGE_ALIVE, "sg_begin_pass: color attachment view's image object no longer alive") \
4392+
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_COLORATTACHMENTVIEW_IMAGE_ALIVE, "sg_begin_pass: color attachment view's image object is uninitialized or no longer alive") \
43934393
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_COLORATTACHMENTVIEW_IMAGE_VALID, "sg_begin_pass: color attachment view's image is not in valid state (SG_RESOURCESTATE_VALID)") \
43944394
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_COLORATTACHMENTVIEW_SIZES, "sg_begin_pass: all color attachments must have the same width and height") \
43954395
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_COLORATTACHMENTVIEW_SAMPLECOUNTS, "sg_begin_pass: all color attachments must have the same sample count") \
43964396
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_RESOLVEATTACHMENTVIEW_NO_COLORATTACHMENTVIEW, "sg_begin_pass: a resolve attachment view must have an associated color attachment view at the same index") \
43974397
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_RESOLVEATTACHMENTVIEW_ALIVE, "sg_begin_pass: resolve attachment view no longer alive") \
43984398
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_RESOLVEATTACHMENTVIEW_VALID, "sg_begin_pass: resolve attachment view not in valid state (SG_RESOURCESTATE_VALID)") \
43994399
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_RESOLVEATTACHMENTVIEW_TYPE, "sg_begin_pass: resolve attachment views has wrong type (must be sg_view_desc.resolve_attachment)") \
4400-
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_RESOLVEATTACHMENTVIEW_IMAGE_ALIVE, "sg_begin_pass: resolve attachment view's image object no longer alive") \
4400+
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_RESOLVEATTACHMENTVIEW_IMAGE_ALIVE, "sg_begin_pass: resolve attachment view's image object is uninitialized or no longer alive") \
44014401
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_RESOLVEATTACHMENTVIEW_IMAGE_VALID, "sg_begin_pass: resolve attachment view's image is not in valid state (SG_RESOURCESTATE_VALID)") \
44024402
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_RESOLVEATTACHMENTVIEW_SIZES, "sg_begin_pass: all attachments must have the same width and height") \
44034403
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEWS_CONTINUOUS, "sg_begin_pass: color attachment view array must be continuous") \
44044404
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEW_ALIVE, "sg_begin_pass: depth-stencil attachment view no longer alive") \
44054405
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEW_VALID, "sg_begin_pass: depth-stencil attachment view not in valid state (SG_RESOURCESTATE_VALID)") \
44064406
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEW_TYPE, "sg_begin_pass: depth-stencil attachment views has wrong type (must be sg_view_desc.depth_stencil_attachment)") \
4407-
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEW_IMAGE_ALIVE, "sg_begin_pass: depth-stencil attachment view's image object no longer alive") \
4407+
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEW_IMAGE_ALIVE, "sg_begin_pass: depth-stencil attachment view's image object is uninitialized or no longer alive") \
44084408
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEW_IMAGE_VALID, "sg_begin_pass: depth-stencil attachment view's image is not in valid state (SG_RESOURCESTATE_VALID)") \
44094409
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEW_SIZES, "sg_begin_pass: attachments must have the same width and height") \
44104410
_SG_LOGITEM_XMACRO(VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEW_SAMPLECOUNT, "sg_begin_pass: all color attachments must have the same sample count") \
@@ -7159,7 +7159,7 @@ _SG_IMPL_RES_PTR(_sg_shader_ref_ptr, _sg_shader_ref_t, _sg_shader_t)
71597159
_SG_IMPL_RES_PTR(_sg_pipeline_ref_ptr, _sg_pipeline_ref_t, _sg_pipeline_t)
71607160
_SG_IMPL_RES_PTR(_sg_view_ref_ptr, _sg_view_ref_t, _sg_view_t)
71617161

7162-
#define _SG_IMPL_RES_PTR_OR_NULL(NAME,REF,RES) _SOKOL_PRIVATE RES* NAME(const REF* ref) { SOKOL_ASSERT(ref); if (SG_INVALID_ID != ref->sref.id) { SOKOL_ASSERT(_sg_sref_slot_eql(&ref->sref, &ref->ptr->slot)); return ref->ptr; } else { return 0; } }
7162+
#define _SG_IMPL_RES_PTR_OR_NULL(NAME,REF,RES) _SOKOL_PRIVATE RES* NAME(const REF* ref) { SOKOL_ASSERT(ref); if ((SG_INVALID_ID != ref->sref.id) && _sg_sref_slot_eql(&ref->sref, &ref->ptr->slot)) { return ref->ptr; } else { return 0; } }
71637163
_SG_IMPL_RES_PTR_OR_NULL(_sg_buffer_ref_ptr_or_null, _sg_buffer_ref_t, _sg_buffer_t)
71647164
_SG_IMPL_RES_PTR_OR_NULL(_sg_image_ref_ptr_or_null, _sg_image_ref_t, _sg_image_t)
71657165
_SG_IMPL_RES_PTR_OR_NULL(_sg_sampler_ref_ptr_or_null, _sg_sampler_ref_t, _sg_sampler_t)
@@ -19218,21 +19218,25 @@ _SOKOL_PRIVATE bool _sg_validate_begin_pass(const sg_pass* pass) {
1921819218
if (view) {
1921919219
// the view object must be in valid state
1922019220
_SG_VALIDATE(view->slot.state == SG_RESOURCESTATE_VALID, VALIDATE_BEGINPASS_COLORATTACHMENTVIEW_VALID);
19221-
// the view object must be a color attachment view
19222-
_SG_VALIDATE(view->cmn.type == _SG_VIEWTYPE_COLORATTACHMENT, VALIDATE_BEGINPASS_COLORATTACHMENTVIEW_TYPE);
19223-
// the view's image object must be alive and valid
19224-
const _sg_image_t* img = _sg_image_ref_ptr_or_null(&view->cmn.img.ref);
19225-
_SG_VALIDATE(img, VALIDATE_BEGINPASS_COLORATTACHMENTVIEW_IMAGE_ALIVE);
19226-
if (img) {
19227-
_SG_VALIDATE(img->slot.state == SG_RESOURCESTATE_VALID, VALIDATE_BEGINPASS_COLORATTACHMENTVIEW_IMAGE_VALID);
19228-
if (att_index == 0) {
19229-
color_width = _sg_image_view_dim(view).width;
19230-
color_height = _sg_image_view_dim(view).height;
19231-
color_sample_count = img->cmn.sample_count;
19232-
} else {
19233-
_SG_VALIDATE(color_width == _sg_image_view_dim(view).width, VALIDATE_BEGINPASS_COLORATTACHMENTVIEW_SIZES);
19234-
_SG_VALIDATE(color_height == _sg_image_view_dim(view).height, VALIDATE_BEGINPASS_COLORATTACHMENTVIEW_SIZES);
19235-
_SG_VALIDATE(color_sample_count == img->cmn.sample_count, VALIDATE_BEGINPASS_COLORATTACHMENTVIEW_SAMPLECOUNTS);
19221+
if (view->slot.state == SG_RESOURCESTATE_VALID) {
19222+
// the view object must be a color attachment view
19223+
_SG_VALIDATE(view->cmn.type == _SG_VIEWTYPE_COLORATTACHMENT, VALIDATE_BEGINPASS_COLORATTACHMENTVIEW_TYPE);
19224+
// the view's image object must be alive and valid
19225+
const _sg_image_t* img = _sg_image_ref_ptr_or_null(&view->cmn.img.ref);
19226+
_SG_VALIDATE(img, VALIDATE_BEGINPASS_COLORATTACHMENTVIEW_IMAGE_ALIVE);
19227+
if (img) {
19228+
_SG_VALIDATE(img->slot.state == SG_RESOURCESTATE_VALID, VALIDATE_BEGINPASS_COLORATTACHMENTVIEW_IMAGE_VALID);
19229+
if (img->slot.state == SG_RESOURCESTATE_VALID) {
19230+
if (color_width == -1) {
19231+
color_width = _sg_image_view_dim(view).width;
19232+
color_height = _sg_image_view_dim(view).height;
19233+
color_sample_count = img->cmn.sample_count;
19234+
} else {
19235+
_SG_VALIDATE(color_width == _sg_image_view_dim(view).width, VALIDATE_BEGINPASS_COLORATTACHMENTVIEW_SIZES);
19236+
_SG_VALIDATE(color_height == _sg_image_view_dim(view).height, VALIDATE_BEGINPASS_COLORATTACHMENTVIEW_SIZES);
19237+
_SG_VALIDATE(color_sample_count == img->cmn.sample_count, VALIDATE_BEGINPASS_COLORATTACHMENTVIEW_SAMPLECOUNTS);
19238+
}
19239+
}
1923619240
}
1923719241
}
1923819242
}
@@ -19249,15 +19253,21 @@ _SOKOL_PRIVATE bool _sg_validate_begin_pass(const sg_pass* pass) {
1924919253
if (view) {
1925019254
// the view object must be in valid state
1925119255
_SG_VALIDATE(view->slot.state == SG_RESOURCESTATE_VALID, VALIDATE_BEGINPASS_RESOLVEATTACHMENTVIEW_VALID);
19252-
// the view object must be a resolve attachment view
19253-
_SG_VALIDATE(view->cmn.type == _SG_VIEWTYPE_RESOLVEATTACHMENT, VALIDATE_BEGINPASS_RESOLVEATTACHMENTVIEW_TYPE);
19254-
// the view's image object must be alive and valid
19255-
const _sg_image_t* img = _sg_image_ref_ptr_or_null(&view->cmn.img.ref);
19256-
_SG_VALIDATE(img, VALIDATE_BEGINPASS_RESOLVEATTACHMENTVIEW_IMAGE_ALIVE);
19257-
if (img) {
19258-
_SG_VALIDATE(img->slot.state == SG_RESOURCESTATE_VALID, VALIDATE_BEGINPASS_RESOLVEATTACHMENTVIEW_IMAGE_VALID);
19259-
_SG_VALIDATE(color_width == _sg_image_view_dim(view).width, VALIDATE_BEGINPASS_RESOLVEATTACHMENTVIEW_SIZES);
19260-
_SG_VALIDATE(color_height == _sg_image_view_dim(view).height, VALIDATE_BEGINPASS_RESOLVEATTACHMENTVIEW_SIZES);
19256+
if (view->slot.state == SG_RESOURCESTATE_VALID) {
19257+
// the view object must be a resolve attachment view
19258+
_SG_VALIDATE(view->cmn.type == _SG_VIEWTYPE_RESOLVEATTACHMENT, VALIDATE_BEGINPASS_RESOLVEATTACHMENTVIEW_TYPE);
19259+
// the view's image object must be alive and valid
19260+
const _sg_image_t* img = _sg_image_ref_ptr_or_null(&view->cmn.img.ref);
19261+
_SG_VALIDATE(img, VALIDATE_BEGINPASS_RESOLVEATTACHMENTVIEW_IMAGE_ALIVE);
19262+
if (img) {
19263+
_SG_VALIDATE(img->slot.state == SG_RESOURCESTATE_VALID, VALIDATE_BEGINPASS_RESOLVEATTACHMENTVIEW_IMAGE_VALID);
19264+
if (img->slot.state == SG_RESOURCESTATE_VALID) {
19265+
if (color_width != -1) {
19266+
_SG_VALIDATE(color_width == _sg_image_view_dim(view).width, VALIDATE_BEGINPASS_RESOLVEATTACHMENTVIEW_SIZES);
19267+
_SG_VALIDATE(color_height == _sg_image_view_dim(view).height, VALIDATE_BEGINPASS_RESOLVEATTACHMENTVIEW_SIZES);
19268+
}
19269+
}
19270+
}
1926119271
}
1926219272
}
1926319273
}
@@ -19270,16 +19280,22 @@ _SOKOL_PRIVATE bool _sg_validate_begin_pass(const sg_pass* pass) {
1927019280
if (view) {
1927119281
// the view object must be in valid state
1927219282
_SG_VALIDATE(view->slot.state == SG_RESOURCESTATE_VALID, VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEW_VALID);
19273-
// the view object must be a depth stencil attachment view
19274-
_SG_VALIDATE(view->cmn.type == _SG_VIEWTYPE_DEPTHSTENCILATTACHMENT, VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEW_TYPE);
19275-
// the view's image object must be alive and valid
19276-
const _sg_image_t* img = _sg_image_ref_ptr_or_null(&view->cmn.img.ref);
19277-
_SG_VALIDATE(img, VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEW_IMAGE_ALIVE);
19278-
if (img) {
19279-
_SG_VALIDATE(img->slot.state == SG_RESOURCESTATE_VALID, VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEW_IMAGE_VALID);
19280-
_SG_VALIDATE(color_width == _sg_image_view_dim(view).width, VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEW_SIZES);
19281-
_SG_VALIDATE(color_height == _sg_image_view_dim(view).height, VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEW_SIZES);
19282-
_SG_VALIDATE(color_sample_count == img->cmn.sample_count, VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEW_SAMPLECOUNT);
19283+
if (view->slot.state == SG_RESOURCESTATE_VALID) {
19284+
// the view object must be a depth stencil attachment view
19285+
_SG_VALIDATE(view->cmn.type == _SG_VIEWTYPE_DEPTHSTENCILATTACHMENT, VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEW_TYPE);
19286+
// the view's image object must be alive and valid
19287+
const _sg_image_t* img = _sg_image_ref_ptr_or_null(&view->cmn.img.ref);
19288+
_SG_VALIDATE(img, VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEW_IMAGE_ALIVE);
19289+
if (img) {
19290+
_SG_VALIDATE(img->slot.state == SG_RESOURCESTATE_VALID, VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEW_IMAGE_VALID);
19291+
if (img->slot.state == SG_RESOURCESTATE_VALID) {
19292+
if (color_width != -1) {
19293+
_SG_VALIDATE(color_width == _sg_image_view_dim(view).width, VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEW_SIZES);
19294+
_SG_VALIDATE(color_height == _sg_image_view_dim(view).height, VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEW_SIZES);
19295+
_SG_VALIDATE(color_sample_count == img->cmn.sample_count, VALIDATE_BEGINPASS_DEPTHSTENCILATTACHMENTVIEW_SAMPLECOUNT);
19296+
}
19297+
}
19298+
}
1928319299
}
1928419300
}
1928519301
}
@@ -19526,30 +19542,32 @@ _SOKOL_PRIVATE bool _sg_validate_apply_bindings(const sg_bindings* bindings) {
1952619542
// the view object must be alive
1952719543
_SG_VALIDATE(view != 0, VALIDATE_ABND_TEXVIEW_ALIVE);
1952819544
if (view) {
19529-
// the view object must be a texture view
19530-
_SG_VALIDATE(view->cmn.type == _SG_VIEWTYPE_TEXTURE, VALIDATE_ABND_TEXVIEW_TYPE);
1953119545
// the view object itself must be in valid state
1953219546
_SG_VALIDATE(view->slot.state == SG_RESOURCESTATE_VALID, VALIDATE_ABND_TEXVIEW_VALID);
19533-
// NOTE: an invalid texture ref is allowed and skips rendering
19534-
if (_sg_image_ref_valid(&view->cmn.img.ref)) {
19535-
const _sg_image_t* img = _sg_image_ref_ptr(&view->cmn.img.ref);
19536-
_SG_VALIDATE(img->cmn.type == shd->cmn.textures[i].image_type, VALIDATE_ABND_TEXVIEW_IMAGETYPE_MISMATCH);
19537-
if (!_sg.features.msaa_image_bindings) {
19538-
_SG_VALIDATE(img->cmn.sample_count == 1, VALIDATE_ABND_TEXVIEW_MSAA);
19539-
}
19540-
if (shd->cmn.textures[i].multisampled) {
19541-
_SG_VALIDATE(img->cmn.sample_count > 1, VALIDATE_ABND_TEXVIEW_EXPECTED_MULTISAMPLED_IMAGE);
19542-
}
19543-
const _sg_pixelformat_info_t* info = &_sg.formats[img->cmn.pixel_format];
19544-
switch (shd->cmn.textures[i].sample_type) {
19545-
case SG_IMAGESAMPLETYPE_FLOAT:
19546-
_SG_VALIDATE(info->filter, VALIDATE_ABND_TEXVIEW_EXPECTED_FILTERABLE_IMAGE);
19547-
break;
19548-
case SG_IMAGESAMPLETYPE_DEPTH:
19549-
_SG_VALIDATE(info->depth, VALIDATE_ABND_TEXVIEW_EXPECTED_DEPTH_IMAGE);
19550-
break;
19551-
default:
19552-
break;
19547+
if (view->slot.state == SG_RESOURCESTATE_VALID) {
19548+
// the view object must be a texture view
19549+
_SG_VALIDATE(view->cmn.type == _SG_VIEWTYPE_TEXTURE, VALIDATE_ABND_TEXVIEW_TYPE);
19550+
// NOTE: an invalid texture ref is allowed and skips rendering
19551+
if (_sg_image_ref_valid(&view->cmn.img.ref)) {
19552+
const _sg_image_t* img = _sg_image_ref_ptr(&view->cmn.img.ref);
19553+
_SG_VALIDATE(img->cmn.type == shd->cmn.textures[i].image_type, VALIDATE_ABND_TEXVIEW_IMAGETYPE_MISMATCH);
19554+
if (!_sg.features.msaa_image_bindings) {
19555+
_SG_VALIDATE(img->cmn.sample_count == 1, VALIDATE_ABND_TEXVIEW_MSAA);
19556+
}
19557+
if (shd->cmn.textures[i].multisampled) {
19558+
_SG_VALIDATE(img->cmn.sample_count > 1, VALIDATE_ABND_TEXVIEW_EXPECTED_MULTISAMPLED_IMAGE);
19559+
}
19560+
const _sg_pixelformat_info_t* info = &_sg.formats[img->cmn.pixel_format];
19561+
switch (shd->cmn.textures[i].sample_type) {
19562+
case SG_IMAGESAMPLETYPE_FLOAT:
19563+
_SG_VALIDATE(info->filter, VALIDATE_ABND_TEXVIEW_EXPECTED_FILTERABLE_IMAGE);
19564+
break;
19565+
case SG_IMAGESAMPLETYPE_DEPTH:
19566+
_SG_VALIDATE(info->depth, VALIDATE_ABND_TEXVIEW_EXPECTED_DEPTH_IMAGE);
19567+
break;
19568+
default:
19569+
break;
19570+
}
1955319571
}
1955419572
}
1955519573
}
@@ -19592,15 +19610,17 @@ _SOKOL_PRIVATE bool _sg_validate_apply_bindings(const sg_bindings* bindings) {
1959219610
// view object must be alive
1959319611
_SG_VALIDATE(view != 0, VALIDATE_ABND_SBVIEW_ALIVE);
1959419612
if (view) {
19595-
// the view object must be a storage buffer view
19596-
_SG_VALIDATE(view->cmn.type == _SG_VIEWTYPE_STORAGEBUFFER, VALIDATE_ABND_SBVIEW_TYPE);
1959719613
// the view object must be in valid state
1959819614
_SG_VALIDATE(view->slot.state == SG_RESOURCESTATE_VALID, VALIDATE_ABND_SBVIEW_VALID);
19599-
// NOTE: an invalid buffer ref is allowed and skips rendering
19600-
if (_sg_buffer_ref_valid(&view->cmn.buf.ref)) {
19601-
const _sg_buffer_t* buf = _sg_buffer_ref_ptr(&view->cmn.buf.ref);
19602-
if (!shd->cmn.storage_buffers[i].readonly) {
19603-
_SG_VALIDATE(buf->cmn.usage.immutable, VALIDATE_ABND_SBVIEW_READWRITE_IMMUTABLE);
19615+
if (view->slot.state == SG_RESOURCESTATE_VALID) {
19616+
// the view object must be a storage buffer view
19617+
_SG_VALIDATE(view->cmn.type == _SG_VIEWTYPE_STORAGEBUFFER, VALIDATE_ABND_SBVIEW_TYPE);
19618+
// NOTE: an invalid buffer ref is allowed and skips rendering
19619+
if (_sg_buffer_ref_valid(&view->cmn.buf.ref)) {
19620+
const _sg_buffer_t* buf = _sg_buffer_ref_ptr(&view->cmn.buf.ref);
19621+
if (!shd->cmn.storage_buffers[i].readonly) {
19622+
_SG_VALIDATE(buf->cmn.usage.immutable, VALIDATE_ABND_SBVIEW_READWRITE_IMMUTABLE);
19623+
}
1960419624
}
1960519625
}
1960619626
}

0 commit comments

Comments
 (0)