for(auto& item : mImpl->shaderEntries)
{
auto& itemInfo = item.shaderImpl->GetCreateInfo();
+
+ // Check metadata
if(itemInfo.pipelineStage != shaderCreateInfo.pipelineStage ||
itemInfo.shaderlanguage != shaderCreateInfo.shaderlanguage ||
- itemInfo.sourceMode != shaderCreateInfo.sourceMode ||
- itemInfo.sourceSize != shaderCreateInfo.sourceSize)
+ itemInfo.sourceMode != shaderCreateInfo.sourceMode)
+ {
+ continue;
+ }
+
+ // Get offset of source. Since prefix might be removed after ShaderImpl created,
+ // we should compare only after the offset.
+ auto sourceOffset = item.shaderImpl->GetSourceOffset();
+ if(itemInfo.sourceSize + sourceOffset != shaderCreateInfo.sourceSize)
{
continue;
}
- if(memcmp(itemInfo.sourceData, shaderCreateInfo.sourceData, itemInfo.sourceSize) == 0)
+ if(memcmp(itemInfo.sourceData, reinterpret_cast<const uint8_t*>(shaderCreateInfo.sourceData) + sourceOffset, itemInfo.sourceSize) == 0)
{
return item.shaderImpl.get();
}
// Make a copy of source code. if code is meant to be used
// by modern parser, skip the prefix part
- size_t dataStartIndex = 0;
size_t dataSize;
- ShaderImpl::StripLegacyCodeIfNeeded(_createInfo, dataStartIndex, glslVersion, dataSize);
+ ShaderImpl::StripLegacyCodeIfNeeded(_createInfo, sourceOffset, glslVersion, dataSize);
source.resize(dataSize);
- std::copy(reinterpret_cast<const uint8_t*>(_createInfo.sourceData) + dataStartIndex,
- reinterpret_cast<const uint8_t*>(_createInfo.sourceData) + dataStartIndex + dataSize,
+ std::copy(reinterpret_cast<const uint8_t*>(_createInfo.sourceData) + sourceOffset,
+ reinterpret_cast<const uint8_t*>(_createInfo.sourceData) + sourceOffset + dataSize,
source.data());
// Substitute pointer
std::vector<uint8_t> source{};
std::vector<uint8_t> sourcePreprocessed{};
+ size_t sourceOffset{0u}; /// byte offset of source data from original CreateInfo.
+ /// It will be changed after call StripLegacyCodeIfNeeded
+ /// More detail, createInfo.sourceData[0] == source[0] == (original CreateInfo).sourceData[sourceOffset];
+
uint32_t glShader{};
uint32_t refCount{0u};
uint32_t flushCount{0u}; ///< Number of frames at refCount=0
return mImpl->glslVersion;
}
+[[nodiscard]] size_t ShaderImpl::GetSourceOffset() const
+{
+ return mImpl->sourceOffset;
+}
+
/**
* @brief Compiles shader
*
void ShaderImpl::StripLegacyCodeIfNeeded(const ShaderCreateInfo& info, size_t& startIndex, uint32_t& glslVersion, size_t& finalDataSize)
{
+ startIndex = 0u;
+
+ // Fast-out if shader is not a text.
+ if(info.sourceMode != ShaderSourceMode::TEXT)
+ {
+ glslVersion = info.shaderVersion;
+ finalDataSize = info.sourceSize;
+ return;
+ }
+
// Make a copy of source code. if code is meant to be used
// by modern parser, skip the prefix part
auto text = reinterpret_cast<const char*>(info.sourceData);
else if(result == 0)
{
char* end;
- startIndex = std::strtoul(reinterpret_cast<const char*>(info.sourceData) + 21, &end, 10);
+ startIndex = std::strtoul(reinterpret_cast<const char*>(info.sourceData) + 21, &end, 10);
+ glslVersion = info.shaderVersion;
}
}
else