Revision control
Copy as Markdown
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
// Qt-Security score:significant reason:default
#include "qspirvshaderremap_p.h"
#include <SPIRV/SPVRemapper.h>
QT_BEGIN_NAMESPACE
void QSpirvShaderRemapper::remapErrorHandler(const std::string &s)
{
if (!remapErrorMsg.isEmpty())
remapErrorMsg.append(QLatin1Char('\n'));
remapErrorMsg.append(QString::fromStdString(s));
}
void QSpirvShaderRemapper::remapLogHandler(const std::string &)
{
}
QByteArray QSpirvShaderRemapper::remap(const QByteArray &ir, QSpirvShader::RemapFlags flags)
{
if (ir.isEmpty())
return QByteArray();
remapErrorMsg.clear();
spv::spirvbin_t b;
b.registerErrorHandler(std::bind(&QSpirvShaderRemapper::remapErrorHandler, this, std::placeholders::_1));
b.registerLogHandler(std::bind(&QSpirvShaderRemapper::remapLogHandler, this, std::placeholders::_1));
const uint32_t opts = flags.testFlag(QSpirvShader::RemapFlag::StripOnly) ? spv::spirvbin_t::STRIP
: spv::spirvbin_t::DO_EVERYTHING;
std::vector<uint32_t> v;
v.resize(ir.size() / 4);
memcpy(v.data(), ir.constData(), v.size() * 4);
b.remap(v, opts);
if (!remapErrorMsg.isEmpty())
return QByteArray();
return QByteArray(reinterpret_cast<const char *>(v.data()), int(v.size()) * 4);
}
QT_END_NAMESPACE