@@ -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