blob: 8e3e99429ff7004784dd61efe6f94aa7a3f3843f [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2008-2012 NVIDIA Corporation.
** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Quick 3D.
**
** $QT_BEGIN_LICENSE:GPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QSSG_RENDER_DYNAMIC_OBJECT_SYSTEM_H
#define QSSG_RENDER_DYNAMIC_OBJECT_SYSTEM_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include <QtQuick3DRender/private/qssgrenderbasetypes_p.h>
#include <QtQuick3DRender/private/qssgrenderbasetypes_p.h>
#include <QtQuick3DRuntimeRender/private/qssgrendershadercache_p.h>
#include <QtQuick3DRuntimeRender/private/qssgrendertessmodevalues_p.h>
#include <QtQuick3DRuntimeRender/private/qssgrendergraphobject_p.h>
#include <QtGui/QVector2D>
#include <QtCore/QString>
#include <QtCore/qmutex.h>
QT_BEGIN_NAMESPACE
struct QSSGRenderDynamicGraphObject;
// struct SWriteBuffer;
// struct SStrRemapMap;
class QSSGRenderContextInterface;
struct QSSGDynamicObjectClass;
typedef QPair<QByteArray, QByteArray> TStrStrPair;
namespace dynamic {
struct QSSGDynamicShaderMapKey
{
TStrStrPair m_name;
ShaderFeatureSetList m_features;
TessellationModeValues m_tessMode;
bool m_wireframeMode;
uint m_hashCode;
QSSGDynamicShaderMapKey(TStrStrPair inName, ShaderFeatureSetList inFeatures, TessellationModeValues inTessMode, bool inWireframeMode)
: m_name(inName), m_tessMode(inTessMode), m_wireframeMode(inWireframeMode)
{
for (int i = 0; i < inFeatures.size(); ++i) {
m_features.append(inFeatures[i]);
}
m_hashCode = qHash(m_name) ^ hashShaderFeatureSet(m_features) ^ qHash(m_tessMode) ^ qHash(m_wireframeMode);
}
bool operator==(const QSSGDynamicShaderMapKey &inKey) const
{
return m_name == inKey.m_name && m_features == inKey.m_features && m_tessMode == inKey.m_tessMode
&& m_wireframeMode == inKey.m_wireframeMode;
}
};
struct QSSGCommand;
struct QSSGDynamicShaderProgramFlags : public QSSGShaderCacheProgramFlags
{
TessellationModeValues tessMode = TessellationModeValues::NoTessellation;
bool wireframeMode = false;
QSSGDynamicShaderProgramFlags() = default;
QSSGDynamicShaderProgramFlags(TessellationModeValues inTessMode, bool inWireframeMode)
: tessMode(inTessMode), wireframeMode(inWireframeMode)
{
}
static const char *wireframeToString(bool inEnable)
{
if (inEnable)
return "wireframeMode:true";
else
return "wireframeMode:false";
}
};
}
struct QSSGDynamicObjectShaderInfo
{
QByteArray m_type; ///< shader type (GLSL or HLSL)
QByteArray m_version; ///< shader version (e.g. 330 vor GLSL)
bool m_hasGeomShader;
bool m_isComputeShader;
QSSGDynamicObjectShaderInfo() : m_hasGeomShader(false), m_isComputeShader(false) {}
QSSGDynamicObjectShaderInfo(const QByteArray &inType, const QByteArray &inVersion, bool inHasGeomShader, bool inIsComputeShader)
: m_type(inType), m_version(inVersion), m_hasGeomShader(inHasGeomShader), m_isComputeShader(inIsComputeShader)
{
}
};
typedef QPair<QSSGRef<QSSGRenderShaderProgram>, dynamic::QSSGDynamicShaderProgramFlags> TShaderAndFlags;
struct QSSGDynamicObjectSystem
{
typedef QHash<QByteArray, QByteArray> TPathDataMap;
typedef QHash<QByteArray, QSSGDynamicObjectShaderInfo> TShaderInfoMap;
typedef QSet<QString> TPathSet;
typedef QHash<dynamic::QSSGDynamicShaderMapKey, TShaderAndFlags> TShaderMap;
QSSGRenderContextInterface *m_context;
TPathDataMap m_expandedFiles;
TShaderMap m_shaderMap;
TShaderInfoMap m_shaderInfoMap;
QByteArray m_vertShader;
QByteArray m_fragShader;
QByteArray m_geometryShader;
QByteArray m_shaderLibraryVersion;
QString m_shaderLibraryPlatformDirectory;
mutable QMutex m_propertyLoadMutex;
QAtomicInt ref;
static QString getShaderCodeLibraryDirectory();
QSSGDynamicObjectSystem(QSSGRenderContextInterface *ctx);
~QSSGDynamicObjectSystem();
void setShaderData(const QByteArray &inPath,
const QByteArray &inData,
const QByteArray &inShaderType,
const QByteArray &inShaderVersion,
bool inHasGeomShader,
bool inIsComputeShader);
QByteArray getShaderCacheKey(const QByteArray &inId, const QByteArray &inProgramMacro, const dynamic::QSSGDynamicShaderProgramFlags &inFlags);
void insertShaderHeaderInformation(QByteArray &theReadBuffer, const QByteArray &inPathToEffect);
void doInsertShaderHeaderInformation(QByteArray &theReadBuffer, const QByteArray &inPathToEffect);
QByteArray doLoadShader(const QByteArray &inPathToEffect);
QStringList getParameters(const QString &str, int begin, int end);
void insertSnapperDirectives(QString &str);
QSSGRef<QSSGRenderShaderProgram> compileShader(const QByteArray &inId,
const QByteArray &inProgramSource,
const QByteArray &inGeomSource,
const QByteArray &inProgramMacroName,
const ShaderFeatureSetList &inFeatureSet,
const dynamic::QSSGDynamicShaderProgramFlags &inFlags,
bool inForceCompilation = false);
// This just returns the custom material shader source without compiling
QByteArray getShaderSource(const QByteArray &inPath);
TShaderAndFlags getShaderProgram(const QByteArray &inPath,
const QByteArray &inProgramMacro,
const ShaderFeatureSetList &inFeatureSet,
const dynamic::QSSGDynamicShaderProgramFlags &inFlags,
bool inForceCompilation);
TShaderAndFlags getDepthPrepassShader(const QByteArray &inPath, const QByteArray &inPMacro, const ShaderFeatureSetList &inFeatureSet);
void setShaderCodeLibraryVersion(const QByteArray &version);
QByteArray shaderCodeLibraryVersion();
void setShaderCodeLibraryPlatformDirectory(const QString &directory);
QString shaderCodeLibraryPlatformDirectory();
};
QT_END_NAMESPACE
#endif