Add statemap validation in debug mode

This commit is contained in:
Jan 2022-08-20 15:11:08 +02:00
parent 2dd8660824
commit c5cfdfde89
2 changed files with 50 additions and 2 deletions

View File

@ -1,7 +1,53 @@
#include "StateMapLayout.h" #include "StateMapLayout.h"
#include <cassert>
using namespace state_map; using namespace state_map;
namespace state_map
{
#ifdef _DEBUG
void ValidateStateMapLayout(const StateMapLayout& layout)
{
// Must have at least one state bits field
assert(layout.m_state_bits_count > 0);
for (const auto& var : layout.m_var_layout.m_vars)
{
// Cannot exceed state bits fields
assert(var.m_state_bits_index < layout.m_state_bits_count);
for (auto i = 0u; i < var.m_values.size(); i++)
{
const auto& value = var.m_values[i];
// Zero mask values must be last
assert(value.m_state_bits_mask != 0 || i == var.m_values.size() - 1);
}
}
for (const auto& entry : layout.m_entry_layout.m_entries)
{
// Cannot exceed state bits fields
assert(entry.m_state_bits_index < layout.m_state_bits_count);
// Has to have a mask for passthrough
assert(entry.m_state_bits_mask != 0);
for (auto& resultVar : entry.m_result_vars)
{
const auto correspondingVar = std::find_if(layout.m_var_layout.m_vars.begin(), layout.m_var_layout.m_vars.end(), [&resultVar](const StateMapLayoutVar& var)
{
return var.m_name == resultVar;
});
// Has to have a corresponding var
assert(correspondingVar != layout.m_var_layout.m_vars.end());
}
}
}
#endif
}
StateMapLayoutEntry::StateMapLayoutEntry(std::string name, const size_t stateBitsIndex, const size_t stateBitsMask, std::vector<std::string> resultVars) StateMapLayoutEntry::StateMapLayoutEntry(std::string name, const size_t stateBitsIndex, const size_t stateBitsMask, std::vector<std::string> resultVars)
: m_name(std::move(name)), : m_name(std::move(name)),
@ -39,4 +85,7 @@ StateMapLayout::StateMapLayout(const size_t stateBitsCount, const StateMapLayout
m_entry_layout(entryLayout), m_entry_layout(entryLayout),
m_var_layout(varLayout) m_var_layout(varLayout)
{ {
#ifdef _DEBUG
ValidateStateMapLayout(*this);
#endif
} }

View File

@ -790,10 +790,9 @@ namespace IW4
}, },
{ {
"mtlStencil", 1, { "mtlStencil", 1, {
{"Disable", 0},
{"OneSided", GFXS1_STENCIL_FRONT_ENABLE}, {"OneSided", GFXS1_STENCIL_FRONT_ENABLE},
{"TwoSided", GFXS1_STENCIL_FRONT_ENABLE | GFXS1_STENCIL_BACK_ENABLE}, {"TwoSided", GFXS1_STENCIL_FRONT_ENABLE | GFXS1_STENCIL_BACK_ENABLE},
{"0", GFXS1_POLYGON_OFFSET_0}, {"Disable", 0},
} }
}, },
{ {