1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
//#include <boost/functional/hash.hpp>
#include "Rendering/Shaders/ShaderStates.h"
#include "System/Sync/HsiehHash.h"
#include <unordered_set>
static std::unordered_set<int> samplerTypes{
#ifndef HEADLESS
GL_SAMPLER_1D,
GL_SAMPLER_2D,
GL_SAMPLER_3D,
GL_SAMPLER_CUBE,
GL_SAMPLER_1D_SHADOW,
GL_SAMPLER_2D_SHADOW,
GL_SAMPLER_1D_ARRAY,
GL_SAMPLER_2D_ARRAY,
GL_SAMPLER_1D_ARRAY_SHADOW,
GL_SAMPLER_2D_ARRAY_SHADOW,
GL_SAMPLER_2D_MULTISAMPLE,
GL_SAMPLER_2D_MULTISAMPLE_ARRAY,
GL_SAMPLER_CUBE_SHADOW,
GL_SAMPLER_BUFFER,
GL_SAMPLER_2D_RECT,
GL_SAMPLER_2D_RECT_SHADOW,
GL_INT_SAMPLER_1D,
GL_INT_SAMPLER_2D,
GL_INT_SAMPLER_3D,
GL_INT_SAMPLER_CUBE,
GL_INT_SAMPLER_1D_ARRAY,
GL_INT_SAMPLER_2D_ARRAY,
GL_INT_SAMPLER_2D_MULTISAMPLE,
GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY,
GL_INT_SAMPLER_BUFFER,
GL_INT_SAMPLER_2D_RECT,
GL_UNSIGNED_INT_SAMPLER_1D,
GL_UNSIGNED_INT_SAMPLER_2D,
GL_UNSIGNED_INT_SAMPLER_3D,
GL_UNSIGNED_INT_SAMPLER_CUBE,
GL_UNSIGNED_INT_SAMPLER_1D_ARRAY,
GL_UNSIGNED_INT_SAMPLER_2D_ARRAY,
GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE,
GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY,
GL_UNSIGNED_INT_SAMPLER_BUFFER,
GL_UNSIGNED_INT_SAMPLER_2D_RECT,
#endif
};
namespace Shader {
int UniformState::Hash(const int v0, const int v1, const int v2, const int v3) const
{
int hash = ~0;
hash += v0 ^ (hash * 33);
hash += v1 ^ (hash * 33);
hash += v2 ^ (hash * 33);
hash += v3 ^ (hash * 33);
return hash;
}
int UniformState::Hash(const int* v, int count) const
{
int hash = ~0;
for (int n = 0; n < count; ++n) {
hash += v[n] ^ (hash * 33);
}
return hash;
}
bool UniformState::IsLocationValid() const
{
#ifdef HEADLESS
// our stub headers are outdated and are missing GL_INVALID_INDEX
return false;
#else
return (location != GL_INVALID_INDEX);
#endif
}
#ifdef DEBUG
void UniformState::AssertType(int type) const
{
int utype = this->type;
if (samplerTypes.find(utype) != samplerTypes.end())
utype = GL_INT;
assert(type == utype || utype == -1);
}
#endif
unsigned int SShaderFlagState::GetHash()
{
if (updates != lastUpdates) {
const std::string defs = GetString();
lastUpdates = updates;
lastHash = HsiehHash(&defs[0], defs.length(), 997);
assert(lastHash != 0);
}
return lastHash;
}
}
|