update glslang (#103)
* update glslang * update glslang on android and metal Co-authored-by: coulsonwang <coulsonwang@126.com>
This commit is contained in:
parent
eab0959367
commit
b2e669956e
|
|
@ -114,7 +114,11 @@ add_library(SPIRV STATIC IMPORTED GLOBAL)
|
||||||
set_target_properties(SPIRV PROPERTIES
|
set_target_properties(SPIRV PROPERTIES
|
||||||
IMPORTED_LOCATION ${platform_spec_path}/glslang/libSPIRV.a
|
IMPORTED_LOCATION ${platform_spec_path}/glslang/libSPIRV.a
|
||||||
)
|
)
|
||||||
set(glslang_libs_name glslang OGLCompiler OSDependent SPIRV)
|
add_library(glslang-default-resource-limits STATIC IMPORTED GLOBAL)
|
||||||
|
set_target_properties(glslang-default-resource-limits PROPERTIES
|
||||||
|
IMPORTED_LOCATION ${platform_spec_path}/glslang/libglslang-default-resource-limits.a
|
||||||
|
)
|
||||||
|
set(glslang_libs_name glslang OGLCompiler OSDependent SPIRV glslang-default-resource-limits)
|
||||||
|
|
||||||
|
|
||||||
list(APPEND CC_EXTERNAL_LIBS
|
list(APPEND CC_EXTERNAL_LIBS
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,57 @@
|
||||||
|
//
|
||||||
|
// Copyright (C) 2016 Google, Inc.
|
||||||
|
//
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions
|
||||||
|
// are met:
|
||||||
|
//
|
||||||
|
// Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following
|
||||||
|
// disclaimer in the documentation and/or other materials provided
|
||||||
|
// with the distribution.
|
||||||
|
//
|
||||||
|
// Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived
|
||||||
|
// from this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
|
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
// POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
#ifndef _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_
|
||||||
|
#define _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "../glslang/Include/ResourceLimits.h"
|
||||||
|
|
||||||
|
namespace glslang {
|
||||||
|
|
||||||
|
// These are the default resources for TBuiltInResources, used for both
|
||||||
|
// - parsing this string for the case where the user didn't supply one,
|
||||||
|
// - dumping out a template for user construction of a config file.
|
||||||
|
extern const TBuiltInResource DefaultTBuiltInResource;
|
||||||
|
|
||||||
|
// Returns the DefaultTBuiltInResource as a human-readable string.
|
||||||
|
std::string GetDefaultTBuiltInResourceString();
|
||||||
|
|
||||||
|
// Decodes the resource limits from |config| to |resources|.
|
||||||
|
void DecodeResourceLimits(TBuiltInResource* resources, char* config);
|
||||||
|
|
||||||
|
} // end namespace glslang
|
||||||
|
|
||||||
|
#endif // _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
/**
|
||||||
|
BSD 2-Clause License
|
||||||
|
|
||||||
|
Copyright (c) 2020, Travis Fort
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef _STAND_ALONE_RESOURCE_LIMITS_C_INCLUDED_
|
||||||
|
#define _STAND_ALONE_RESOURCE_LIMITS_C_INCLUDED_
|
||||||
|
|
||||||
|
#include "../glslang/Include/glslang_c_interface.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// These are the default resources for TBuiltInResources, used for both
|
||||||
|
// - parsing this string for the case where the user didn't supply one,
|
||||||
|
// - dumping out a template for user construction of a config file.
|
||||||
|
const glslang_resource_t* glslang_default_resource(void);
|
||||||
|
|
||||||
|
// Returns the DefaultTBuiltInResource as a human-readable string.
|
||||||
|
// NOTE: User is responsible for freeing this string.
|
||||||
|
const char* glslang_default_resource_string();
|
||||||
|
|
||||||
|
// Decodes the resource limits from |config| to |resources|.
|
||||||
|
void glslang_decode_resource_limits(glslang_resource_t* resources, char* config);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // _STAND_ALONE_RESOURCE_LIMITS_C_INCLUDED_
|
||||||
|
|
@ -231,6 +231,9 @@ enum TBuiltInVariable {
|
||||||
EbvFragSizeEXT,
|
EbvFragSizeEXT,
|
||||||
EbvFragInvocationCountEXT,
|
EbvFragInvocationCountEXT,
|
||||||
|
|
||||||
|
EbvSecondaryFragDataEXT,
|
||||||
|
EbvSecondaryFragColorEXT,
|
||||||
|
|
||||||
EbvViewportMaskNV,
|
EbvViewportMaskNV,
|
||||||
EbvSecondaryPositionNV,
|
EbvSecondaryPositionNV,
|
||||||
EbvSecondaryViewportMaskNV,
|
EbvSecondaryViewportMaskNV,
|
||||||
|
|
@ -433,6 +436,9 @@ __inline const char* GetBuiltInVariableString(TBuiltInVariable v)
|
||||||
case EbvFragSizeEXT: return "FragSizeEXT";
|
case EbvFragSizeEXT: return "FragSizeEXT";
|
||||||
case EbvFragInvocationCountEXT: return "FragInvocationCountEXT";
|
case EbvFragInvocationCountEXT: return "FragInvocationCountEXT";
|
||||||
|
|
||||||
|
case EbvSecondaryFragDataEXT: return "SecondaryFragDataEXT";
|
||||||
|
case EbvSecondaryFragColorEXT: return "SecondaryFragColorEXT";
|
||||||
|
|
||||||
case EbvViewportMaskNV: return "ViewportMaskNV";
|
case EbvViewportMaskNV: return "ViewportMaskNV";
|
||||||
case EbvSecondaryPositionNV: return "SecondaryPositionNV";
|
case EbvSecondaryPositionNV: return "SecondaryPositionNV";
|
||||||
case EbvSecondaryViewportMaskNV: return "SecondaryViewportMaskNV";
|
case EbvSecondaryViewportMaskNV: return "SecondaryViewportMaskNV";
|
||||||
|
|
@ -142,6 +142,7 @@ struct TBuiltInResource {
|
||||||
int maxTaskWorkGroupSizeY_NV;
|
int maxTaskWorkGroupSizeY_NV;
|
||||||
int maxTaskWorkGroupSizeZ_NV;
|
int maxTaskWorkGroupSizeZ_NV;
|
||||||
int maxMeshViewCountNV;
|
int maxMeshViewCountNV;
|
||||||
|
int maxDualSourceDrawBuffersEXT;
|
||||||
|
|
||||||
TLimits limits;
|
TLimits limits;
|
||||||
};
|
};
|
||||||
|
|
@ -1235,6 +1235,7 @@ struct TShaderQualifiers {
|
||||||
bool layoutDerivativeGroupQuads; // true if layout derivative_group_quadsNV set
|
bool layoutDerivativeGroupQuads; // true if layout derivative_group_quadsNV set
|
||||||
bool layoutDerivativeGroupLinear; // true if layout derivative_group_linearNV set
|
bool layoutDerivativeGroupLinear; // true if layout derivative_group_linearNV set
|
||||||
int primitives; // mesh shader "max_primitives"DerivativeGroupLinear; // true if layout derivative_group_linearNV set
|
int primitives; // mesh shader "max_primitives"DerivativeGroupLinear; // true if layout derivative_group_linearNV set
|
||||||
|
bool layoutPrimitiveCulling; // true if layout primitive_culling set
|
||||||
TLayoutDepth getDepth() const { return layoutDepth; }
|
TLayoutDepth getDepth() const { return layoutDepth; }
|
||||||
#else
|
#else
|
||||||
TLayoutDepth getDepth() const { return EldNone; }
|
TLayoutDepth getDepth() const { return EldNone; }
|
||||||
|
|
@ -1268,6 +1269,7 @@ struct TShaderQualifiers {
|
||||||
layoutOverrideCoverage = false;
|
layoutOverrideCoverage = false;
|
||||||
layoutDerivativeGroupQuads = false;
|
layoutDerivativeGroupQuads = false;
|
||||||
layoutDerivativeGroupLinear = false;
|
layoutDerivativeGroupLinear = false;
|
||||||
|
layoutPrimitiveCulling = false;
|
||||||
primitives = TQualifier::layoutNotSet;
|
primitives = TQualifier::layoutNotSet;
|
||||||
interlockOrdering = EioNone;
|
interlockOrdering = EioNone;
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -1331,6 +1333,8 @@ struct TShaderQualifiers {
|
||||||
primitives = src.primitives;
|
primitives = src.primitives;
|
||||||
if (src.interlockOrdering != EioNone)
|
if (src.interlockOrdering != EioNone)
|
||||||
interlockOrdering = src.interlockOrdering;
|
interlockOrdering = src.interlockOrdering;
|
||||||
|
if (src.layoutPrimitiveCulling)
|
||||||
|
layoutPrimitiveCulling = src.layoutPrimitiveCulling;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -148,6 +148,7 @@ typedef struct glslang_resource_s {
|
||||||
int max_task_work_group_size_y_nv;
|
int max_task_work_group_size_y_nv;
|
||||||
int max_task_work_group_size_z_nv;
|
int max_task_work_group_size_z_nv;
|
||||||
int max_mesh_view_count_nv;
|
int max_mesh_view_count_nv;
|
||||||
|
int maxDualSourceDrawBuffersEXT;
|
||||||
|
|
||||||
glslang_limits_t limits;
|
glslang_limits_t limits;
|
||||||
} glslang_resource_t;
|
} glslang_resource_t;
|
||||||
|
|
@ -164,6 +164,9 @@ typedef enum {
|
||||||
GLSLANG_REFLECTION_SEPARATE_BUFFERS_BIT = (1 << 3),
|
GLSLANG_REFLECTION_SEPARATE_BUFFERS_BIT = (1 << 3),
|
||||||
GLSLANG_REFLECTION_ALL_BLOCK_VARIABLES_BIT = (1 << 4),
|
GLSLANG_REFLECTION_ALL_BLOCK_VARIABLES_BIT = (1 << 4),
|
||||||
GLSLANG_REFLECTION_UNWRAP_IO_BLOCKS_BIT = (1 << 5),
|
GLSLANG_REFLECTION_UNWRAP_IO_BLOCKS_BIT = (1 << 5),
|
||||||
|
GLSLANG_REFLECTION_ALL_IO_VARIABLES_BIT = (1 << 6),
|
||||||
|
GLSLANG_REFLECTION_SHARED_STD140_SSBO_BIT = (1 << 7),
|
||||||
|
GLSLANG_REFLECTION_SHARED_STD140_UBO_BIT = (1 << 8),
|
||||||
LAST_ELEMENT_MARKER(GLSLANG_REFLECTION_COUNT),
|
LAST_ELEMENT_MARKER(GLSLANG_REFLECTION_COUNT),
|
||||||
} glslang_reflection_options_t;
|
} glslang_reflection_options_t;
|
||||||
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
// This header is generated by the make-revision script.
|
// This header is generated by the make-revision script.
|
||||||
|
|
||||||
#define GLSLANG_PATCH_LEVEL 3743
|
#define GLSLANG_PATCH_LEVEL 3795
|
||||||
|
|
@ -68,6 +68,7 @@ class TScanContext;
|
||||||
class TPpContext;
|
class TPpContext;
|
||||||
|
|
||||||
typedef std::set<int> TIdSetType;
|
typedef std::set<int> TIdSetType;
|
||||||
|
typedef std::map<const TTypeList*, std::map<size_t, const TTypeList*>> TStructRecord;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Sharable code (as well as what's in TParseVersions) across
|
// Sharable code (as well as what's in TParseVersions) across
|
||||||
|
|
@ -315,6 +316,7 @@ public:
|
||||||
TIntermTyped* handleBinaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* left, TIntermTyped* right);
|
TIntermTyped* handleBinaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* left, TIntermTyped* right);
|
||||||
TIntermTyped* handleUnaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* childNode);
|
TIntermTyped* handleUnaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* childNode);
|
||||||
TIntermTyped* handleDotDereference(const TSourceLoc&, TIntermTyped* base, const TString& field);
|
TIntermTyped* handleDotDereference(const TSourceLoc&, TIntermTyped* base, const TString& field);
|
||||||
|
TIntermTyped* handleDotSwizzle(const TSourceLoc&, TIntermTyped* base, const TString& field);
|
||||||
void blockMemberExtensionCheck(const TSourceLoc&, const TIntermTyped* base, int member, const TString& memberName);
|
void blockMemberExtensionCheck(const TSourceLoc&, const TIntermTyped* base, int member, const TString& memberName);
|
||||||
TFunction* handleFunctionDeclarator(const TSourceLoc&, TFunction& function, bool prototype);
|
TFunction* handleFunctionDeclarator(const TSourceLoc&, TFunction& function, bool prototype);
|
||||||
TIntermAggregate* handleFunctionDefinition(const TSourceLoc&, TFunction&);
|
TIntermAggregate* handleFunctionDefinition(const TSourceLoc&, TFunction&);
|
||||||
|
|
@ -417,12 +419,15 @@ public:
|
||||||
void fixBlockLocations(const TSourceLoc&, TQualifier&, TTypeList&, bool memberWithLocation, bool memberWithoutLocation);
|
void fixBlockLocations(const TSourceLoc&, TQualifier&, TTypeList&, bool memberWithLocation, bool memberWithoutLocation);
|
||||||
void fixXfbOffsets(TQualifier&, TTypeList&);
|
void fixXfbOffsets(TQualifier&, TTypeList&);
|
||||||
void fixBlockUniformOffsets(TQualifier&, TTypeList&);
|
void fixBlockUniformOffsets(TQualifier&, TTypeList&);
|
||||||
|
void fixBlockUniformLayoutMatrix(TQualifier&, TTypeList*, TTypeList*);
|
||||||
|
void fixBlockUniformLayoutPacking(TQualifier&, TTypeList*, TTypeList*);
|
||||||
void addQualifierToExisting(const TSourceLoc&, TQualifier, const TString& identifier);
|
void addQualifierToExisting(const TSourceLoc&, TQualifier, const TString& identifier);
|
||||||
void addQualifierToExisting(const TSourceLoc&, TQualifier, TIdentifierList&);
|
void addQualifierToExisting(const TSourceLoc&, TQualifier, TIdentifierList&);
|
||||||
void invariantCheck(const TSourceLoc&, const TQualifier&);
|
void invariantCheck(const TSourceLoc&, const TQualifier&);
|
||||||
void updateStandaloneQualifierDefaults(const TSourceLoc&, const TPublicType&);
|
void updateStandaloneQualifierDefaults(const TSourceLoc&, const TPublicType&);
|
||||||
void wrapupSwitchSubsequence(TIntermAggregate* statements, TIntermNode* branchNode);
|
void wrapupSwitchSubsequence(TIntermAggregate* statements, TIntermNode* branchNode);
|
||||||
TIntermNode* addSwitch(const TSourceLoc&, TIntermTyped* expression, TIntermAggregate* body);
|
TIntermNode* addSwitch(const TSourceLoc&, TIntermTyped* expression, TIntermAggregate* body);
|
||||||
|
const TTypeList* recordStructCopy(TStructRecord&, const TType*, const TType*);
|
||||||
|
|
||||||
#ifndef GLSLANG_WEB
|
#ifndef GLSLANG_WEB
|
||||||
TAttributeType attributeFromName(const TString& name) const;
|
TAttributeType attributeFromName(const TString& name) const;
|
||||||
|
|
@ -483,6 +488,8 @@ protected:
|
||||||
bool anyIndexLimits;
|
bool anyIndexLimits;
|
||||||
TIdSetType inductiveLoopIds;
|
TIdSetType inductiveLoopIds;
|
||||||
TVector<TIntermTyped*> needsIndexLimitationChecking;
|
TVector<TIntermTyped*> needsIndexLimitationChecking;
|
||||||
|
TStructRecord matrixFixRecord;
|
||||||
|
TStructRecord packingFixRecord;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Geometry shader input arrays:
|
// Geometry shader input arrays:
|
||||||
|
|
@ -36,6 +36,7 @@
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
// POSSIBILITY OF SUCH DAMAGE.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef _VERSIONS_INCLUDED_
|
#ifndef _VERSIONS_INCLUDED_
|
||||||
#define _VERSIONS_INCLUDED_
|
#define _VERSIONS_INCLUDED_
|
||||||
|
|
||||||
|
|
@ -52,7 +53,7 @@
|
||||||
// Don't maintain an ordinal set of enums (0,1,2,3...) to avoid all possible
|
// Don't maintain an ordinal set of enums (0,1,2,3...) to avoid all possible
|
||||||
// defects from mixing the two different forms.
|
// defects from mixing the two different forms.
|
||||||
//
|
//
|
||||||
typedef enum {
|
typedef enum : unsigned {
|
||||||
EBadProfile = 0,
|
EBadProfile = 0,
|
||||||
ENoProfile = (1 << 0), // only for desktop, before profiles showed up
|
ENoProfile = (1 << 0), // only for desktop, before profiles showed up
|
||||||
ECoreProfile = (1 << 1),
|
ECoreProfile = (1 << 1),
|
||||||
|
|
@ -157,6 +158,7 @@ const char* const E_GL_ARB_shader_image_size = "GL_ARB_shader_image_s
|
||||||
const char* const E_GL_ARB_shader_storage_buffer_object = "GL_ARB_shader_storage_buffer_object";
|
const char* const E_GL_ARB_shader_storage_buffer_object = "GL_ARB_shader_storage_buffer_object";
|
||||||
const char* const E_GL_ARB_shading_language_packing = "GL_ARB_shading_language_packing";
|
const char* const E_GL_ARB_shading_language_packing = "GL_ARB_shading_language_packing";
|
||||||
const char* const E_GL_ARB_texture_query_lod = "GL_ARB_texture_query_lod";
|
const char* const E_GL_ARB_texture_query_lod = "GL_ARB_texture_query_lod";
|
||||||
|
const char* const E_GL_ARB_vertex_attrib_64bit = "GL_ARB_vertex_attrib_64bit";
|
||||||
|
|
||||||
const char* const E_GL_KHR_shader_subgroup_basic = "GL_KHR_shader_subgroup_basic";
|
const char* const E_GL_KHR_shader_subgroup_basic = "GL_KHR_shader_subgroup_basic";
|
||||||
const char* const E_GL_KHR_shader_subgroup_vote = "GL_KHR_shader_subgroup_vote";
|
const char* const E_GL_KHR_shader_subgroup_vote = "GL_KHR_shader_subgroup_vote";
|
||||||
|
|
@ -195,6 +197,8 @@ const char* const E_GL_EXT_debug_printf = "GL_EXT_debug_prin
|
||||||
const char* const E_GL_EXT_ray_tracing = "GL_EXT_ray_tracing";
|
const char* const E_GL_EXT_ray_tracing = "GL_EXT_ray_tracing";
|
||||||
const char* const E_GL_EXT_ray_query = "GL_EXT_ray_query";
|
const char* const E_GL_EXT_ray_query = "GL_EXT_ray_query";
|
||||||
const char* const E_GL_EXT_ray_flags_primitive_culling = "GL_EXT_ray_flags_primitive_culling";
|
const char* const E_GL_EXT_ray_flags_primitive_culling = "GL_EXT_ray_flags_primitive_culling";
|
||||||
|
const char* const E_GL_EXT_blend_func_extended = "GL_EXT_blend_func_extended";
|
||||||
|
const char* const E_GL_EXT_shader_implicit_conversions = "GL_EXT_shader_implicit_conversions";
|
||||||
|
|
||||||
// Arrays of extensions for the above viewportEXTs duplications
|
// Arrays of extensions for the above viewportEXTs duplications
|
||||||
|
|
||||||
|
|
@ -266,6 +270,7 @@ const char* const E_GL_EXT_tessellation_shader = "GL_EXT_tessel
|
||||||
const char* const E_GL_EXT_tessellation_point_size = "GL_EXT_tessellation_point_size";
|
const char* const E_GL_EXT_tessellation_point_size = "GL_EXT_tessellation_point_size";
|
||||||
const char* const E_GL_EXT_texture_buffer = "GL_EXT_texture_buffer";
|
const char* const E_GL_EXT_texture_buffer = "GL_EXT_texture_buffer";
|
||||||
const char* const E_GL_EXT_texture_cube_map_array = "GL_EXT_texture_cube_map_array";
|
const char* const E_GL_EXT_texture_cube_map_array = "GL_EXT_texture_cube_map_array";
|
||||||
|
const char* const E_GL_EXT_shader_integer_mix = "GL_EXT_shader_integer_mix";
|
||||||
|
|
||||||
// OES matching AEP
|
// OES matching AEP
|
||||||
const char* const E_GL_OES_geometry_shader = "GL_OES_geometry_shader";
|
const char* const E_GL_OES_geometry_shader = "GL_OES_geometry_shader";
|
||||||
|
|
@ -203,6 +203,7 @@ public:
|
||||||
void endCollect(EShLanguage) override;
|
void endCollect(EShLanguage) override;
|
||||||
void reserverStorageSlot(TVarEntryInfo& ent, TInfoSink& infoSink) override;
|
void reserverStorageSlot(TVarEntryInfo& ent, TInfoSink& infoSink) override;
|
||||||
void reserverResourceSlot(TVarEntryInfo& ent, TInfoSink& infoSink) override;
|
void reserverResourceSlot(TVarEntryInfo& ent, TInfoSink& infoSink) override;
|
||||||
|
const TString& getAccessName(const TIntermSymbol*);
|
||||||
// in/out symbol and uniform symbol are stored in the same resourceSlotMap, the storage key is used to identify each type of symbol.
|
// in/out symbol and uniform symbol are stored in the same resourceSlotMap, the storage key is used to identify each type of symbol.
|
||||||
// We use stage and storage qualifier to construct a storage key. it can help us identify the same storage resource used in different stage.
|
// We use stage and storage qualifier to construct a storage key. it can help us identify the same storage resource used in different stage.
|
||||||
// if a resource is a program resource and we don't need know it usage stage, we can use same stage to build storage key.
|
// if a resource is a program resource and we don't need know it usage stage, we can use same stage to build storage key.
|
||||||
|
|
@ -238,12 +239,13 @@ typedef std::map<TString, TVarEntryInfo> TVarLiveMap;
|
||||||
// In the future, if the vc++ compiler can handle such a situation,
|
// In the future, if the vc++ compiler can handle such a situation,
|
||||||
// this part of the code will be removed.
|
// this part of the code will be removed.
|
||||||
struct TVarLivePair : std::pair<const TString, TVarEntryInfo> {
|
struct TVarLivePair : std::pair<const TString, TVarEntryInfo> {
|
||||||
TVarLivePair(std::pair<const TString, TVarEntryInfo>& _Right) : pair(_Right.first, _Right.second) {}
|
TVarLivePair(const std::pair<const TString, TVarEntryInfo>& _Right) : pair(_Right.first, _Right.second) {}
|
||||||
TVarLivePair& operator=(const TVarLivePair& _Right) {
|
TVarLivePair& operator=(const TVarLivePair& _Right) {
|
||||||
const_cast<TString&>(first) = _Right.first;
|
const_cast<TString&>(first) = _Right.first;
|
||||||
second = _Right.second;
|
second = _Right.second;
|
||||||
return (*this);
|
return (*this);
|
||||||
}
|
}
|
||||||
|
TVarLivePair(const TVarLivePair& src) : pair(src) { }
|
||||||
};
|
};
|
||||||
typedef std::vector<TVarLivePair> TVarLiveVector;
|
typedef std::vector<TVarLivePair> TVarLiveVector;
|
||||||
|
|
||||||
|
|
@ -265,6 +265,7 @@ public:
|
||||||
computeDerivativeMode(LayoutDerivativeNone),
|
computeDerivativeMode(LayoutDerivativeNone),
|
||||||
primitives(TQualifier::layoutNotSet),
|
primitives(TQualifier::layoutNotSet),
|
||||||
numTaskNVBlocks(0),
|
numTaskNVBlocks(0),
|
||||||
|
layoutPrimitiveCulling(false),
|
||||||
autoMapBindings(false),
|
autoMapBindings(false),
|
||||||
autoMapLocations(false),
|
autoMapLocations(false),
|
||||||
flattenUniformArrays(false),
|
flattenUniformArrays(false),
|
||||||
|
|
@ -356,8 +357,15 @@ public:
|
||||||
}
|
}
|
||||||
const SpvVersion& getSpv() const { return spvVersion; }
|
const SpvVersion& getSpv() const { return spvVersion; }
|
||||||
EShLanguage getStage() const { return language; }
|
EShLanguage getStage() const { return language; }
|
||||||
void addRequestedExtension(const char* extension) { requestedExtensions.insert(extension); }
|
void updateRequestedExtension(const char* extension, TExtensionBehavior behavior) {
|
||||||
const std::set<std::string>& getRequestedExtensions() const { return requestedExtensions; }
|
if(requestedExtensions.find(extension) != requestedExtensions.end()) {
|
||||||
|
requestedExtensions[extension] = behavior;
|
||||||
|
} else {
|
||||||
|
requestedExtensions.insert(std::make_pair(extension, behavior));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::map<std::string, TExtensionBehavior>& getRequestedExtensions() const { return requestedExtensions; }
|
||||||
|
|
||||||
void setTreeRoot(TIntermNode* r) { treeRoot = r; }
|
void setTreeRoot(TIntermNode* r) { treeRoot = r; }
|
||||||
TIntermNode* getTreeRoot() const { return treeRoot; }
|
TIntermNode* getTreeRoot() const { return treeRoot; }
|
||||||
|
|
@ -392,7 +400,7 @@ public:
|
||||||
void setSource(EShSource s) { source = s; }
|
void setSource(EShSource s) { source = s; }
|
||||||
EShSource getSource() const { return source; }
|
EShSource getSource() const { return source; }
|
||||||
#else
|
#else
|
||||||
void setSource(EShSource s) { assert(s == EShSourceGlsl); }
|
void setSource(EShSource s) { assert(s == EShSourceGlsl); (void)s; }
|
||||||
EShSource getSource() const { return EShSourceGlsl; }
|
EShSource getSource() const { return EShSourceGlsl; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -735,6 +743,8 @@ public:
|
||||||
void setLayoutDerivativeMode(ComputeDerivativeMode mode) { computeDerivativeMode = mode; }
|
void setLayoutDerivativeMode(ComputeDerivativeMode mode) { computeDerivativeMode = mode; }
|
||||||
bool hasLayoutDerivativeModeNone() const { return computeDerivativeMode != LayoutDerivativeNone; }
|
bool hasLayoutDerivativeModeNone() const { return computeDerivativeMode != LayoutDerivativeNone; }
|
||||||
ComputeDerivativeMode getLayoutDerivativeModeNone() const { return computeDerivativeMode; }
|
ComputeDerivativeMode getLayoutDerivativeModeNone() const { return computeDerivativeMode; }
|
||||||
|
void setLayoutPrimitiveCulling() { layoutPrimitiveCulling = true; }
|
||||||
|
bool getLayoutPrimitiveCulling() const { return layoutPrimitiveCulling; }
|
||||||
bool setPrimitives(int m)
|
bool setPrimitives(int m)
|
||||||
{
|
{
|
||||||
if (primitives != TQualifier::layoutNotSet)
|
if (primitives != TQualifier::layoutNotSet)
|
||||||
|
|
@ -902,7 +912,13 @@ protected:
|
||||||
#ifdef GLSLANG_WEB
|
#ifdef GLSLANG_WEB
|
||||||
bool extensionRequested(const char *extension) const { return false; }
|
bool extensionRequested(const char *extension) const { return false; }
|
||||||
#else
|
#else
|
||||||
bool extensionRequested(const char *extension) const {return requestedExtensions.find(extension) != requestedExtensions.end();}
|
bool extensionRequested(const char *extension) const {
|
||||||
|
auto it = requestedExtensions.find(extension);
|
||||||
|
if (it != requestedExtensions.end()) {
|
||||||
|
return (it->second == EBhDisable) ? false : true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const char* getResourceName(TResourceType);
|
static const char* getResourceName(TResourceType);
|
||||||
|
|
@ -917,7 +933,7 @@ protected:
|
||||||
int version; // source version
|
int version; // source version
|
||||||
SpvVersion spvVersion;
|
SpvVersion spvVersion;
|
||||||
TIntermNode* treeRoot;
|
TIntermNode* treeRoot;
|
||||||
std::set<std::string> requestedExtensions; // cumulation of all enabled or required extensions; not connected to what subset of the shader used them
|
std::map<std::string, TExtensionBehavior> requestedExtensions; // cumulation of all enabled or required extensions; not connected to what subset of the shader used them
|
||||||
TBuiltInResource resources;
|
TBuiltInResource resources;
|
||||||
int numEntryPoints;
|
int numEntryPoints;
|
||||||
int numErrors;
|
int numErrors;
|
||||||
|
|
@ -961,6 +977,7 @@ protected:
|
||||||
ComputeDerivativeMode computeDerivativeMode;
|
ComputeDerivativeMode computeDerivativeMode;
|
||||||
int primitives;
|
int primitives;
|
||||||
int numTaskNVBlocks;
|
int numTaskNVBlocks;
|
||||||
|
bool layoutPrimitiveCulling;
|
||||||
|
|
||||||
// Base shift values
|
// Base shift values
|
||||||
std::array<unsigned int, EResCount> shiftBinding;
|
std::array<unsigned int, EResCount> shiftBinding;
|
||||||
|
|
@ -101,6 +101,7 @@ public:
|
||||||
void updateExtensionBehavior(int line, const char* const extension, const char* behavior) { }
|
void updateExtensionBehavior(int line, const char* const extension, const char* behavior) { }
|
||||||
void updateExtensionBehavior(const char* const extension, TExtensionBehavior) { }
|
void updateExtensionBehavior(const char* const extension, TExtensionBehavior) { }
|
||||||
void checkExtensionStage(const TSourceLoc&, const char* const extension) { }
|
void checkExtensionStage(const TSourceLoc&, const char* const extension) { }
|
||||||
|
void extensionRequires(const TSourceLoc&, const char* const extension, const char* behavior) { }
|
||||||
void fullIntegerCheck(const TSourceLoc&, const char* op) { }
|
void fullIntegerCheck(const TSourceLoc&, const char* op) { }
|
||||||
void doubleCheck(const TSourceLoc&, const char* op) { }
|
void doubleCheck(const TSourceLoc&, const char* op) { }
|
||||||
bool float16Arithmetic() { return false; }
|
bool float16Arithmetic() { return false; }
|
||||||
|
|
@ -139,6 +140,7 @@ public:
|
||||||
virtual bool checkExtensionsRequested(const TSourceLoc&, int numExtensions, const char* const extensions[],
|
virtual bool checkExtensionsRequested(const TSourceLoc&, int numExtensions, const char* const extensions[],
|
||||||
const char* featureDesc);
|
const char* featureDesc);
|
||||||
virtual void checkExtensionStage(const TSourceLoc&, const char* const extension);
|
virtual void checkExtensionStage(const TSourceLoc&, const char* const extension);
|
||||||
|
virtual void extensionRequires(const TSourceLoc&, const char* const extension, const char* behavior);
|
||||||
virtual void fullIntegerCheck(const TSourceLoc&, const char* op);
|
virtual void fullIntegerCheck(const TSourceLoc&, const char* op);
|
||||||
|
|
||||||
virtual void unimplemented(const TSourceLoc&, const char* featureDesc);
|
virtual void unimplemented(const TSourceLoc&, const char* featureDesc);
|
||||||
|
|
@ -170,6 +172,7 @@ public:
|
||||||
virtual void vulkanRemoved(const TSourceLoc&, const char* op);
|
virtual void vulkanRemoved(const TSourceLoc&, const char* op);
|
||||||
virtual void requireVulkan(const TSourceLoc&, const char* op);
|
virtual void requireVulkan(const TSourceLoc&, const char* op);
|
||||||
virtual void requireSpv(const TSourceLoc&, const char* op);
|
virtual void requireSpv(const TSourceLoc&, const char* op);
|
||||||
|
virtual void requireSpv(const TSourceLoc&, const char *op, unsigned int version);
|
||||||
|
|
||||||
|
|
||||||
#if defined(GLSLANG_WEB) && !defined(GLSLANG_WEB_DEVEL)
|
#if defined(GLSLANG_WEB) && !defined(GLSLANG_WEB_DEVEL)
|
||||||
|
|
@ -222,6 +225,7 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
TMap<TString, TExtensionBehavior> extensionBehavior; // for each extension string, what its current behavior is set to
|
TMap<TString, TExtensionBehavior> extensionBehavior; // for each extension string, what its current behavior is set to
|
||||||
|
TMap<TString, unsigned int> extensionMinSpv; // for each extension string, store minimum spirv required
|
||||||
EShMessages messages; // errors/warnings/rule-sets
|
EShMessages messages; // errors/warnings/rule-sets
|
||||||
int numErrors; // number of compile-time errors encountered
|
int numErrors; // number of compile-time errors encountered
|
||||||
TInputScanner* currentScanner;
|
TInputScanner* currentScanner;
|
||||||
|
|
@ -68,7 +68,7 @@
|
||||||
// This should always increase, as some paths to do not consume
|
// This should always increase, as some paths to do not consume
|
||||||
// a more major number.
|
// a more major number.
|
||||||
// It should increment by one when new functionality is added.
|
// It should increment by one when new functionality is added.
|
||||||
#define GLSLANG_MINOR_VERSION 13
|
#define GLSLANG_MINOR_VERSION 14
|
||||||
|
|
||||||
//
|
//
|
||||||
// Call before doing any other compiler/linker operations.
|
// Call before doing any other compiler/linker operations.
|
||||||
|
|
@ -109,7 +109,7 @@ typedef enum {
|
||||||
LAST_ELEMENT_MARKER(EShLangCount),
|
LAST_ELEMENT_MARKER(EShLangCount),
|
||||||
} EShLanguage; // would be better as stage, but this is ancient now
|
} EShLanguage; // would be better as stage, but this is ancient now
|
||||||
|
|
||||||
typedef enum {
|
typedef enum : unsigned {
|
||||||
EShLangVertexMask = (1 << EShLangVertex),
|
EShLangVertexMask = (1 << EShLangVertex),
|
||||||
EShLangTessControlMask = (1 << EShLangTessControl),
|
EShLangTessControlMask = (1 << EShLangTessControl),
|
||||||
EShLangTessEvaluationMask = (1 << EShLangTessEvaluation),
|
EShLangTessEvaluationMask = (1 << EShLangTessEvaluation),
|
||||||
|
|
@ -240,7 +240,7 @@ typedef enum {
|
||||||
//
|
//
|
||||||
// Message choices for what errors and warnings are given.
|
// Message choices for what errors and warnings are given.
|
||||||
//
|
//
|
||||||
enum EShMessages {
|
enum EShMessages : unsigned {
|
||||||
EShMsgDefault = 0, // default is to give all required errors and extra warnings
|
EShMsgDefault = 0, // default is to give all required errors and extra warnings
|
||||||
EShMsgRelaxedErrors = (1 << 0), // be liberal in accepting input
|
EShMsgRelaxedErrors = (1 << 0), // be liberal in accepting input
|
||||||
EShMsgSuppressWarnings = (1 << 1), // suppress all warnings, except those required by the specification
|
EShMsgSuppressWarnings = (1 << 1), // suppress all warnings, except those required by the specification
|
||||||
|
|
@ -255,7 +255,7 @@ enum EShMessages {
|
||||||
EShMsgDebugInfo = (1 << 10), // save debug information
|
EShMsgDebugInfo = (1 << 10), // save debug information
|
||||||
EShMsgHlslEnable16BitTypes = (1 << 11), // enable use of 16-bit types in SPIR-V for HLSL
|
EShMsgHlslEnable16BitTypes = (1 << 11), // enable use of 16-bit types in SPIR-V for HLSL
|
||||||
EShMsgHlslLegalization = (1 << 12), // enable HLSL Legalization messages
|
EShMsgHlslLegalization = (1 << 12), // enable HLSL Legalization messages
|
||||||
EShMsgHlslDX9Compatible = (1 << 13), // enable HLSL DX9 compatible mode (right now only for samplers)
|
EShMsgHlslDX9Compatible = (1 << 13), // enable HLSL DX9 compatible mode (for samplers and semantics)
|
||||||
EShMsgBuiltinSymbolTable = (1 << 14), // print the builtin symbol table
|
EShMsgBuiltinSymbolTable = (1 << 14), // print the builtin symbol table
|
||||||
LAST_ELEMENT_MARKER(EShMsgCount),
|
LAST_ELEMENT_MARKER(EShMsgCount),
|
||||||
};
|
};
|
||||||
|
|
@ -271,6 +271,9 @@ typedef enum {
|
||||||
EShReflectionSeparateBuffers = (1 << 3), // buffer variables and buffer blocks are reflected separately
|
EShReflectionSeparateBuffers = (1 << 3), // buffer variables and buffer blocks are reflected separately
|
||||||
EShReflectionAllBlockVariables = (1 << 4), // reflect all variables in blocks, even if they are inactive
|
EShReflectionAllBlockVariables = (1 << 4), // reflect all variables in blocks, even if they are inactive
|
||||||
EShReflectionUnwrapIOBlocks = (1 << 5), // unwrap input/output blocks the same as with uniform blocks
|
EShReflectionUnwrapIOBlocks = (1 << 5), // unwrap input/output blocks the same as with uniform blocks
|
||||||
|
EShReflectionAllIOVariables = (1 << 6), // reflect all input/output variables, even if they are inactive
|
||||||
|
EShReflectionSharedStd140SSBO = (1 << 7), // Apply std140/shared rules for ubo to ssbo
|
||||||
|
EShReflectionSharedStd140UBO = (1 << 8), // Apply std140/shared rules for ubo to ssbo
|
||||||
LAST_ELEMENT_MARKER(EShReflectionCount),
|
LAST_ELEMENT_MARKER(EShReflectionCount),
|
||||||
} EShReflectionOptions;
|
} EShReflectionOptions;
|
||||||
|
|
||||||
|
|
@ -412,6 +415,7 @@ enum TResourceType {
|
||||||
EResCount
|
EResCount
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// Make one TShader per shader that you will link into a program. Then
|
// Make one TShader per shader that you will link into a program. Then
|
||||||
// - provide the shader through setStrings() or setStringsWithLengths()
|
// - provide the shader through setStrings() or setStringsWithLengths()
|
||||||
// - optionally call setEnv*(), see below for more detail
|
// - optionally call setEnv*(), see below for more detail
|
||||||
|
|
@ -694,6 +698,7 @@ public:
|
||||||
int counterIndex;
|
int counterIndex;
|
||||||
int numMembers;
|
int numMembers;
|
||||||
int arrayStride; // stride of an array variable
|
int arrayStride; // stride of an array variable
|
||||||
|
int topLevelArraySize; // size of the top-level variable in a storage buffer member
|
||||||
int topLevelArrayStride; // stride of the top-level variable in a storage buffer member
|
int topLevelArrayStride; // stride of the top-level variable in a storage buffer member
|
||||||
EShLanguageMask stages;
|
EShLanguageMask stages;
|
||||||
|
|
||||||
|
|
@ -1,108 +0,0 @@
|
||||||
/*
|
|
||||||
** Copyright (c) 2014-2016 The Khronos Group Inc.
|
|
||||||
**
|
|
||||||
** Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
** of this software and/or associated documentation files (the "Materials"),
|
|
||||||
** to deal in the Materials without restriction, including without limitation
|
|
||||||
** the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
** and/or sell copies of the Materials, and to permit persons to whom the
|
|
||||||
** Materials are furnished to do so, subject to the following conditions:
|
|
||||||
**
|
|
||||||
** The above copyright notice and this permission notice shall be included in
|
|
||||||
** all copies or substantial portions of the Materials.
|
|
||||||
**
|
|
||||||
** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS
|
|
||||||
** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND
|
|
||||||
** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/
|
|
||||||
**
|
|
||||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS
|
|
||||||
** IN THE MATERIALS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef GLSLextAMD_H
|
|
||||||
#define GLSLextAMD_H
|
|
||||||
|
|
||||||
static const int GLSLextAMDVersion = 100;
|
|
||||||
static const int GLSLextAMDRevision = 7;
|
|
||||||
|
|
||||||
// SPV_AMD_shader_ballot
|
|
||||||
static const char* const E_SPV_AMD_shader_ballot = "SPV_AMD_shader_ballot";
|
|
||||||
|
|
||||||
enum ShaderBallotAMD {
|
|
||||||
ShaderBallotBadAMD = 0, // Don't use
|
|
||||||
|
|
||||||
SwizzleInvocationsAMD = 1,
|
|
||||||
SwizzleInvocationsMaskedAMD = 2,
|
|
||||||
WriteInvocationAMD = 3,
|
|
||||||
MbcntAMD = 4,
|
|
||||||
|
|
||||||
ShaderBallotCountAMD
|
|
||||||
};
|
|
||||||
|
|
||||||
// SPV_AMD_shader_trinary_minmax
|
|
||||||
static const char* const E_SPV_AMD_shader_trinary_minmax = "SPV_AMD_shader_trinary_minmax";
|
|
||||||
|
|
||||||
enum ShaderTrinaryMinMaxAMD {
|
|
||||||
ShaderTrinaryMinMaxBadAMD = 0, // Don't use
|
|
||||||
|
|
||||||
FMin3AMD = 1,
|
|
||||||
UMin3AMD = 2,
|
|
||||||
SMin3AMD = 3,
|
|
||||||
FMax3AMD = 4,
|
|
||||||
UMax3AMD = 5,
|
|
||||||
SMax3AMD = 6,
|
|
||||||
FMid3AMD = 7,
|
|
||||||
UMid3AMD = 8,
|
|
||||||
SMid3AMD = 9,
|
|
||||||
|
|
||||||
ShaderTrinaryMinMaxCountAMD
|
|
||||||
};
|
|
||||||
|
|
||||||
// SPV_AMD_shader_explicit_vertex_parameter
|
|
||||||
static const char* const E_SPV_AMD_shader_explicit_vertex_parameter = "SPV_AMD_shader_explicit_vertex_parameter";
|
|
||||||
|
|
||||||
enum ShaderExplicitVertexParameterAMD {
|
|
||||||
ShaderExplicitVertexParameterBadAMD = 0, // Don't use
|
|
||||||
|
|
||||||
InterpolateAtVertexAMD = 1,
|
|
||||||
|
|
||||||
ShaderExplicitVertexParameterCountAMD
|
|
||||||
};
|
|
||||||
|
|
||||||
// SPV_AMD_gcn_shader
|
|
||||||
static const char* const E_SPV_AMD_gcn_shader = "SPV_AMD_gcn_shader";
|
|
||||||
|
|
||||||
enum GcnShaderAMD {
|
|
||||||
GcnShaderBadAMD = 0, // Don't use
|
|
||||||
|
|
||||||
CubeFaceIndexAMD = 1,
|
|
||||||
CubeFaceCoordAMD = 2,
|
|
||||||
TimeAMD = 3,
|
|
||||||
|
|
||||||
GcnShaderCountAMD
|
|
||||||
};
|
|
||||||
|
|
||||||
// SPV_AMD_gpu_shader_half_float
|
|
||||||
static const char* const E_SPV_AMD_gpu_shader_half_float = "SPV_AMD_gpu_shader_half_float";
|
|
||||||
|
|
||||||
// SPV_AMD_texture_gather_bias_lod
|
|
||||||
static const char* const E_SPV_AMD_texture_gather_bias_lod = "SPV_AMD_texture_gather_bias_lod";
|
|
||||||
|
|
||||||
// SPV_AMD_gpu_shader_int16
|
|
||||||
static const char* const E_SPV_AMD_gpu_shader_int16 = "SPV_AMD_gpu_shader_int16";
|
|
||||||
|
|
||||||
// SPV_AMD_shader_image_load_store_lod
|
|
||||||
static const char* const E_SPV_AMD_shader_image_load_store_lod = "SPV_AMD_shader_image_load_store_lod";
|
|
||||||
|
|
||||||
// SPV_AMD_shader_fragment_mask
|
|
||||||
static const char* const E_SPV_AMD_shader_fragment_mask = "SPV_AMD_shader_fragment_mask";
|
|
||||||
|
|
||||||
// SPV_AMD_gpu_shader_half_float_fetch
|
|
||||||
static const char* const E_SPV_AMD_gpu_shader_half_float_fetch = "SPV_AMD_gpu_shader_half_float_fetch";
|
|
||||||
|
|
||||||
#endif // #ifndef GLSLextAMD_H
|
|
||||||
|
|
@ -1,39 +0,0 @@
|
||||||
/*
|
|
||||||
** Copyright (c) 2014-2016 The Khronos Group Inc.
|
|
||||||
**
|
|
||||||
** Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
** of this software and/or associated documentation files (the "Materials"),
|
|
||||||
** to deal in the Materials without restriction, including without limitation
|
|
||||||
** the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
** and/or sell copies of the Materials, and to permit persons to whom the
|
|
||||||
** Materials are furnished to do so, subject to the following conditions:
|
|
||||||
**
|
|
||||||
** The above copyright notice and this permission notice shall be included in
|
|
||||||
** all copies or substantial portions of the Materials.
|
|
||||||
**
|
|
||||||
** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS
|
|
||||||
** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND
|
|
||||||
** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/
|
|
||||||
**
|
|
||||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS
|
|
||||||
** IN THE MATERIALS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef GLSLextEXT_H
|
|
||||||
#define GLSLextEXT_H
|
|
||||||
|
|
||||||
static const int GLSLextEXTVersion = 100;
|
|
||||||
static const int GLSLextEXTRevision = 2;
|
|
||||||
|
|
||||||
static const char* const E_SPV_EXT_shader_stencil_export = "SPV_EXT_shader_stencil_export";
|
|
||||||
static const char* const E_SPV_EXT_shader_viewport_index_layer = "SPV_EXT_shader_viewport_index_layer";
|
|
||||||
static const char* const E_SPV_EXT_fragment_fully_covered = "SPV_EXT_fragment_fully_covered";
|
|
||||||
static const char* const E_SPV_EXT_fragment_invocation_density = "SPV_EXT_fragment_invocation_density";
|
|
||||||
static const char* const E_SPV_EXT_demote_to_helper_invocation = "SPV_EXT_demote_to_helper_invocation";
|
|
||||||
|
|
||||||
#endif // #ifndef GLSLextEXT_H
|
|
||||||
|
|
@ -1,51 +0,0 @@
|
||||||
/*
|
|
||||||
** Copyright (c) 2014-2020 The Khronos Group Inc.
|
|
||||||
** Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.
|
|
||||||
**
|
|
||||||
** Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
** of this software and/or associated documentation files (the "Materials"),
|
|
||||||
** to deal in the Materials without restriction, including without limitation
|
|
||||||
** the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
** and/or sell copies of the Materials, and to permit persons to whom the
|
|
||||||
** Materials are furnished to do so, subject to the following conditions:
|
|
||||||
**
|
|
||||||
** The above copyright notice and this permission notice shall be included in
|
|
||||||
** all copies or substantial portions of the Materials.
|
|
||||||
**
|
|
||||||
** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS
|
|
||||||
** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND
|
|
||||||
** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/
|
|
||||||
**
|
|
||||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS
|
|
||||||
** IN THE MATERIALS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef GLSLextKHR_H
|
|
||||||
#define GLSLextKHR_H
|
|
||||||
|
|
||||||
static const int GLSLextKHRVersion = 100;
|
|
||||||
static const int GLSLextKHRRevision = 2;
|
|
||||||
|
|
||||||
static const char* const E_SPV_KHR_shader_ballot = "SPV_KHR_shader_ballot";
|
|
||||||
static const char* const E_SPV_KHR_subgroup_vote = "SPV_KHR_subgroup_vote";
|
|
||||||
static const char* const E_SPV_KHR_device_group = "SPV_KHR_device_group";
|
|
||||||
static const char* const E_SPV_KHR_multiview = "SPV_KHR_multiview";
|
|
||||||
static const char* const E_SPV_KHR_shader_draw_parameters = "SPV_KHR_shader_draw_parameters";
|
|
||||||
static const char* const E_SPV_KHR_16bit_storage = "SPV_KHR_16bit_storage";
|
|
||||||
static const char* const E_SPV_KHR_8bit_storage = "SPV_KHR_8bit_storage";
|
|
||||||
static const char* const E_SPV_KHR_storage_buffer_storage_class = "SPV_KHR_storage_buffer_storage_class";
|
|
||||||
static const char* const E_SPV_KHR_post_depth_coverage = "SPV_KHR_post_depth_coverage";
|
|
||||||
static const char* const E_SPV_KHR_vulkan_memory_model = "SPV_KHR_vulkan_memory_model";
|
|
||||||
static const char* const E_SPV_EXT_physical_storage_buffer = "SPV_EXT_physical_storage_buffer";
|
|
||||||
static const char* const E_SPV_KHR_physical_storage_buffer = "SPV_KHR_physical_storage_buffer";
|
|
||||||
static const char* const E_SPV_EXT_fragment_shader_interlock = "SPV_EXT_fragment_shader_interlock";
|
|
||||||
static const char* const E_SPV_KHR_shader_clock = "SPV_KHR_shader_clock";
|
|
||||||
static const char* const E_SPV_KHR_non_semantic_info = "SPV_KHR_non_semantic_info";
|
|
||||||
static const char* const E_SPV_KHR_ray_tracing = "SPV_KHR_ray_tracing";
|
|
||||||
static const char* const E_SPV_KHR_ray_query = "SPV_KHR_ray_query";
|
|
||||||
#endif // #ifndef GLSLextKHR_H
|
|
||||||
|
|
@ -1,81 +0,0 @@
|
||||||
/*
|
|
||||||
** Copyright (c) 2014-2017 The Khronos Group Inc.
|
|
||||||
**
|
|
||||||
** Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
** of this software and/or associated documentation files (the "Materials"),
|
|
||||||
** to deal in the Materials without restriction, including without limitation
|
|
||||||
** the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
** and/or sell copies of the Materials, and to permit persons to whom the
|
|
||||||
** Materials are furnished to do so, subject to the following conditions:
|
|
||||||
**
|
|
||||||
** The above copyright notice and this permission notice shall be included in
|
|
||||||
** all copies or substantial portions of the Materials.
|
|
||||||
**
|
|
||||||
** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS
|
|
||||||
** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND
|
|
||||||
** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/
|
|
||||||
**
|
|
||||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS
|
|
||||||
** IN THE MATERIALS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef GLSLextNV_H
|
|
||||||
#define GLSLextNV_H
|
|
||||||
|
|
||||||
enum BuiltIn;
|
|
||||||
enum Decoration;
|
|
||||||
enum Op;
|
|
||||||
enum Capability;
|
|
||||||
|
|
||||||
static const int GLSLextNVVersion = 100;
|
|
||||||
static const int GLSLextNVRevision = 11;
|
|
||||||
|
|
||||||
//SPV_NV_sample_mask_override_coverage
|
|
||||||
const char* const E_SPV_NV_sample_mask_override_coverage = "SPV_NV_sample_mask_override_coverage";
|
|
||||||
|
|
||||||
//SPV_NV_geometry_shader_passthrough
|
|
||||||
const char* const E_SPV_NV_geometry_shader_passthrough = "SPV_NV_geometry_shader_passthrough";
|
|
||||||
|
|
||||||
//SPV_NV_viewport_array2
|
|
||||||
const char* const E_SPV_NV_viewport_array2 = "SPV_NV_viewport_array2";
|
|
||||||
const char* const E_ARB_shader_viewport_layer_array = "SPV_ARB_shader_viewport_layer_array";
|
|
||||||
|
|
||||||
//SPV_NV_stereo_view_rendering
|
|
||||||
const char* const E_SPV_NV_stereo_view_rendering = "SPV_NV_stereo_view_rendering";
|
|
||||||
|
|
||||||
//SPV_NVX_multiview_per_view_attributes
|
|
||||||
const char* const E_SPV_NVX_multiview_per_view_attributes = "SPV_NVX_multiview_per_view_attributes";
|
|
||||||
|
|
||||||
//SPV_NV_shader_subgroup_partitioned
|
|
||||||
const char* const E_SPV_NV_shader_subgroup_partitioned = "SPV_NV_shader_subgroup_partitioned";
|
|
||||||
|
|
||||||
//SPV_NV_fragment_shader_barycentric
|
|
||||||
const char* const E_SPV_NV_fragment_shader_barycentric = "SPV_NV_fragment_shader_barycentric";
|
|
||||||
|
|
||||||
//SPV_NV_compute_shader_derivatives
|
|
||||||
const char* const E_SPV_NV_compute_shader_derivatives = "SPV_NV_compute_shader_derivatives";
|
|
||||||
|
|
||||||
//SPV_NV_shader_image_footprint
|
|
||||||
const char* const E_SPV_NV_shader_image_footprint = "SPV_NV_shader_image_footprint";
|
|
||||||
|
|
||||||
//SPV_NV_mesh_shader
|
|
||||||
const char* const E_SPV_NV_mesh_shader = "SPV_NV_mesh_shader";
|
|
||||||
|
|
||||||
//SPV_NV_raytracing
|
|
||||||
const char* const E_SPV_NV_ray_tracing = "SPV_NV_ray_tracing";
|
|
||||||
|
|
||||||
//SPV_NV_shading_rate
|
|
||||||
const char* const E_SPV_NV_shading_rate = "SPV_NV_shading_rate";
|
|
||||||
|
|
||||||
//SPV_NV_cooperative_matrix
|
|
||||||
const char* const E_SPV_NV_cooperative_matrix = "SPV_NV_cooperative_matrix";
|
|
||||||
|
|
||||||
//SPV_NV_shader_sm_builtins
|
|
||||||
const char* const E_SPV_NV_shader_sm_builtins = "SPV_NV_shader_sm_builtins";
|
|
||||||
|
|
||||||
#endif // #ifndef GLSLextNV_H
|
|
||||||
|
|
@ -1,131 +0,0 @@
|
||||||
/*
|
|
||||||
** Copyright (c) 2014-2016 The Khronos Group Inc.
|
|
||||||
**
|
|
||||||
** Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
** of this software and/or associated documentation files (the "Materials"),
|
|
||||||
** to deal in the Materials without restriction, including without limitation
|
|
||||||
** the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
** and/or sell copies of the Materials, and to permit persons to whom the
|
|
||||||
** Materials are furnished to do so, subject to the following conditions:
|
|
||||||
**
|
|
||||||
** The above copyright notice and this permission notice shall be included in
|
|
||||||
** all copies or substantial portions of the Materials.
|
|
||||||
**
|
|
||||||
** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS
|
|
||||||
** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND
|
|
||||||
** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/
|
|
||||||
**
|
|
||||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS
|
|
||||||
** IN THE MATERIALS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef GLSLstd450_H
|
|
||||||
#define GLSLstd450_H
|
|
||||||
|
|
||||||
static const int GLSLstd450Version = 100;
|
|
||||||
static const int GLSLstd450Revision = 1;
|
|
||||||
|
|
||||||
enum GLSLstd450 {
|
|
||||||
GLSLstd450Bad = 0, // Don't use
|
|
||||||
|
|
||||||
GLSLstd450Round = 1,
|
|
||||||
GLSLstd450RoundEven = 2,
|
|
||||||
GLSLstd450Trunc = 3,
|
|
||||||
GLSLstd450FAbs = 4,
|
|
||||||
GLSLstd450SAbs = 5,
|
|
||||||
GLSLstd450FSign = 6,
|
|
||||||
GLSLstd450SSign = 7,
|
|
||||||
GLSLstd450Floor = 8,
|
|
||||||
GLSLstd450Ceil = 9,
|
|
||||||
GLSLstd450Fract = 10,
|
|
||||||
|
|
||||||
GLSLstd450Radians = 11,
|
|
||||||
GLSLstd450Degrees = 12,
|
|
||||||
GLSLstd450Sin = 13,
|
|
||||||
GLSLstd450Cos = 14,
|
|
||||||
GLSLstd450Tan = 15,
|
|
||||||
GLSLstd450Asin = 16,
|
|
||||||
GLSLstd450Acos = 17,
|
|
||||||
GLSLstd450Atan = 18,
|
|
||||||
GLSLstd450Sinh = 19,
|
|
||||||
GLSLstd450Cosh = 20,
|
|
||||||
GLSLstd450Tanh = 21,
|
|
||||||
GLSLstd450Asinh = 22,
|
|
||||||
GLSLstd450Acosh = 23,
|
|
||||||
GLSLstd450Atanh = 24,
|
|
||||||
GLSLstd450Atan2 = 25,
|
|
||||||
|
|
||||||
GLSLstd450Pow = 26,
|
|
||||||
GLSLstd450Exp = 27,
|
|
||||||
GLSLstd450Log = 28,
|
|
||||||
GLSLstd450Exp2 = 29,
|
|
||||||
GLSLstd450Log2 = 30,
|
|
||||||
GLSLstd450Sqrt = 31,
|
|
||||||
GLSLstd450InverseSqrt = 32,
|
|
||||||
|
|
||||||
GLSLstd450Determinant = 33,
|
|
||||||
GLSLstd450MatrixInverse = 34,
|
|
||||||
|
|
||||||
GLSLstd450Modf = 35, // second operand needs an OpVariable to write to
|
|
||||||
GLSLstd450ModfStruct = 36, // no OpVariable operand
|
|
||||||
GLSLstd450FMin = 37,
|
|
||||||
GLSLstd450UMin = 38,
|
|
||||||
GLSLstd450SMin = 39,
|
|
||||||
GLSLstd450FMax = 40,
|
|
||||||
GLSLstd450UMax = 41,
|
|
||||||
GLSLstd450SMax = 42,
|
|
||||||
GLSLstd450FClamp = 43,
|
|
||||||
GLSLstd450UClamp = 44,
|
|
||||||
GLSLstd450SClamp = 45,
|
|
||||||
GLSLstd450FMix = 46,
|
|
||||||
GLSLstd450IMix = 47, // Reserved
|
|
||||||
GLSLstd450Step = 48,
|
|
||||||
GLSLstd450SmoothStep = 49,
|
|
||||||
|
|
||||||
GLSLstd450Fma = 50,
|
|
||||||
GLSLstd450Frexp = 51, // second operand needs an OpVariable to write to
|
|
||||||
GLSLstd450FrexpStruct = 52, // no OpVariable operand
|
|
||||||
GLSLstd450Ldexp = 53,
|
|
||||||
|
|
||||||
GLSLstd450PackSnorm4x8 = 54,
|
|
||||||
GLSLstd450PackUnorm4x8 = 55,
|
|
||||||
GLSLstd450PackSnorm2x16 = 56,
|
|
||||||
GLSLstd450PackUnorm2x16 = 57,
|
|
||||||
GLSLstd450PackHalf2x16 = 58,
|
|
||||||
GLSLstd450PackDouble2x32 = 59,
|
|
||||||
GLSLstd450UnpackSnorm2x16 = 60,
|
|
||||||
GLSLstd450UnpackUnorm2x16 = 61,
|
|
||||||
GLSLstd450UnpackHalf2x16 = 62,
|
|
||||||
GLSLstd450UnpackSnorm4x8 = 63,
|
|
||||||
GLSLstd450UnpackUnorm4x8 = 64,
|
|
||||||
GLSLstd450UnpackDouble2x32 = 65,
|
|
||||||
|
|
||||||
GLSLstd450Length = 66,
|
|
||||||
GLSLstd450Distance = 67,
|
|
||||||
GLSLstd450Cross = 68,
|
|
||||||
GLSLstd450Normalize = 69,
|
|
||||||
GLSLstd450FaceForward = 70,
|
|
||||||
GLSLstd450Reflect = 71,
|
|
||||||
GLSLstd450Refract = 72,
|
|
||||||
|
|
||||||
GLSLstd450FindILsb = 73,
|
|
||||||
GLSLstd450FindSMsb = 74,
|
|
||||||
GLSLstd450FindUMsb = 75,
|
|
||||||
|
|
||||||
GLSLstd450InterpolateAtCentroid = 76,
|
|
||||||
GLSLstd450InterpolateAtSample = 77,
|
|
||||||
GLSLstd450InterpolateAtOffset = 78,
|
|
||||||
|
|
||||||
GLSLstd450NMin = 79,
|
|
||||||
GLSLstd450NMax = 80,
|
|
||||||
GLSLstd450NClamp = 81,
|
|
||||||
|
|
||||||
GLSLstd450Count
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // #ifndef GLSLstd450_H
|
|
||||||
|
|
@ -1,83 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2016 Google, Inc.
|
|
||||||
//
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef GLSLANG_SPIRV_LOGGER_H
|
|
||||||
#define GLSLANG_SPIRV_LOGGER_H
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace spv {
|
|
||||||
|
|
||||||
// A class for holding all SPIR-V build status messages, including
|
|
||||||
// missing/TBD functionalities, warnings, and errors.
|
|
||||||
class SpvBuildLogger {
|
|
||||||
public:
|
|
||||||
SpvBuildLogger() {}
|
|
||||||
|
|
||||||
#ifdef GLSLANG_WEB
|
|
||||||
void tbdFunctionality(const std::string& f) { }
|
|
||||||
void missingFunctionality(const std::string& f) { }
|
|
||||||
void warning(const std::string& w) { }
|
|
||||||
void error(const std::string& e) { errors.push_back(e); }
|
|
||||||
std::string getAllMessages() { return ""; }
|
|
||||||
#else
|
|
||||||
|
|
||||||
// Registers a TBD functionality.
|
|
||||||
void tbdFunctionality(const std::string& f);
|
|
||||||
// Registers a missing functionality.
|
|
||||||
void missingFunctionality(const std::string& f);
|
|
||||||
|
|
||||||
// Logs a warning.
|
|
||||||
void warning(const std::string& w) { warnings.push_back(w); }
|
|
||||||
// Logs an error.
|
|
||||||
void error(const std::string& e) { errors.push_back(e); }
|
|
||||||
|
|
||||||
// Returns all messages accumulated in the order of:
|
|
||||||
// TBD functionalities, missing functionalities, warnings, errors.
|
|
||||||
std::string getAllMessages() const;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
private:
|
|
||||||
SpvBuildLogger(const SpvBuildLogger&);
|
|
||||||
|
|
||||||
std::vector<std::string> tbdFeatures;
|
|
||||||
std::vector<std::string> missingFeatures;
|
|
||||||
std::vector<std::string> warnings;
|
|
||||||
std::vector<std::string> errors;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // end spv namespace
|
|
||||||
|
|
||||||
#endif // GLSLANG_SPIRV_LOGGER_H
|
|
||||||
|
|
@ -1,50 +0,0 @@
|
||||||
// Copyright (c) 2020 The Khronos Group Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
||||||
// copy of this software and/or associated documentation files (the
|
|
||||||
// "Materials"), to deal in the Materials without restriction, including
|
|
||||||
// without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
// distribute, sublicense, and/or sell copies of the Materials, and to
|
|
||||||
// permit persons to whom the Materials are furnished to do so, subject to
|
|
||||||
// the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included
|
|
||||||
// in all copies or substantial portions of the Materials.
|
|
||||||
//
|
|
||||||
// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS
|
|
||||||
// KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS
|
|
||||||
// SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT
|
|
||||||
// https://www.khronos.org/registry/
|
|
||||||
//
|
|
||||||
// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef SPIRV_UNIFIED1_NonSemanticDebugPrintf_H_
|
|
||||||
#define SPIRV_UNIFIED1_NonSemanticDebugPrintf_H_
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
enum {
|
|
||||||
NonSemanticDebugPrintfRevision = 1,
|
|
||||||
NonSemanticDebugPrintfRevision_BitWidthPadding = 0x7fffffff
|
|
||||||
};
|
|
||||||
|
|
||||||
enum NonSemanticDebugPrintfInstructions {
|
|
||||||
NonSemanticDebugPrintfDebugPrintf = 1,
|
|
||||||
NonSemanticDebugPrintfInstructionsMax = 0x7fffffff
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // SPIRV_UNIFIED1_NonSemanticDebugPrintf_H_
|
|
||||||
|
|
@ -1,304 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2015 LunarG, Inc.
|
|
||||||
//
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef SPIRVREMAPPER_H
|
|
||||||
#define SPIRVREMAPPER_H
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <exception>
|
|
||||||
|
|
||||||
namespace spv {
|
|
||||||
|
|
||||||
// MSVC defines __cplusplus as an older value, even when it supports almost all of 11.
|
|
||||||
// We handle that here by making our own symbol.
|
|
||||||
#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1700)
|
|
||||||
# define use_cpp11 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class spirvbin_base_t
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
enum Options {
|
|
||||||
NONE = 0,
|
|
||||||
STRIP = (1<<0),
|
|
||||||
MAP_TYPES = (1<<1),
|
|
||||||
MAP_NAMES = (1<<2),
|
|
||||||
MAP_FUNCS = (1<<3),
|
|
||||||
DCE_FUNCS = (1<<4),
|
|
||||||
DCE_VARS = (1<<5),
|
|
||||||
DCE_TYPES = (1<<6),
|
|
||||||
OPT_LOADSTORE = (1<<7),
|
|
||||||
OPT_FWD_LS = (1<<8), // EXPERIMENTAL: PRODUCES INVALID SCHEMA-0 SPIRV
|
|
||||||
MAP_ALL = (MAP_TYPES | MAP_NAMES | MAP_FUNCS),
|
|
||||||
DCE_ALL = (DCE_FUNCS | DCE_VARS | DCE_TYPES),
|
|
||||||
OPT_ALL = (OPT_LOADSTORE),
|
|
||||||
|
|
||||||
ALL_BUT_STRIP = (MAP_ALL | DCE_ALL | OPT_ALL),
|
|
||||||
DO_EVERYTHING = (STRIP | ALL_BUT_STRIP)
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace SPV
|
|
||||||
|
|
||||||
#if !defined (use_cpp11)
|
|
||||||
#include <cstdio>
|
|
||||||
#include <cstdint>
|
|
||||||
|
|
||||||
namespace spv {
|
|
||||||
class spirvbin_t : public spirvbin_base_t
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
spirvbin_t(int /*verbose = 0*/) { }
|
|
||||||
|
|
||||||
void remap(std::vector<std::uint32_t>& /*spv*/, unsigned int /*opts = 0*/)
|
|
||||||
{
|
|
||||||
printf("Tool not compiled for C++11, which is required for SPIR-V remapping.\n");
|
|
||||||
exit(5);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace SPV
|
|
||||||
|
|
||||||
#else // defined (use_cpp11)
|
|
||||||
|
|
||||||
#include <functional>
|
|
||||||
#include <cstdint>
|
|
||||||
#include <unordered_map>
|
|
||||||
#include <unordered_set>
|
|
||||||
#include <map>
|
|
||||||
#include <set>
|
|
||||||
#include <cassert>
|
|
||||||
|
|
||||||
#include "spirv.hpp"
|
|
||||||
#include "spvIR.h"
|
|
||||||
|
|
||||||
namespace spv {
|
|
||||||
|
|
||||||
// class to hold SPIR-V binary data for remapping, DCE, and debug stripping
|
|
||||||
class spirvbin_t : public spirvbin_base_t
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
spirvbin_t(int verbose = 0) : entryPoint(spv::NoResult), largestNewId(0), verbose(verbose), errorLatch(false)
|
|
||||||
{ }
|
|
||||||
|
|
||||||
virtual ~spirvbin_t() { }
|
|
||||||
|
|
||||||
// remap on an existing binary in memory
|
|
||||||
void remap(std::vector<std::uint32_t>& spv, std::uint32_t opts = DO_EVERYTHING);
|
|
||||||
|
|
||||||
// Type for error/log handler functions
|
|
||||||
typedef std::function<void(const std::string&)> errorfn_t;
|
|
||||||
typedef std::function<void(const std::string&)> logfn_t;
|
|
||||||
|
|
||||||
// Register error/log handling functions (can be lambda fn / functor / etc)
|
|
||||||
static void registerErrorHandler(errorfn_t handler) { errorHandler = handler; }
|
|
||||||
static void registerLogHandler(logfn_t handler) { logHandler = handler; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// This can be overridden to provide other message behavior if needed
|
|
||||||
virtual void msg(int minVerbosity, int indent, const std::string& txt) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Local to global, or global to local ID map
|
|
||||||
typedef std::unordered_map<spv::Id, spv::Id> idmap_t;
|
|
||||||
typedef std::unordered_set<spv::Id> idset_t;
|
|
||||||
typedef std::unordered_map<spv::Id, int> blockmap_t;
|
|
||||||
|
|
||||||
void remap(std::uint32_t opts = DO_EVERYTHING);
|
|
||||||
|
|
||||||
// Map of names to IDs
|
|
||||||
typedef std::unordered_map<std::string, spv::Id> namemap_t;
|
|
||||||
|
|
||||||
typedef std::uint32_t spirword_t;
|
|
||||||
|
|
||||||
typedef std::pair<unsigned, unsigned> range_t;
|
|
||||||
typedef std::function<void(spv::Id&)> idfn_t;
|
|
||||||
typedef std::function<bool(spv::Op, unsigned start)> instfn_t;
|
|
||||||
|
|
||||||
// Special Values for ID map:
|
|
||||||
static const spv::Id unmapped; // unchanged from default value
|
|
||||||
static const spv::Id unused; // unused ID
|
|
||||||
static const int header_size; // SPIR header = 5 words
|
|
||||||
|
|
||||||
class id_iterator_t;
|
|
||||||
|
|
||||||
// For mapping type entries between different shaders
|
|
||||||
typedef std::vector<spirword_t> typeentry_t;
|
|
||||||
typedef std::map<spv::Id, typeentry_t> globaltypes_t;
|
|
||||||
|
|
||||||
// A set that preserves position order, and a reverse map
|
|
||||||
typedef std::set<int> posmap_t;
|
|
||||||
typedef std::unordered_map<spv::Id, int> posmap_rev_t;
|
|
||||||
|
|
||||||
// Maps and ID to the size of its base type, if known.
|
|
||||||
typedef std::unordered_map<spv::Id, unsigned> typesize_map_t;
|
|
||||||
|
|
||||||
// handle error
|
|
||||||
void error(const std::string& txt) const { errorLatch = true; errorHandler(txt); }
|
|
||||||
|
|
||||||
bool isConstOp(spv::Op opCode) const;
|
|
||||||
bool isTypeOp(spv::Op opCode) const;
|
|
||||||
bool isStripOp(spv::Op opCode) const;
|
|
||||||
bool isFlowCtrl(spv::Op opCode) const;
|
|
||||||
range_t literalRange(spv::Op opCode) const;
|
|
||||||
range_t typeRange(spv::Op opCode) const;
|
|
||||||
range_t constRange(spv::Op opCode) const;
|
|
||||||
unsigned typeSizeInWords(spv::Id id) const;
|
|
||||||
unsigned idTypeSizeInWords(spv::Id id) const;
|
|
||||||
|
|
||||||
spv::Id& asId(unsigned word) { return spv[word]; }
|
|
||||||
const spv::Id& asId(unsigned word) const { return spv[word]; }
|
|
||||||
spv::Op asOpCode(unsigned word) const { return opOpCode(spv[word]); }
|
|
||||||
std::uint32_t asOpCodeHash(unsigned word);
|
|
||||||
spv::Decoration asDecoration(unsigned word) const { return spv::Decoration(spv[word]); }
|
|
||||||
unsigned asWordCount(unsigned word) const { return opWordCount(spv[word]); }
|
|
||||||
spv::Id asTypeConstId(unsigned word) const { return asId(word + (isTypeOp(asOpCode(word)) ? 1 : 2)); }
|
|
||||||
unsigned idPos(spv::Id id) const;
|
|
||||||
|
|
||||||
static unsigned opWordCount(spirword_t data) { return data >> spv::WordCountShift; }
|
|
||||||
static spv::Op opOpCode(spirword_t data) { return spv::Op(data & spv::OpCodeMask); }
|
|
||||||
|
|
||||||
// Header access & set methods
|
|
||||||
spirword_t magic() const { return spv[0]; } // return magic number
|
|
||||||
spirword_t bound() const { return spv[3]; } // return Id bound from header
|
|
||||||
spirword_t bound(spirword_t b) { return spv[3] = b; }
|
|
||||||
spirword_t genmagic() const { return spv[2]; } // generator magic
|
|
||||||
spirword_t genmagic(spirword_t m) { return spv[2] = m; }
|
|
||||||
spirword_t schemaNum() const { return spv[4]; } // schema number from header
|
|
||||||
|
|
||||||
// Mapping fns: get
|
|
||||||
spv::Id localId(spv::Id id) const { return idMapL[id]; }
|
|
||||||
|
|
||||||
// Mapping fns: set
|
|
||||||
inline spv::Id localId(spv::Id id, spv::Id newId);
|
|
||||||
void countIds(spv::Id id);
|
|
||||||
|
|
||||||
// Return next unused new local ID.
|
|
||||||
// NOTE: boost::dynamic_bitset would be more efficient due to find_next(),
|
|
||||||
// which std::vector<bool> doens't have.
|
|
||||||
inline spv::Id nextUnusedId(spv::Id id);
|
|
||||||
|
|
||||||
void buildLocalMaps();
|
|
||||||
std::string literalString(unsigned word) const; // Return literal as a std::string
|
|
||||||
int literalStringWords(const std::string& str) const { return (int(str.size())+4)/4; }
|
|
||||||
|
|
||||||
bool isNewIdMapped(spv::Id newId) const { return isMapped(newId); }
|
|
||||||
bool isOldIdUnmapped(spv::Id oldId) const { return localId(oldId) == unmapped; }
|
|
||||||
bool isOldIdUnused(spv::Id oldId) const { return localId(oldId) == unused; }
|
|
||||||
bool isOldIdMapped(spv::Id oldId) const { return !isOldIdUnused(oldId) && !isOldIdUnmapped(oldId); }
|
|
||||||
bool isFunction(spv::Id oldId) const { return fnPos.find(oldId) != fnPos.end(); }
|
|
||||||
|
|
||||||
// bool matchType(const globaltypes_t& globalTypes, spv::Id lt, spv::Id gt) const;
|
|
||||||
// spv::Id findType(const globaltypes_t& globalTypes, spv::Id lt) const;
|
|
||||||
std::uint32_t hashType(unsigned typeStart) const;
|
|
||||||
|
|
||||||
spirvbin_t& process(instfn_t, idfn_t, unsigned begin = 0, unsigned end = 0);
|
|
||||||
int processInstruction(unsigned word, instfn_t, idfn_t);
|
|
||||||
|
|
||||||
void validate() const;
|
|
||||||
void mapTypeConst();
|
|
||||||
void mapFnBodies();
|
|
||||||
void optLoadStore();
|
|
||||||
void dceFuncs();
|
|
||||||
void dceVars();
|
|
||||||
void dceTypes();
|
|
||||||
void mapNames();
|
|
||||||
void foldIds(); // fold IDs to smallest space
|
|
||||||
void forwardLoadStores(); // load store forwarding (EXPERIMENTAL)
|
|
||||||
void offsetIds(); // create relative offset IDs
|
|
||||||
|
|
||||||
void applyMap(); // remap per local name map
|
|
||||||
void mapRemainder(); // map any IDs we haven't touched yet
|
|
||||||
void stripDebug(); // strip all debug info
|
|
||||||
void stripDeadRefs(); // strips debug info for now-dead references after DCE
|
|
||||||
void strip(); // remove debug symbols
|
|
||||||
|
|
||||||
std::vector<spirword_t> spv; // SPIR words
|
|
||||||
|
|
||||||
namemap_t nameMap; // ID names from OpName
|
|
||||||
|
|
||||||
// Since we want to also do binary ops, we can't use std::vector<bool>. we could use
|
|
||||||
// boost::dynamic_bitset, but we're trying to avoid a boost dependency.
|
|
||||||
typedef std::uint64_t bits_t;
|
|
||||||
std::vector<bits_t> mapped; // which new IDs have been mapped
|
|
||||||
static const int mBits = sizeof(bits_t) * 4;
|
|
||||||
|
|
||||||
bool isMapped(spv::Id id) const { return id < maxMappedId() && ((mapped[id/mBits] & (1LL<<(id%mBits))) != 0); }
|
|
||||||
void setMapped(spv::Id id) { resizeMapped(id); mapped[id/mBits] |= (1LL<<(id%mBits)); }
|
|
||||||
void resizeMapped(spv::Id id) { if (id >= maxMappedId()) mapped.resize(id/mBits+1, 0); }
|
|
||||||
size_t maxMappedId() const { return mapped.size() * mBits; }
|
|
||||||
|
|
||||||
// Add a strip range for a given instruction starting at 'start'
|
|
||||||
// Note: avoiding brace initializers to please older versions os MSVC.
|
|
||||||
void stripInst(unsigned start) { stripRange.push_back(range_t(start, start + asWordCount(start))); }
|
|
||||||
|
|
||||||
// Function start and end. use unordered_map because we'll have
|
|
||||||
// many fewer functions than IDs.
|
|
||||||
std::unordered_map<spv::Id, range_t> fnPos;
|
|
||||||
|
|
||||||
// Which functions are called, anywhere in the module, with a call count
|
|
||||||
std::unordered_map<spv::Id, int> fnCalls;
|
|
||||||
|
|
||||||
posmap_t typeConstPos; // word positions that define types & consts (ordered)
|
|
||||||
posmap_rev_t idPosR; // reverse map from IDs to positions
|
|
||||||
typesize_map_t idTypeSizeMap; // maps each ID to its type size, if known.
|
|
||||||
|
|
||||||
std::vector<spv::Id> idMapL; // ID {M}ap from {L}ocal to {G}lobal IDs
|
|
||||||
|
|
||||||
spv::Id entryPoint; // module entry point
|
|
||||||
spv::Id largestNewId; // biggest new ID we have mapped anything to
|
|
||||||
|
|
||||||
// Sections of the binary to strip, given as [begin,end)
|
|
||||||
std::vector<range_t> stripRange;
|
|
||||||
|
|
||||||
// processing options:
|
|
||||||
std::uint32_t options;
|
|
||||||
int verbose; // verbosity level
|
|
||||||
|
|
||||||
// Error latch: this is set if the error handler is ever executed. It would be better to
|
|
||||||
// use a try/catch block and throw, but that's not desired for certain environments, so
|
|
||||||
// this is the alternative.
|
|
||||||
mutable bool errorLatch;
|
|
||||||
|
|
||||||
static errorfn_t errorHandler;
|
|
||||||
static logfn_t logHandler;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace SPV
|
|
||||||
|
|
||||||
#endif // defined (use_cpp11)
|
|
||||||
#endif // SPIRVREMAPPER_H
|
|
||||||
|
|
@ -1,838 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 LunarG, Inc.
|
|
||||||
// Copyright (C) 2015-2020 Google, Inc.
|
|
||||||
// Copyright (C) 2017 ARM Limited.
|
|
||||||
// Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.
|
|
||||||
//
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
//
|
|
||||||
// "Builder" is an interface to fully build SPIR-V IR. Allocate one of
|
|
||||||
// these to build (a thread safe) internal SPIR-V representation (IR),
|
|
||||||
// and then dump it as a binary stream according to the SPIR-V specification.
|
|
||||||
//
|
|
||||||
// A Builder has a 1:1 relationship with a SPIR-V module.
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
#ifndef SpvBuilder_H
|
|
||||||
#define SpvBuilder_H
|
|
||||||
|
|
||||||
#include "Logger.h"
|
|
||||||
#include "spirv.hpp"
|
|
||||||
#include "spvIR.h"
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <map>
|
|
||||||
#include <memory>
|
|
||||||
#include <set>
|
|
||||||
#include <sstream>
|
|
||||||
#include <stack>
|
|
||||||
#include <unordered_map>
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
namespace spv {
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
Spv_1_0 = (1 << 16),
|
|
||||||
Spv_1_1 = (1 << 16) | (1 << 8),
|
|
||||||
Spv_1_2 = (1 << 16) | (2 << 8),
|
|
||||||
Spv_1_3 = (1 << 16) | (3 << 8),
|
|
||||||
Spv_1_4 = (1 << 16) | (4 << 8),
|
|
||||||
Spv_1_5 = (1 << 16) | (5 << 8),
|
|
||||||
} SpvVersion;
|
|
||||||
|
|
||||||
class Builder {
|
|
||||||
public:
|
|
||||||
Builder(unsigned int spvVersion, unsigned int userNumber, SpvBuildLogger* logger);
|
|
||||||
virtual ~Builder();
|
|
||||||
|
|
||||||
static const int maxMatrixSize = 4;
|
|
||||||
|
|
||||||
unsigned int getSpvVersion() const { return spvVersion; }
|
|
||||||
|
|
||||||
void setSource(spv::SourceLanguage lang, int version)
|
|
||||||
{
|
|
||||||
source = lang;
|
|
||||||
sourceVersion = version;
|
|
||||||
}
|
|
||||||
spv::Id getStringId(const std::string& str)
|
|
||||||
{
|
|
||||||
auto sItr = stringIds.find(str);
|
|
||||||
if (sItr != stringIds.end())
|
|
||||||
return sItr->second;
|
|
||||||
spv::Id strId = getUniqueId();
|
|
||||||
Instruction* fileString = new Instruction(strId, NoType, OpString);
|
|
||||||
const char* file_c_str = str.c_str();
|
|
||||||
fileString->addStringOperand(file_c_str);
|
|
||||||
strings.push_back(std::unique_ptr<Instruction>(fileString));
|
|
||||||
module.mapInstruction(fileString);
|
|
||||||
stringIds[file_c_str] = strId;
|
|
||||||
return strId;
|
|
||||||
}
|
|
||||||
void setSourceFile(const std::string& file)
|
|
||||||
{
|
|
||||||
sourceFileStringId = getStringId(file);
|
|
||||||
}
|
|
||||||
void setSourceText(const std::string& text) { sourceText = text; }
|
|
||||||
void addSourceExtension(const char* ext) { sourceExtensions.push_back(ext); }
|
|
||||||
void addModuleProcessed(const std::string& p) { moduleProcesses.push_back(p.c_str()); }
|
|
||||||
void setEmitOpLines() { emitOpLines = true; }
|
|
||||||
void addExtension(const char* ext) { extensions.insert(ext); }
|
|
||||||
void removeExtension(const char* ext)
|
|
||||||
{
|
|
||||||
extensions.erase(ext);
|
|
||||||
}
|
|
||||||
void addIncorporatedExtension(const char* ext, SpvVersion incorporatedVersion)
|
|
||||||
{
|
|
||||||
if (getSpvVersion() < static_cast<unsigned>(incorporatedVersion))
|
|
||||||
addExtension(ext);
|
|
||||||
}
|
|
||||||
void promoteIncorporatedExtension(const char* baseExt, const char* promoExt, SpvVersion incorporatedVersion)
|
|
||||||
{
|
|
||||||
removeExtension(baseExt);
|
|
||||||
addIncorporatedExtension(promoExt, incorporatedVersion);
|
|
||||||
}
|
|
||||||
void addInclude(const std::string& name, const std::string& text)
|
|
||||||
{
|
|
||||||
spv::Id incId = getStringId(name);
|
|
||||||
includeFiles[incId] = &text;
|
|
||||||
}
|
|
||||||
Id import(const char*);
|
|
||||||
void setMemoryModel(spv::AddressingModel addr, spv::MemoryModel mem)
|
|
||||||
{
|
|
||||||
addressModel = addr;
|
|
||||||
memoryModel = mem;
|
|
||||||
}
|
|
||||||
|
|
||||||
void addCapability(spv::Capability cap) { capabilities.insert(cap); }
|
|
||||||
|
|
||||||
// To get a new <id> for anything needing a new one.
|
|
||||||
Id getUniqueId() { return ++uniqueId; }
|
|
||||||
|
|
||||||
// To get a set of new <id>s, e.g., for a set of function parameters
|
|
||||||
Id getUniqueIds(int numIds)
|
|
||||||
{
|
|
||||||
Id id = uniqueId + 1;
|
|
||||||
uniqueId += numIds;
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate OpLine for non-filename-based #line directives (ie no filename
|
|
||||||
// seen yet): Log the current line, and if different than the last one,
|
|
||||||
// issue a new OpLine using the new line and current source file name.
|
|
||||||
void setLine(int line);
|
|
||||||
|
|
||||||
// If filename null, generate OpLine for non-filename-based line directives,
|
|
||||||
// else do filename-based: Log the current line and file, and if different
|
|
||||||
// than the last one, issue a new OpLine using the new line and file
|
|
||||||
// name.
|
|
||||||
void setLine(int line, const char* filename);
|
|
||||||
// Low-level OpLine. See setLine() for a layered helper.
|
|
||||||
void addLine(Id fileName, int line, int column);
|
|
||||||
|
|
||||||
// For creating new types (will return old type if the requested one was already made).
|
|
||||||
Id makeVoidType();
|
|
||||||
Id makeBoolType();
|
|
||||||
Id makePointer(StorageClass, Id pointee);
|
|
||||||
Id makeForwardPointer(StorageClass);
|
|
||||||
Id makePointerFromForwardPointer(StorageClass, Id forwardPointerType, Id pointee);
|
|
||||||
Id makeIntegerType(int width, bool hasSign); // generic
|
|
||||||
Id makeIntType(int width) { return makeIntegerType(width, true); }
|
|
||||||
Id makeUintType(int width) { return makeIntegerType(width, false); }
|
|
||||||
Id makeFloatType(int width);
|
|
||||||
Id makeStructType(const std::vector<Id>& members, const char*);
|
|
||||||
Id makeStructResultType(Id type0, Id type1);
|
|
||||||
Id makeVectorType(Id component, int size);
|
|
||||||
Id makeMatrixType(Id component, int cols, int rows);
|
|
||||||
Id makeArrayType(Id element, Id sizeId, int stride); // 0 stride means no stride decoration
|
|
||||||
Id makeRuntimeArray(Id element);
|
|
||||||
Id makeFunctionType(Id returnType, const std::vector<Id>& paramTypes);
|
|
||||||
Id makeImageType(Id sampledType, Dim, bool depth, bool arrayed, bool ms, unsigned sampled, ImageFormat format);
|
|
||||||
Id makeSamplerType();
|
|
||||||
Id makeSampledImageType(Id imageType);
|
|
||||||
Id makeCooperativeMatrixType(Id component, Id scope, Id rows, Id cols);
|
|
||||||
|
|
||||||
// accelerationStructureNV type
|
|
||||||
Id makeAccelerationStructureType();
|
|
||||||
// rayQueryEXT type
|
|
||||||
Id makeRayQueryType();
|
|
||||||
|
|
||||||
// For querying about types.
|
|
||||||
Id getTypeId(Id resultId) const { return module.getTypeId(resultId); }
|
|
||||||
Id getDerefTypeId(Id resultId) const;
|
|
||||||
Op getOpCode(Id id) const { return module.getInstruction(id)->getOpCode(); }
|
|
||||||
Op getTypeClass(Id typeId) const { return getOpCode(typeId); }
|
|
||||||
Op getMostBasicTypeClass(Id typeId) const;
|
|
||||||
int getNumComponents(Id resultId) const { return getNumTypeComponents(getTypeId(resultId)); }
|
|
||||||
int getNumTypeConstituents(Id typeId) const;
|
|
||||||
int getNumTypeComponents(Id typeId) const { return getNumTypeConstituents(typeId); }
|
|
||||||
Id getScalarTypeId(Id typeId) const;
|
|
||||||
Id getContainedTypeId(Id typeId) const;
|
|
||||||
Id getContainedTypeId(Id typeId, int) const;
|
|
||||||
StorageClass getTypeStorageClass(Id typeId) const { return module.getStorageClass(typeId); }
|
|
||||||
ImageFormat getImageTypeFormat(Id typeId) const
|
|
||||||
{ return (ImageFormat)module.getInstruction(typeId)->getImmediateOperand(6); }
|
|
||||||
|
|
||||||
bool isPointer(Id resultId) const { return isPointerType(getTypeId(resultId)); }
|
|
||||||
bool isScalar(Id resultId) const { return isScalarType(getTypeId(resultId)); }
|
|
||||||
bool isVector(Id resultId) const { return isVectorType(getTypeId(resultId)); }
|
|
||||||
bool isMatrix(Id resultId) const { return isMatrixType(getTypeId(resultId)); }
|
|
||||||
bool isCooperativeMatrix(Id resultId)const { return isCooperativeMatrixType(getTypeId(resultId)); }
|
|
||||||
bool isAggregate(Id resultId) const { return isAggregateType(getTypeId(resultId)); }
|
|
||||||
bool isSampledImage(Id resultId) const { return isSampledImageType(getTypeId(resultId)); }
|
|
||||||
|
|
||||||
bool isBoolType(Id typeId)
|
|
||||||
{ return groupedTypes[OpTypeBool].size() > 0 && typeId == groupedTypes[OpTypeBool].back()->getResultId(); }
|
|
||||||
bool isIntType(Id typeId) const
|
|
||||||
{ return getTypeClass(typeId) == OpTypeInt && module.getInstruction(typeId)->getImmediateOperand(1) != 0; }
|
|
||||||
bool isUintType(Id typeId) const
|
|
||||||
{ return getTypeClass(typeId) == OpTypeInt && module.getInstruction(typeId)->getImmediateOperand(1) == 0; }
|
|
||||||
bool isFloatType(Id typeId) const { return getTypeClass(typeId) == OpTypeFloat; }
|
|
||||||
bool isPointerType(Id typeId) const { return getTypeClass(typeId) == OpTypePointer; }
|
|
||||||
bool isScalarType(Id typeId) const
|
|
||||||
{ return getTypeClass(typeId) == OpTypeFloat || getTypeClass(typeId) == OpTypeInt ||
|
|
||||||
getTypeClass(typeId) == OpTypeBool; }
|
|
||||||
bool isVectorType(Id typeId) const { return getTypeClass(typeId) == OpTypeVector; }
|
|
||||||
bool isMatrixType(Id typeId) const { return getTypeClass(typeId) == OpTypeMatrix; }
|
|
||||||
bool isStructType(Id typeId) const { return getTypeClass(typeId) == OpTypeStruct; }
|
|
||||||
bool isArrayType(Id typeId) const { return getTypeClass(typeId) == OpTypeArray; }
|
|
||||||
#ifdef GLSLANG_WEB
|
|
||||||
bool isCooperativeMatrixType(Id typeId)const { return false; }
|
|
||||||
#else
|
|
||||||
bool isCooperativeMatrixType(Id typeId)const { return getTypeClass(typeId) == OpTypeCooperativeMatrixNV; }
|
|
||||||
#endif
|
|
||||||
bool isAggregateType(Id typeId) const
|
|
||||||
{ return isArrayType(typeId) || isStructType(typeId) || isCooperativeMatrixType(typeId); }
|
|
||||||
bool isImageType(Id typeId) const { return getTypeClass(typeId) == OpTypeImage; }
|
|
||||||
bool isSamplerType(Id typeId) const { return getTypeClass(typeId) == OpTypeSampler; }
|
|
||||||
bool isSampledImageType(Id typeId) const { return getTypeClass(typeId) == OpTypeSampledImage; }
|
|
||||||
bool containsType(Id typeId, Op typeOp, unsigned int width) const;
|
|
||||||
bool containsPhysicalStorageBufferOrArray(Id typeId) const;
|
|
||||||
|
|
||||||
bool isConstantOpCode(Op opcode) const;
|
|
||||||
bool isSpecConstantOpCode(Op opcode) const;
|
|
||||||
bool isConstant(Id resultId) const { return isConstantOpCode(getOpCode(resultId)); }
|
|
||||||
bool isConstantScalar(Id resultId) const { return getOpCode(resultId) == OpConstant; }
|
|
||||||
bool isSpecConstant(Id resultId) const { return isSpecConstantOpCode(getOpCode(resultId)); }
|
|
||||||
unsigned int getConstantScalar(Id resultId) const
|
|
||||||
{ return module.getInstruction(resultId)->getImmediateOperand(0); }
|
|
||||||
StorageClass getStorageClass(Id resultId) const { return getTypeStorageClass(getTypeId(resultId)); }
|
|
||||||
|
|
||||||
int getScalarTypeWidth(Id typeId) const
|
|
||||||
{
|
|
||||||
Id scalarTypeId = getScalarTypeId(typeId);
|
|
||||||
assert(getTypeClass(scalarTypeId) == OpTypeInt || getTypeClass(scalarTypeId) == OpTypeFloat);
|
|
||||||
return module.getInstruction(scalarTypeId)->getImmediateOperand(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int getTypeNumColumns(Id typeId) const
|
|
||||||
{
|
|
||||||
assert(isMatrixType(typeId));
|
|
||||||
return getNumTypeConstituents(typeId);
|
|
||||||
}
|
|
||||||
int getNumColumns(Id resultId) const { return getTypeNumColumns(getTypeId(resultId)); }
|
|
||||||
int getTypeNumRows(Id typeId) const
|
|
||||||
{
|
|
||||||
assert(isMatrixType(typeId));
|
|
||||||
return getNumTypeComponents(getContainedTypeId(typeId));
|
|
||||||
}
|
|
||||||
int getNumRows(Id resultId) const { return getTypeNumRows(getTypeId(resultId)); }
|
|
||||||
|
|
||||||
Dim getTypeDimensionality(Id typeId) const
|
|
||||||
{
|
|
||||||
assert(isImageType(typeId));
|
|
||||||
return (Dim)module.getInstruction(typeId)->getImmediateOperand(1);
|
|
||||||
}
|
|
||||||
Id getImageType(Id resultId) const
|
|
||||||
{
|
|
||||||
Id typeId = getTypeId(resultId);
|
|
||||||
assert(isImageType(typeId) || isSampledImageType(typeId));
|
|
||||||
return isSampledImageType(typeId) ? module.getInstruction(typeId)->getIdOperand(0) : typeId;
|
|
||||||
}
|
|
||||||
bool isArrayedImageType(Id typeId) const
|
|
||||||
{
|
|
||||||
assert(isImageType(typeId));
|
|
||||||
return module.getInstruction(typeId)->getImmediateOperand(3) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// For making new constants (will return old constant if the requested one was already made).
|
|
||||||
Id makeBoolConstant(bool b, bool specConstant = false);
|
|
||||||
Id makeInt8Constant(int i, bool specConstant = false)
|
|
||||||
{ return makeIntConstant(makeIntType(8), (unsigned)i, specConstant); }
|
|
||||||
Id makeUint8Constant(unsigned u, bool specConstant = false)
|
|
||||||
{ return makeIntConstant(makeUintType(8), u, specConstant); }
|
|
||||||
Id makeInt16Constant(int i, bool specConstant = false)
|
|
||||||
{ return makeIntConstant(makeIntType(16), (unsigned)i, specConstant); }
|
|
||||||
Id makeUint16Constant(unsigned u, bool specConstant = false)
|
|
||||||
{ return makeIntConstant(makeUintType(16), u, specConstant); }
|
|
||||||
Id makeIntConstant(int i, bool specConstant = false)
|
|
||||||
{ return makeIntConstant(makeIntType(32), (unsigned)i, specConstant); }
|
|
||||||
Id makeUintConstant(unsigned u, bool specConstant = false)
|
|
||||||
{ return makeIntConstant(makeUintType(32), u, specConstant); }
|
|
||||||
Id makeInt64Constant(long long i, bool specConstant = false)
|
|
||||||
{ return makeInt64Constant(makeIntType(64), (unsigned long long)i, specConstant); }
|
|
||||||
Id makeUint64Constant(unsigned long long u, bool specConstant = false)
|
|
||||||
{ return makeInt64Constant(makeUintType(64), u, specConstant); }
|
|
||||||
Id makeFloatConstant(float f, bool specConstant = false);
|
|
||||||
Id makeDoubleConstant(double d, bool specConstant = false);
|
|
||||||
Id makeFloat16Constant(float f16, bool specConstant = false);
|
|
||||||
Id makeFpConstant(Id type, double d, bool specConstant = false);
|
|
||||||
|
|
||||||
// Turn the array of constants into a proper spv constant of the requested type.
|
|
||||||
Id makeCompositeConstant(Id type, const std::vector<Id>& comps, bool specConst = false);
|
|
||||||
|
|
||||||
// Methods for adding information outside the CFG.
|
|
||||||
Instruction* addEntryPoint(ExecutionModel, Function*, const char* name);
|
|
||||||
void addExecutionMode(Function*, ExecutionMode mode, int value1 = -1, int value2 = -1, int value3 = -1);
|
|
||||||
void addName(Id, const char* name);
|
|
||||||
void addMemberName(Id, int member, const char* name);
|
|
||||||
void addDecoration(Id, Decoration, int num = -1);
|
|
||||||
void addDecoration(Id, Decoration, const char*);
|
|
||||||
void addDecorationId(Id id, Decoration, Id idDecoration);
|
|
||||||
void addMemberDecoration(Id, unsigned int member, Decoration, int num = -1);
|
|
||||||
void addMemberDecoration(Id, unsigned int member, Decoration, const char*);
|
|
||||||
|
|
||||||
// At the end of what block do the next create*() instructions go?
|
|
||||||
void setBuildPoint(Block* bp) { buildPoint = bp; }
|
|
||||||
Block* getBuildPoint() const { return buildPoint; }
|
|
||||||
|
|
||||||
// Make the entry-point function. The returned pointer is only valid
|
|
||||||
// for the lifetime of this builder.
|
|
||||||
Function* makeEntryPoint(const char*);
|
|
||||||
|
|
||||||
// Make a shader-style function, and create its entry block if entry is non-zero.
|
|
||||||
// Return the function, pass back the entry.
|
|
||||||
// The returned pointer is only valid for the lifetime of this builder.
|
|
||||||
Function* makeFunctionEntry(Decoration precision, Id returnType, const char* name,
|
|
||||||
const std::vector<Id>& paramTypes, const std::vector<std::vector<Decoration>>& precisions, Block **entry = 0);
|
|
||||||
|
|
||||||
// Create a return. An 'implicit' return is one not appearing in the source
|
|
||||||
// code. In the case of an implicit return, no post-return block is inserted.
|
|
||||||
void makeReturn(bool implicit, Id retVal = 0);
|
|
||||||
|
|
||||||
// Generate all the code needed to finish up a function.
|
|
||||||
void leaveFunction();
|
|
||||||
|
|
||||||
// Create a discard.
|
|
||||||
void makeDiscard();
|
|
||||||
|
|
||||||
// Create a global or function local or IO variable.
|
|
||||||
Id createVariable(StorageClass, Id type, const char* name = 0, Id initializer = NoResult);
|
|
||||||
|
|
||||||
// Create an intermediate with an undefined value.
|
|
||||||
Id createUndefined(Id type);
|
|
||||||
|
|
||||||
// Store into an Id and return the l-value
|
|
||||||
void createStore(Id rValue, Id lValue, spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMaskNone,
|
|
||||||
spv::Scope scope = spv::ScopeMax, unsigned int alignment = 0);
|
|
||||||
|
|
||||||
// Load from an Id and return it
|
|
||||||
Id createLoad(Id lValue, spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMaskNone,
|
|
||||||
spv::Scope scope = spv::ScopeMax, unsigned int alignment = 0);
|
|
||||||
|
|
||||||
// Create an OpAccessChain instruction
|
|
||||||
Id createAccessChain(StorageClass, Id base, const std::vector<Id>& offsets);
|
|
||||||
|
|
||||||
// Create an OpArrayLength instruction
|
|
||||||
Id createArrayLength(Id base, unsigned int member);
|
|
||||||
|
|
||||||
// Create an OpCooperativeMatrixLengthNV instruction
|
|
||||||
Id createCooperativeMatrixLength(Id type);
|
|
||||||
|
|
||||||
// Create an OpCompositeExtract instruction
|
|
||||||
Id createCompositeExtract(Id composite, Id typeId, unsigned index);
|
|
||||||
Id createCompositeExtract(Id composite, Id typeId, const std::vector<unsigned>& indexes);
|
|
||||||
Id createCompositeInsert(Id object, Id composite, Id typeId, unsigned index);
|
|
||||||
Id createCompositeInsert(Id object, Id composite, Id typeId, const std::vector<unsigned>& indexes);
|
|
||||||
|
|
||||||
Id createVectorExtractDynamic(Id vector, Id typeId, Id componentIndex);
|
|
||||||
Id createVectorInsertDynamic(Id vector, Id typeId, Id component, Id componentIndex);
|
|
||||||
|
|
||||||
void createNoResultOp(Op);
|
|
||||||
void createNoResultOp(Op, Id operand);
|
|
||||||
void createNoResultOp(Op, const std::vector<Id>& operands);
|
|
||||||
void createNoResultOp(Op, const std::vector<IdImmediate>& operands);
|
|
||||||
void createControlBarrier(Scope execution, Scope memory, MemorySemanticsMask);
|
|
||||||
void createMemoryBarrier(unsigned executionScope, unsigned memorySemantics);
|
|
||||||
Id createUnaryOp(Op, Id typeId, Id operand);
|
|
||||||
Id createBinOp(Op, Id typeId, Id operand1, Id operand2);
|
|
||||||
Id createTriOp(Op, Id typeId, Id operand1, Id operand2, Id operand3);
|
|
||||||
Id createOp(Op, Id typeId, const std::vector<Id>& operands);
|
|
||||||
Id createOp(Op, Id typeId, const std::vector<IdImmediate>& operands);
|
|
||||||
Id createFunctionCall(spv::Function*, const std::vector<spv::Id>&);
|
|
||||||
Id createSpecConstantOp(Op, Id typeId, const std::vector<spv::Id>& operands, const std::vector<unsigned>& literals);
|
|
||||||
|
|
||||||
// Take an rvalue (source) and a set of channels to extract from it to
|
|
||||||
// make a new rvalue, which is returned.
|
|
||||||
Id createRvalueSwizzle(Decoration precision, Id typeId, Id source, const std::vector<unsigned>& channels);
|
|
||||||
|
|
||||||
// Take a copy of an lvalue (target) and a source of components, and set the
|
|
||||||
// source components into the lvalue where the 'channels' say to put them.
|
|
||||||
// An updated version of the target is returned.
|
|
||||||
// (No true lvalue or stores are used.)
|
|
||||||
Id createLvalueSwizzle(Id typeId, Id target, Id source, const std::vector<unsigned>& channels);
|
|
||||||
|
|
||||||
// If both the id and precision are valid, the id
|
|
||||||
// gets tagged with the requested precision.
|
|
||||||
// The passed in id is always the returned id, to simplify use patterns.
|
|
||||||
Id setPrecision(Id id, Decoration precision)
|
|
||||||
{
|
|
||||||
if (precision != NoPrecision && id != NoResult)
|
|
||||||
addDecoration(id, precision);
|
|
||||||
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Can smear a scalar to a vector for the following forms:
|
|
||||||
// - promoteScalar(scalar, vector) // smear scalar to width of vector
|
|
||||||
// - promoteScalar(vector, scalar) // smear scalar to width of vector
|
|
||||||
// - promoteScalar(pointer, scalar) // smear scalar to width of what pointer points to
|
|
||||||
// - promoteScalar(scalar, scalar) // do nothing
|
|
||||||
// Other forms are not allowed.
|
|
||||||
//
|
|
||||||
// Generally, the type of 'scalar' does not need to be the same type as the components in 'vector'.
|
|
||||||
// The type of the created vector is a vector of components of the same type as the scalar.
|
|
||||||
//
|
|
||||||
// Note: One of the arguments will change, with the result coming back that way rather than
|
|
||||||
// through the return value.
|
|
||||||
void promoteScalar(Decoration precision, Id& left, Id& right);
|
|
||||||
|
|
||||||
// Make a value by smearing the scalar to fill the type.
|
|
||||||
// vectorType should be the correct type for making a vector of scalarVal.
|
|
||||||
// (No conversions are done.)
|
|
||||||
Id smearScalar(Decoration precision, Id scalarVal, Id vectorType);
|
|
||||||
|
|
||||||
// Create a call to a built-in function.
|
|
||||||
Id createBuiltinCall(Id resultType, Id builtins, int entryPoint, const std::vector<Id>& args);
|
|
||||||
|
|
||||||
// List of parameters used to create a texture operation
|
|
||||||
struct TextureParameters {
|
|
||||||
Id sampler;
|
|
||||||
Id coords;
|
|
||||||
Id bias;
|
|
||||||
Id lod;
|
|
||||||
Id Dref;
|
|
||||||
Id offset;
|
|
||||||
Id offsets;
|
|
||||||
Id gradX;
|
|
||||||
Id gradY;
|
|
||||||
Id sample;
|
|
||||||
Id component;
|
|
||||||
Id texelOut;
|
|
||||||
Id lodClamp;
|
|
||||||
Id granularity;
|
|
||||||
Id coarse;
|
|
||||||
bool nonprivate;
|
|
||||||
bool volatil;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Select the correct texture operation based on all inputs, and emit the correct instruction
|
|
||||||
Id createTextureCall(Decoration precision, Id resultType, bool sparse, bool fetch, bool proj, bool gather,
|
|
||||||
bool noImplicit, const TextureParameters&, ImageOperandsMask);
|
|
||||||
|
|
||||||
// Emit the OpTextureQuery* instruction that was passed in.
|
|
||||||
// Figure out the right return value and type, and return it.
|
|
||||||
Id createTextureQueryCall(Op, const TextureParameters&, bool isUnsignedResult);
|
|
||||||
|
|
||||||
Id createSamplePositionCall(Decoration precision, Id, Id);
|
|
||||||
|
|
||||||
Id createBitFieldExtractCall(Decoration precision, Id, Id, Id, bool isSigned);
|
|
||||||
Id createBitFieldInsertCall(Decoration precision, Id, Id, Id, Id);
|
|
||||||
|
|
||||||
// Reduction comparison for composites: For equal and not-equal resulting in a scalar.
|
|
||||||
Id createCompositeCompare(Decoration precision, Id, Id, bool /* true if for equal, false if for not-equal */);
|
|
||||||
|
|
||||||
// OpCompositeConstruct
|
|
||||||
Id createCompositeConstruct(Id typeId, const std::vector<Id>& constituents);
|
|
||||||
|
|
||||||
// vector or scalar constructor
|
|
||||||
Id createConstructor(Decoration precision, const std::vector<Id>& sources, Id resultTypeId);
|
|
||||||
|
|
||||||
// matrix constructor
|
|
||||||
Id createMatrixConstructor(Decoration precision, const std::vector<Id>& sources, Id constructee);
|
|
||||||
|
|
||||||
// Helper to use for building nested control flow with if-then-else.
|
|
||||||
class If {
|
|
||||||
public:
|
|
||||||
If(Id condition, unsigned int ctrl, Builder& builder);
|
|
||||||
~If() {}
|
|
||||||
|
|
||||||
void makeBeginElse();
|
|
||||||
void makeEndIf();
|
|
||||||
|
|
||||||
private:
|
|
||||||
If(const If&);
|
|
||||||
If& operator=(If&);
|
|
||||||
|
|
||||||
Builder& builder;
|
|
||||||
Id condition;
|
|
||||||
unsigned int control;
|
|
||||||
Function* function;
|
|
||||||
Block* headerBlock;
|
|
||||||
Block* thenBlock;
|
|
||||||
Block* elseBlock;
|
|
||||||
Block* mergeBlock;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Make a switch statement. A switch has 'numSegments' of pieces of code, not containing
|
|
||||||
// any case/default labels, all separated by one or more case/default labels. Each possible
|
|
||||||
// case value v is a jump to the caseValues[v] segment. The defaultSegment is also in this
|
|
||||||
// number space. How to compute the value is given by 'condition', as in switch(condition).
|
|
||||||
//
|
|
||||||
// The SPIR-V Builder will maintain the stack of post-switch merge blocks for nested switches.
|
|
||||||
//
|
|
||||||
// Use a defaultSegment < 0 if there is no default segment (to branch to post switch).
|
|
||||||
//
|
|
||||||
// Returns the right set of basic blocks to start each code segment with, so that the caller's
|
|
||||||
// recursion stack can hold the memory for it.
|
|
||||||
//
|
|
||||||
void makeSwitch(Id condition, unsigned int control, int numSegments, const std::vector<int>& caseValues,
|
|
||||||
const std::vector<int>& valueToSegment, int defaultSegment, std::vector<Block*>& segmentBB);
|
|
||||||
|
|
||||||
// Add a branch to the innermost switch's merge block.
|
|
||||||
void addSwitchBreak();
|
|
||||||
|
|
||||||
// Move to the next code segment, passing in the return argument in makeSwitch()
|
|
||||||
void nextSwitchSegment(std::vector<Block*>& segmentBB, int segment);
|
|
||||||
|
|
||||||
// Finish off the innermost switch.
|
|
||||||
void endSwitch(std::vector<Block*>& segmentBB);
|
|
||||||
|
|
||||||
struct LoopBlocks {
|
|
||||||
LoopBlocks(Block& head, Block& body, Block& merge, Block& continue_target) :
|
|
||||||
head(head), body(body), merge(merge), continue_target(continue_target) { }
|
|
||||||
Block &head, &body, &merge, &continue_target;
|
|
||||||
private:
|
|
||||||
LoopBlocks();
|
|
||||||
LoopBlocks& operator=(const LoopBlocks&) = delete;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Start a new loop and prepare the builder to generate code for it. Until
|
|
||||||
// closeLoop() is called for this loop, createLoopContinue() and
|
|
||||||
// createLoopExit() will target its corresponding blocks.
|
|
||||||
LoopBlocks& makeNewLoop();
|
|
||||||
|
|
||||||
// Create a new block in the function containing the build point. Memory is
|
|
||||||
// owned by the function object.
|
|
||||||
Block& makeNewBlock();
|
|
||||||
|
|
||||||
// Add a branch to the continue_target of the current (innermost) loop.
|
|
||||||
void createLoopContinue();
|
|
||||||
|
|
||||||
// Add an exit (e.g. "break") from the innermost loop that we're currently
|
|
||||||
// in.
|
|
||||||
void createLoopExit();
|
|
||||||
|
|
||||||
// Close the innermost loop that you're in
|
|
||||||
void closeLoop();
|
|
||||||
|
|
||||||
//
|
|
||||||
// Access chain design for an R-Value vs. L-Value:
|
|
||||||
//
|
|
||||||
// There is a single access chain the builder is building at
|
|
||||||
// any particular time. Such a chain can be used to either to a load or
|
|
||||||
// a store, when desired.
|
|
||||||
//
|
|
||||||
// Expressions can be r-values, l-values, or both, or only r-values:
|
|
||||||
// a[b.c].d = .... // l-value
|
|
||||||
// ... = a[b.c].d; // r-value, that also looks like an l-value
|
|
||||||
// ++a[b.c].d; // r-value and l-value
|
|
||||||
// (x + y)[2]; // r-value only, can't possibly be l-value
|
|
||||||
//
|
|
||||||
// Computing an r-value means generating code. Hence,
|
|
||||||
// r-values should only be computed when they are needed, not speculatively.
|
|
||||||
//
|
|
||||||
// Computing an l-value means saving away information for later use in the compiler,
|
|
||||||
// no code is generated until the l-value is later dereferenced. It is okay
|
|
||||||
// to speculatively generate an l-value, just not okay to speculatively dereference it.
|
|
||||||
//
|
|
||||||
// The base of the access chain (the left-most variable or expression
|
|
||||||
// from which everything is based) can be set either as an l-value
|
|
||||||
// or as an r-value. Most efficient would be to set an l-value if one
|
|
||||||
// is available. If an expression was evaluated, the resulting r-value
|
|
||||||
// can be set as the chain base.
|
|
||||||
//
|
|
||||||
// The users of this single access chain can save and restore if they
|
|
||||||
// want to nest or manage multiple chains.
|
|
||||||
//
|
|
||||||
|
|
||||||
struct AccessChain {
|
|
||||||
Id base; // for l-values, pointer to the base object, for r-values, the base object
|
|
||||||
std::vector<Id> indexChain;
|
|
||||||
Id instr; // cache the instruction that generates this access chain
|
|
||||||
std::vector<unsigned> swizzle; // each std::vector element selects the next GLSL component number
|
|
||||||
Id component; // a dynamic component index, can coexist with a swizzle,
|
|
||||||
// done after the swizzle, NoResult if not present
|
|
||||||
Id preSwizzleBaseType; // dereferenced type, before swizzle or component is applied;
|
|
||||||
// NoType unless a swizzle or component is present
|
|
||||||
bool isRValue; // true if 'base' is an r-value, otherwise, base is an l-value
|
|
||||||
unsigned int alignment; // bitwise OR of alignment values passed in. Accumulates worst alignment.
|
|
||||||
// Only tracks base and (optional) component selection alignment.
|
|
||||||
|
|
||||||
// Accumulate whether anything in the chain of structures has coherent decorations.
|
|
||||||
struct CoherentFlags {
|
|
||||||
CoherentFlags() { clear(); }
|
|
||||||
#ifdef GLSLANG_WEB
|
|
||||||
void clear() { }
|
|
||||||
bool isVolatile() const { return false; }
|
|
||||||
CoherentFlags operator |=(const CoherentFlags &other) { return *this; }
|
|
||||||
#else
|
|
||||||
bool isVolatile() const { return volatil; }
|
|
||||||
bool anyCoherent() const {
|
|
||||||
return coherent || devicecoherent || queuefamilycoherent || workgroupcoherent ||
|
|
||||||
subgroupcoherent || shadercallcoherent;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned coherent : 1;
|
|
||||||
unsigned devicecoherent : 1;
|
|
||||||
unsigned queuefamilycoherent : 1;
|
|
||||||
unsigned workgroupcoherent : 1;
|
|
||||||
unsigned subgroupcoherent : 1;
|
|
||||||
unsigned shadercallcoherent : 1;
|
|
||||||
unsigned nonprivate : 1;
|
|
||||||
unsigned volatil : 1;
|
|
||||||
unsigned isImage : 1;
|
|
||||||
|
|
||||||
void clear() {
|
|
||||||
coherent = 0;
|
|
||||||
devicecoherent = 0;
|
|
||||||
queuefamilycoherent = 0;
|
|
||||||
workgroupcoherent = 0;
|
|
||||||
subgroupcoherent = 0;
|
|
||||||
shadercallcoherent = 0;
|
|
||||||
nonprivate = 0;
|
|
||||||
volatil = 0;
|
|
||||||
isImage = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
CoherentFlags operator |=(const CoherentFlags &other) {
|
|
||||||
coherent |= other.coherent;
|
|
||||||
devicecoherent |= other.devicecoherent;
|
|
||||||
queuefamilycoherent |= other.queuefamilycoherent;
|
|
||||||
workgroupcoherent |= other.workgroupcoherent;
|
|
||||||
subgroupcoherent |= other.subgroupcoherent;
|
|
||||||
shadercallcoherent |= other.shadercallcoherent;
|
|
||||||
nonprivate |= other.nonprivate;
|
|
||||||
volatil |= other.volatil;
|
|
||||||
isImage |= other.isImage;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
CoherentFlags coherentFlags;
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// the SPIR-V builder maintains a single active chain that
|
|
||||||
// the following methods operate on
|
|
||||||
//
|
|
||||||
|
|
||||||
// for external save and restore
|
|
||||||
AccessChain getAccessChain() { return accessChain; }
|
|
||||||
void setAccessChain(AccessChain newChain) { accessChain = newChain; }
|
|
||||||
|
|
||||||
// clear accessChain
|
|
||||||
void clearAccessChain();
|
|
||||||
|
|
||||||
// set new base as an l-value base
|
|
||||||
void setAccessChainLValue(Id lValue)
|
|
||||||
{
|
|
||||||
assert(isPointer(lValue));
|
|
||||||
accessChain.base = lValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// set new base value as an r-value
|
|
||||||
void setAccessChainRValue(Id rValue)
|
|
||||||
{
|
|
||||||
accessChain.isRValue = true;
|
|
||||||
accessChain.base = rValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// push offset onto the end of the chain
|
|
||||||
void accessChainPush(Id offset, AccessChain::CoherentFlags coherentFlags, unsigned int alignment)
|
|
||||||
{
|
|
||||||
accessChain.indexChain.push_back(offset);
|
|
||||||
accessChain.coherentFlags |= coherentFlags;
|
|
||||||
accessChain.alignment |= alignment;
|
|
||||||
}
|
|
||||||
|
|
||||||
// push new swizzle onto the end of any existing swizzle, merging into a single swizzle
|
|
||||||
void accessChainPushSwizzle(std::vector<unsigned>& swizzle, Id preSwizzleBaseType,
|
|
||||||
AccessChain::CoherentFlags coherentFlags, unsigned int alignment);
|
|
||||||
|
|
||||||
// push a dynamic component selection onto the access chain, only applicable with a
|
|
||||||
// non-trivial swizzle or no swizzle
|
|
||||||
void accessChainPushComponent(Id component, Id preSwizzleBaseType, AccessChain::CoherentFlags coherentFlags,
|
|
||||||
unsigned int alignment)
|
|
||||||
{
|
|
||||||
if (accessChain.swizzle.size() != 1) {
|
|
||||||
accessChain.component = component;
|
|
||||||
if (accessChain.preSwizzleBaseType == NoType)
|
|
||||||
accessChain.preSwizzleBaseType = preSwizzleBaseType;
|
|
||||||
}
|
|
||||||
accessChain.coherentFlags |= coherentFlags;
|
|
||||||
accessChain.alignment |= alignment;
|
|
||||||
}
|
|
||||||
|
|
||||||
// use accessChain and swizzle to store value
|
|
||||||
void accessChainStore(Id rvalue, spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMaskNone,
|
|
||||||
spv::Scope scope = spv::ScopeMax, unsigned int alignment = 0);
|
|
||||||
|
|
||||||
// use accessChain and swizzle to load an r-value
|
|
||||||
Id accessChainLoad(Decoration precision, Decoration nonUniform, Id ResultType,
|
|
||||||
spv::MemoryAccessMask memoryAccess = spv::MemoryAccessMaskNone, spv::Scope scope = spv::ScopeMax,
|
|
||||||
unsigned int alignment = 0);
|
|
||||||
|
|
||||||
// Return whether or not the access chain can be represented in SPIR-V
|
|
||||||
// as an l-value.
|
|
||||||
// E.g., a[3].yx cannot be, while a[3].y and a[3].y[x] can be.
|
|
||||||
bool isSpvLvalue() const { return accessChain.swizzle.size() <= 1; }
|
|
||||||
|
|
||||||
// get the direct pointer for an l-value
|
|
||||||
Id accessChainGetLValue();
|
|
||||||
|
|
||||||
// Get the inferred SPIR-V type of the result of the current access chain,
|
|
||||||
// based on the type of the base and the chain of dereferences.
|
|
||||||
Id accessChainGetInferredType();
|
|
||||||
|
|
||||||
// Add capabilities, extensions, remove unneeded decorations, etc.,
|
|
||||||
// based on the resulting SPIR-V.
|
|
||||||
void postProcess();
|
|
||||||
|
|
||||||
// Prune unreachable blocks in the CFG and remove unneeded decorations.
|
|
||||||
void postProcessCFG();
|
|
||||||
|
|
||||||
#ifndef GLSLANG_WEB
|
|
||||||
// Add capabilities, extensions based on instructions in the module.
|
|
||||||
void postProcessFeatures();
|
|
||||||
// Hook to visit each instruction in a block in a function
|
|
||||||
void postProcess(Instruction&);
|
|
||||||
// Hook to visit each non-32-bit sized float/int operation in a block.
|
|
||||||
void postProcessType(const Instruction&, spv::Id typeId);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void dump(std::vector<unsigned int>&) const;
|
|
||||||
|
|
||||||
void createBranch(Block* block);
|
|
||||||
void createConditionalBranch(Id condition, Block* thenBlock, Block* elseBlock);
|
|
||||||
void createLoopMerge(Block* mergeBlock, Block* continueBlock, unsigned int control,
|
|
||||||
const std::vector<unsigned int>& operands);
|
|
||||||
|
|
||||||
// Sets to generate opcode for specialization constants.
|
|
||||||
void setToSpecConstCodeGenMode() { generatingOpCodeForSpecConst = true; }
|
|
||||||
// Sets to generate opcode for non-specialization constants (normal mode).
|
|
||||||
void setToNormalCodeGenMode() { generatingOpCodeForSpecConst = false; }
|
|
||||||
// Check if the builder is generating code for spec constants.
|
|
||||||
bool isInSpecConstCodeGenMode() { return generatingOpCodeForSpecConst; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
Id makeIntConstant(Id typeId, unsigned value, bool specConstant);
|
|
||||||
Id makeInt64Constant(Id typeId, unsigned long long value, bool specConstant);
|
|
||||||
Id findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned value);
|
|
||||||
Id findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned v1, unsigned v2);
|
|
||||||
Id findCompositeConstant(Op typeClass, Id typeId, const std::vector<Id>& comps);
|
|
||||||
Id findStructConstant(Id typeId, const std::vector<Id>& comps);
|
|
||||||
Id collapseAccessChain();
|
|
||||||
void remapDynamicSwizzle();
|
|
||||||
void transferAccessChainSwizzle(bool dynamic);
|
|
||||||
void simplifyAccessChainSwizzle();
|
|
||||||
void createAndSetNoPredecessorBlock(const char*);
|
|
||||||
void createSelectionMerge(Block* mergeBlock, unsigned int control);
|
|
||||||
void dumpSourceInstructions(std::vector<unsigned int>&) const;
|
|
||||||
void dumpSourceInstructions(const spv::Id fileId, const std::string& text, std::vector<unsigned int>&) const;
|
|
||||||
void dumpInstructions(std::vector<unsigned int>&, const std::vector<std::unique_ptr<Instruction> >&) const;
|
|
||||||
void dumpModuleProcesses(std::vector<unsigned int>&) const;
|
|
||||||
spv::MemoryAccessMask sanitizeMemoryAccessForStorageClass(spv::MemoryAccessMask memoryAccess, StorageClass sc)
|
|
||||||
const;
|
|
||||||
|
|
||||||
unsigned int spvVersion; // the version of SPIR-V to emit in the header
|
|
||||||
SourceLanguage source;
|
|
||||||
int sourceVersion;
|
|
||||||
spv::Id sourceFileStringId;
|
|
||||||
std::string sourceText;
|
|
||||||
int currentLine;
|
|
||||||
const char* currentFile;
|
|
||||||
bool emitOpLines;
|
|
||||||
std::set<std::string> extensions;
|
|
||||||
std::vector<const char*> sourceExtensions;
|
|
||||||
std::vector<const char*> moduleProcesses;
|
|
||||||
AddressingModel addressModel;
|
|
||||||
MemoryModel memoryModel;
|
|
||||||
std::set<spv::Capability> capabilities;
|
|
||||||
int builderNumber;
|
|
||||||
Module module;
|
|
||||||
Block* buildPoint;
|
|
||||||
Id uniqueId;
|
|
||||||
Function* entryPointFunction;
|
|
||||||
bool generatingOpCodeForSpecConst;
|
|
||||||
AccessChain accessChain;
|
|
||||||
|
|
||||||
// special blocks of instructions for output
|
|
||||||
std::vector<std::unique_ptr<Instruction> > strings;
|
|
||||||
std::vector<std::unique_ptr<Instruction> > imports;
|
|
||||||
std::vector<std::unique_ptr<Instruction> > entryPoints;
|
|
||||||
std::vector<std::unique_ptr<Instruction> > executionModes;
|
|
||||||
std::vector<std::unique_ptr<Instruction> > names;
|
|
||||||
std::vector<std::unique_ptr<Instruction> > decorations;
|
|
||||||
std::vector<std::unique_ptr<Instruction> > constantsTypesGlobals;
|
|
||||||
std::vector<std::unique_ptr<Instruction> > externals;
|
|
||||||
std::vector<std::unique_ptr<Function> > functions;
|
|
||||||
|
|
||||||
// not output, internally used for quick & dirty canonical (unique) creation
|
|
||||||
|
|
||||||
// map type opcodes to constant inst.
|
|
||||||
std::unordered_map<unsigned int, std::vector<Instruction*>> groupedConstants;
|
|
||||||
// map struct-id to constant instructions
|
|
||||||
std::unordered_map<unsigned int, std::vector<Instruction*>> groupedStructConstants;
|
|
||||||
// map type opcodes to type instructions
|
|
||||||
std::unordered_map<unsigned int, std::vector<Instruction*>> groupedTypes;
|
|
||||||
|
|
||||||
// stack of switches
|
|
||||||
std::stack<Block*> switchMerges;
|
|
||||||
|
|
||||||
// Our loop stack.
|
|
||||||
std::stack<LoopBlocks> loops;
|
|
||||||
|
|
||||||
// map from strings to their string ids
|
|
||||||
std::unordered_map<std::string, spv::Id> stringIds;
|
|
||||||
|
|
||||||
// map from include file name ids to their contents
|
|
||||||
std::map<spv::Id, const std::string*> includeFiles;
|
|
||||||
|
|
||||||
// The stream for outputting warnings and errors.
|
|
||||||
SpvBuildLogger* logger;
|
|
||||||
}; // end Builder class
|
|
||||||
|
|
||||||
}; // end spv namespace
|
|
||||||
|
|
||||||
#endif // SpvBuilder_H
|
|
||||||
|
|
@ -1,81 +0,0 @@
|
||||||
// Copyright (c) 2015-2016 The Khronos Group Inc.
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
#ifndef LIBSPIRV_UTIL_BITUTILS_H_
|
|
||||||
#define LIBSPIRV_UTIL_BITUTILS_H_
|
|
||||||
|
|
||||||
#include <cstdint>
|
|
||||||
#include <cstring>
|
|
||||||
|
|
||||||
namespace spvutils {
|
|
||||||
|
|
||||||
// Performs a bitwise copy of source to the destination type Dest.
|
|
||||||
template <typename Dest, typename Src>
|
|
||||||
Dest BitwiseCast(Src source) {
|
|
||||||
Dest dest;
|
|
||||||
static_assert(sizeof(source) == sizeof(dest),
|
|
||||||
"BitwiseCast: Source and destination must have the same size");
|
|
||||||
std::memcpy(static_cast<void*>(&dest), &source, sizeof(dest));
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBits<T, First, Num> returns an integer of type <T> with bits set
|
|
||||||
// for position <First> through <First + Num - 1>, counting from the least
|
|
||||||
// significant bit. In particular when Num == 0, no positions are set to 1.
|
|
||||||
// A static assert will be triggered if First + Num > sizeof(T) * 8, that is,
|
|
||||||
// a bit that will not fit in the underlying type is set.
|
|
||||||
template <typename T, size_t First = 0, size_t Num = 0>
|
|
||||||
struct SetBits {
|
|
||||||
static_assert(First < sizeof(T) * 8,
|
|
||||||
"Tried to set a bit that is shifted too far.");
|
|
||||||
const static T get = (T(1) << First) | SetBits<T, First + 1, Num - 1>::get;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, size_t Last>
|
|
||||||
struct SetBits<T, Last, 0> {
|
|
||||||
const static T get = T(0);
|
|
||||||
};
|
|
||||||
|
|
||||||
// This is all compile-time so we can put our tests right here.
|
|
||||||
static_assert(SetBits<uint32_t, 0, 0>::get == uint32_t(0x00000000),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint32_t, 0, 1>::get == uint32_t(0x00000001),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint32_t, 31, 1>::get == uint32_t(0x80000000),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint32_t, 1, 2>::get == uint32_t(0x00000006),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint32_t, 30, 2>::get == uint32_t(0xc0000000),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint32_t, 0, 31>::get == uint32_t(0x7FFFFFFF),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint32_t, 0, 32>::get == uint32_t(0xFFFFFFFF),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint32_t, 16, 16>::get == uint32_t(0xFFFF0000),
|
|
||||||
"SetBits failed");
|
|
||||||
|
|
||||||
static_assert(SetBits<uint64_t, 0, 1>::get == uint64_t(0x0000000000000001LL),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint64_t, 63, 1>::get == uint64_t(0x8000000000000000LL),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint64_t, 62, 2>::get == uint64_t(0xc000000000000000LL),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint64_t, 31, 1>::get == uint64_t(0x0000000080000000LL),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint64_t, 16, 16>::get == uint64_t(0x00000000FFFF0000LL),
|
|
||||||
"SetBits failed");
|
|
||||||
|
|
||||||
} // namespace spvutils
|
|
||||||
|
|
||||||
#endif // LIBSPIRV_UTIL_BITUTILS_H_
|
|
||||||
|
|
@ -1,258 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 LunarG, Inc.
|
|
||||||
//
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
//
|
|
||||||
// Parameterize the SPIR-V enumerants.
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "spirv.hpp"
|
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace spv {
|
|
||||||
|
|
||||||
// Fill in all the parameters
|
|
||||||
void Parameterize();
|
|
||||||
|
|
||||||
// Return the English names of all the enums.
|
|
||||||
const char* SourceString(int);
|
|
||||||
const char* AddressingString(int);
|
|
||||||
const char* MemoryString(int);
|
|
||||||
const char* ExecutionModelString(int);
|
|
||||||
const char* ExecutionModeString(int);
|
|
||||||
const char* StorageClassString(int);
|
|
||||||
const char* DecorationString(int);
|
|
||||||
const char* BuiltInString(int);
|
|
||||||
const char* DimensionString(int);
|
|
||||||
const char* SelectControlString(int);
|
|
||||||
const char* LoopControlString(int);
|
|
||||||
const char* FunctionControlString(int);
|
|
||||||
const char* SamplerAddressingModeString(int);
|
|
||||||
const char* SamplerFilterModeString(int);
|
|
||||||
const char* ImageFormatString(int);
|
|
||||||
const char* ImageChannelOrderString(int);
|
|
||||||
const char* ImageChannelTypeString(int);
|
|
||||||
const char* ImageChannelDataTypeString(int type);
|
|
||||||
const char* ImageOperandsString(int format);
|
|
||||||
const char* ImageOperands(int);
|
|
||||||
const char* FPFastMathString(int);
|
|
||||||
const char* FPRoundingModeString(int);
|
|
||||||
const char* LinkageTypeString(int);
|
|
||||||
const char* FuncParamAttrString(int);
|
|
||||||
const char* AccessQualifierString(int);
|
|
||||||
const char* MemorySemanticsString(int);
|
|
||||||
const char* MemoryAccessString(int);
|
|
||||||
const char* ExecutionScopeString(int);
|
|
||||||
const char* GroupOperationString(int);
|
|
||||||
const char* KernelEnqueueFlagsString(int);
|
|
||||||
const char* KernelProfilingInfoString(int);
|
|
||||||
const char* CapabilityString(int);
|
|
||||||
const char* OpcodeString(int);
|
|
||||||
const char* ScopeString(int mem);
|
|
||||||
|
|
||||||
// For grouping opcodes into subsections
|
|
||||||
enum OpcodeClass {
|
|
||||||
OpClassMisc,
|
|
||||||
OpClassDebug,
|
|
||||||
OpClassAnnotate,
|
|
||||||
OpClassExtension,
|
|
||||||
OpClassMode,
|
|
||||||
OpClassType,
|
|
||||||
OpClassConstant,
|
|
||||||
OpClassMemory,
|
|
||||||
OpClassFunction,
|
|
||||||
OpClassImage,
|
|
||||||
OpClassConvert,
|
|
||||||
OpClassComposite,
|
|
||||||
OpClassArithmetic,
|
|
||||||
OpClassBit,
|
|
||||||
OpClassRelationalLogical,
|
|
||||||
OpClassDerivative,
|
|
||||||
OpClassFlowControl,
|
|
||||||
OpClassAtomic,
|
|
||||||
OpClassPrimitive,
|
|
||||||
OpClassBarrier,
|
|
||||||
OpClassGroup,
|
|
||||||
OpClassDeviceSideEnqueue,
|
|
||||||
OpClassPipe,
|
|
||||||
|
|
||||||
OpClassCount,
|
|
||||||
OpClassMissing // all instructions start out as missing
|
|
||||||
};
|
|
||||||
|
|
||||||
// For parameterizing operands.
|
|
||||||
enum OperandClass {
|
|
||||||
OperandNone,
|
|
||||||
OperandId,
|
|
||||||
OperandVariableIds,
|
|
||||||
OperandOptionalLiteral,
|
|
||||||
OperandOptionalLiteralString,
|
|
||||||
OperandVariableLiterals,
|
|
||||||
OperandVariableIdLiteral,
|
|
||||||
OperandVariableLiteralId,
|
|
||||||
OperandLiteralNumber,
|
|
||||||
OperandLiteralString,
|
|
||||||
OperandSource,
|
|
||||||
OperandExecutionModel,
|
|
||||||
OperandAddressing,
|
|
||||||
OperandMemory,
|
|
||||||
OperandExecutionMode,
|
|
||||||
OperandStorage,
|
|
||||||
OperandDimensionality,
|
|
||||||
OperandSamplerAddressingMode,
|
|
||||||
OperandSamplerFilterMode,
|
|
||||||
OperandSamplerImageFormat,
|
|
||||||
OperandImageChannelOrder,
|
|
||||||
OperandImageChannelDataType,
|
|
||||||
OperandImageOperands,
|
|
||||||
OperandFPFastMath,
|
|
||||||
OperandFPRoundingMode,
|
|
||||||
OperandLinkageType,
|
|
||||||
OperandAccessQualifier,
|
|
||||||
OperandFuncParamAttr,
|
|
||||||
OperandDecoration,
|
|
||||||
OperandBuiltIn,
|
|
||||||
OperandSelect,
|
|
||||||
OperandLoop,
|
|
||||||
OperandFunction,
|
|
||||||
OperandMemorySemantics,
|
|
||||||
OperandMemoryAccess,
|
|
||||||
OperandScope,
|
|
||||||
OperandGroupOperation,
|
|
||||||
OperandKernelEnqueueFlags,
|
|
||||||
OperandKernelProfilingInfo,
|
|
||||||
OperandCapability,
|
|
||||||
|
|
||||||
OperandOpcode,
|
|
||||||
|
|
||||||
OperandCount
|
|
||||||
};
|
|
||||||
|
|
||||||
// Any specific enum can have a set of capabilities that allow it:
|
|
||||||
typedef std::vector<Capability> EnumCaps;
|
|
||||||
|
|
||||||
// Parameterize a set of operands with their OperandClass(es) and descriptions.
|
|
||||||
class OperandParameters {
|
|
||||||
public:
|
|
||||||
OperandParameters() { }
|
|
||||||
void push(OperandClass oc, const char* d, bool opt = false)
|
|
||||||
{
|
|
||||||
opClass.push_back(oc);
|
|
||||||
desc.push_back(d);
|
|
||||||
optional.push_back(opt);
|
|
||||||
}
|
|
||||||
void setOptional();
|
|
||||||
OperandClass getClass(int op) const { return opClass[op]; }
|
|
||||||
const char* getDesc(int op) const { return desc[op]; }
|
|
||||||
bool isOptional(int op) const { return optional[op]; }
|
|
||||||
int getNum() const { return (int)opClass.size(); }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
std::vector<OperandClass> opClass;
|
|
||||||
std::vector<const char*> desc;
|
|
||||||
std::vector<bool> optional;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Parameterize an enumerant
|
|
||||||
class EnumParameters {
|
|
||||||
public:
|
|
||||||
EnumParameters() : desc(0) { }
|
|
||||||
const char* desc;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Parameterize a set of enumerants that form an enum
|
|
||||||
class EnumDefinition : public EnumParameters {
|
|
||||||
public:
|
|
||||||
EnumDefinition() :
|
|
||||||
ceiling(0), bitmask(false), getName(0), enumParams(0), operandParams(0) { }
|
|
||||||
void set(int ceil, const char* (*name)(int), EnumParameters* ep, bool mask = false)
|
|
||||||
{
|
|
||||||
ceiling = ceil;
|
|
||||||
getName = name;
|
|
||||||
bitmask = mask;
|
|
||||||
enumParams = ep;
|
|
||||||
}
|
|
||||||
void setOperands(OperandParameters* op) { operandParams = op; }
|
|
||||||
int ceiling; // ceiling of enumerants
|
|
||||||
bool bitmask; // true if these enumerants combine into a bitmask
|
|
||||||
const char* (*getName)(int); // a function that returns the name for each enumerant value (or shift)
|
|
||||||
EnumParameters* enumParams; // parameters for each individual enumerant
|
|
||||||
OperandParameters* operandParams; // sets of operands
|
|
||||||
};
|
|
||||||
|
|
||||||
// Parameterize an instruction's logical format, including its known set of operands,
|
|
||||||
// per OperandParameters above.
|
|
||||||
class InstructionParameters {
|
|
||||||
public:
|
|
||||||
InstructionParameters() :
|
|
||||||
opDesc("TBD"),
|
|
||||||
opClass(OpClassMissing),
|
|
||||||
typePresent(true), // most normal, only exceptions have to be spelled out
|
|
||||||
resultPresent(true) // most normal, only exceptions have to be spelled out
|
|
||||||
{ }
|
|
||||||
|
|
||||||
void setResultAndType(bool r, bool t)
|
|
||||||
{
|
|
||||||
resultPresent = r;
|
|
||||||
typePresent = t;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool hasResult() const { return resultPresent != 0; }
|
|
||||||
bool hasType() const { return typePresent != 0; }
|
|
||||||
|
|
||||||
const char* opDesc;
|
|
||||||
OpcodeClass opClass;
|
|
||||||
OperandParameters operands;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
int typePresent : 1;
|
|
||||||
int resultPresent : 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
// The set of objects that hold all the instruction/operand
|
|
||||||
// parameterization information.
|
|
||||||
extern InstructionParameters InstructionDesc[];
|
|
||||||
|
|
||||||
// These hold definitions of the enumerants used for operands
|
|
||||||
extern EnumDefinition OperandClassParams[];
|
|
||||||
|
|
||||||
const char* GetOperandDesc(OperandClass operand);
|
|
||||||
void PrintImmediateRow(int imm, const char* name, const EnumParameters* enumParams, bool caps, bool hex = false);
|
|
||||||
const char* AccessQualifierString(int attr);
|
|
||||||
|
|
||||||
void PrintOperands(const OperandParameters& operands, int reservedOperands);
|
|
||||||
|
|
||||||
} // end namespace spv
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,485 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2014 LunarG, Inc.
|
|
||||||
// Copyright (C) 2015-2018 Google, Inc.
|
|
||||||
//
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// SPIRV-IR
|
|
||||||
//
|
|
||||||
// Simple in-memory representation (IR) of SPIRV. Just for holding
|
|
||||||
// Each function's CFG of blocks. Has this hierarchy:
|
|
||||||
// - Module, which is a list of
|
|
||||||
// - Function, which is a list of
|
|
||||||
// - Block, which is a list of
|
|
||||||
// - Instruction
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
#ifndef spvIR_H
|
|
||||||
#define spvIR_H
|
|
||||||
|
|
||||||
#include "spirv.hpp"
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <cassert>
|
|
||||||
#include <functional>
|
|
||||||
#include <iostream>
|
|
||||||
#include <memory>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace spv {
|
|
||||||
|
|
||||||
class Block;
|
|
||||||
class Function;
|
|
||||||
class Module;
|
|
||||||
|
|
||||||
const Id NoResult = 0;
|
|
||||||
const Id NoType = 0;
|
|
||||||
|
|
||||||
const Decoration NoPrecision = DecorationMax;
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
# define POTENTIALLY_UNUSED __attribute__((unused))
|
|
||||||
#else
|
|
||||||
# define POTENTIALLY_UNUSED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
POTENTIALLY_UNUSED
|
|
||||||
const MemorySemanticsMask MemorySemanticsAllMemory =
|
|
||||||
(MemorySemanticsMask)(MemorySemanticsUniformMemoryMask |
|
|
||||||
MemorySemanticsWorkgroupMemoryMask |
|
|
||||||
MemorySemanticsAtomicCounterMemoryMask |
|
|
||||||
MemorySemanticsImageMemoryMask);
|
|
||||||
|
|
||||||
struct IdImmediate {
|
|
||||||
bool isId; // true if word is an Id, false if word is an immediate
|
|
||||||
unsigned word;
|
|
||||||
IdImmediate(bool i, unsigned w) : isId(i), word(w) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// SPIR-V IR instruction.
|
|
||||||
//
|
|
||||||
|
|
||||||
class Instruction {
|
|
||||||
public:
|
|
||||||
Instruction(Id resultId, Id typeId, Op opCode) : resultId(resultId), typeId(typeId), opCode(opCode), block(nullptr) { }
|
|
||||||
explicit Instruction(Op opCode) : resultId(NoResult), typeId(NoType), opCode(opCode), block(nullptr) { }
|
|
||||||
virtual ~Instruction() {}
|
|
||||||
void addIdOperand(Id id) {
|
|
||||||
operands.push_back(id);
|
|
||||||
idOperand.push_back(true);
|
|
||||||
}
|
|
||||||
void addImmediateOperand(unsigned int immediate) {
|
|
||||||
operands.push_back(immediate);
|
|
||||||
idOperand.push_back(false);
|
|
||||||
}
|
|
||||||
void setImmediateOperand(unsigned idx, unsigned int immediate) {
|
|
||||||
assert(!idOperand[idx]);
|
|
||||||
operands[idx] = immediate;
|
|
||||||
}
|
|
||||||
|
|
||||||
void addStringOperand(const char* str)
|
|
||||||
{
|
|
||||||
unsigned int word;
|
|
||||||
char* wordString = (char*)&word;
|
|
||||||
char* wordPtr = wordString;
|
|
||||||
int charCount = 0;
|
|
||||||
char c;
|
|
||||||
do {
|
|
||||||
c = *(str++);
|
|
||||||
*(wordPtr++) = c;
|
|
||||||
++charCount;
|
|
||||||
if (charCount == 4) {
|
|
||||||
addImmediateOperand(word);
|
|
||||||
wordPtr = wordString;
|
|
||||||
charCount = 0;
|
|
||||||
}
|
|
||||||
} while (c != 0);
|
|
||||||
|
|
||||||
// deal with partial last word
|
|
||||||
if (charCount > 0) {
|
|
||||||
// pad with 0s
|
|
||||||
for (; charCount < 4; ++charCount)
|
|
||||||
*(wordPtr++) = 0;
|
|
||||||
addImmediateOperand(word);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bool isIdOperand(int op) const { return idOperand[op]; }
|
|
||||||
void setBlock(Block* b) { block = b; }
|
|
||||||
Block* getBlock() const { return block; }
|
|
||||||
Op getOpCode() const { return opCode; }
|
|
||||||
int getNumOperands() const
|
|
||||||
{
|
|
||||||
assert(operands.size() == idOperand.size());
|
|
||||||
return (int)operands.size();
|
|
||||||
}
|
|
||||||
Id getResultId() const { return resultId; }
|
|
||||||
Id getTypeId() const { return typeId; }
|
|
||||||
Id getIdOperand(int op) const {
|
|
||||||
assert(idOperand[op]);
|
|
||||||
return operands[op];
|
|
||||||
}
|
|
||||||
unsigned int getImmediateOperand(int op) const {
|
|
||||||
assert(!idOperand[op]);
|
|
||||||
return operands[op];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write out the binary form.
|
|
||||||
void dump(std::vector<unsigned int>& out) const
|
|
||||||
{
|
|
||||||
// Compute the wordCount
|
|
||||||
unsigned int wordCount = 1;
|
|
||||||
if (typeId)
|
|
||||||
++wordCount;
|
|
||||||
if (resultId)
|
|
||||||
++wordCount;
|
|
||||||
wordCount += (unsigned int)operands.size();
|
|
||||||
|
|
||||||
// Write out the beginning of the instruction
|
|
||||||
out.push_back(((wordCount) << WordCountShift) | opCode);
|
|
||||||
if (typeId)
|
|
||||||
out.push_back(typeId);
|
|
||||||
if (resultId)
|
|
||||||
out.push_back(resultId);
|
|
||||||
|
|
||||||
// Write out the operands
|
|
||||||
for (int op = 0; op < (int)operands.size(); ++op)
|
|
||||||
out.push_back(operands[op]);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
Instruction(const Instruction&);
|
|
||||||
Id resultId;
|
|
||||||
Id typeId;
|
|
||||||
Op opCode;
|
|
||||||
std::vector<Id> operands; // operands, both <id> and immediates (both are unsigned int)
|
|
||||||
std::vector<bool> idOperand; // true for operands that are <id>, false for immediates
|
|
||||||
Block* block;
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// SPIR-V IR block.
|
|
||||||
//
|
|
||||||
|
|
||||||
class Block {
|
|
||||||
public:
|
|
||||||
Block(Id id, Function& parent);
|
|
||||||
virtual ~Block()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
Id getId() { return instructions.front()->getResultId(); }
|
|
||||||
|
|
||||||
Function& getParent() const { return parent; }
|
|
||||||
void addInstruction(std::unique_ptr<Instruction> inst);
|
|
||||||
void addPredecessor(Block* pred) { predecessors.push_back(pred); pred->successors.push_back(this);}
|
|
||||||
void addLocalVariable(std::unique_ptr<Instruction> inst) { localVariables.push_back(std::move(inst)); }
|
|
||||||
const std::vector<Block*>& getPredecessors() const { return predecessors; }
|
|
||||||
const std::vector<Block*>& getSuccessors() const { return successors; }
|
|
||||||
const std::vector<std::unique_ptr<Instruction> >& getInstructions() const {
|
|
||||||
return instructions;
|
|
||||||
}
|
|
||||||
const std::vector<std::unique_ptr<Instruction> >& getLocalVariables() const { return localVariables; }
|
|
||||||
void setUnreachable() { unreachable = true; }
|
|
||||||
bool isUnreachable() const { return unreachable; }
|
|
||||||
// Returns the block's merge instruction, if one exists (otherwise null).
|
|
||||||
const Instruction* getMergeInstruction() const {
|
|
||||||
if (instructions.size() < 2) return nullptr;
|
|
||||||
const Instruction* nextToLast = (instructions.cend() - 2)->get();
|
|
||||||
switch (nextToLast->getOpCode()) {
|
|
||||||
case OpSelectionMerge:
|
|
||||||
case OpLoopMerge:
|
|
||||||
return nextToLast;
|
|
||||||
default:
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Change this block into a canonical dead merge block. Delete instructions
|
|
||||||
// as necessary. A canonical dead merge block has only an OpLabel and an
|
|
||||||
// OpUnreachable.
|
|
||||||
void rewriteAsCanonicalUnreachableMerge() {
|
|
||||||
assert(localVariables.empty());
|
|
||||||
// Delete all instructions except for the label.
|
|
||||||
assert(instructions.size() > 0);
|
|
||||||
instructions.resize(1);
|
|
||||||
successors.clear();
|
|
||||||
addInstruction(std::unique_ptr<Instruction>(new Instruction(OpUnreachable)));
|
|
||||||
}
|
|
||||||
// Change this block into a canonical dead continue target branching to the
|
|
||||||
// given header ID. Delete instructions as necessary. A canonical dead continue
|
|
||||||
// target has only an OpLabel and an unconditional branch back to the corresponding
|
|
||||||
// header.
|
|
||||||
void rewriteAsCanonicalUnreachableContinue(Block* header) {
|
|
||||||
assert(localVariables.empty());
|
|
||||||
// Delete all instructions except for the label.
|
|
||||||
assert(instructions.size() > 0);
|
|
||||||
instructions.resize(1);
|
|
||||||
successors.clear();
|
|
||||||
// Add OpBranch back to the header.
|
|
||||||
assert(header != nullptr);
|
|
||||||
Instruction* branch = new Instruction(OpBranch);
|
|
||||||
branch->addIdOperand(header->getId());
|
|
||||||
addInstruction(std::unique_ptr<Instruction>(branch));
|
|
||||||
successors.push_back(header);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isTerminated() const
|
|
||||||
{
|
|
||||||
switch (instructions.back()->getOpCode()) {
|
|
||||||
case OpBranch:
|
|
||||||
case OpBranchConditional:
|
|
||||||
case OpSwitch:
|
|
||||||
case OpKill:
|
|
||||||
case OpReturn:
|
|
||||||
case OpReturnValue:
|
|
||||||
case OpUnreachable:
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void dump(std::vector<unsigned int>& out) const
|
|
||||||
{
|
|
||||||
instructions[0]->dump(out);
|
|
||||||
for (int i = 0; i < (int)localVariables.size(); ++i)
|
|
||||||
localVariables[i]->dump(out);
|
|
||||||
for (int i = 1; i < (int)instructions.size(); ++i)
|
|
||||||
instructions[i]->dump(out);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
Block(const Block&);
|
|
||||||
Block& operator=(Block&);
|
|
||||||
|
|
||||||
// To enforce keeping parent and ownership in sync:
|
|
||||||
friend Function;
|
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Instruction> > instructions;
|
|
||||||
std::vector<Block*> predecessors, successors;
|
|
||||||
std::vector<std::unique_ptr<Instruction> > localVariables;
|
|
||||||
Function& parent;
|
|
||||||
|
|
||||||
// track whether this block is known to be uncreachable (not necessarily
|
|
||||||
// true for all unreachable blocks, but should be set at least
|
|
||||||
// for the extraneous ones introduced by the builder).
|
|
||||||
bool unreachable;
|
|
||||||
};
|
|
||||||
|
|
||||||
// The different reasons for reaching a block in the inReadableOrder traversal.
|
|
||||||
enum ReachReason {
|
|
||||||
// Reachable from the entry block via transfers of control, i.e. branches.
|
|
||||||
ReachViaControlFlow = 0,
|
|
||||||
// A continue target that is not reachable via control flow.
|
|
||||||
ReachDeadContinue,
|
|
||||||
// A merge block that is not reachable via control flow.
|
|
||||||
ReachDeadMerge
|
|
||||||
};
|
|
||||||
|
|
||||||
// Traverses the control-flow graph rooted at root in an order suited for
|
|
||||||
// readable code generation. Invokes callback at every node in the traversal
|
|
||||||
// order. The callback arguments are:
|
|
||||||
// - the block,
|
|
||||||
// - the reason we reached the block,
|
|
||||||
// - if the reason was that block is an unreachable continue or unreachable merge block
|
|
||||||
// then the last parameter is the corresponding header block.
|
|
||||||
void inReadableOrder(Block* root, std::function<void(Block*, ReachReason, Block* header)> callback);
|
|
||||||
|
|
||||||
//
|
|
||||||
// SPIR-V IR Function.
|
|
||||||
//
|
|
||||||
|
|
||||||
class Function {
|
|
||||||
public:
|
|
||||||
Function(Id id, Id resultType, Id functionType, Id firstParam, Module& parent);
|
|
||||||
virtual ~Function()
|
|
||||||
{
|
|
||||||
for (int i = 0; i < (int)parameterInstructions.size(); ++i)
|
|
||||||
delete parameterInstructions[i];
|
|
||||||
|
|
||||||
for (int i = 0; i < (int)blocks.size(); ++i)
|
|
||||||
delete blocks[i];
|
|
||||||
}
|
|
||||||
Id getId() const { return functionInstruction.getResultId(); }
|
|
||||||
Id getParamId(int p) const { return parameterInstructions[p]->getResultId(); }
|
|
||||||
Id getParamType(int p) const { return parameterInstructions[p]->getTypeId(); }
|
|
||||||
|
|
||||||
void addBlock(Block* block) { blocks.push_back(block); }
|
|
||||||
void removeBlock(Block* block)
|
|
||||||
{
|
|
||||||
auto found = find(blocks.begin(), blocks.end(), block);
|
|
||||||
assert(found != blocks.end());
|
|
||||||
blocks.erase(found);
|
|
||||||
delete block;
|
|
||||||
}
|
|
||||||
|
|
||||||
Module& getParent() const { return parent; }
|
|
||||||
Block* getEntryBlock() const { return blocks.front(); }
|
|
||||||
Block* getLastBlock() const { return blocks.back(); }
|
|
||||||
const std::vector<Block*>& getBlocks() const { return blocks; }
|
|
||||||
void addLocalVariable(std::unique_ptr<Instruction> inst);
|
|
||||||
Id getReturnType() const { return functionInstruction.getTypeId(); }
|
|
||||||
|
|
||||||
void setImplicitThis() { implicitThis = true; }
|
|
||||||
bool hasImplicitThis() const { return implicitThis; }
|
|
||||||
|
|
||||||
void dump(std::vector<unsigned int>& out) const
|
|
||||||
{
|
|
||||||
// OpFunction
|
|
||||||
functionInstruction.dump(out);
|
|
||||||
|
|
||||||
// OpFunctionParameter
|
|
||||||
for (int p = 0; p < (int)parameterInstructions.size(); ++p)
|
|
||||||
parameterInstructions[p]->dump(out);
|
|
||||||
|
|
||||||
// Blocks
|
|
||||||
inReadableOrder(blocks[0], [&out](const Block* b, ReachReason, Block*) { b->dump(out); });
|
|
||||||
Instruction end(0, 0, OpFunctionEnd);
|
|
||||||
end.dump(out);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
Function(const Function&);
|
|
||||||
Function& operator=(Function&);
|
|
||||||
|
|
||||||
Module& parent;
|
|
||||||
Instruction functionInstruction;
|
|
||||||
std::vector<Instruction*> parameterInstructions;
|
|
||||||
std::vector<Block*> blocks;
|
|
||||||
bool implicitThis; // true if this is a member function expecting to be passed a 'this' as the first argument
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// SPIR-V IR Module.
|
|
||||||
//
|
|
||||||
|
|
||||||
class Module {
|
|
||||||
public:
|
|
||||||
Module() {}
|
|
||||||
virtual ~Module()
|
|
||||||
{
|
|
||||||
// TODO delete things
|
|
||||||
}
|
|
||||||
|
|
||||||
void addFunction(Function *fun) { functions.push_back(fun); }
|
|
||||||
|
|
||||||
void mapInstruction(Instruction *instruction)
|
|
||||||
{
|
|
||||||
spv::Id resultId = instruction->getResultId();
|
|
||||||
// map the instruction's result id
|
|
||||||
if (resultId >= idToInstruction.size())
|
|
||||||
idToInstruction.resize(resultId + 16);
|
|
||||||
idToInstruction[resultId] = instruction;
|
|
||||||
}
|
|
||||||
|
|
||||||
Instruction* getInstruction(Id id) const { return idToInstruction[id]; }
|
|
||||||
const std::vector<Function*>& getFunctions() const { return functions; }
|
|
||||||
spv::Id getTypeId(Id resultId) const {
|
|
||||||
return idToInstruction[resultId] == nullptr ? NoType : idToInstruction[resultId]->getTypeId();
|
|
||||||
}
|
|
||||||
StorageClass getStorageClass(Id typeId) const
|
|
||||||
{
|
|
||||||
assert(idToInstruction[typeId]->getOpCode() == spv::OpTypePointer);
|
|
||||||
return (StorageClass)idToInstruction[typeId]->getImmediateOperand(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void dump(std::vector<unsigned int>& out) const
|
|
||||||
{
|
|
||||||
for (int f = 0; f < (int)functions.size(); ++f)
|
|
||||||
functions[f]->dump(out);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
Module(const Module&);
|
|
||||||
std::vector<Function*> functions;
|
|
||||||
|
|
||||||
// map from result id to instruction having that result id
|
|
||||||
std::vector<Instruction*> idToInstruction;
|
|
||||||
|
|
||||||
// map from a result id to its type id
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// Implementation (it's here due to circular type definitions).
|
|
||||||
//
|
|
||||||
|
|
||||||
// Add both
|
|
||||||
// - the OpFunction instruction
|
|
||||||
// - all the OpFunctionParameter instructions
|
|
||||||
__inline Function::Function(Id id, Id resultType, Id functionType, Id firstParamId, Module& parent)
|
|
||||||
: parent(parent), functionInstruction(id, resultType, OpFunction), implicitThis(false)
|
|
||||||
{
|
|
||||||
// OpFunction
|
|
||||||
functionInstruction.addImmediateOperand(FunctionControlMaskNone);
|
|
||||||
functionInstruction.addIdOperand(functionType);
|
|
||||||
parent.mapInstruction(&functionInstruction);
|
|
||||||
parent.addFunction(this);
|
|
||||||
|
|
||||||
// OpFunctionParameter
|
|
||||||
Instruction* typeInst = parent.getInstruction(functionType);
|
|
||||||
int numParams = typeInst->getNumOperands() - 1;
|
|
||||||
for (int p = 0; p < numParams; ++p) {
|
|
||||||
Instruction* param = new Instruction(firstParamId + p, typeInst->getIdOperand(p + 1), OpFunctionParameter);
|
|
||||||
parent.mapInstruction(param);
|
|
||||||
parameterInstructions.push_back(param);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
__inline void Function::addLocalVariable(std::unique_ptr<Instruction> inst)
|
|
||||||
{
|
|
||||||
Instruction* raw_instruction = inst.get();
|
|
||||||
blocks[0]->addLocalVariable(std::move(inst));
|
|
||||||
parent.mapInstruction(raw_instruction);
|
|
||||||
}
|
|
||||||
|
|
||||||
__inline Block::Block(Id id, Function& parent) : parent(parent), unreachable(false)
|
|
||||||
{
|
|
||||||
instructions.push_back(std::unique_ptr<Instruction>(new Instruction(id, NoType, OpLabel)));
|
|
||||||
instructions.back()->setBlock(this);
|
|
||||||
parent.getParent().mapInstruction(instructions.back().get());
|
|
||||||
}
|
|
||||||
|
|
||||||
__inline void Block::addInstruction(std::unique_ptr<Instruction> inst)
|
|
||||||
{
|
|
||||||
Instruction* raw_instruction = inst.get();
|
|
||||||
instructions.push_back(std::move(inst));
|
|
||||||
raw_instruction->setBlock(this);
|
|
||||||
if (raw_instruction->getResultId())
|
|
||||||
parent.getParent().mapInstruction(raw_instruction);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // end spv namespace
|
|
||||||
|
|
||||||
#endif // spvIR_H
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,57 @@
|
||||||
|
//
|
||||||
|
// Copyright (C) 2016 Google, Inc.
|
||||||
|
//
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions
|
||||||
|
// are met:
|
||||||
|
//
|
||||||
|
// Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following
|
||||||
|
// disclaimer in the documentation and/or other materials provided
|
||||||
|
// with the distribution.
|
||||||
|
//
|
||||||
|
// Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived
|
||||||
|
// from this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
|
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
// POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
#ifndef _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_
|
||||||
|
#define _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "../glslang/Include/ResourceLimits.h"
|
||||||
|
|
||||||
|
namespace glslang {
|
||||||
|
|
||||||
|
// These are the default resources for TBuiltInResources, used for both
|
||||||
|
// - parsing this string for the case where the user didn't supply one,
|
||||||
|
// - dumping out a template for user construction of a config file.
|
||||||
|
extern const TBuiltInResource DefaultTBuiltInResource;
|
||||||
|
|
||||||
|
// Returns the DefaultTBuiltInResource as a human-readable string.
|
||||||
|
std::string GetDefaultTBuiltInResourceString();
|
||||||
|
|
||||||
|
// Decodes the resource limits from |config| to |resources|.
|
||||||
|
void DecodeResourceLimits(TBuiltInResource* resources, char* config);
|
||||||
|
|
||||||
|
} // end namespace glslang
|
||||||
|
|
||||||
|
#endif // _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
/**
|
||||||
|
BSD 2-Clause License
|
||||||
|
|
||||||
|
Copyright (c) 2020, Travis Fort
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef _STAND_ALONE_RESOURCE_LIMITS_C_INCLUDED_
|
||||||
|
#define _STAND_ALONE_RESOURCE_LIMITS_C_INCLUDED_
|
||||||
|
|
||||||
|
#include "../glslang/Include/glslang_c_interface.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// These are the default resources for TBuiltInResources, used for both
|
||||||
|
// - parsing this string for the case where the user didn't supply one,
|
||||||
|
// - dumping out a template for user construction of a config file.
|
||||||
|
const glslang_resource_t* glslang_default_resource(void);
|
||||||
|
|
||||||
|
// Returns the DefaultTBuiltInResource as a human-readable string.
|
||||||
|
// NOTE: User is responsible for freeing this string.
|
||||||
|
const char* glslang_default_resource_string();
|
||||||
|
|
||||||
|
// Decodes the resource limits from |config| to |resources|.
|
||||||
|
void glslang_decode_resource_limits(glslang_resource_t* resources, char* config);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // _STAND_ALONE_RESOURCE_LIMITS_C_INCLUDED_
|
||||||
|
|
@ -231,6 +231,9 @@ enum TBuiltInVariable {
|
||||||
EbvFragSizeEXT,
|
EbvFragSizeEXT,
|
||||||
EbvFragInvocationCountEXT,
|
EbvFragInvocationCountEXT,
|
||||||
|
|
||||||
|
EbvSecondaryFragDataEXT,
|
||||||
|
EbvSecondaryFragColorEXT,
|
||||||
|
|
||||||
EbvViewportMaskNV,
|
EbvViewportMaskNV,
|
||||||
EbvSecondaryPositionNV,
|
EbvSecondaryPositionNV,
|
||||||
EbvSecondaryViewportMaskNV,
|
EbvSecondaryViewportMaskNV,
|
||||||
|
|
@ -433,6 +436,9 @@ __inline const char* GetBuiltInVariableString(TBuiltInVariable v)
|
||||||
case EbvFragSizeEXT: return "FragSizeEXT";
|
case EbvFragSizeEXT: return "FragSizeEXT";
|
||||||
case EbvFragInvocationCountEXT: return "FragInvocationCountEXT";
|
case EbvFragInvocationCountEXT: return "FragInvocationCountEXT";
|
||||||
|
|
||||||
|
case EbvSecondaryFragDataEXT: return "SecondaryFragDataEXT";
|
||||||
|
case EbvSecondaryFragColorEXT: return "SecondaryFragColorEXT";
|
||||||
|
|
||||||
case EbvViewportMaskNV: return "ViewportMaskNV";
|
case EbvViewportMaskNV: return "ViewportMaskNV";
|
||||||
case EbvSecondaryPositionNV: return "SecondaryPositionNV";
|
case EbvSecondaryPositionNV: return "SecondaryPositionNV";
|
||||||
case EbvSecondaryViewportMaskNV: return "SecondaryViewportMaskNV";
|
case EbvSecondaryViewportMaskNV: return "SecondaryViewportMaskNV";
|
||||||
|
|
|
||||||
|
|
@ -142,6 +142,7 @@ struct TBuiltInResource {
|
||||||
int maxTaskWorkGroupSizeY_NV;
|
int maxTaskWorkGroupSizeY_NV;
|
||||||
int maxTaskWorkGroupSizeZ_NV;
|
int maxTaskWorkGroupSizeZ_NV;
|
||||||
int maxMeshViewCountNV;
|
int maxMeshViewCountNV;
|
||||||
|
int maxDualSourceDrawBuffersEXT;
|
||||||
|
|
||||||
TLimits limits;
|
TLimits limits;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1235,6 +1235,7 @@ struct TShaderQualifiers {
|
||||||
bool layoutDerivativeGroupQuads; // true if layout derivative_group_quadsNV set
|
bool layoutDerivativeGroupQuads; // true if layout derivative_group_quadsNV set
|
||||||
bool layoutDerivativeGroupLinear; // true if layout derivative_group_linearNV set
|
bool layoutDerivativeGroupLinear; // true if layout derivative_group_linearNV set
|
||||||
int primitives; // mesh shader "max_primitives"DerivativeGroupLinear; // true if layout derivative_group_linearNV set
|
int primitives; // mesh shader "max_primitives"DerivativeGroupLinear; // true if layout derivative_group_linearNV set
|
||||||
|
bool layoutPrimitiveCulling; // true if layout primitive_culling set
|
||||||
TLayoutDepth getDepth() const { return layoutDepth; }
|
TLayoutDepth getDepth() const { return layoutDepth; }
|
||||||
#else
|
#else
|
||||||
TLayoutDepth getDepth() const { return EldNone; }
|
TLayoutDepth getDepth() const { return EldNone; }
|
||||||
|
|
@ -1268,6 +1269,7 @@ struct TShaderQualifiers {
|
||||||
layoutOverrideCoverage = false;
|
layoutOverrideCoverage = false;
|
||||||
layoutDerivativeGroupQuads = false;
|
layoutDerivativeGroupQuads = false;
|
||||||
layoutDerivativeGroupLinear = false;
|
layoutDerivativeGroupLinear = false;
|
||||||
|
layoutPrimitiveCulling = false;
|
||||||
primitives = TQualifier::layoutNotSet;
|
primitives = TQualifier::layoutNotSet;
|
||||||
interlockOrdering = EioNone;
|
interlockOrdering = EioNone;
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -1331,6 +1333,8 @@ struct TShaderQualifiers {
|
||||||
primitives = src.primitives;
|
primitives = src.primitives;
|
||||||
if (src.interlockOrdering != EioNone)
|
if (src.interlockOrdering != EioNone)
|
||||||
interlockOrdering = src.interlockOrdering;
|
interlockOrdering = src.interlockOrdering;
|
||||||
|
if (src.layoutPrimitiveCulling)
|
||||||
|
layoutPrimitiveCulling = src.layoutPrimitiveCulling;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -148,6 +148,7 @@ typedef struct glslang_resource_s {
|
||||||
int max_task_work_group_size_y_nv;
|
int max_task_work_group_size_y_nv;
|
||||||
int max_task_work_group_size_z_nv;
|
int max_task_work_group_size_z_nv;
|
||||||
int max_mesh_view_count_nv;
|
int max_mesh_view_count_nv;
|
||||||
|
int maxDualSourceDrawBuffersEXT;
|
||||||
|
|
||||||
glslang_limits_t limits;
|
glslang_limits_t limits;
|
||||||
} glslang_resource_t;
|
} glslang_resource_t;
|
||||||
|
|
|
||||||
|
|
@ -164,6 +164,9 @@ typedef enum {
|
||||||
GLSLANG_REFLECTION_SEPARATE_BUFFERS_BIT = (1 << 3),
|
GLSLANG_REFLECTION_SEPARATE_BUFFERS_BIT = (1 << 3),
|
||||||
GLSLANG_REFLECTION_ALL_BLOCK_VARIABLES_BIT = (1 << 4),
|
GLSLANG_REFLECTION_ALL_BLOCK_VARIABLES_BIT = (1 << 4),
|
||||||
GLSLANG_REFLECTION_UNWRAP_IO_BLOCKS_BIT = (1 << 5),
|
GLSLANG_REFLECTION_UNWRAP_IO_BLOCKS_BIT = (1 << 5),
|
||||||
|
GLSLANG_REFLECTION_ALL_IO_VARIABLES_BIT = (1 << 6),
|
||||||
|
GLSLANG_REFLECTION_SHARED_STD140_SSBO_BIT = (1 << 7),
|
||||||
|
GLSLANG_REFLECTION_SHARED_STD140_UBO_BIT = (1 << 8),
|
||||||
LAST_ELEMENT_MARKER(GLSLANG_REFLECTION_COUNT),
|
LAST_ELEMENT_MARKER(GLSLANG_REFLECTION_COUNT),
|
||||||
} glslang_reflection_options_t;
|
} glslang_reflection_options_t;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
// This header is generated by the make-revision script.
|
// This header is generated by the make-revision script.
|
||||||
|
|
||||||
#define GLSLANG_PATCH_LEVEL 3743
|
#define GLSLANG_PATCH_LEVEL 3795
|
||||||
|
|
|
||||||
|
|
@ -68,6 +68,7 @@ class TScanContext;
|
||||||
class TPpContext;
|
class TPpContext;
|
||||||
|
|
||||||
typedef std::set<int> TIdSetType;
|
typedef std::set<int> TIdSetType;
|
||||||
|
typedef std::map<const TTypeList*, std::map<size_t, const TTypeList*>> TStructRecord;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Sharable code (as well as what's in TParseVersions) across
|
// Sharable code (as well as what's in TParseVersions) across
|
||||||
|
|
@ -315,6 +316,7 @@ public:
|
||||||
TIntermTyped* handleBinaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* left, TIntermTyped* right);
|
TIntermTyped* handleBinaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* left, TIntermTyped* right);
|
||||||
TIntermTyped* handleUnaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* childNode);
|
TIntermTyped* handleUnaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* childNode);
|
||||||
TIntermTyped* handleDotDereference(const TSourceLoc&, TIntermTyped* base, const TString& field);
|
TIntermTyped* handleDotDereference(const TSourceLoc&, TIntermTyped* base, const TString& field);
|
||||||
|
TIntermTyped* handleDotSwizzle(const TSourceLoc&, TIntermTyped* base, const TString& field);
|
||||||
void blockMemberExtensionCheck(const TSourceLoc&, const TIntermTyped* base, int member, const TString& memberName);
|
void blockMemberExtensionCheck(const TSourceLoc&, const TIntermTyped* base, int member, const TString& memberName);
|
||||||
TFunction* handleFunctionDeclarator(const TSourceLoc&, TFunction& function, bool prototype);
|
TFunction* handleFunctionDeclarator(const TSourceLoc&, TFunction& function, bool prototype);
|
||||||
TIntermAggregate* handleFunctionDefinition(const TSourceLoc&, TFunction&);
|
TIntermAggregate* handleFunctionDefinition(const TSourceLoc&, TFunction&);
|
||||||
|
|
@ -417,12 +419,15 @@ public:
|
||||||
void fixBlockLocations(const TSourceLoc&, TQualifier&, TTypeList&, bool memberWithLocation, bool memberWithoutLocation);
|
void fixBlockLocations(const TSourceLoc&, TQualifier&, TTypeList&, bool memberWithLocation, bool memberWithoutLocation);
|
||||||
void fixXfbOffsets(TQualifier&, TTypeList&);
|
void fixXfbOffsets(TQualifier&, TTypeList&);
|
||||||
void fixBlockUniformOffsets(TQualifier&, TTypeList&);
|
void fixBlockUniformOffsets(TQualifier&, TTypeList&);
|
||||||
|
void fixBlockUniformLayoutMatrix(TQualifier&, TTypeList*, TTypeList*);
|
||||||
|
void fixBlockUniformLayoutPacking(TQualifier&, TTypeList*, TTypeList*);
|
||||||
void addQualifierToExisting(const TSourceLoc&, TQualifier, const TString& identifier);
|
void addQualifierToExisting(const TSourceLoc&, TQualifier, const TString& identifier);
|
||||||
void addQualifierToExisting(const TSourceLoc&, TQualifier, TIdentifierList&);
|
void addQualifierToExisting(const TSourceLoc&, TQualifier, TIdentifierList&);
|
||||||
void invariantCheck(const TSourceLoc&, const TQualifier&);
|
void invariantCheck(const TSourceLoc&, const TQualifier&);
|
||||||
void updateStandaloneQualifierDefaults(const TSourceLoc&, const TPublicType&);
|
void updateStandaloneQualifierDefaults(const TSourceLoc&, const TPublicType&);
|
||||||
void wrapupSwitchSubsequence(TIntermAggregate* statements, TIntermNode* branchNode);
|
void wrapupSwitchSubsequence(TIntermAggregate* statements, TIntermNode* branchNode);
|
||||||
TIntermNode* addSwitch(const TSourceLoc&, TIntermTyped* expression, TIntermAggregate* body);
|
TIntermNode* addSwitch(const TSourceLoc&, TIntermTyped* expression, TIntermAggregate* body);
|
||||||
|
const TTypeList* recordStructCopy(TStructRecord&, const TType*, const TType*);
|
||||||
|
|
||||||
#ifndef GLSLANG_WEB
|
#ifndef GLSLANG_WEB
|
||||||
TAttributeType attributeFromName(const TString& name) const;
|
TAttributeType attributeFromName(const TString& name) const;
|
||||||
|
|
@ -483,6 +488,8 @@ protected:
|
||||||
bool anyIndexLimits;
|
bool anyIndexLimits;
|
||||||
TIdSetType inductiveLoopIds;
|
TIdSetType inductiveLoopIds;
|
||||||
TVector<TIntermTyped*> needsIndexLimitationChecking;
|
TVector<TIntermTyped*> needsIndexLimitationChecking;
|
||||||
|
TStructRecord matrixFixRecord;
|
||||||
|
TStructRecord packingFixRecord;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Geometry shader input arrays:
|
// Geometry shader input arrays:
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
// POSSIBILITY OF SUCH DAMAGE.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef _VERSIONS_INCLUDED_
|
#ifndef _VERSIONS_INCLUDED_
|
||||||
#define _VERSIONS_INCLUDED_
|
#define _VERSIONS_INCLUDED_
|
||||||
|
|
||||||
|
|
@ -52,7 +53,7 @@
|
||||||
// Don't maintain an ordinal set of enums (0,1,2,3...) to avoid all possible
|
// Don't maintain an ordinal set of enums (0,1,2,3...) to avoid all possible
|
||||||
// defects from mixing the two different forms.
|
// defects from mixing the two different forms.
|
||||||
//
|
//
|
||||||
typedef enum {
|
typedef enum : unsigned {
|
||||||
EBadProfile = 0,
|
EBadProfile = 0,
|
||||||
ENoProfile = (1 << 0), // only for desktop, before profiles showed up
|
ENoProfile = (1 << 0), // only for desktop, before profiles showed up
|
||||||
ECoreProfile = (1 << 1),
|
ECoreProfile = (1 << 1),
|
||||||
|
|
@ -157,6 +158,7 @@ const char* const E_GL_ARB_shader_image_size = "GL_ARB_shader_image_s
|
||||||
const char* const E_GL_ARB_shader_storage_buffer_object = "GL_ARB_shader_storage_buffer_object";
|
const char* const E_GL_ARB_shader_storage_buffer_object = "GL_ARB_shader_storage_buffer_object";
|
||||||
const char* const E_GL_ARB_shading_language_packing = "GL_ARB_shading_language_packing";
|
const char* const E_GL_ARB_shading_language_packing = "GL_ARB_shading_language_packing";
|
||||||
const char* const E_GL_ARB_texture_query_lod = "GL_ARB_texture_query_lod";
|
const char* const E_GL_ARB_texture_query_lod = "GL_ARB_texture_query_lod";
|
||||||
|
const char* const E_GL_ARB_vertex_attrib_64bit = "GL_ARB_vertex_attrib_64bit";
|
||||||
|
|
||||||
const char* const E_GL_KHR_shader_subgroup_basic = "GL_KHR_shader_subgroup_basic";
|
const char* const E_GL_KHR_shader_subgroup_basic = "GL_KHR_shader_subgroup_basic";
|
||||||
const char* const E_GL_KHR_shader_subgroup_vote = "GL_KHR_shader_subgroup_vote";
|
const char* const E_GL_KHR_shader_subgroup_vote = "GL_KHR_shader_subgroup_vote";
|
||||||
|
|
@ -195,6 +197,8 @@ const char* const E_GL_EXT_debug_printf = "GL_EXT_debug_prin
|
||||||
const char* const E_GL_EXT_ray_tracing = "GL_EXT_ray_tracing";
|
const char* const E_GL_EXT_ray_tracing = "GL_EXT_ray_tracing";
|
||||||
const char* const E_GL_EXT_ray_query = "GL_EXT_ray_query";
|
const char* const E_GL_EXT_ray_query = "GL_EXT_ray_query";
|
||||||
const char* const E_GL_EXT_ray_flags_primitive_culling = "GL_EXT_ray_flags_primitive_culling";
|
const char* const E_GL_EXT_ray_flags_primitive_culling = "GL_EXT_ray_flags_primitive_culling";
|
||||||
|
const char* const E_GL_EXT_blend_func_extended = "GL_EXT_blend_func_extended";
|
||||||
|
const char* const E_GL_EXT_shader_implicit_conversions = "GL_EXT_shader_implicit_conversions";
|
||||||
|
|
||||||
// Arrays of extensions for the above viewportEXTs duplications
|
// Arrays of extensions for the above viewportEXTs duplications
|
||||||
|
|
||||||
|
|
@ -266,6 +270,7 @@ const char* const E_GL_EXT_tessellation_shader = "GL_EXT_tessel
|
||||||
const char* const E_GL_EXT_tessellation_point_size = "GL_EXT_tessellation_point_size";
|
const char* const E_GL_EXT_tessellation_point_size = "GL_EXT_tessellation_point_size";
|
||||||
const char* const E_GL_EXT_texture_buffer = "GL_EXT_texture_buffer";
|
const char* const E_GL_EXT_texture_buffer = "GL_EXT_texture_buffer";
|
||||||
const char* const E_GL_EXT_texture_cube_map_array = "GL_EXT_texture_cube_map_array";
|
const char* const E_GL_EXT_texture_cube_map_array = "GL_EXT_texture_cube_map_array";
|
||||||
|
const char* const E_GL_EXT_shader_integer_mix = "GL_EXT_shader_integer_mix";
|
||||||
|
|
||||||
// OES matching AEP
|
// OES matching AEP
|
||||||
const char* const E_GL_OES_geometry_shader = "GL_OES_geometry_shader";
|
const char* const E_GL_OES_geometry_shader = "GL_OES_geometry_shader";
|
||||||
|
|
|
||||||
|
|
@ -203,6 +203,7 @@ public:
|
||||||
void endCollect(EShLanguage) override;
|
void endCollect(EShLanguage) override;
|
||||||
void reserverStorageSlot(TVarEntryInfo& ent, TInfoSink& infoSink) override;
|
void reserverStorageSlot(TVarEntryInfo& ent, TInfoSink& infoSink) override;
|
||||||
void reserverResourceSlot(TVarEntryInfo& ent, TInfoSink& infoSink) override;
|
void reserverResourceSlot(TVarEntryInfo& ent, TInfoSink& infoSink) override;
|
||||||
|
const TString& getAccessName(const TIntermSymbol*);
|
||||||
// in/out symbol and uniform symbol are stored in the same resourceSlotMap, the storage key is used to identify each type of symbol.
|
// in/out symbol and uniform symbol are stored in the same resourceSlotMap, the storage key is used to identify each type of symbol.
|
||||||
// We use stage and storage qualifier to construct a storage key. it can help us identify the same storage resource used in different stage.
|
// We use stage and storage qualifier to construct a storage key. it can help us identify the same storage resource used in different stage.
|
||||||
// if a resource is a program resource and we don't need know it usage stage, we can use same stage to build storage key.
|
// if a resource is a program resource and we don't need know it usage stage, we can use same stage to build storage key.
|
||||||
|
|
@ -238,12 +239,13 @@ typedef std::map<TString, TVarEntryInfo> TVarLiveMap;
|
||||||
// In the future, if the vc++ compiler can handle such a situation,
|
// In the future, if the vc++ compiler can handle such a situation,
|
||||||
// this part of the code will be removed.
|
// this part of the code will be removed.
|
||||||
struct TVarLivePair : std::pair<const TString, TVarEntryInfo> {
|
struct TVarLivePair : std::pair<const TString, TVarEntryInfo> {
|
||||||
TVarLivePair(std::pair<const TString, TVarEntryInfo>& _Right) : pair(_Right.first, _Right.second) {}
|
TVarLivePair(const std::pair<const TString, TVarEntryInfo>& _Right) : pair(_Right.first, _Right.second) {}
|
||||||
TVarLivePair& operator=(const TVarLivePair& _Right) {
|
TVarLivePair& operator=(const TVarLivePair& _Right) {
|
||||||
const_cast<TString&>(first) = _Right.first;
|
const_cast<TString&>(first) = _Right.first;
|
||||||
second = _Right.second;
|
second = _Right.second;
|
||||||
return (*this);
|
return (*this);
|
||||||
}
|
}
|
||||||
|
TVarLivePair(const TVarLivePair& src) : pair(src) { }
|
||||||
};
|
};
|
||||||
typedef std::vector<TVarLivePair> TVarLiveVector;
|
typedef std::vector<TVarLivePair> TVarLiveVector;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -265,6 +265,7 @@ public:
|
||||||
computeDerivativeMode(LayoutDerivativeNone),
|
computeDerivativeMode(LayoutDerivativeNone),
|
||||||
primitives(TQualifier::layoutNotSet),
|
primitives(TQualifier::layoutNotSet),
|
||||||
numTaskNVBlocks(0),
|
numTaskNVBlocks(0),
|
||||||
|
layoutPrimitiveCulling(false),
|
||||||
autoMapBindings(false),
|
autoMapBindings(false),
|
||||||
autoMapLocations(false),
|
autoMapLocations(false),
|
||||||
flattenUniformArrays(false),
|
flattenUniformArrays(false),
|
||||||
|
|
@ -356,8 +357,15 @@ public:
|
||||||
}
|
}
|
||||||
const SpvVersion& getSpv() const { return spvVersion; }
|
const SpvVersion& getSpv() const { return spvVersion; }
|
||||||
EShLanguage getStage() const { return language; }
|
EShLanguage getStage() const { return language; }
|
||||||
void addRequestedExtension(const char* extension) { requestedExtensions.insert(extension); }
|
void updateRequestedExtension(const char* extension, TExtensionBehavior behavior) {
|
||||||
const std::set<std::string>& getRequestedExtensions() const { return requestedExtensions; }
|
if(requestedExtensions.find(extension) != requestedExtensions.end()) {
|
||||||
|
requestedExtensions[extension] = behavior;
|
||||||
|
} else {
|
||||||
|
requestedExtensions.insert(std::make_pair(extension, behavior));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::map<std::string, TExtensionBehavior>& getRequestedExtensions() const { return requestedExtensions; }
|
||||||
|
|
||||||
void setTreeRoot(TIntermNode* r) { treeRoot = r; }
|
void setTreeRoot(TIntermNode* r) { treeRoot = r; }
|
||||||
TIntermNode* getTreeRoot() const { return treeRoot; }
|
TIntermNode* getTreeRoot() const { return treeRoot; }
|
||||||
|
|
@ -392,7 +400,7 @@ public:
|
||||||
void setSource(EShSource s) { source = s; }
|
void setSource(EShSource s) { source = s; }
|
||||||
EShSource getSource() const { return source; }
|
EShSource getSource() const { return source; }
|
||||||
#else
|
#else
|
||||||
void setSource(EShSource s) { assert(s == EShSourceGlsl); }
|
void setSource(EShSource s) { assert(s == EShSourceGlsl); (void)s; }
|
||||||
EShSource getSource() const { return EShSourceGlsl; }
|
EShSource getSource() const { return EShSourceGlsl; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -735,6 +743,8 @@ public:
|
||||||
void setLayoutDerivativeMode(ComputeDerivativeMode mode) { computeDerivativeMode = mode; }
|
void setLayoutDerivativeMode(ComputeDerivativeMode mode) { computeDerivativeMode = mode; }
|
||||||
bool hasLayoutDerivativeModeNone() const { return computeDerivativeMode != LayoutDerivativeNone; }
|
bool hasLayoutDerivativeModeNone() const { return computeDerivativeMode != LayoutDerivativeNone; }
|
||||||
ComputeDerivativeMode getLayoutDerivativeModeNone() const { return computeDerivativeMode; }
|
ComputeDerivativeMode getLayoutDerivativeModeNone() const { return computeDerivativeMode; }
|
||||||
|
void setLayoutPrimitiveCulling() { layoutPrimitiveCulling = true; }
|
||||||
|
bool getLayoutPrimitiveCulling() const { return layoutPrimitiveCulling; }
|
||||||
bool setPrimitives(int m)
|
bool setPrimitives(int m)
|
||||||
{
|
{
|
||||||
if (primitives != TQualifier::layoutNotSet)
|
if (primitives != TQualifier::layoutNotSet)
|
||||||
|
|
@ -902,7 +912,13 @@ protected:
|
||||||
#ifdef GLSLANG_WEB
|
#ifdef GLSLANG_WEB
|
||||||
bool extensionRequested(const char *extension) const { return false; }
|
bool extensionRequested(const char *extension) const { return false; }
|
||||||
#else
|
#else
|
||||||
bool extensionRequested(const char *extension) const {return requestedExtensions.find(extension) != requestedExtensions.end();}
|
bool extensionRequested(const char *extension) const {
|
||||||
|
auto it = requestedExtensions.find(extension);
|
||||||
|
if (it != requestedExtensions.end()) {
|
||||||
|
return (it->second == EBhDisable) ? false : true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const char* getResourceName(TResourceType);
|
static const char* getResourceName(TResourceType);
|
||||||
|
|
@ -917,7 +933,7 @@ protected:
|
||||||
int version; // source version
|
int version; // source version
|
||||||
SpvVersion spvVersion;
|
SpvVersion spvVersion;
|
||||||
TIntermNode* treeRoot;
|
TIntermNode* treeRoot;
|
||||||
std::set<std::string> requestedExtensions; // cumulation of all enabled or required extensions; not connected to what subset of the shader used them
|
std::map<std::string, TExtensionBehavior> requestedExtensions; // cumulation of all enabled or required extensions; not connected to what subset of the shader used them
|
||||||
TBuiltInResource resources;
|
TBuiltInResource resources;
|
||||||
int numEntryPoints;
|
int numEntryPoints;
|
||||||
int numErrors;
|
int numErrors;
|
||||||
|
|
@ -961,6 +977,7 @@ protected:
|
||||||
ComputeDerivativeMode computeDerivativeMode;
|
ComputeDerivativeMode computeDerivativeMode;
|
||||||
int primitives;
|
int primitives;
|
||||||
int numTaskNVBlocks;
|
int numTaskNVBlocks;
|
||||||
|
bool layoutPrimitiveCulling;
|
||||||
|
|
||||||
// Base shift values
|
// Base shift values
|
||||||
std::array<unsigned int, EResCount> shiftBinding;
|
std::array<unsigned int, EResCount> shiftBinding;
|
||||||
|
|
|
||||||
|
|
@ -101,6 +101,7 @@ public:
|
||||||
void updateExtensionBehavior(int line, const char* const extension, const char* behavior) { }
|
void updateExtensionBehavior(int line, const char* const extension, const char* behavior) { }
|
||||||
void updateExtensionBehavior(const char* const extension, TExtensionBehavior) { }
|
void updateExtensionBehavior(const char* const extension, TExtensionBehavior) { }
|
||||||
void checkExtensionStage(const TSourceLoc&, const char* const extension) { }
|
void checkExtensionStage(const TSourceLoc&, const char* const extension) { }
|
||||||
|
void extensionRequires(const TSourceLoc&, const char* const extension, const char* behavior) { }
|
||||||
void fullIntegerCheck(const TSourceLoc&, const char* op) { }
|
void fullIntegerCheck(const TSourceLoc&, const char* op) { }
|
||||||
void doubleCheck(const TSourceLoc&, const char* op) { }
|
void doubleCheck(const TSourceLoc&, const char* op) { }
|
||||||
bool float16Arithmetic() { return false; }
|
bool float16Arithmetic() { return false; }
|
||||||
|
|
@ -139,6 +140,7 @@ public:
|
||||||
virtual bool checkExtensionsRequested(const TSourceLoc&, int numExtensions, const char* const extensions[],
|
virtual bool checkExtensionsRequested(const TSourceLoc&, int numExtensions, const char* const extensions[],
|
||||||
const char* featureDesc);
|
const char* featureDesc);
|
||||||
virtual void checkExtensionStage(const TSourceLoc&, const char* const extension);
|
virtual void checkExtensionStage(const TSourceLoc&, const char* const extension);
|
||||||
|
virtual void extensionRequires(const TSourceLoc&, const char* const extension, const char* behavior);
|
||||||
virtual void fullIntegerCheck(const TSourceLoc&, const char* op);
|
virtual void fullIntegerCheck(const TSourceLoc&, const char* op);
|
||||||
|
|
||||||
virtual void unimplemented(const TSourceLoc&, const char* featureDesc);
|
virtual void unimplemented(const TSourceLoc&, const char* featureDesc);
|
||||||
|
|
@ -170,6 +172,7 @@ public:
|
||||||
virtual void vulkanRemoved(const TSourceLoc&, const char* op);
|
virtual void vulkanRemoved(const TSourceLoc&, const char* op);
|
||||||
virtual void requireVulkan(const TSourceLoc&, const char* op);
|
virtual void requireVulkan(const TSourceLoc&, const char* op);
|
||||||
virtual void requireSpv(const TSourceLoc&, const char* op);
|
virtual void requireSpv(const TSourceLoc&, const char* op);
|
||||||
|
virtual void requireSpv(const TSourceLoc&, const char *op, unsigned int version);
|
||||||
|
|
||||||
|
|
||||||
#if defined(GLSLANG_WEB) && !defined(GLSLANG_WEB_DEVEL)
|
#if defined(GLSLANG_WEB) && !defined(GLSLANG_WEB_DEVEL)
|
||||||
|
|
@ -222,6 +225,7 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
TMap<TString, TExtensionBehavior> extensionBehavior; // for each extension string, what its current behavior is set to
|
TMap<TString, TExtensionBehavior> extensionBehavior; // for each extension string, what its current behavior is set to
|
||||||
|
TMap<TString, unsigned int> extensionMinSpv; // for each extension string, store minimum spirv required
|
||||||
EShMessages messages; // errors/warnings/rule-sets
|
EShMessages messages; // errors/warnings/rule-sets
|
||||||
int numErrors; // number of compile-time errors encountered
|
int numErrors; // number of compile-time errors encountered
|
||||||
TInputScanner* currentScanner;
|
TInputScanner* currentScanner;
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,7 @@
|
||||||
// This should always increase, as some paths to do not consume
|
// This should always increase, as some paths to do not consume
|
||||||
// a more major number.
|
// a more major number.
|
||||||
// It should increment by one when new functionality is added.
|
// It should increment by one when new functionality is added.
|
||||||
#define GLSLANG_MINOR_VERSION 13
|
#define GLSLANG_MINOR_VERSION 14
|
||||||
|
|
||||||
//
|
//
|
||||||
// Call before doing any other compiler/linker operations.
|
// Call before doing any other compiler/linker operations.
|
||||||
|
|
@ -109,7 +109,7 @@ typedef enum {
|
||||||
LAST_ELEMENT_MARKER(EShLangCount),
|
LAST_ELEMENT_MARKER(EShLangCount),
|
||||||
} EShLanguage; // would be better as stage, but this is ancient now
|
} EShLanguage; // would be better as stage, but this is ancient now
|
||||||
|
|
||||||
typedef enum {
|
typedef enum : unsigned {
|
||||||
EShLangVertexMask = (1 << EShLangVertex),
|
EShLangVertexMask = (1 << EShLangVertex),
|
||||||
EShLangTessControlMask = (1 << EShLangTessControl),
|
EShLangTessControlMask = (1 << EShLangTessControl),
|
||||||
EShLangTessEvaluationMask = (1 << EShLangTessEvaluation),
|
EShLangTessEvaluationMask = (1 << EShLangTessEvaluation),
|
||||||
|
|
@ -240,7 +240,7 @@ typedef enum {
|
||||||
//
|
//
|
||||||
// Message choices for what errors and warnings are given.
|
// Message choices for what errors and warnings are given.
|
||||||
//
|
//
|
||||||
enum EShMessages {
|
enum EShMessages : unsigned {
|
||||||
EShMsgDefault = 0, // default is to give all required errors and extra warnings
|
EShMsgDefault = 0, // default is to give all required errors and extra warnings
|
||||||
EShMsgRelaxedErrors = (1 << 0), // be liberal in accepting input
|
EShMsgRelaxedErrors = (1 << 0), // be liberal in accepting input
|
||||||
EShMsgSuppressWarnings = (1 << 1), // suppress all warnings, except those required by the specification
|
EShMsgSuppressWarnings = (1 << 1), // suppress all warnings, except those required by the specification
|
||||||
|
|
@ -255,7 +255,7 @@ enum EShMessages {
|
||||||
EShMsgDebugInfo = (1 << 10), // save debug information
|
EShMsgDebugInfo = (1 << 10), // save debug information
|
||||||
EShMsgHlslEnable16BitTypes = (1 << 11), // enable use of 16-bit types in SPIR-V for HLSL
|
EShMsgHlslEnable16BitTypes = (1 << 11), // enable use of 16-bit types in SPIR-V for HLSL
|
||||||
EShMsgHlslLegalization = (1 << 12), // enable HLSL Legalization messages
|
EShMsgHlslLegalization = (1 << 12), // enable HLSL Legalization messages
|
||||||
EShMsgHlslDX9Compatible = (1 << 13), // enable HLSL DX9 compatible mode (right now only for samplers)
|
EShMsgHlslDX9Compatible = (1 << 13), // enable HLSL DX9 compatible mode (for samplers and semantics)
|
||||||
EShMsgBuiltinSymbolTable = (1 << 14), // print the builtin symbol table
|
EShMsgBuiltinSymbolTable = (1 << 14), // print the builtin symbol table
|
||||||
LAST_ELEMENT_MARKER(EShMsgCount),
|
LAST_ELEMENT_MARKER(EShMsgCount),
|
||||||
};
|
};
|
||||||
|
|
@ -271,6 +271,9 @@ typedef enum {
|
||||||
EShReflectionSeparateBuffers = (1 << 3), // buffer variables and buffer blocks are reflected separately
|
EShReflectionSeparateBuffers = (1 << 3), // buffer variables and buffer blocks are reflected separately
|
||||||
EShReflectionAllBlockVariables = (1 << 4), // reflect all variables in blocks, even if they are inactive
|
EShReflectionAllBlockVariables = (1 << 4), // reflect all variables in blocks, even if they are inactive
|
||||||
EShReflectionUnwrapIOBlocks = (1 << 5), // unwrap input/output blocks the same as with uniform blocks
|
EShReflectionUnwrapIOBlocks = (1 << 5), // unwrap input/output blocks the same as with uniform blocks
|
||||||
|
EShReflectionAllIOVariables = (1 << 6), // reflect all input/output variables, even if they are inactive
|
||||||
|
EShReflectionSharedStd140SSBO = (1 << 7), // Apply std140/shared rules for ubo to ssbo
|
||||||
|
EShReflectionSharedStd140UBO = (1 << 8), // Apply std140/shared rules for ubo to ssbo
|
||||||
LAST_ELEMENT_MARKER(EShReflectionCount),
|
LAST_ELEMENT_MARKER(EShReflectionCount),
|
||||||
} EShReflectionOptions;
|
} EShReflectionOptions;
|
||||||
|
|
||||||
|
|
@ -412,6 +415,7 @@ enum TResourceType {
|
||||||
EResCount
|
EResCount
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// Make one TShader per shader that you will link into a program. Then
|
// Make one TShader per shader that you will link into a program. Then
|
||||||
// - provide the shader through setStrings() or setStringsWithLengths()
|
// - provide the shader through setStrings() or setStringsWithLengths()
|
||||||
// - optionally call setEnv*(), see below for more detail
|
// - optionally call setEnv*(), see below for more detail
|
||||||
|
|
@ -694,6 +698,7 @@ public:
|
||||||
int counterIndex;
|
int counterIndex;
|
||||||
int numMembers;
|
int numMembers;
|
||||||
int arrayStride; // stride of an array variable
|
int arrayStride; // stride of an array variable
|
||||||
|
int topLevelArraySize; // size of the top-level variable in a storage buffer member
|
||||||
int topLevelArrayStride; // stride of the top-level variable in a storage buffer member
|
int topLevelArrayStride; // stride of the top-level variable in a storage buffer member
|
||||||
EShLanguageMask stages;
|
EShLanguageMask stages;
|
||||||
|
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,57 @@
|
||||||
|
//
|
||||||
|
// Copyright (C) 2016 Google, Inc.
|
||||||
|
//
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions
|
||||||
|
// are met:
|
||||||
|
//
|
||||||
|
// Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following
|
||||||
|
// disclaimer in the documentation and/or other materials provided
|
||||||
|
// with the distribution.
|
||||||
|
//
|
||||||
|
// Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived
|
||||||
|
// from this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
|
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
// POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
#ifndef _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_
|
||||||
|
#define _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "../glslang/Include/ResourceLimits.h"
|
||||||
|
|
||||||
|
namespace glslang {
|
||||||
|
|
||||||
|
// These are the default resources for TBuiltInResources, used for both
|
||||||
|
// - parsing this string for the case where the user didn't supply one,
|
||||||
|
// - dumping out a template for user construction of a config file.
|
||||||
|
extern const TBuiltInResource DefaultTBuiltInResource;
|
||||||
|
|
||||||
|
// Returns the DefaultTBuiltInResource as a human-readable string.
|
||||||
|
std::string GetDefaultTBuiltInResourceString();
|
||||||
|
|
||||||
|
// Decodes the resource limits from |config| to |resources|.
|
||||||
|
void DecodeResourceLimits(TBuiltInResource* resources, char* config);
|
||||||
|
|
||||||
|
} // end namespace glslang
|
||||||
|
|
||||||
|
#endif // _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
/**
|
||||||
|
BSD 2-Clause License
|
||||||
|
|
||||||
|
Copyright (c) 2020, Travis Fort
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef _STAND_ALONE_RESOURCE_LIMITS_C_INCLUDED_
|
||||||
|
#define _STAND_ALONE_RESOURCE_LIMITS_C_INCLUDED_
|
||||||
|
|
||||||
|
#include "../glslang/Include/glslang_c_interface.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// These are the default resources for TBuiltInResources, used for both
|
||||||
|
// - parsing this string for the case where the user didn't supply one,
|
||||||
|
// - dumping out a template for user construction of a config file.
|
||||||
|
const glslang_resource_t* glslang_default_resource(void);
|
||||||
|
|
||||||
|
// Returns the DefaultTBuiltInResource as a human-readable string.
|
||||||
|
// NOTE: User is responsible for freeing this string.
|
||||||
|
const char* glslang_default_resource_string();
|
||||||
|
|
||||||
|
// Decodes the resource limits from |config| to |resources|.
|
||||||
|
void glslang_decode_resource_limits(glslang_resource_t* resources, char* config);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // _STAND_ALONE_RESOURCE_LIMITS_C_INCLUDED_
|
||||||
|
|
@ -231,6 +231,9 @@ enum TBuiltInVariable {
|
||||||
EbvFragSizeEXT,
|
EbvFragSizeEXT,
|
||||||
EbvFragInvocationCountEXT,
|
EbvFragInvocationCountEXT,
|
||||||
|
|
||||||
|
EbvSecondaryFragDataEXT,
|
||||||
|
EbvSecondaryFragColorEXT,
|
||||||
|
|
||||||
EbvViewportMaskNV,
|
EbvViewportMaskNV,
|
||||||
EbvSecondaryPositionNV,
|
EbvSecondaryPositionNV,
|
||||||
EbvSecondaryViewportMaskNV,
|
EbvSecondaryViewportMaskNV,
|
||||||
|
|
@ -433,6 +436,9 @@ __inline const char* GetBuiltInVariableString(TBuiltInVariable v)
|
||||||
case EbvFragSizeEXT: return "FragSizeEXT";
|
case EbvFragSizeEXT: return "FragSizeEXT";
|
||||||
case EbvFragInvocationCountEXT: return "FragInvocationCountEXT";
|
case EbvFragInvocationCountEXT: return "FragInvocationCountEXT";
|
||||||
|
|
||||||
|
case EbvSecondaryFragDataEXT: return "SecondaryFragDataEXT";
|
||||||
|
case EbvSecondaryFragColorEXT: return "SecondaryFragColorEXT";
|
||||||
|
|
||||||
case EbvViewportMaskNV: return "ViewportMaskNV";
|
case EbvViewportMaskNV: return "ViewportMaskNV";
|
||||||
case EbvSecondaryPositionNV: return "SecondaryPositionNV";
|
case EbvSecondaryPositionNV: return "SecondaryPositionNV";
|
||||||
case EbvSecondaryViewportMaskNV: return "SecondaryViewportMaskNV";
|
case EbvSecondaryViewportMaskNV: return "SecondaryViewportMaskNV";
|
||||||
|
|
|
||||||
|
|
@ -142,6 +142,7 @@ struct TBuiltInResource {
|
||||||
int maxTaskWorkGroupSizeY_NV;
|
int maxTaskWorkGroupSizeY_NV;
|
||||||
int maxTaskWorkGroupSizeZ_NV;
|
int maxTaskWorkGroupSizeZ_NV;
|
||||||
int maxMeshViewCountNV;
|
int maxMeshViewCountNV;
|
||||||
|
int maxDualSourceDrawBuffersEXT;
|
||||||
|
|
||||||
TLimits limits;
|
TLimits limits;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1235,6 +1235,7 @@ struct TShaderQualifiers {
|
||||||
bool layoutDerivativeGroupQuads; // true if layout derivative_group_quadsNV set
|
bool layoutDerivativeGroupQuads; // true if layout derivative_group_quadsNV set
|
||||||
bool layoutDerivativeGroupLinear; // true if layout derivative_group_linearNV set
|
bool layoutDerivativeGroupLinear; // true if layout derivative_group_linearNV set
|
||||||
int primitives; // mesh shader "max_primitives"DerivativeGroupLinear; // true if layout derivative_group_linearNV set
|
int primitives; // mesh shader "max_primitives"DerivativeGroupLinear; // true if layout derivative_group_linearNV set
|
||||||
|
bool layoutPrimitiveCulling; // true if layout primitive_culling set
|
||||||
TLayoutDepth getDepth() const { return layoutDepth; }
|
TLayoutDepth getDepth() const { return layoutDepth; }
|
||||||
#else
|
#else
|
||||||
TLayoutDepth getDepth() const { return EldNone; }
|
TLayoutDepth getDepth() const { return EldNone; }
|
||||||
|
|
@ -1268,6 +1269,7 @@ struct TShaderQualifiers {
|
||||||
layoutOverrideCoverage = false;
|
layoutOverrideCoverage = false;
|
||||||
layoutDerivativeGroupQuads = false;
|
layoutDerivativeGroupQuads = false;
|
||||||
layoutDerivativeGroupLinear = false;
|
layoutDerivativeGroupLinear = false;
|
||||||
|
layoutPrimitiveCulling = false;
|
||||||
primitives = TQualifier::layoutNotSet;
|
primitives = TQualifier::layoutNotSet;
|
||||||
interlockOrdering = EioNone;
|
interlockOrdering = EioNone;
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -1331,6 +1333,8 @@ struct TShaderQualifiers {
|
||||||
primitives = src.primitives;
|
primitives = src.primitives;
|
||||||
if (src.interlockOrdering != EioNone)
|
if (src.interlockOrdering != EioNone)
|
||||||
interlockOrdering = src.interlockOrdering;
|
interlockOrdering = src.interlockOrdering;
|
||||||
|
if (src.layoutPrimitiveCulling)
|
||||||
|
layoutPrimitiveCulling = src.layoutPrimitiveCulling;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -148,6 +148,7 @@ typedef struct glslang_resource_s {
|
||||||
int max_task_work_group_size_y_nv;
|
int max_task_work_group_size_y_nv;
|
||||||
int max_task_work_group_size_z_nv;
|
int max_task_work_group_size_z_nv;
|
||||||
int max_mesh_view_count_nv;
|
int max_mesh_view_count_nv;
|
||||||
|
int maxDualSourceDrawBuffersEXT;
|
||||||
|
|
||||||
glslang_limits_t limits;
|
glslang_limits_t limits;
|
||||||
} glslang_resource_t;
|
} glslang_resource_t;
|
||||||
|
|
|
||||||
|
|
@ -164,6 +164,9 @@ typedef enum {
|
||||||
GLSLANG_REFLECTION_SEPARATE_BUFFERS_BIT = (1 << 3),
|
GLSLANG_REFLECTION_SEPARATE_BUFFERS_BIT = (1 << 3),
|
||||||
GLSLANG_REFLECTION_ALL_BLOCK_VARIABLES_BIT = (1 << 4),
|
GLSLANG_REFLECTION_ALL_BLOCK_VARIABLES_BIT = (1 << 4),
|
||||||
GLSLANG_REFLECTION_UNWRAP_IO_BLOCKS_BIT = (1 << 5),
|
GLSLANG_REFLECTION_UNWRAP_IO_BLOCKS_BIT = (1 << 5),
|
||||||
|
GLSLANG_REFLECTION_ALL_IO_VARIABLES_BIT = (1 << 6),
|
||||||
|
GLSLANG_REFLECTION_SHARED_STD140_SSBO_BIT = (1 << 7),
|
||||||
|
GLSLANG_REFLECTION_SHARED_STD140_UBO_BIT = (1 << 8),
|
||||||
LAST_ELEMENT_MARKER(GLSLANG_REFLECTION_COUNT),
|
LAST_ELEMENT_MARKER(GLSLANG_REFLECTION_COUNT),
|
||||||
} glslang_reflection_options_t;
|
} glslang_reflection_options_t;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
// This header is generated by the make-revision script.
|
// This header is generated by the make-revision script.
|
||||||
|
|
||||||
#define GLSLANG_PATCH_LEVEL 3743
|
#define GLSLANG_PATCH_LEVEL 3795
|
||||||
|
|
|
||||||
|
|
@ -68,6 +68,7 @@ class TScanContext;
|
||||||
class TPpContext;
|
class TPpContext;
|
||||||
|
|
||||||
typedef std::set<int> TIdSetType;
|
typedef std::set<int> TIdSetType;
|
||||||
|
typedef std::map<const TTypeList*, std::map<size_t, const TTypeList*>> TStructRecord;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Sharable code (as well as what's in TParseVersions) across
|
// Sharable code (as well as what's in TParseVersions) across
|
||||||
|
|
@ -315,6 +316,7 @@ public:
|
||||||
TIntermTyped* handleBinaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* left, TIntermTyped* right);
|
TIntermTyped* handleBinaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* left, TIntermTyped* right);
|
||||||
TIntermTyped* handleUnaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* childNode);
|
TIntermTyped* handleUnaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* childNode);
|
||||||
TIntermTyped* handleDotDereference(const TSourceLoc&, TIntermTyped* base, const TString& field);
|
TIntermTyped* handleDotDereference(const TSourceLoc&, TIntermTyped* base, const TString& field);
|
||||||
|
TIntermTyped* handleDotSwizzle(const TSourceLoc&, TIntermTyped* base, const TString& field);
|
||||||
void blockMemberExtensionCheck(const TSourceLoc&, const TIntermTyped* base, int member, const TString& memberName);
|
void blockMemberExtensionCheck(const TSourceLoc&, const TIntermTyped* base, int member, const TString& memberName);
|
||||||
TFunction* handleFunctionDeclarator(const TSourceLoc&, TFunction& function, bool prototype);
|
TFunction* handleFunctionDeclarator(const TSourceLoc&, TFunction& function, bool prototype);
|
||||||
TIntermAggregate* handleFunctionDefinition(const TSourceLoc&, TFunction&);
|
TIntermAggregate* handleFunctionDefinition(const TSourceLoc&, TFunction&);
|
||||||
|
|
@ -417,12 +419,15 @@ public:
|
||||||
void fixBlockLocations(const TSourceLoc&, TQualifier&, TTypeList&, bool memberWithLocation, bool memberWithoutLocation);
|
void fixBlockLocations(const TSourceLoc&, TQualifier&, TTypeList&, bool memberWithLocation, bool memberWithoutLocation);
|
||||||
void fixXfbOffsets(TQualifier&, TTypeList&);
|
void fixXfbOffsets(TQualifier&, TTypeList&);
|
||||||
void fixBlockUniformOffsets(TQualifier&, TTypeList&);
|
void fixBlockUniformOffsets(TQualifier&, TTypeList&);
|
||||||
|
void fixBlockUniformLayoutMatrix(TQualifier&, TTypeList*, TTypeList*);
|
||||||
|
void fixBlockUniformLayoutPacking(TQualifier&, TTypeList*, TTypeList*);
|
||||||
void addQualifierToExisting(const TSourceLoc&, TQualifier, const TString& identifier);
|
void addQualifierToExisting(const TSourceLoc&, TQualifier, const TString& identifier);
|
||||||
void addQualifierToExisting(const TSourceLoc&, TQualifier, TIdentifierList&);
|
void addQualifierToExisting(const TSourceLoc&, TQualifier, TIdentifierList&);
|
||||||
void invariantCheck(const TSourceLoc&, const TQualifier&);
|
void invariantCheck(const TSourceLoc&, const TQualifier&);
|
||||||
void updateStandaloneQualifierDefaults(const TSourceLoc&, const TPublicType&);
|
void updateStandaloneQualifierDefaults(const TSourceLoc&, const TPublicType&);
|
||||||
void wrapupSwitchSubsequence(TIntermAggregate* statements, TIntermNode* branchNode);
|
void wrapupSwitchSubsequence(TIntermAggregate* statements, TIntermNode* branchNode);
|
||||||
TIntermNode* addSwitch(const TSourceLoc&, TIntermTyped* expression, TIntermAggregate* body);
|
TIntermNode* addSwitch(const TSourceLoc&, TIntermTyped* expression, TIntermAggregate* body);
|
||||||
|
const TTypeList* recordStructCopy(TStructRecord&, const TType*, const TType*);
|
||||||
|
|
||||||
#ifndef GLSLANG_WEB
|
#ifndef GLSLANG_WEB
|
||||||
TAttributeType attributeFromName(const TString& name) const;
|
TAttributeType attributeFromName(const TString& name) const;
|
||||||
|
|
@ -483,6 +488,8 @@ protected:
|
||||||
bool anyIndexLimits;
|
bool anyIndexLimits;
|
||||||
TIdSetType inductiveLoopIds;
|
TIdSetType inductiveLoopIds;
|
||||||
TVector<TIntermTyped*> needsIndexLimitationChecking;
|
TVector<TIntermTyped*> needsIndexLimitationChecking;
|
||||||
|
TStructRecord matrixFixRecord;
|
||||||
|
TStructRecord packingFixRecord;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Geometry shader input arrays:
|
// Geometry shader input arrays:
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
// POSSIBILITY OF SUCH DAMAGE.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef _VERSIONS_INCLUDED_
|
#ifndef _VERSIONS_INCLUDED_
|
||||||
#define _VERSIONS_INCLUDED_
|
#define _VERSIONS_INCLUDED_
|
||||||
|
|
||||||
|
|
@ -52,7 +53,7 @@
|
||||||
// Don't maintain an ordinal set of enums (0,1,2,3...) to avoid all possible
|
// Don't maintain an ordinal set of enums (0,1,2,3...) to avoid all possible
|
||||||
// defects from mixing the two different forms.
|
// defects from mixing the two different forms.
|
||||||
//
|
//
|
||||||
typedef enum {
|
typedef enum : unsigned {
|
||||||
EBadProfile = 0,
|
EBadProfile = 0,
|
||||||
ENoProfile = (1 << 0), // only for desktop, before profiles showed up
|
ENoProfile = (1 << 0), // only for desktop, before profiles showed up
|
||||||
ECoreProfile = (1 << 1),
|
ECoreProfile = (1 << 1),
|
||||||
|
|
@ -157,6 +158,7 @@ const char* const E_GL_ARB_shader_image_size = "GL_ARB_shader_image_s
|
||||||
const char* const E_GL_ARB_shader_storage_buffer_object = "GL_ARB_shader_storage_buffer_object";
|
const char* const E_GL_ARB_shader_storage_buffer_object = "GL_ARB_shader_storage_buffer_object";
|
||||||
const char* const E_GL_ARB_shading_language_packing = "GL_ARB_shading_language_packing";
|
const char* const E_GL_ARB_shading_language_packing = "GL_ARB_shading_language_packing";
|
||||||
const char* const E_GL_ARB_texture_query_lod = "GL_ARB_texture_query_lod";
|
const char* const E_GL_ARB_texture_query_lod = "GL_ARB_texture_query_lod";
|
||||||
|
const char* const E_GL_ARB_vertex_attrib_64bit = "GL_ARB_vertex_attrib_64bit";
|
||||||
|
|
||||||
const char* const E_GL_KHR_shader_subgroup_basic = "GL_KHR_shader_subgroup_basic";
|
const char* const E_GL_KHR_shader_subgroup_basic = "GL_KHR_shader_subgroup_basic";
|
||||||
const char* const E_GL_KHR_shader_subgroup_vote = "GL_KHR_shader_subgroup_vote";
|
const char* const E_GL_KHR_shader_subgroup_vote = "GL_KHR_shader_subgroup_vote";
|
||||||
|
|
@ -195,6 +197,8 @@ const char* const E_GL_EXT_debug_printf = "GL_EXT_debug_prin
|
||||||
const char* const E_GL_EXT_ray_tracing = "GL_EXT_ray_tracing";
|
const char* const E_GL_EXT_ray_tracing = "GL_EXT_ray_tracing";
|
||||||
const char* const E_GL_EXT_ray_query = "GL_EXT_ray_query";
|
const char* const E_GL_EXT_ray_query = "GL_EXT_ray_query";
|
||||||
const char* const E_GL_EXT_ray_flags_primitive_culling = "GL_EXT_ray_flags_primitive_culling";
|
const char* const E_GL_EXT_ray_flags_primitive_culling = "GL_EXT_ray_flags_primitive_culling";
|
||||||
|
const char* const E_GL_EXT_blend_func_extended = "GL_EXT_blend_func_extended";
|
||||||
|
const char* const E_GL_EXT_shader_implicit_conversions = "GL_EXT_shader_implicit_conversions";
|
||||||
|
|
||||||
// Arrays of extensions for the above viewportEXTs duplications
|
// Arrays of extensions for the above viewportEXTs duplications
|
||||||
|
|
||||||
|
|
@ -266,6 +270,7 @@ const char* const E_GL_EXT_tessellation_shader = "GL_EXT_tessel
|
||||||
const char* const E_GL_EXT_tessellation_point_size = "GL_EXT_tessellation_point_size";
|
const char* const E_GL_EXT_tessellation_point_size = "GL_EXT_tessellation_point_size";
|
||||||
const char* const E_GL_EXT_texture_buffer = "GL_EXT_texture_buffer";
|
const char* const E_GL_EXT_texture_buffer = "GL_EXT_texture_buffer";
|
||||||
const char* const E_GL_EXT_texture_cube_map_array = "GL_EXT_texture_cube_map_array";
|
const char* const E_GL_EXT_texture_cube_map_array = "GL_EXT_texture_cube_map_array";
|
||||||
|
const char* const E_GL_EXT_shader_integer_mix = "GL_EXT_shader_integer_mix";
|
||||||
|
|
||||||
// OES matching AEP
|
// OES matching AEP
|
||||||
const char* const E_GL_OES_geometry_shader = "GL_OES_geometry_shader";
|
const char* const E_GL_OES_geometry_shader = "GL_OES_geometry_shader";
|
||||||
|
|
|
||||||
|
|
@ -203,6 +203,7 @@ public:
|
||||||
void endCollect(EShLanguage) override;
|
void endCollect(EShLanguage) override;
|
||||||
void reserverStorageSlot(TVarEntryInfo& ent, TInfoSink& infoSink) override;
|
void reserverStorageSlot(TVarEntryInfo& ent, TInfoSink& infoSink) override;
|
||||||
void reserverResourceSlot(TVarEntryInfo& ent, TInfoSink& infoSink) override;
|
void reserverResourceSlot(TVarEntryInfo& ent, TInfoSink& infoSink) override;
|
||||||
|
const TString& getAccessName(const TIntermSymbol*);
|
||||||
// in/out symbol and uniform symbol are stored in the same resourceSlotMap, the storage key is used to identify each type of symbol.
|
// in/out symbol and uniform symbol are stored in the same resourceSlotMap, the storage key is used to identify each type of symbol.
|
||||||
// We use stage and storage qualifier to construct a storage key. it can help us identify the same storage resource used in different stage.
|
// We use stage and storage qualifier to construct a storage key. it can help us identify the same storage resource used in different stage.
|
||||||
// if a resource is a program resource and we don't need know it usage stage, we can use same stage to build storage key.
|
// if a resource is a program resource and we don't need know it usage stage, we can use same stage to build storage key.
|
||||||
|
|
@ -238,12 +239,13 @@ typedef std::map<TString, TVarEntryInfo> TVarLiveMap;
|
||||||
// In the future, if the vc++ compiler can handle such a situation,
|
// In the future, if the vc++ compiler can handle such a situation,
|
||||||
// this part of the code will be removed.
|
// this part of the code will be removed.
|
||||||
struct TVarLivePair : std::pair<const TString, TVarEntryInfo> {
|
struct TVarLivePair : std::pair<const TString, TVarEntryInfo> {
|
||||||
TVarLivePair(std::pair<const TString, TVarEntryInfo>& _Right) : pair(_Right.first, _Right.second) {}
|
TVarLivePair(const std::pair<const TString, TVarEntryInfo>& _Right) : pair(_Right.first, _Right.second) {}
|
||||||
TVarLivePair& operator=(const TVarLivePair& _Right) {
|
TVarLivePair& operator=(const TVarLivePair& _Right) {
|
||||||
const_cast<TString&>(first) = _Right.first;
|
const_cast<TString&>(first) = _Right.first;
|
||||||
second = _Right.second;
|
second = _Right.second;
|
||||||
return (*this);
|
return (*this);
|
||||||
}
|
}
|
||||||
|
TVarLivePair(const TVarLivePair& src) : pair(src) { }
|
||||||
};
|
};
|
||||||
typedef std::vector<TVarLivePair> TVarLiveVector;
|
typedef std::vector<TVarLivePair> TVarLiveVector;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -265,6 +265,7 @@ public:
|
||||||
computeDerivativeMode(LayoutDerivativeNone),
|
computeDerivativeMode(LayoutDerivativeNone),
|
||||||
primitives(TQualifier::layoutNotSet),
|
primitives(TQualifier::layoutNotSet),
|
||||||
numTaskNVBlocks(0),
|
numTaskNVBlocks(0),
|
||||||
|
layoutPrimitiveCulling(false),
|
||||||
autoMapBindings(false),
|
autoMapBindings(false),
|
||||||
autoMapLocations(false),
|
autoMapLocations(false),
|
||||||
flattenUniformArrays(false),
|
flattenUniformArrays(false),
|
||||||
|
|
@ -356,8 +357,15 @@ public:
|
||||||
}
|
}
|
||||||
const SpvVersion& getSpv() const { return spvVersion; }
|
const SpvVersion& getSpv() const { return spvVersion; }
|
||||||
EShLanguage getStage() const { return language; }
|
EShLanguage getStage() const { return language; }
|
||||||
void addRequestedExtension(const char* extension) { requestedExtensions.insert(extension); }
|
void updateRequestedExtension(const char* extension, TExtensionBehavior behavior) {
|
||||||
const std::set<std::string>& getRequestedExtensions() const { return requestedExtensions; }
|
if(requestedExtensions.find(extension) != requestedExtensions.end()) {
|
||||||
|
requestedExtensions[extension] = behavior;
|
||||||
|
} else {
|
||||||
|
requestedExtensions.insert(std::make_pair(extension, behavior));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::map<std::string, TExtensionBehavior>& getRequestedExtensions() const { return requestedExtensions; }
|
||||||
|
|
||||||
void setTreeRoot(TIntermNode* r) { treeRoot = r; }
|
void setTreeRoot(TIntermNode* r) { treeRoot = r; }
|
||||||
TIntermNode* getTreeRoot() const { return treeRoot; }
|
TIntermNode* getTreeRoot() const { return treeRoot; }
|
||||||
|
|
@ -392,7 +400,7 @@ public:
|
||||||
void setSource(EShSource s) { source = s; }
|
void setSource(EShSource s) { source = s; }
|
||||||
EShSource getSource() const { return source; }
|
EShSource getSource() const { return source; }
|
||||||
#else
|
#else
|
||||||
void setSource(EShSource s) { assert(s == EShSourceGlsl); }
|
void setSource(EShSource s) { assert(s == EShSourceGlsl); (void)s; }
|
||||||
EShSource getSource() const { return EShSourceGlsl; }
|
EShSource getSource() const { return EShSourceGlsl; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -735,6 +743,8 @@ public:
|
||||||
void setLayoutDerivativeMode(ComputeDerivativeMode mode) { computeDerivativeMode = mode; }
|
void setLayoutDerivativeMode(ComputeDerivativeMode mode) { computeDerivativeMode = mode; }
|
||||||
bool hasLayoutDerivativeModeNone() const { return computeDerivativeMode != LayoutDerivativeNone; }
|
bool hasLayoutDerivativeModeNone() const { return computeDerivativeMode != LayoutDerivativeNone; }
|
||||||
ComputeDerivativeMode getLayoutDerivativeModeNone() const { return computeDerivativeMode; }
|
ComputeDerivativeMode getLayoutDerivativeModeNone() const { return computeDerivativeMode; }
|
||||||
|
void setLayoutPrimitiveCulling() { layoutPrimitiveCulling = true; }
|
||||||
|
bool getLayoutPrimitiveCulling() const { return layoutPrimitiveCulling; }
|
||||||
bool setPrimitives(int m)
|
bool setPrimitives(int m)
|
||||||
{
|
{
|
||||||
if (primitives != TQualifier::layoutNotSet)
|
if (primitives != TQualifier::layoutNotSet)
|
||||||
|
|
@ -902,7 +912,13 @@ protected:
|
||||||
#ifdef GLSLANG_WEB
|
#ifdef GLSLANG_WEB
|
||||||
bool extensionRequested(const char *extension) const { return false; }
|
bool extensionRequested(const char *extension) const { return false; }
|
||||||
#else
|
#else
|
||||||
bool extensionRequested(const char *extension) const {return requestedExtensions.find(extension) != requestedExtensions.end();}
|
bool extensionRequested(const char *extension) const {
|
||||||
|
auto it = requestedExtensions.find(extension);
|
||||||
|
if (it != requestedExtensions.end()) {
|
||||||
|
return (it->second == EBhDisable) ? false : true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const char* getResourceName(TResourceType);
|
static const char* getResourceName(TResourceType);
|
||||||
|
|
@ -917,7 +933,7 @@ protected:
|
||||||
int version; // source version
|
int version; // source version
|
||||||
SpvVersion spvVersion;
|
SpvVersion spvVersion;
|
||||||
TIntermNode* treeRoot;
|
TIntermNode* treeRoot;
|
||||||
std::set<std::string> requestedExtensions; // cumulation of all enabled or required extensions; not connected to what subset of the shader used them
|
std::map<std::string, TExtensionBehavior> requestedExtensions; // cumulation of all enabled or required extensions; not connected to what subset of the shader used them
|
||||||
TBuiltInResource resources;
|
TBuiltInResource resources;
|
||||||
int numEntryPoints;
|
int numEntryPoints;
|
||||||
int numErrors;
|
int numErrors;
|
||||||
|
|
@ -961,6 +977,7 @@ protected:
|
||||||
ComputeDerivativeMode computeDerivativeMode;
|
ComputeDerivativeMode computeDerivativeMode;
|
||||||
int primitives;
|
int primitives;
|
||||||
int numTaskNVBlocks;
|
int numTaskNVBlocks;
|
||||||
|
bool layoutPrimitiveCulling;
|
||||||
|
|
||||||
// Base shift values
|
// Base shift values
|
||||||
std::array<unsigned int, EResCount> shiftBinding;
|
std::array<unsigned int, EResCount> shiftBinding;
|
||||||
|
|
|
||||||
|
|
@ -101,6 +101,7 @@ public:
|
||||||
void updateExtensionBehavior(int line, const char* const extension, const char* behavior) { }
|
void updateExtensionBehavior(int line, const char* const extension, const char* behavior) { }
|
||||||
void updateExtensionBehavior(const char* const extension, TExtensionBehavior) { }
|
void updateExtensionBehavior(const char* const extension, TExtensionBehavior) { }
|
||||||
void checkExtensionStage(const TSourceLoc&, const char* const extension) { }
|
void checkExtensionStage(const TSourceLoc&, const char* const extension) { }
|
||||||
|
void extensionRequires(const TSourceLoc&, const char* const extension, const char* behavior) { }
|
||||||
void fullIntegerCheck(const TSourceLoc&, const char* op) { }
|
void fullIntegerCheck(const TSourceLoc&, const char* op) { }
|
||||||
void doubleCheck(const TSourceLoc&, const char* op) { }
|
void doubleCheck(const TSourceLoc&, const char* op) { }
|
||||||
bool float16Arithmetic() { return false; }
|
bool float16Arithmetic() { return false; }
|
||||||
|
|
@ -139,6 +140,7 @@ public:
|
||||||
virtual bool checkExtensionsRequested(const TSourceLoc&, int numExtensions, const char* const extensions[],
|
virtual bool checkExtensionsRequested(const TSourceLoc&, int numExtensions, const char* const extensions[],
|
||||||
const char* featureDesc);
|
const char* featureDesc);
|
||||||
virtual void checkExtensionStage(const TSourceLoc&, const char* const extension);
|
virtual void checkExtensionStage(const TSourceLoc&, const char* const extension);
|
||||||
|
virtual void extensionRequires(const TSourceLoc&, const char* const extension, const char* behavior);
|
||||||
virtual void fullIntegerCheck(const TSourceLoc&, const char* op);
|
virtual void fullIntegerCheck(const TSourceLoc&, const char* op);
|
||||||
|
|
||||||
virtual void unimplemented(const TSourceLoc&, const char* featureDesc);
|
virtual void unimplemented(const TSourceLoc&, const char* featureDesc);
|
||||||
|
|
@ -170,6 +172,7 @@ public:
|
||||||
virtual void vulkanRemoved(const TSourceLoc&, const char* op);
|
virtual void vulkanRemoved(const TSourceLoc&, const char* op);
|
||||||
virtual void requireVulkan(const TSourceLoc&, const char* op);
|
virtual void requireVulkan(const TSourceLoc&, const char* op);
|
||||||
virtual void requireSpv(const TSourceLoc&, const char* op);
|
virtual void requireSpv(const TSourceLoc&, const char* op);
|
||||||
|
virtual void requireSpv(const TSourceLoc&, const char *op, unsigned int version);
|
||||||
|
|
||||||
|
|
||||||
#if defined(GLSLANG_WEB) && !defined(GLSLANG_WEB_DEVEL)
|
#if defined(GLSLANG_WEB) && !defined(GLSLANG_WEB_DEVEL)
|
||||||
|
|
@ -222,6 +225,7 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
TMap<TString, TExtensionBehavior> extensionBehavior; // for each extension string, what its current behavior is set to
|
TMap<TString, TExtensionBehavior> extensionBehavior; // for each extension string, what its current behavior is set to
|
||||||
|
TMap<TString, unsigned int> extensionMinSpv; // for each extension string, store minimum spirv required
|
||||||
EShMessages messages; // errors/warnings/rule-sets
|
EShMessages messages; // errors/warnings/rule-sets
|
||||||
int numErrors; // number of compile-time errors encountered
|
int numErrors; // number of compile-time errors encountered
|
||||||
TInputScanner* currentScanner;
|
TInputScanner* currentScanner;
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,7 @@
|
||||||
// This should always increase, as some paths to do not consume
|
// This should always increase, as some paths to do not consume
|
||||||
// a more major number.
|
// a more major number.
|
||||||
// It should increment by one when new functionality is added.
|
// It should increment by one when new functionality is added.
|
||||||
#define GLSLANG_MINOR_VERSION 13
|
#define GLSLANG_MINOR_VERSION 14
|
||||||
|
|
||||||
//
|
//
|
||||||
// Call before doing any other compiler/linker operations.
|
// Call before doing any other compiler/linker operations.
|
||||||
|
|
@ -109,7 +109,7 @@ typedef enum {
|
||||||
LAST_ELEMENT_MARKER(EShLangCount),
|
LAST_ELEMENT_MARKER(EShLangCount),
|
||||||
} EShLanguage; // would be better as stage, but this is ancient now
|
} EShLanguage; // would be better as stage, but this is ancient now
|
||||||
|
|
||||||
typedef enum {
|
typedef enum : unsigned {
|
||||||
EShLangVertexMask = (1 << EShLangVertex),
|
EShLangVertexMask = (1 << EShLangVertex),
|
||||||
EShLangTessControlMask = (1 << EShLangTessControl),
|
EShLangTessControlMask = (1 << EShLangTessControl),
|
||||||
EShLangTessEvaluationMask = (1 << EShLangTessEvaluation),
|
EShLangTessEvaluationMask = (1 << EShLangTessEvaluation),
|
||||||
|
|
@ -240,7 +240,7 @@ typedef enum {
|
||||||
//
|
//
|
||||||
// Message choices for what errors and warnings are given.
|
// Message choices for what errors and warnings are given.
|
||||||
//
|
//
|
||||||
enum EShMessages {
|
enum EShMessages : unsigned {
|
||||||
EShMsgDefault = 0, // default is to give all required errors and extra warnings
|
EShMsgDefault = 0, // default is to give all required errors and extra warnings
|
||||||
EShMsgRelaxedErrors = (1 << 0), // be liberal in accepting input
|
EShMsgRelaxedErrors = (1 << 0), // be liberal in accepting input
|
||||||
EShMsgSuppressWarnings = (1 << 1), // suppress all warnings, except those required by the specification
|
EShMsgSuppressWarnings = (1 << 1), // suppress all warnings, except those required by the specification
|
||||||
|
|
@ -255,7 +255,7 @@ enum EShMessages {
|
||||||
EShMsgDebugInfo = (1 << 10), // save debug information
|
EShMsgDebugInfo = (1 << 10), // save debug information
|
||||||
EShMsgHlslEnable16BitTypes = (1 << 11), // enable use of 16-bit types in SPIR-V for HLSL
|
EShMsgHlslEnable16BitTypes = (1 << 11), // enable use of 16-bit types in SPIR-V for HLSL
|
||||||
EShMsgHlslLegalization = (1 << 12), // enable HLSL Legalization messages
|
EShMsgHlslLegalization = (1 << 12), // enable HLSL Legalization messages
|
||||||
EShMsgHlslDX9Compatible = (1 << 13), // enable HLSL DX9 compatible mode (right now only for samplers)
|
EShMsgHlslDX9Compatible = (1 << 13), // enable HLSL DX9 compatible mode (for samplers and semantics)
|
||||||
EShMsgBuiltinSymbolTable = (1 << 14), // print the builtin symbol table
|
EShMsgBuiltinSymbolTable = (1 << 14), // print the builtin symbol table
|
||||||
LAST_ELEMENT_MARKER(EShMsgCount),
|
LAST_ELEMENT_MARKER(EShMsgCount),
|
||||||
};
|
};
|
||||||
|
|
@ -271,6 +271,9 @@ typedef enum {
|
||||||
EShReflectionSeparateBuffers = (1 << 3), // buffer variables and buffer blocks are reflected separately
|
EShReflectionSeparateBuffers = (1 << 3), // buffer variables and buffer blocks are reflected separately
|
||||||
EShReflectionAllBlockVariables = (1 << 4), // reflect all variables in blocks, even if they are inactive
|
EShReflectionAllBlockVariables = (1 << 4), // reflect all variables in blocks, even if they are inactive
|
||||||
EShReflectionUnwrapIOBlocks = (1 << 5), // unwrap input/output blocks the same as with uniform blocks
|
EShReflectionUnwrapIOBlocks = (1 << 5), // unwrap input/output blocks the same as with uniform blocks
|
||||||
|
EShReflectionAllIOVariables = (1 << 6), // reflect all input/output variables, even if they are inactive
|
||||||
|
EShReflectionSharedStd140SSBO = (1 << 7), // Apply std140/shared rules for ubo to ssbo
|
||||||
|
EShReflectionSharedStd140UBO = (1 << 8), // Apply std140/shared rules for ubo to ssbo
|
||||||
LAST_ELEMENT_MARKER(EShReflectionCount),
|
LAST_ELEMENT_MARKER(EShReflectionCount),
|
||||||
} EShReflectionOptions;
|
} EShReflectionOptions;
|
||||||
|
|
||||||
|
|
@ -412,6 +415,7 @@ enum TResourceType {
|
||||||
EResCount
|
EResCount
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// Make one TShader per shader that you will link into a program. Then
|
// Make one TShader per shader that you will link into a program. Then
|
||||||
// - provide the shader through setStrings() or setStringsWithLengths()
|
// - provide the shader through setStrings() or setStringsWithLengths()
|
||||||
// - optionally call setEnv*(), see below for more detail
|
// - optionally call setEnv*(), see below for more detail
|
||||||
|
|
@ -694,6 +698,7 @@ public:
|
||||||
int counterIndex;
|
int counterIndex;
|
||||||
int numMembers;
|
int numMembers;
|
||||||
int arrayStride; // stride of an array variable
|
int arrayStride; // stride of an array variable
|
||||||
|
int topLevelArraySize; // size of the top-level variable in a storage buffer member
|
||||||
int topLevelArrayStride; // stride of the top-level variable in a storage buffer member
|
int topLevelArrayStride; // stride of the top-level variable in a storage buffer member
|
||||||
EShLanguageMask stages;
|
EShLanguageMask stages;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -99,21 +99,25 @@ endif()
|
||||||
|
|
||||||
add_library(glslang STATIC IMPORTED GLOBAL)
|
add_library(glslang STATIC IMPORTED GLOBAL)
|
||||||
set_target_properties(glslang PROPERTIES
|
set_target_properties(glslang PROPERTIES
|
||||||
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libglslang.a
|
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/glslang/libglslang.a
|
||||||
)
|
)
|
||||||
add_library(OGLCompiler STATIC IMPORTED GLOBAL)
|
add_library(OGLCompiler STATIC IMPORTED GLOBAL)
|
||||||
set_target_properties(OGLCompiler PROPERTIES
|
set_target_properties(OGLCompiler PROPERTIES
|
||||||
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libOGLCompiler.a
|
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/glslang/libOGLCompiler.a
|
||||||
)
|
)
|
||||||
add_library(OSDependent STATIC IMPORTED GLOBAL)
|
add_library(OSDependent STATIC IMPORTED GLOBAL)
|
||||||
set_target_properties(OSDependent PROPERTIES
|
set_target_properties(OSDependent PROPERTIES
|
||||||
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libOSDependent.a
|
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/glslang/libOSDependent.a
|
||||||
)
|
)
|
||||||
add_library(SPIRV STATIC IMPORTED GLOBAL)
|
add_library(SPIRV STATIC IMPORTED GLOBAL)
|
||||||
set_target_properties(SPIRV PROPERTIES
|
set_target_properties(SPIRV PROPERTIES
|
||||||
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/libSPIRV.a
|
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/glslang/libSPIRV.a
|
||||||
)
|
)
|
||||||
set(glslang_libs_name glslang OGLCompiler OSDependent SPIRV)
|
add_library(glslang-default-resource-limits STATIC IMPORTED GLOBAL)
|
||||||
|
set_target_properties(glslang-default-resource-limits PROPERTIES
|
||||||
|
IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/libs/glslang/libglslang-default-resource-limits.a
|
||||||
|
)
|
||||||
|
set(glslang_libs_name glslang OGLCompiler OSDependent SPIRV glslang-default-resource-limits)
|
||||||
|
|
||||||
add_library(spirv-cross-core STATIC IMPORTED GLOBAL)
|
add_library(spirv-cross-core STATIC IMPORTED GLOBAL)
|
||||||
set_target_properties(spirv-cross-core PROPERTIES
|
set_target_properties(spirv-cross-core PROPERTIES
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
//
|
||||||
|
// Copyright (C) 2016 Google, Inc.
|
||||||
|
//
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions
|
||||||
|
// are met:
|
||||||
|
//
|
||||||
|
// Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following
|
||||||
|
// disclaimer in the documentation and/or other materials provided
|
||||||
|
// with the distribution.
|
||||||
|
//
|
||||||
|
// Neither the name of Google Inc. nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived
|
||||||
|
// from this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
|
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
// POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
#ifndef _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_
|
||||||
|
#define _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "../glslang/Include/ResourceLimits.h"
|
||||||
|
|
||||||
|
namespace glslang {
|
||||||
|
|
||||||
|
// These are the default resources for TBuiltInResources, used for both
|
||||||
|
// - parsing this string for the case where the user didn't supply one,
|
||||||
|
// - dumping out a template for user construction of a config file.
|
||||||
|
extern const TBuiltInResource DefaultTBuiltInResource;
|
||||||
|
|
||||||
|
// Returns the DefaultTBuiltInResource as a human-readable string.
|
||||||
|
std::string GetDefaultTBuiltInResourceString();
|
||||||
|
|
||||||
|
// Decodes the resource limits from |config| to |resources|.
|
||||||
|
void DecodeResourceLimits(TBuiltInResource* resources, char* config);
|
||||||
|
|
||||||
|
} // end namespace glslang
|
||||||
|
|
||||||
|
#endif // _STAND_ALONE_RESOURCE_LIMITS_INCLUDED_
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
/**
|
||||||
|
BSD 2-Clause License
|
||||||
|
|
||||||
|
Copyright (c) 2020, Travis Fort
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef _STAND_ALONE_RESOURCE_LIMITS_C_INCLUDED_
|
||||||
|
#define _STAND_ALONE_RESOURCE_LIMITS_C_INCLUDED_
|
||||||
|
|
||||||
|
#include "../glslang/Include/glslang_c_interface.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// These are the default resources for TBuiltInResources, used for both
|
||||||
|
// - parsing this string for the case where the user didn't supply one,
|
||||||
|
// - dumping out a template for user construction of a config file.
|
||||||
|
const glslang_resource_t* glslang_default_resource(void);
|
||||||
|
|
||||||
|
// Returns the DefaultTBuiltInResource as a human-readable string.
|
||||||
|
// NOTE: User is responsible for freeing this string.
|
||||||
|
const char* glslang_default_resource_string();
|
||||||
|
|
||||||
|
// Decodes the resource limits from |config| to |resources|.
|
||||||
|
void glslang_decode_resource_limits(glslang_resource_t* resources, char* config);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // _STAND_ALONE_RESOURCE_LIMITS_C_INCLUDED_
|
||||||
|
|
@ -231,6 +231,9 @@ enum TBuiltInVariable {
|
||||||
EbvFragSizeEXT,
|
EbvFragSizeEXT,
|
||||||
EbvFragInvocationCountEXT,
|
EbvFragInvocationCountEXT,
|
||||||
|
|
||||||
|
EbvSecondaryFragDataEXT,
|
||||||
|
EbvSecondaryFragColorEXT,
|
||||||
|
|
||||||
EbvViewportMaskNV,
|
EbvViewportMaskNV,
|
||||||
EbvSecondaryPositionNV,
|
EbvSecondaryPositionNV,
|
||||||
EbvSecondaryViewportMaskNV,
|
EbvSecondaryViewportMaskNV,
|
||||||
|
|
@ -433,6 +436,9 @@ __inline const char* GetBuiltInVariableString(TBuiltInVariable v)
|
||||||
case EbvFragSizeEXT: return "FragSizeEXT";
|
case EbvFragSizeEXT: return "FragSizeEXT";
|
||||||
case EbvFragInvocationCountEXT: return "FragInvocationCountEXT";
|
case EbvFragInvocationCountEXT: return "FragInvocationCountEXT";
|
||||||
|
|
||||||
|
case EbvSecondaryFragDataEXT: return "SecondaryFragDataEXT";
|
||||||
|
case EbvSecondaryFragColorEXT: return "SecondaryFragColorEXT";
|
||||||
|
|
||||||
case EbvViewportMaskNV: return "ViewportMaskNV";
|
case EbvViewportMaskNV: return "ViewportMaskNV";
|
||||||
case EbvSecondaryPositionNV: return "SecondaryPositionNV";
|
case EbvSecondaryPositionNV: return "SecondaryPositionNV";
|
||||||
case EbvSecondaryViewportMaskNV: return "SecondaryViewportMaskNV";
|
case EbvSecondaryViewportMaskNV: return "SecondaryViewportMaskNV";
|
||||||
|
|
|
||||||
|
|
@ -142,6 +142,7 @@ struct TBuiltInResource {
|
||||||
int maxTaskWorkGroupSizeY_NV;
|
int maxTaskWorkGroupSizeY_NV;
|
||||||
int maxTaskWorkGroupSizeZ_NV;
|
int maxTaskWorkGroupSizeZ_NV;
|
||||||
int maxMeshViewCountNV;
|
int maxMeshViewCountNV;
|
||||||
|
int maxDualSourceDrawBuffersEXT;
|
||||||
|
|
||||||
TLimits limits;
|
TLimits limits;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1235,6 +1235,7 @@ struct TShaderQualifiers {
|
||||||
bool layoutDerivativeGroupQuads; // true if layout derivative_group_quadsNV set
|
bool layoutDerivativeGroupQuads; // true if layout derivative_group_quadsNV set
|
||||||
bool layoutDerivativeGroupLinear; // true if layout derivative_group_linearNV set
|
bool layoutDerivativeGroupLinear; // true if layout derivative_group_linearNV set
|
||||||
int primitives; // mesh shader "max_primitives"DerivativeGroupLinear; // true if layout derivative_group_linearNV set
|
int primitives; // mesh shader "max_primitives"DerivativeGroupLinear; // true if layout derivative_group_linearNV set
|
||||||
|
bool layoutPrimitiveCulling; // true if layout primitive_culling set
|
||||||
TLayoutDepth getDepth() const { return layoutDepth; }
|
TLayoutDepth getDepth() const { return layoutDepth; }
|
||||||
#else
|
#else
|
||||||
TLayoutDepth getDepth() const { return EldNone; }
|
TLayoutDepth getDepth() const { return EldNone; }
|
||||||
|
|
@ -1268,6 +1269,7 @@ struct TShaderQualifiers {
|
||||||
layoutOverrideCoverage = false;
|
layoutOverrideCoverage = false;
|
||||||
layoutDerivativeGroupQuads = false;
|
layoutDerivativeGroupQuads = false;
|
||||||
layoutDerivativeGroupLinear = false;
|
layoutDerivativeGroupLinear = false;
|
||||||
|
layoutPrimitiveCulling = false;
|
||||||
primitives = TQualifier::layoutNotSet;
|
primitives = TQualifier::layoutNotSet;
|
||||||
interlockOrdering = EioNone;
|
interlockOrdering = EioNone;
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -1331,6 +1333,8 @@ struct TShaderQualifiers {
|
||||||
primitives = src.primitives;
|
primitives = src.primitives;
|
||||||
if (src.interlockOrdering != EioNone)
|
if (src.interlockOrdering != EioNone)
|
||||||
interlockOrdering = src.interlockOrdering;
|
interlockOrdering = src.interlockOrdering;
|
||||||
|
if (src.layoutPrimitiveCulling)
|
||||||
|
layoutPrimitiveCulling = src.layoutPrimitiveCulling;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -148,6 +148,7 @@ typedef struct glslang_resource_s {
|
||||||
int max_task_work_group_size_y_nv;
|
int max_task_work_group_size_y_nv;
|
||||||
int max_task_work_group_size_z_nv;
|
int max_task_work_group_size_z_nv;
|
||||||
int max_mesh_view_count_nv;
|
int max_mesh_view_count_nv;
|
||||||
|
int maxDualSourceDrawBuffersEXT;
|
||||||
|
|
||||||
glslang_limits_t limits;
|
glslang_limits_t limits;
|
||||||
} glslang_resource_t;
|
} glslang_resource_t;
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue