Merge branch 'master' into EndStreamPrimitive

This commit is contained in:
Greg Fischer 2022-01-10 11:49:19 -07:00 committed by GitHub
commit 364b169807
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 334 additions and 21 deletions

View File

@ -337,7 +337,7 @@ GPL 3 with special bison exception
================================================================================ ================================================================================
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
The preprocessor has the core licenses stated above, plus an additional licence: The preprocessor has the core licenses stated above, plus additional licences:
/****************************************************************************\ /****************************************************************************\
Copyright (c) 2002, NVIDIA Corporation. Copyright (c) 2002, NVIDIA Corporation.
@ -382,3 +382,29 @@ NVIDIA SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT,
TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF
NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\****************************************************************************/ \****************************************************************************/
/*
** 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.
*/

View File

@ -433,11 +433,11 @@ Id Builder::makeGenericType(spv::Op opcode, std::vector<spv::IdImmediate>& opera
Instruction* type; Instruction* type;
for (int t = 0; t < (int)groupedTypes[opcode].size(); ++t) { for (int t = 0; t < (int)groupedTypes[opcode].size(); ++t) {
type = groupedTypes[opcode][t]; type = groupedTypes[opcode][t];
if (type->getNumOperands() != operands.size()) if (static_cast<size_t>(type->getNumOperands()) != operands.size())
continue; // Number mismatch, find next continue; // Number mismatch, find next
bool match = true; bool match = true;
for (int op = 0; match && op < operands.size(); ++op) { for (size_t op = 0; match && op < operands.size(); ++op) {
match = (operands[op].isId ? type->getIdOperand(op) : type->getImmediateOperand(op)) == operands[op].word; match = (operands[op].isId ? type->getIdOperand(op) : type->getImmediateOperand(op)) == operands[op].word;
} }
if (match) if (match)
@ -446,7 +446,7 @@ Id Builder::makeGenericType(spv::Op opcode, std::vector<spv::IdImmediate>& opera
// not found, make it // not found, make it
type = new Instruction(getUniqueId(), NoType, opcode); type = new Instruction(getUniqueId(), NoType, opcode);
for (int op = 0; op < operands.size(); ++op) { for (size_t op = 0; op < operands.size(); ++op) {
if (operands[op].isId) if (operands[op].isId)
type->addIdOperand(operands[op].word); type->addIdOperand(operands[op].word);
else else

View File

@ -8,7 +8,9 @@ ERROR: 0:53: 'double' : Reserved word.
ERROR: 0:53: 'double' : not supported for this version or the enabled extensions ERROR: 0:53: 'double' : not supported for this version or the enabled extensions
ERROR: 0:53: 'double' : must be qualified as flat in ERROR: 0:53: 'double' : must be qualified as flat in
ERROR: 0:57: '=' : cannot convert from ' global double' to ' global int' ERROR: 0:57: '=' : cannot convert from ' global double' to ' global int'
ERROR: 0:80: 'floatBitsToInt' : required extension not requested: GL_ARB_shader_bit_encoding ERROR: 0:80: 'floatBitsToInt' : required extension not requested: Possible extensions include:
GL_ARB_shader_bit_encoding
GL_ARB_gpu_shader5
ERROR: 0:100: 'packSnorm2x16' : required extension not requested: GL_ARB_shading_language_packing ERROR: 0:100: 'packSnorm2x16' : required extension not requested: GL_ARB_shading_language_packing
ERROR: 0:114: 'textureQueryLOD' : required extension not requested: GL_ARB_texture_query_lod ERROR: 0:114: 'textureQueryLOD' : required extension not requested: GL_ARB_texture_query_lod
ERROR: 0:115: 'textureQueryLOD' : required extension not requested: GL_ARB_texture_query_lod ERROR: 0:115: 'textureQueryLOD' : required extension not requested: GL_ARB_texture_query_lod

View File

@ -0,0 +1,217 @@
floatBitsToInt.vert
WARNING: 0:2: '#extension' : extension is only partially supported: GL_ARB_gpu_shader5
Shader version: 150
Requested GL_ARB_gpu_shader5
0:? Sequence
0:6 Function Definition: main( ( global void)
0:6 Function Parameters:
0:8 Sequence
0:8 move second child to first child ( temp 4-component vector of float)
0:8 'result' ( smooth out 4-component vector of float)
0:8 Constant:
0:8 1.000000
0:8 1.000000
0:8 1.000000
0:8 1.000000
0:9 Sequence
0:9 move second child to first child ( temp int)
0:9 'ret_val' ( temp int)
0:9 floatBitsToInt ( global int)
0:9 'value' ( uniform float)
0:10 Test condition and select ( temp void)
0:10 Condition
0:10 Compare Not Equal ( temp bool)
0:10 'expected_value' ( uniform int)
0:10 'ret_val' ( temp int)
0:10 true case
0:10 Sequence
0:10 move second child to first child ( temp 4-component vector of float)
0:10 'result' ( smooth out 4-component vector of float)
0:10 Constant:
0:10 0.000000
0:10 0.000000
0:10 0.000000
0:10 0.000000
0:12 switch
0:12 condition
0:12 'gl_VertexID' ( gl_VertexId int VertexId)
0:12 body
0:12 Sequence
0:13 case: with expression
0:13 Constant:
0:13 0 (const int)
0:? Sequence
0:13 move second child to first child ( temp 4-component vector of float)
0:13 gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
0:13 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 1-element array of float ClipDistance gl_ClipDistance})
0:13 Constant:
0:13 0 (const uint)
0:13 Constant:
0:13 -1.000000
0:13 1.000000
0:13 0.000000
0:13 1.000000
0:13 Branch: Break
0:14 case: with expression
0:14 Constant:
0:14 1 (const int)
0:? Sequence
0:14 move second child to first child ( temp 4-component vector of float)
0:14 gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
0:14 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 1-element array of float ClipDistance gl_ClipDistance})
0:14 Constant:
0:14 0 (const uint)
0:14 Constant:
0:14 1.000000
0:14 1.000000
0:14 0.000000
0:14 1.000000
0:14 Branch: Break
0:15 case: with expression
0:15 Constant:
0:15 2 (const int)
0:? Sequence
0:15 move second child to first child ( temp 4-component vector of float)
0:15 gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
0:15 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 1-element array of float ClipDistance gl_ClipDistance})
0:15 Constant:
0:15 0 (const uint)
0:15 Constant:
0:15 -1.000000
0:15 -1.000000
0:15 0.000000
0:15 1.000000
0:15 Branch: Break
0:16 case: with expression
0:16 Constant:
0:16 3 (const int)
0:? Sequence
0:16 move second child to first child ( temp 4-component vector of float)
0:16 gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
0:16 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 1-element array of float ClipDistance gl_ClipDistance})
0:16 Constant:
0:16 0 (const uint)
0:16 Constant:
0:16 1.000000
0:16 -1.000000
0:16 0.000000
0:16 1.000000
0:16 Branch: Break
0:? Linker Objects
0:? 'expected_value' ( uniform int)
0:? 'value' ( uniform float)
0:? 'result' ( smooth out 4-component vector of float)
0:? 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out unsized 1-element array of float ClipDistance gl_ClipDistance})
0:? 'gl_VertexID' ( gl_VertexId int VertexId)
0:? 'gl_InstanceID' ( gl_InstanceId int InstanceId)
Linked vertex stage:
Shader version: 150
Requested GL_ARB_gpu_shader5
0:? Sequence
0:6 Function Definition: main( ( global void)
0:6 Function Parameters:
0:8 Sequence
0:8 move second child to first child ( temp 4-component vector of float)
0:8 'result' ( smooth out 4-component vector of float)
0:8 Constant:
0:8 1.000000
0:8 1.000000
0:8 1.000000
0:8 1.000000
0:9 Sequence
0:9 move second child to first child ( temp int)
0:9 'ret_val' ( temp int)
0:9 floatBitsToInt ( global int)
0:9 'value' ( uniform float)
0:10 Test condition and select ( temp void)
0:10 Condition
0:10 Compare Not Equal ( temp bool)
0:10 'expected_value' ( uniform int)
0:10 'ret_val' ( temp int)
0:10 true case
0:10 Sequence
0:10 move second child to first child ( temp 4-component vector of float)
0:10 'result' ( smooth out 4-component vector of float)
0:10 Constant:
0:10 0.000000
0:10 0.000000
0:10 0.000000
0:10 0.000000
0:12 switch
0:12 condition
0:12 'gl_VertexID' ( gl_VertexId int VertexId)
0:12 body
0:12 Sequence
0:13 case: with expression
0:13 Constant:
0:13 0 (const int)
0:? Sequence
0:13 move second child to first child ( temp 4-component vector of float)
0:13 gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
0:13 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
0:13 Constant:
0:13 0 (const uint)
0:13 Constant:
0:13 -1.000000
0:13 1.000000
0:13 0.000000
0:13 1.000000
0:13 Branch: Break
0:14 case: with expression
0:14 Constant:
0:14 1 (const int)
0:? Sequence
0:14 move second child to first child ( temp 4-component vector of float)
0:14 gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
0:14 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
0:14 Constant:
0:14 0 (const uint)
0:14 Constant:
0:14 1.000000
0:14 1.000000
0:14 0.000000
0:14 1.000000
0:14 Branch: Break
0:15 case: with expression
0:15 Constant:
0:15 2 (const int)
0:? Sequence
0:15 move second child to first child ( temp 4-component vector of float)
0:15 gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
0:15 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
0:15 Constant:
0:15 0 (const uint)
0:15 Constant:
0:15 -1.000000
0:15 -1.000000
0:15 0.000000
0:15 1.000000
0:15 Branch: Break
0:16 case: with expression
0:16 Constant:
0:16 3 (const int)
0:? Sequence
0:16 move second child to first child ( temp 4-component vector of float)
0:16 gl_Position: direct index for structure ( gl_Position 4-component vector of float Position)
0:16 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
0:16 Constant:
0:16 0 (const uint)
0:16 Constant:
0:16 1.000000
0:16 -1.000000
0:16 0.000000
0:16 1.000000
0:16 Branch: Break
0:? Linker Objects
0:? 'expected_value' ( uniform int)
0:? 'value' ( uniform float)
0:? 'result' ( smooth out 4-component vector of float)
0:? 'anon@0' ( out block{ gl_Position 4-component vector of float Position gl_Position, gl_PointSize float PointSize gl_PointSize, out 1-element array of float ClipDistance gl_ClipDistance})
0:? 'gl_VertexID' ( gl_VertexId int VertexId)
0:? 'gl_InstanceID' ( gl_InstanceId int InstanceId)

View File

@ -0,0 +1,35 @@
xfbUnsizedArray.error.tese
ERROR: 0:4: 'xfb_offset' : unsized array in buffer 0
ERROR: 1 compilation errors. No code generated.
Shader version: 430
Requested GL_ARB_enhanced_layouts
in xfb mode
input primitive = isolines
vertex spacing = none
triangle order = none
using point mode
ERROR: node is still EOpNull!
0:6 Function Definition: main( ( global void)
0:6 Function Parameters:
0:? Linker Objects
0:? 'unsized' (layout( xfb_buffer=0 xfb_offset=0) out unsized 1-element array of 4-component vector of float)
Linked tessellation evaluation stage:
Shader version: 430
Requested GL_ARB_enhanced_layouts
in xfb mode
input primitive = isolines
vertex spacing = equal_spacing
triangle order = ccw
using point mode
ERROR: node is still EOpNull!
0:6 Function Definition: main( ( global void)
0:6 Function Parameters:
0:? Linker Objects
0:? 'unsized' (layout( xfb_buffer=0 xfb_offset=0) out 1-element array of 4-component vector of float)

18
Test/floatBitsToInt.vert Normal file
View File

@ -0,0 +1,18 @@
#version 150
#extension GL_ARB_gpu_shader5 : require
uniform int expected_value;
uniform float value;
out vec4 result;
void main()
{
result = vec4(1.0, 1.0, 1.0, 1.0);
int ret_val = floatBitsToInt(value);
if (expected_value != ret_val){ result = vec4(0.0, 0.0, 0.0, 0.0); }
switch (gl_VertexID) {
case 0: gl_Position = vec4(-1.0, 1.0, 0.0, 1.0); break;
case 1: gl_Position = vec4( 1.0, 1.0, 0.0, 1.0); break;
case 2: gl_Position = vec4(-1.0,-1.0, 0.0, 1.0); break;
case 3: gl_Position = vec4( 1.0,-1.0, 0.0, 1.0); break;
}
}

View File

@ -0,0 +1,8 @@
#version 430 core
#extension GL_ARB_enhanced_layouts : require
layout(isolines, point_mode) in;
layout (xfb_offset = 0) out vec4 unsized[]; // error: unsized array
void main()
{
}

View File

@ -8353,10 +8353,11 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
} }
if (profile != EEsProfile && version < 330 ) { if (profile != EEsProfile && version < 330 ) {
symbolTable.setFunctionExtensions("floatBitsToInt", 1, &E_GL_ARB_shader_bit_encoding); const char* bitsConvertExt[2] = {E_GL_ARB_shader_bit_encoding, E_GL_ARB_gpu_shader5};
symbolTable.setFunctionExtensions("floatBitsToUint", 1, &E_GL_ARB_shader_bit_encoding); symbolTable.setFunctionExtensions("floatBitsToInt", 2, bitsConvertExt);
symbolTable.setFunctionExtensions("intBitsToFloat", 1, &E_GL_ARB_shader_bit_encoding); symbolTable.setFunctionExtensions("floatBitsToUint", 2, bitsConvertExt);
symbolTable.setFunctionExtensions("uintBitsToFloat", 1, &E_GL_ARB_shader_bit_encoding); symbolTable.setFunctionExtensions("intBitsToFloat", 2, bitsConvertExt);
symbolTable.setFunctionExtensions("uintBitsToFloat", 2, bitsConvertExt);
} }
if (profile != EEsProfile && version < 430 ) { if (profile != EEsProfile && version < 430 ) {

View File

@ -6212,11 +6212,13 @@ void TParseContext::layoutTypeCheck(const TSourceLoc& loc, const TType& type)
#ifndef GLSLANG_WEB #ifndef GLSLANG_WEB
if (qualifier.hasXfbOffset() && qualifier.hasXfbBuffer()) { if (qualifier.hasXfbOffset() && qualifier.hasXfbBuffer()) {
int repeated = intermediate.addXfbBufferOffset(type); if (type.isUnsizedArray()) {
if (repeated >= 0)
error(loc, "overlapping offsets at", "xfb_offset", "offset %d in buffer %d", repeated, qualifier.layoutXfbBuffer);
if (type.isUnsizedArray())
error(loc, "unsized array", "xfb_offset", "in buffer %d", qualifier.layoutXfbBuffer); error(loc, "unsized array", "xfb_offset", "in buffer %d", qualifier.layoutXfbBuffer);
} else {
int repeated = intermediate.addXfbBufferOffset(type);
if (repeated >= 0)
error(loc, "overlapping offsets at", "xfb_offset", "offset %d in buffer %d", repeated, qualifier.layoutXfbBuffer);
}
// "The offset must be a multiple of the size of the first component of the first // "The offset must be a multiple of the size of the first component of the first
// qualified variable or block member, or a compile-time error results. Further, if applied to an aggregate // qualified variable or block member, or a compile-time error results. Further, if applied to an aggregate

View File

@ -1802,7 +1802,7 @@ unsigned int TIntermediate::computeTypeXfbSize(const TType& type, bool& contains
return size; return size;
} }
int numComponents; int numComponents {0};
if (type.isScalar()) if (type.isScalar())
numComponents = 1; numComponents = 1;
else if (type.isVector()) else if (type.isVector())

View File

@ -236,6 +236,7 @@ INSTANTIATE_TEST_SUITE_P(
"noMatchingFunction.frag", "noMatchingFunction.frag",
"constantUnaryConversion.comp", "constantUnaryConversion.comp",
"xfbUnsizedArray.error.vert", "xfbUnsizedArray.error.vert",
"xfbUnsizedArray.error.tese",
"glsl.140.layoutOffset.error.vert", "glsl.140.layoutOffset.error.vert",
"glsl.430.layoutOffset.error.vert", "glsl.430.layoutOffset.error.vert",
"glsl.450.subgroup.frag", "glsl.450.subgroup.frag",
@ -291,7 +292,8 @@ INSTANTIATE_TEST_SUITE_P(
"GL_ARB_draw_instanced.vert", "GL_ARB_draw_instanced.vert",
"GL_ARB_fragment_coord_conventions.vert", "GL_ARB_fragment_coord_conventions.vert",
"BestMatchFunction.vert", "BestMatchFunction.vert",
"EndStreamPrimitive.geom" "EndStreamPrimitive.geom",
"floatBitsToInt.vert",
})), })),
FileNameAsCustomTestSuffix FileNameAsCustomTestSuffix
); );

View File

@ -113,11 +113,13 @@ bool verifyIOMapping(std::string& linkingError, glslang::TProgram& program) {
bool found = false; bool found = false;
for (auto outIt : pipeOut) { for (auto outIt : pipeOut) {
if (outIt.second->getType()->isStruct()) { if (outIt.second->getType()->isStruct()) {
unsigned int baseLoc = outIt.second->getType()->getQualifier().hasLocation() ? outIt.second->getType()->getQualifier().layoutLocation : -1; unsigned int baseLoc = outIt.second->getType()->getQualifier().hasLocation() ?
for (int j = 0; j < outIt.second->getType()->getStruct()->size(); j++) { outIt.second->getType()->getQualifier().layoutLocation :
std::numeric_limits<unsigned int>::max();
for (size_t j = 0; j < outIt.second->getType()->getStruct()->size(); j++) {
baseLoc = (*outIt.second->getType()->getStruct())[j].type->getQualifier().hasLocation() ? baseLoc = (*outIt.second->getType()->getStruct())[j].type->getQualifier().hasLocation() ?
(*outIt.second->getType()->getStruct())[j].type->getQualifier().layoutLocation : baseLoc; (*outIt.second->getType()->getStruct())[j].type->getQualifier().layoutLocation : baseLoc;
if (baseLoc != -1) { if (baseLoc != std::numeric_limits<unsigned int>::max()) {
if (baseLoc == in.getType()->getQualifier().layoutLocation) { if (baseLoc == in.getType()->getQualifier().layoutLocation) {
found = true; found = true;
break; break;
@ -134,10 +136,10 @@ bool verifyIOMapping(std::string& linkingError, glslang::TProgram& program) {
} }
else { else {
unsigned int baseLoc = in.getType()->getQualifier().hasLocation() ? in.getType()->getQualifier().layoutLocation : -1; unsigned int baseLoc = in.getType()->getQualifier().hasLocation() ? in.getType()->getQualifier().layoutLocation : -1;
for (int j = 0; j < in.getType()->getStruct()->size(); j++) { for (size_t j = 0; j < in.getType()->getStruct()->size(); j++) {
baseLoc = (*in.getType()->getStruct())[j].type->getQualifier().hasLocation() ? baseLoc = (*in.getType()->getStruct())[j].type->getQualifier().hasLocation() ?
(*in.getType()->getStruct())[j].type->getQualifier().layoutLocation : baseLoc; (*in.getType()->getStruct())[j].type->getQualifier().layoutLocation : baseLoc;
if (baseLoc != -1) { if (baseLoc != std::numeric_limits<unsigned int>::max()) {
bool isMemberFound = false; bool isMemberFound = false;
for (auto outIt : pipeOut) { for (auto outIt : pipeOut) {
if (baseLoc == outIt.second->getType()->getQualifier().layoutLocation) { if (baseLoc == outIt.second->getType()->getQualifier().layoutLocation) {