// Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include "shader.h" #include #include #include void Shader::load(QVulkanInstance *inst, VkDevice dev, const QString &fn) { reset(); m_maybeRunning = true; m_future = QtConcurrent::run([inst, dev, fn]() { ShaderData sd; QFile f(fn); if (!f.open(QIODevice::ReadOnly)) { qWarning("Failed to open %s", qPrintable(fn)); return sd; } QByteArray blob = f.readAll(); VkShaderModuleCreateInfo shaderInfo; memset(&shaderInfo, 0, sizeof(shaderInfo)); shaderInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; shaderInfo.codeSize = blob.size(); shaderInfo.pCode = reinterpret_cast(blob.constData()); VkResult err = inst->deviceFunctions(dev)->vkCreateShaderModule(dev, &shaderInfo, nullptr, &sd.shaderModule); if (err != VK_SUCCESS) { qWarning("Failed to create shader module: %d", err); return sd; } return sd; }); } ShaderData *Shader::data() { if (m_maybeRunning && !m_data.isValid()) m_data = m_future.result(); return &m_data; } void Shader::reset() { *data() = ShaderData(); m_maybeRunning = false; }