if ("gl_SubgroupEqMask" == caseDef.varName)
{
if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return "%54 = OpIEqual %11 %51 %53\n";
+ return "%56 = OpIEqual %11 %53 %55\n";
else
- return "%36 = OpIEqual %13 %33 %35\n";
+ return "%38 = OpIEqual %16 %35 %37\n";
}
else if ("gl_SubgroupGeMask" == caseDef.varName)
{
if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return "%54 = OpUGreaterThanEqual %11 %51 %53\n";
+ return "%56 = OpUGreaterThanEqual %11 %53 %55\n";
else
- return "%36 = OpUGreaterThanEqual %13 %33 %35\n";
+ return "%38 = OpUGreaterThanEqual %16 %35 %37\n";
}
else if ("gl_SubgroupGtMask" == caseDef.varName)
{
if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return "%54 = OpUGreaterThan %11 %51 %53\n";
+ return "%56 = OpUGreaterThan %11 %53 %55\n";
else
- return "%36 = OpUGreaterThan %13 %33 %35\n";
+ return "%38 = OpUGreaterThan %16 %35 %37\n";
}
else if ("gl_SubgroupLeMask" == caseDef.varName)
{
if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return "%54 = OpULessThanEqual %11 %51 %53\n";
+ return "%56 = OpULessThanEqual %11 %53 %55\n";
else
- return "%36 = OpULessThanEqual %13 %33 %35\n";
+ return "%38 = OpULessThanEqual %16 %35 %37\n";
}
else if ("gl_SubgroupLtMask" == caseDef.varName)
{
if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return "%54 = OpULessThan %11 %51 %53\n";
+ return "%56 = OpULessThan %11 %53 %55\n";
else
- return "%36 = OpULessThan %13 %33 %35\n";
+ return "%38 = OpULessThan %16 %35 %37\n";
}
return "";
}
if ("gl_SubgroupEqMask" == caseDef.varName)
{
if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return "OpDecorate %37 BuiltIn SubgroupEqMask\n";
+ return "OpDecorate %40 BuiltIn SubgroupEqMask\n";
else
- return "OpDecorate %19 BuiltIn SubgroupEqMask\n";
+ return "OpDecorate %22 BuiltIn SubgroupEqMask\n";
}
else if ("gl_SubgroupGeMask" == caseDef.varName)
{
if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return "OpDecorate %37 BuiltIn SubgroupGeMask\n";
+ return "OpDecorate %40 BuiltIn SubgroupGeMask\n";
else
- return "OpDecorate %19 BuiltIn SubgroupGeMask\n";
+ return "OpDecorate %22 BuiltIn SubgroupGeMask\n";
}
else if ("gl_SubgroupGtMask" == caseDef.varName)
{
if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return "OpDecorate %37 BuiltIn SubgroupGtMask\n";
+ return "OpDecorate %40 BuiltIn SubgroupGtMask\n";
else
- return "OpDecorate %19 BuiltIn SubgroupGtMask\n";
+ return "OpDecorate %22 BuiltIn SubgroupGtMask\n";
}
else if ("gl_SubgroupLeMask" == caseDef.varName)
{
if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return "OpDecorate %37 BuiltIn SubgroupLeMask\n";
+ return "OpDecorate %40 BuiltIn SubgroupLeMask\n";
else
- return "OpDecorate %19 BuiltIn SubgroupLeMask\n";
+ return "OpDecorate %22 BuiltIn SubgroupLeMask\n";
}
else if ("gl_SubgroupLtMask" == caseDef.varName)
{
if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
- return "OpDecorate %37 BuiltIn SubgroupLtMask\n";
+ return "OpDecorate %40 BuiltIn SubgroupLtMask\n";
else
- return "OpDecorate %19 BuiltIn SubgroupLtMask\n";
+ return "OpDecorate %22 BuiltIn SubgroupLtMask\n";
}
return "";
}
std::ostringstream bdy;
bdy << " uint tempResult = 0x1;\n"
+ << " uint bit = 0x1;\n"
+ << " uint bitCount = 0x0;\n"
<< " uvec4 mask = subgroupBallot(true);\n"
<< " const uvec4 var = " << caseDef.varName << ";\n"
<< " for (uint i = 0; i < gl_SubgroupSize; i++)\n"
<< " }\n";
}
- bdy << " }\n";
+ bdy << " }\n"
+ << " for (uint i = 0; i < 32; i++)\n"
+ << " {\n"
+ << " if ((var.x & bit) > 0)\n"
+ << " {\n"
+ << " bitCount++;\n"
+ << " }\n"
+ << " if ((var.y & bit) > 0)\n"
+ << " {\n"
+ << " bitCount++;\n"
+ << " }\n"
+ << " if ((var.z & bit) > 0)\n"
+ << " {\n"
+ << " bitCount++;\n"
+ << " }\n"
+ << " if ((var.w & bit) > 0)\n"
+ << " {\n"
+ << " bitCount++;\n"
+ << " }\n"
+ << " bit = bit<<1;\n"
+ << " }\n"
+ << " if (subgroupBallotBitCount(var) != bitCount)\n"
+ << " {\n"
+ << " tempResult = 0;\n"
+ << " }\n";
return bdy.str();
}
if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
{
/*
+ const string bdy = subgroupMask(caseDef);
+ const string vertex =
+ "#version 450\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(location = 0) out float out_color;\n"
"layout(location = 0) in highp vec4 in_position;\n"
"\n"
"void main (void)\n"
"{\n"
- bdy.str()
+ + bdy +
" out_color = float(tempResult);\n"
" gl_Position = in_position;\n"
" gl_PointSize = 1.0f;\n"
"}\n";
+ programCollection.glslSources.add("vert")
+ << glu::VertexSource(vertex) << vk::ShaderBuildOptions(vk::SPIRV_VERSION_1_3, 0u);
*/
+
const string vertex =
"; SPIR-V\n"
"; Version: 1.3\n"
"; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 63\n"
+ "; Bound: 123\n"
"; Schema: 0\n"
"OpCapability Shader\n"
"OpCapability GroupNonUniform\n"
"OpCapability GroupNonUniformBallot\n"
"%1 = OpExtInstImport \"GLSL.std.450\"\n"
"OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint Vertex %4 \"main\" %19 %30 %34 %49 %56 %59\n"
+ "OpEntryPoint Vertex %4 \"main\" %22 %32 %36 %107 %114 %117\n"
+ mask +
- "OpDecorate %30 RelaxedPrecision\n"
- "OpDecorate %30 BuiltIn SubgroupSize\n"
- "OpDecorate %31 RelaxedPrecision\n"
- "OpDecorate %34 RelaxedPrecision\n"
- "OpDecorate %34 BuiltIn SubgroupLocalInvocationId\n"
- "OpDecorate %35 RelaxedPrecision\n"
- "OpDecorate %49 Location 0\n"
- "OpMemberDecorate %54 0 BuiltIn Position\n"
- "OpMemberDecorate %54 1 BuiltIn PointSize\n"
- "OpMemberDecorate %54 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %54 3 BuiltIn CullDistance\n"
- "OpDecorate %54 Block\n"
- "OpDecorate %59 Location 0\n"
+ "OpDecorate %32 RelaxedPrecision\n"
+ "OpDecorate %32 BuiltIn SubgroupSize\n"
+ "OpDecorate %33 RelaxedPrecision\n"
+ "OpDecorate %36 RelaxedPrecision\n"
+ "OpDecorate %36 BuiltIn SubgroupLocalInvocationId\n"
+ "OpDecorate %37 RelaxedPrecision\n"
+ "OpDecorate %107 Location 0\n"
+ "OpMemberDecorate %112 0 BuiltIn Position\n"
+ "OpMemberDecorate %112 1 BuiltIn PointSize\n"
+ "OpMemberDecorate %112 2 BuiltIn ClipDistance\n"
+ "OpMemberDecorate %112 3 BuiltIn CullDistance\n"
+ "OpDecorate %112 Block\n"
+ "OpDecorate %117 Location 0\n"
"%2 = OpTypeVoid\n"
"%3 = OpTypeFunction %2\n"
"%6 = OpTypeInt 32 0\n"
"%7 = OpTypePointer Function %6\n"
"%9 = OpConstant %6 1\n"
- "%10 = OpTypeVector %6 4\n"
- "%11 = OpTypePointer Function %10\n"
- "%13 = OpTypeBool\n"
- "%14 = OpConstantTrue %13\n"
- "%15 = OpConstant %6 3\n"
- "%18 = OpTypePointer Input %10\n"
- "%19 = OpVariable %18 Input\n"
- "%22 = OpConstant %6 0\n"
- "%29 = OpTypePointer Input %6\n"
- "%30 = OpVariable %29 Input\n"
- "%34 = OpVariable %29 Input\n"
- "%44 = OpTypeInt 32 1\n"
- "%45 = OpConstant %44 1\n"
- "%47 = OpTypeFloat 32\n"
- "%48 = OpTypePointer Output %47\n"
- "%49 = OpVariable %48 Output\n"
- "%52 = OpTypeVector %47 4\n"
- "%53 = OpTypeArray %47 %9\n"
- "%54 = OpTypeStruct %52 %47 %53 %53\n"
- "%55 = OpTypePointer Output %54\n"
- "%56 = OpVariable %55 Output\n"
- "%57 = OpConstant %44 0\n"
- "%63 = OpConstant %47 1\n"
- "%58 = OpTypePointer Input %52\n"
- "%59 = OpVariable %58 Input\n"
- "%61 = OpTypePointer Output %52\n"
+ "%12 = OpConstant %6 0\n"
+ "%13 = OpTypeVector %6 4\n"
+ "%14 = OpTypePointer Function %13\n"
+ "%16 = OpTypeBool\n"
+ "%17 = OpConstantTrue %16\n"
+ "%18 = OpConstant %6 3\n"
+ "%21 = OpTypePointer Input %13\n"
+ "%22 = OpVariable %21 Input\n"
+ "%31 = OpTypePointer Input %6\n"
+ "%32 = OpVariable %31 Input\n"
+ "%36 = OpVariable %31 Input\n"
+ "%46 = OpTypeInt 32 1\n"
+ "%47 = OpConstant %46 1\n"
+ "%56 = OpConstant %6 32\n"
+ "%76 = OpConstant %6 2\n"
+ "%105 = OpTypeFloat 32\n"
+ "%106 = OpTypePointer Output %105\n"
+ "%107 = OpVariable %106 Output\n"
+ "%110 = OpTypeVector %105 4\n"
+ "%111 = OpTypeArray %105 %9\n"
+ "%112 = OpTypeStruct %110 %105 %111 %111\n"
+ "%113 = OpTypePointer Output %112\n"
+ "%114 = OpVariable %113 Output\n"
+ "%115 = OpConstant %46 0\n"
+ "%116 = OpTypePointer Input %110\n"
+ "%117 = OpVariable %116 Input\n"
+ "%119 = OpTypePointer Output %110\n"
+ "%121 = OpConstant %105 1\n"
"%4 = OpFunction %2 None %3\n"
"%5 = OpLabel\n"
"%8 = OpVariable %7 Function\n"
- "%12 = OpVariable %11 Function\n"
- "%17 = OpVariable %11 Function\n"
- "%21 = OpVariable %7 Function\n"
+ "%10 = OpVariable %7 Function\n"
+ "%11 = OpVariable %7 Function\n"
+ "%15 = OpVariable %14 Function\n"
+ "%20 = OpVariable %14 Function\n"
+ "%24 = OpVariable %7 Function\n"
+ "%49 = OpVariable %7 Function\n"
"OpStore %8 %9\n"
- "%16 = OpGroupNonUniformBallot %10 %15 %14\n"
- "OpStore %12 %16\n"
- "%20 = OpLoad %10 %19\n"
- "OpStore %17 %20\n"
- "OpStore %21 %22\n"
- "OpBranch %23\n"
- "%23 = OpLabel\n"
- "OpLoopMerge %25 %26 None\n"
- "OpBranch %27\n"
- "%27 = OpLabel\n"
- "%28 = OpLoad %6 %21\n"
- "%31 = OpLoad %6 %30\n"
- "%32 = OpULessThan %13 %28 %31\n"
- "OpBranchConditional %32 %24 %25\n"
- "%24 = OpLabel\n"
- "%33 = OpLoad %6 %21\n"
- "%35 = OpLoad %6 %34\n"
- + comparison +
- "%37 = OpLoad %10 %17\n"
- "%38 = OpLoad %6 %21\n"
- "%39 = OpGroupNonUniformBallotBitExtract %13 %15 %37 %38\n"
- "%40 = OpLogicalNotEqual %13 %36 %39\n"
- "OpSelectionMerge %42 None\n"
- "OpBranchConditional %40 %41 %42\n"
- "%41 = OpLabel\n"
- "OpStore %8 %22\n"
- "OpBranch %42\n"
- "%42 = OpLabel\n"
- "OpBranch %26\n"
- "%26 = OpLabel\n"
- "%43 = OpLoad %6 %21\n"
- "%46 = OpIAdd %6 %43 %45\n"
- "OpStore %21 %46\n"
- "OpBranch %23\n"
+ "OpStore %10 %9\n"
+ "OpStore %11 %12\n"
+ "%19 = OpGroupNonUniformBallot %13 %18 %17\n"
+ "OpStore %15 %19\n"
+ "%23 = OpLoad %13 %22\n"
+ "OpStore %20 %23\n"
+ "OpStore %24 %12\n"
+ "OpBranch %25\n"
"%25 = OpLabel\n"
- "%50 = OpLoad %6 %8\n"
- "%51 = OpConvertUToF %47 %50\n"
- "OpStore %49 %51\n"
- "%60 = OpLoad %52 %59\n"
- "%62 = OpAccessChain %61 %56 %57\n"
- "OpStore %62 %60\n"
- "%64 = OpAccessChain %48 %56 %45\n"
- "OpStore %64 %63\n"
+ "OpLoopMerge %27 %28 None\n"
+ "OpBranch %29\n"
+ "%29 = OpLabel\n"
+ "%30 = OpLoad %6 %24\n"
+ "%33 = OpLoad %6 %32\n"
+ "%34 = OpULessThan %16 %30 %33\n"
+ "OpBranchConditional %34 %26 %27\n"
+ "%26 = OpLabel\n"
+ "%35 = OpLoad %6 %24\n"
+ "%37 = OpLoad %6 %36\n"
+ + comparison +
+ "%39 = OpLoad %13 %20\n"
+ "%40 = OpLoad %6 %24\n"
+ "%41 = OpGroupNonUniformBallotBitExtract %16 %18 %39 %40\n"
+ "%42 = OpLogicalNotEqual %16 %38 %41\n"
+ "OpSelectionMerge %44 None\n"
+ "OpBranchConditional %42 %43 %44\n"
+ "%43 = OpLabel\n"
+ "OpStore %8 %12\n"
+ "OpBranch %44\n"
+ "%44 = OpLabel\n"
+ "OpBranch %28\n"
+ "%28 = OpLabel\n"
+ "%45 = OpLoad %6 %24\n"
+ "%48 = OpIAdd %6 %45 %47\n"
+ "OpStore %24 %48\n"
+ "OpBranch %25\n"
+ "%27 = OpLabel\n"
+ "OpStore %49 %12\n"
+ "OpBranch %50\n"
+ "%50 = OpLabel\n"
+ "OpLoopMerge %52 %53 None\n"
+ "OpBranch %54\n"
+ "%54 = OpLabel\n"
+ "%55 = OpLoad %6 %49\n"
+ "%57 = OpULessThan %16 %55 %56\n"
+ "OpBranchConditional %57 %51 %52\n"
+ "%51 = OpLabel\n"
+ "%58 = OpAccessChain %7 %20 %12\n"
+ "%59 = OpLoad %6 %58\n"
+ "%60 = OpLoad %6 %10\n"
+ "%61 = OpBitwiseAnd %6 %59 %60\n"
+ "%62 = OpUGreaterThan %16 %61 %12\n"
+ "OpSelectionMerge %64 None\n"
+ "OpBranchConditional %62 %63 %64\n"
+ "%63 = OpLabel\n"
+ "%65 = OpLoad %6 %11\n"
+ "%66 = OpIAdd %6 %65 %47\n"
+ "OpStore %11 %66\n"
+ "OpBranch %64\n"
+ "%64 = OpLabel\n"
+ "%67 = OpAccessChain %7 %20 %9\n"
+ "%68 = OpLoad %6 %67\n"
+ "%69 = OpLoad %6 %10\n"
+ "%70 = OpBitwiseAnd %6 %68 %69\n"
+ "%71 = OpUGreaterThan %16 %70 %12\n"
+ "OpSelectionMerge %73 None\n"
+ "OpBranchConditional %71 %72 %73\n"
+ "%72 = OpLabel\n"
+ "%74 = OpLoad %6 %11\n"
+ "%75 = OpIAdd %6 %74 %47\n"
+ "OpStore %11 %75\n"
+ "OpBranch %73\n"
+ "%73 = OpLabel\n"
+ "%77 = OpAccessChain %7 %20 %76\n"
+ "%78 = OpLoad %6 %77\n"
+ "%79 = OpLoad %6 %10\n"
+ "%80 = OpBitwiseAnd %6 %78 %79\n"
+ "%81 = OpUGreaterThan %16 %80 %12\n"
+ "OpSelectionMerge %83 None\n"
+ "OpBranchConditional %81 %82 %83\n"
+ "%82 = OpLabel\n"
+ "%84 = OpLoad %6 %11\n"
+ "%85 = OpIAdd %6 %84 %47\n"
+ "OpStore %11 %85\n"
+ "OpBranch %83\n"
+ "%83 = OpLabel\n"
+ "%86 = OpAccessChain %7 %20 %18\n"
+ "%87 = OpLoad %6 %86\n"
+ "%88 = OpLoad %6 %10\n"
+ "%89 = OpBitwiseAnd %6 %87 %88\n"
+ "%90 = OpUGreaterThan %16 %89 %12\n"
+ "OpSelectionMerge %92 None\n"
+ "OpBranchConditional %90 %91 %92\n"
+ "%91 = OpLabel\n"
+ "%93 = OpLoad %6 %11\n"
+ "%94 = OpIAdd %6 %93 %47\n"
+ "OpStore %11 %94\n"
+ "OpBranch %92\n"
+ "%92 = OpLabel\n"
+ "%95 = OpLoad %6 %10\n"
+ "%96 = OpShiftLeftLogical %6 %95 %47\n"
+ "OpStore %10 %96\n"
+ "OpBranch %53\n"
+ "%53 = OpLabel\n"
+ "%97 = OpLoad %6 %49\n"
+ "%98 = OpIAdd %6 %97 %47\n"
+ "OpStore %49 %98\n"
+ "OpBranch %50\n"
+ "%52 = OpLabel\n"
+ "%99 = OpLoad %13 %20\n"
+ "%100 = OpGroupNonUniformBallotBitCount %6 %18 Reduce %99\n"
+ "%101 = OpLoad %6 %11\n"
+ "%102 = OpINotEqual %16 %100 %101\n"
+ "OpSelectionMerge %104 None\n"
+ "OpBranchConditional %102 %103 %104\n"
+ "%103 = OpLabel\n"
+ "OpStore %8 %12\n"
+ "OpBranch %104\n"
+ "%104 = OpLabel\n"
+ "%108 = OpLoad %6 %8\n"
+ "%109 = OpConvertUToF %105 %108\n"
+ "OpStore %107 %109\n"
+ "%118 = OpLoad %110 %117\n"
+ "%120 = OpAccessChain %119 %114 %115\n"
+ "OpStore %120 %118\n"
+ "%122 = OpAccessChain %106 %114 %47\n"
+ "OpStore %122 %121\n"
"OpReturn\n"
"OpFunctionEnd\n";
programCollection.spirvAsmSources.add("vert") << vertex << buildOptionsSpr;
}
else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
{
+ /*
+ const string bdy = subgroupMask(caseDef);
+ const string evaluationSource =
+ "#version 450\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "#extension GL_EXT_tessellation_shader : require\n"
+ "layout(isolines, equal_spacing, ccw ) in;\n"
+ "layout(location = 0) out float out_color;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdy +
+ " out_color = float(tempResult);\n"
+ " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
+ "}\n";
+ programCollection.glslSources.add("tese")
+ << glu::TessellationEvaluationSource(evaluationSource) << vk::ShaderBuildOptions(vk::SPIRV_VERSION_1_3, 0u);
+ */
const string evaluationSource =
"; SPIR-V\n"
"; Version: 1.3\n"
"; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 81\n"
+ "; Bound: 136\n"
"; Schema: 0\n"
"OpCapability Tessellation\n"
"OpCapability GroupNonUniform\n"
"OpCapability GroupNonUniformBallot\n"
"%1 = OpExtInstImport \"GLSL.std.450\"\n"
"OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint TessellationEvaluation %4 \"main\" %19 %30 %34 %49 %56 %62 %70 %80\n"
+ "OpEntryPoint TessellationEvaluation %4 \"main\" %22 %32 %36 %107 %114 %120 %128\n"
"OpExecutionMode %4 Isolines\n"
"OpExecutionMode %4 SpacingEqual\n"
"OpExecutionMode %4 VertexOrderCcw\n"
+ mask +
- "OpDecorate %30 RelaxedPrecision\n"
- "OpDecorate %30 BuiltIn SubgroupSize\n"
- "OpDecorate %31 RelaxedPrecision\n"
- "OpDecorate %34 RelaxedPrecision\n"
- "OpDecorate %34 BuiltIn SubgroupLocalInvocationId\n"
- "OpDecorate %35 RelaxedPrecision\n"
- "OpDecorate %49 Location 0\n"
- "OpMemberDecorate %54 0 BuiltIn Position\n"
- "OpMemberDecorate %54 1 BuiltIn PointSize\n"
- "OpMemberDecorate %54 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %54 3 BuiltIn CullDistance\n"
- "OpDecorate %54 Block\n"
- "OpMemberDecorate %58 0 BuiltIn Position\n"
- "OpMemberDecorate %58 1 BuiltIn PointSize\n"
- "OpMemberDecorate %58 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %58 3 BuiltIn CullDistance\n"
- "OpDecorate %58 Block\n"
- "OpDecorate %70 BuiltIn TessCoord\n"
- "OpDecorate %80 Location 0\n"
+ "OpDecorate %32 RelaxedPrecision\n"
+ "OpDecorate %32 BuiltIn SubgroupSize\n"
+ "OpDecorate %33 RelaxedPrecision\n"
+ "OpDecorate %36 RelaxedPrecision\n"
+ "OpDecorate %36 BuiltIn SubgroupLocalInvocationId\n"
+ "OpDecorate %37 RelaxedPrecision\n"
+ "OpDecorate %107 Location 0\n"
+ "OpMemberDecorate %112 0 BuiltIn Position\n"
+ "OpMemberDecorate %112 1 BuiltIn PointSize\n"
+ "OpMemberDecorate %112 2 BuiltIn ClipDistance\n"
+ "OpMemberDecorate %112 3 BuiltIn CullDistance\n"
+ "OpDecorate %112 Block\n"
+ "OpMemberDecorate %116 0 BuiltIn Position\n"
+ "OpMemberDecorate %116 1 BuiltIn PointSize\n"
+ "OpMemberDecorate %116 2 BuiltIn ClipDistance\n"
+ "OpMemberDecorate %116 3 BuiltIn CullDistance\n"
+ "OpDecorate %116 Block\n"
+ "OpDecorate %128 BuiltIn TessCoord\n"
"%2 = OpTypeVoid\n"
"%3 = OpTypeFunction %2\n"
"%6 = OpTypeInt 32 0\n"
"%7 = OpTypePointer Function %6\n"
"%9 = OpConstant %6 1\n"
- "%10 = OpTypeVector %6 4\n"
- "%11 = OpTypePointer Function %10\n"
- "%13 = OpTypeBool\n"
- "%14 = OpConstantTrue %13\n"
- "%15 = OpConstant %6 3\n"
- "%18 = OpTypePointer Input %10\n"
- "%19 = OpVariable %18 Input\n"
- "%22 = OpConstant %6 0\n"
- "%29 = OpTypePointer Input %6\n"
- "%30 = OpVariable %29 Input\n"
- "%34 = OpVariable %29 Input\n"
- "%44 = OpTypeInt 32 1\n"
- "%45 = OpConstant %44 1\n"
- "%47 = OpTypeFloat 32\n"
- "%48 = OpTypePointer Output %47\n"
- "%49 = OpVariable %48 Output\n"
- "%52 = OpTypeVector %47 4\n"
- "%53 = OpTypeArray %47 %9\n"
- "%54 = OpTypeStruct %52 %47 %53 %53\n"
- "%55 = OpTypePointer Output %54\n"
- "%56 = OpVariable %55 Output\n"
- "%57 = OpConstant %44 0\n"
- "%58 = OpTypeStruct %52 %47 %53 %53\n"
- "%59 = OpConstant %6 32\n"
- "%60 = OpTypeArray %58 %59\n"
- "%61 = OpTypePointer Input %60\n"
- "%62 = OpVariable %61 Input\n"
- "%63 = OpTypePointer Input %52\n"
- "%68 = OpTypeVector %47 3\n"
- "%69 = OpTypePointer Input %68\n"
- "%70 = OpVariable %69 Input\n"
- "%71 = OpTypePointer Input %47\n"
- "%76 = OpTypePointer Output %52\n"
- "%78 = OpTypeArray %47 %59\n"
- "%79 = OpTypePointer Input %78\n"
- "%80 = OpVariable %79 Input\n"
+ "%12 = OpConstant %6 0\n"
+ "%13 = OpTypeVector %6 4\n"
+ "%14 = OpTypePointer Function %13\n"
+ "%16 = OpTypeBool\n"
+ "%17 = OpConstantTrue %16\n"
+ "%18 = OpConstant %6 3\n"
+ "%21 = OpTypePointer Input %13\n"
+ "%22 = OpVariable %21 Input\n"
+ "%31 = OpTypePointer Input %6\n"
+ "%32 = OpVariable %31 Input\n"
+ "%36 = OpVariable %31 Input\n"
+ "%46 = OpTypeInt 32 1\n"
+ "%47 = OpConstant %46 1\n"
+ "%56 = OpConstant %6 32\n"
+ "%76 = OpConstant %6 2\n"
+ "%105 = OpTypeFloat 32\n"
+ "%106 = OpTypePointer Output %105\n"
+ "%107 = OpVariable %106 Output\n"
+ "%110 = OpTypeVector %105 4\n"
+ "%111 = OpTypeArray %105 %9\n"
+ "%112 = OpTypeStruct %110 %105 %111 %111\n"
+ "%113 = OpTypePointer Output %112\n"
+ "%114 = OpVariable %113 Output\n"
+ "%115 = OpConstant %46 0\n"
+ "%116 = OpTypeStruct %110 %105 %111 %111\n"
+ "%117 = OpConstant %6 32\n"
+ "%118 = OpTypeArray %116 %117\n"
+ "%119 = OpTypePointer Input %118\n"
+ "%120 = OpVariable %119 Input\n"
+ "%121 = OpTypePointer Input %110\n"
+ "%126 = OpTypeVector %105 3\n"
+ "%127 = OpTypePointer Input %126\n"
+ "%128 = OpVariable %127 Input\n"
+ "%129 = OpTypePointer Input %105\n"
+ "%134 = OpTypePointer Output %110\n"
"%4 = OpFunction %2 None %3\n"
"%5 = OpLabel\n"
"%8 = OpVariable %7 Function\n"
- "%12 = OpVariable %11 Function\n"
- "%17 = OpVariable %11 Function\n"
- "%21 = OpVariable %7 Function\n"
+ "%10 = OpVariable %7 Function\n"
+ "%11 = OpVariable %7 Function\n"
+ "%15 = OpVariable %14 Function\n"
+ "%20 = OpVariable %14 Function\n"
+ "%24 = OpVariable %7 Function\n"
+ "%49 = OpVariable %7 Function\n"
"OpStore %8 %9\n"
- "%16 = OpGroupNonUniformBallot %10 %15 %14\n"
- "OpStore %12 %16\n"
- "%20 = OpLoad %10 %19\n"
- "OpStore %17 %20\n"
- "OpStore %21 %22\n"
- "OpBranch %23\n"
- "%23 = OpLabel\n"
- "OpLoopMerge %25 %26 None\n"
- "OpBranch %27\n"
- "%27 = OpLabel\n"
- "%28 = OpLoad %6 %21\n"
- "%31 = OpLoad %6 %30\n"
- "%32 = OpULessThan %13 %28 %31\n"
- "OpBranchConditional %32 %24 %25\n"
- "%24 = OpLabel\n"
- "%33 = OpLoad %6 %21\n"
- "%35 = OpLoad %6 %34\n"
- + comparison +
- "%37 = OpLoad %10 %17\n"
- "%38 = OpLoad %6 %21\n"
- "%39 = OpGroupNonUniformBallotBitExtract %13 %15 %37 %38\n"
- "%40 = OpLogicalNotEqual %13 %36 %39\n"
- "OpSelectionMerge %42 None\n"
- "OpBranchConditional %40 %41 %42\n"
- "%41 = OpLabel\n"
- "OpStore %8 %22\n"
- "OpBranch %42\n"
- "%42 = OpLabel\n"
- "OpBranch %26\n"
- "%26 = OpLabel\n"
- "%43 = OpLoad %6 %21\n"
- "%46 = OpIAdd %6 %43 %45\n"
- "OpStore %21 %46\n"
- "OpBranch %23\n"
+ "OpStore %10 %9\n"
+ "OpStore %11 %12\n"
+ "%19 = OpGroupNonUniformBallot %13 %18 %17\n"
+ "OpStore %15 %19\n"
+ "%23 = OpLoad %13 %22\n"
+ "OpStore %20 %23\n"
+ "OpStore %24 %12\n"
+ "OpBranch %25\n"
"%25 = OpLabel\n"
- "%50 = OpLoad %6 %8\n"
- "%51 = OpConvertUToF %47 %50\n"
- "OpStore %49 %51\n"
- "%64 = OpAccessChain %63 %62 %57 %57\n"
- "%65 = OpLoad %52 %64\n"
- "%66 = OpAccessChain %63 %62 %45 %57\n"
- "%67 = OpLoad %52 %66\n"
- "%72 = OpAccessChain %71 %70 %22\n"
- "%73 = OpLoad %47 %72\n"
- "%74 = OpCompositeConstruct %52 %73 %73 %73 %73\n"
- "%75 = OpExtInst %52 %1 FMix %65 %67 %74\n"
- "%77 = OpAccessChain %76 %56 %57\n"
- "OpStore %77 %75\n"
+ "OpLoopMerge %27 %28 None\n"
+ "OpBranch %29\n"
+ "%29 = OpLabel\n"
+ "%30 = OpLoad %6 %24\n"
+ "%33 = OpLoad %6 %32\n"
+ "%34 = OpULessThan %16 %30 %33\n"
+ "OpBranchConditional %34 %26 %27\n"
+ "%26 = OpLabel\n"
+ "%35 = OpLoad %6 %24\n"
+ "%37 = OpLoad %6 %36\n"
+ + comparison +
+ "%39 = OpLoad %13 %20\n"
+ "%40 = OpLoad %6 %24\n"
+ "%41 = OpGroupNonUniformBallotBitExtract %16 %18 %39 %40\n"
+ "%42 = OpLogicalNotEqual %16 %38 %41\n"
+ "OpSelectionMerge %44 None\n"
+ "OpBranchConditional %42 %43 %44\n"
+ "%43 = OpLabel\n"
+ "OpStore %8 %12\n"
+ "OpBranch %44\n"
+ "%44 = OpLabel\n"
+ "OpBranch %28\n"
+ "%28 = OpLabel\n"
+ "%45 = OpLoad %6 %24\n"
+ "%48 = OpIAdd %6 %45 %47\n"
+ "OpStore %24 %48\n"
+ "OpBranch %25\n"
+ "%27 = OpLabel\n"
+ "OpStore %49 %12\n"
+ "OpBranch %50\n"
+ "%50 = OpLabel\n"
+ "OpLoopMerge %52 %53 None\n"
+ "OpBranch %54\n"
+ "%54 = OpLabel\n"
+ "%55 = OpLoad %6 %49\n"
+ "%57 = OpULessThan %16 %55 %56\n"
+ "OpBranchConditional %57 %51 %52\n"
+ "%51 = OpLabel\n"
+ "%58 = OpAccessChain %7 %20 %12\n"
+ "%59 = OpLoad %6 %58\n"
+ "%60 = OpLoad %6 %10\n"
+ "%61 = OpBitwiseAnd %6 %59 %60\n"
+ "%62 = OpUGreaterThan %16 %61 %12\n"
+ "OpSelectionMerge %64 None\n"
+ "OpBranchConditional %62 %63 %64\n"
+ "%63 = OpLabel\n"
+ "%65 = OpLoad %6 %11\n"
+ "%66 = OpIAdd %6 %65 %47\n"
+ "OpStore %11 %66\n"
+ "OpBranch %64\n"
+ "%64 = OpLabel\n"
+ "%67 = OpAccessChain %7 %20 %9\n"
+ "%68 = OpLoad %6 %67\n"
+ "%69 = OpLoad %6 %10\n"
+ "%70 = OpBitwiseAnd %6 %68 %69\n"
+ "%71 = OpUGreaterThan %16 %70 %12\n"
+ "OpSelectionMerge %73 None\n"
+ "OpBranchConditional %71 %72 %73\n"
+ "%72 = OpLabel\n"
+ "%74 = OpLoad %6 %11\n"
+ "%75 = OpIAdd %6 %74 %47\n"
+ "OpStore %11 %75\n"
+ "OpBranch %73\n"
+ "%73 = OpLabel\n"
+ "%77 = OpAccessChain %7 %20 %76\n"
+ "%78 = OpLoad %6 %77\n"
+ "%79 = OpLoad %6 %10\n"
+ "%80 = OpBitwiseAnd %6 %78 %79\n"
+ "%81 = OpUGreaterThan %16 %80 %12\n"
+ "OpSelectionMerge %83 None\n"
+ "OpBranchConditional %81 %82 %83\n"
+ "%82 = OpLabel\n"
+ "%84 = OpLoad %6 %11\n"
+ "%85 = OpIAdd %6 %84 %47\n"
+ "OpStore %11 %85\n"
+ "OpBranch %83\n"
+ "%83 = OpLabel\n"
+ "%86 = OpAccessChain %7 %20 %18\n"
+ "%87 = OpLoad %6 %86\n"
+ "%88 = OpLoad %6 %10\n"
+ "%89 = OpBitwiseAnd %6 %87 %88\n"
+ "%90 = OpUGreaterThan %16 %89 %12\n"
+ "OpSelectionMerge %92 None\n"
+ "OpBranchConditional %90 %91 %92\n"
+ "%91 = OpLabel\n"
+ "%93 = OpLoad %6 %11\n"
+ "%94 = OpIAdd %6 %93 %47\n"
+ "OpStore %11 %94\n"
+ "OpBranch %92\n"
+ "%92 = OpLabel\n"
+ "%95 = OpLoad %6 %10\n"
+ "%96 = OpShiftLeftLogical %6 %95 %47\n"
+ "OpStore %10 %96\n"
+ "OpBranch %53\n"
+ "%53 = OpLabel\n"
+ "%97 = OpLoad %6 %49\n"
+ "%98 = OpIAdd %6 %97 %47\n"
+ "OpStore %49 %98\n"
+ "OpBranch %50\n"
+ "%52 = OpLabel\n"
+ "%99 = OpLoad %13 %20\n"
+ "%100 = OpGroupNonUniformBallotBitCount %6 %18 Reduce %99\n"
+ "%101 = OpLoad %6 %11\n"
+ "%102 = OpINotEqual %16 %100 %101\n"
+ "OpSelectionMerge %104 None\n"
+ "OpBranchConditional %102 %103 %104\n"
+ "%103 = OpLabel\n"
+ "OpStore %8 %12\n"
+ "OpBranch %104\n"
+ "%104 = OpLabel\n"
+ "%108 = OpLoad %6 %8\n"
+ "%109 = OpConvertUToF %105 %108\n"
+ "OpStore %107 %109\n"
+ "%122 = OpAccessChain %121 %120 %115 %115\n"
+ "%123 = OpLoad %110 %122\n"
+ "%124 = OpAccessChain %121 %120 %47 %115\n"
+ "%125 = OpLoad %110 %124\n"
+ "%130 = OpAccessChain %129 %128 %12\n"
+ "%131 = OpLoad %105 %130\n"
+ "%132 = OpCompositeConstruct %110 %131 %131 %131 %131\n"
+ "%133 = OpExtInst %110 %1 FMix %123 %125 %132\n"
+ "%135 = OpAccessChain %134 %114 %115\n"
+ "OpStore %135 %133\n"
"OpReturn\n"
"OpFunctionEnd\n";
programCollection.spirvAsmSources.add("tese") << evaluationSource << buildOptionsSpr;
else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
{
/*
+ const string bdy = subgroupMask(caseDef);
+ const string controlSource =
+ "#version 450\n"
"#extension GL_EXT_tessellation_shader : require\n"
"#extension GL_KHR_shader_subgroup_ballot: enable\n"
"layout(vertices = 2) out;\n"
"void main (void)\n"
"{\n"
" if (gl_InvocationID == 0)\n"
- {\n"
+ " {\n"
" gl_TessLevelOuter[0] = 1.0f;\n"
" gl_TessLevelOuter[1] = 1.0f;\n"
" }\n"
- bdy.str()
+ + bdy +
" out_color[gl_InvocationID] = float(tempResult);\n"
" gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
- "}\n";;
+ "}\n";
+ programCollection.glslSources.add("tesc")
+ << glu::TessellationControlSource(controlSource) << vk::ShaderBuildOptions(vk::SPIRV_VERSION_1_3, 0u);
*/
-
const string controlSource =
"; SPIR-V\n"
"; Version: 1.3\n"
"; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 89\n"
+ "; Bound: 146\n"
"; Schema: 0\n"
"OpCapability Tessellation\n"
"OpCapability GroupNonUniform\n"
"OpCapability GroupNonUniformBallot\n"
"%1 = OpExtInstImport \"GLSL.std.450\"\n"
"OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint TessellationControl %4 \"main\" %8 %20 %37 %48 %52 %66 %76 %82\n"
+ "OpEntryPoint TessellationControl %4 \"main\" %8 %20 %40 %50 %54 %123 %133 %139\n"
"OpExecutionMode %4 OutputVertices 2\n"
"OpDecorate %8 BuiltIn InvocationId\n"
"OpDecorate %20 Patch\n"
"OpDecorate %20 BuiltIn TessLevelOuter\n"
+ mask +
- "OpDecorate %48 RelaxedPrecision\n"
- "OpDecorate %48 BuiltIn SubgroupSize\n"
- "OpDecorate %49 RelaxedPrecision\n"
- "OpDecorate %52 RelaxedPrecision\n"
- "OpDecorate %52 BuiltIn SubgroupLocalInvocationId\n"
- "OpDecorate %53 RelaxedPrecision\n"
- "OpDecorate %66 Location 0\n"
- "OpMemberDecorate %73 0 BuiltIn Position\n"
- "OpMemberDecorate %73 1 BuiltIn PointSize\n"
- "OpMemberDecorate %73 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %73 3 BuiltIn CullDistance\n"
- "OpDecorate %73 Block\n"
- "OpMemberDecorate %78 0 BuiltIn Position\n"
- "OpMemberDecorate %78 1 BuiltIn PointSize\n"
- "OpMemberDecorate %78 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %78 3 BuiltIn CullDistance\n"
- "OpDecorate %78 Block\n"
+ "OpDecorate %50 RelaxedPrecision\n"
+ "OpDecorate %50 BuiltIn SubgroupSize\n"
+ "OpDecorate %51 RelaxedPrecision\n"
+ "OpDecorate %54 RelaxedPrecision\n"
+ "OpDecorate %54 BuiltIn SubgroupLocalInvocationId\n"
+ "OpDecorate %55 RelaxedPrecision\n"
+ "OpDecorate %123 Location 0\n"
+ "OpMemberDecorate %130 0 BuiltIn Position\n"
+ "OpMemberDecorate %130 1 BuiltIn PointSize\n"
+ "OpMemberDecorate %130 2 BuiltIn ClipDistance\n"
+ "OpMemberDecorate %130 3 BuiltIn CullDistance\n"
+ "OpDecorate %130 Block\n"
+ "OpMemberDecorate %135 0 BuiltIn Position\n"
+ "OpMemberDecorate %135 1 BuiltIn PointSize\n"
+ "OpMemberDecorate %135 2 BuiltIn ClipDistance\n"
+ "OpMemberDecorate %135 3 BuiltIn CullDistance\n"
+ "OpDecorate %135 Block\n"
"%2 = OpTypeVoid\n"
"%3 = OpTypeFunction %2\n"
"%6 = OpTypeInt 32 1\n"
"%24 = OpConstant %6 1\n"
"%26 = OpTypePointer Function %16\n"
"%28 = OpConstant %16 1\n"
- "%29 = OpTypeVector %16 4\n"
- "%30 = OpTypePointer Function %29\n"
- "%32 = OpConstantTrue %11\n"
- "%33 = OpConstant %16 3\n"
- "%36 = OpTypePointer Input %29\n"
- "%37 = OpVariable %36 Input\n"
- "%40 = OpConstant %16 0\n"
- "%47 = OpTypePointer Input %16\n"
- "%48 = OpVariable %47 Input\n"
- "%52 = OpVariable %47 Input\n"
- "%63 = OpConstant %16 2\n"
- "%64 = OpTypeArray %15 %63\n"
- "%65 = OpTypePointer Output %64\n"
- "%66 = OpVariable %65 Output\n"
- "%71 = OpTypeVector %15 4\n"
- "%72 = OpTypeArray %15 %28\n"
- "%73 = OpTypeStruct %71 %15 %72 %72\n"
- "%74 = OpTypeArray %73 %63\n"
- "%75 = OpTypePointer Output %74\n"
- "%76 = OpVariable %75 Output\n"
- "%78 = OpTypeStruct %71 %15 %72 %72\n"
- "%79 = OpConstant %16 32\n"
- "%80 = OpTypeArray %78 %79\n"
- "%81 = OpTypePointer Input %80\n"
- "%82 = OpVariable %81 Input\n"
- "%84 = OpTypePointer Input %71\n"
- "%87 = OpTypePointer Output %71\n"
+ "%31 = OpConstant %16 0\n"
+ "%32 = OpTypeVector %16 4\n"
+ "%33 = OpTypePointer Function %32\n"
+ "%35 = OpConstantTrue %11\n"
+ "%36 = OpConstant %16 3\n"
+ "%39 = OpTypePointer Input %32\n"
+ "%40 = OpVariable %39 Input\n"
+ "%49 = OpTypePointer Input %16\n"
+ "%50 = OpVariable %49 Input\n"
+ "%54 = OpVariable %49 Input\n"
+ "%72 = OpConstant %16 32\n"
+ "%92 = OpConstant %16 2\n"
+ "%121 = OpTypeArray %15 %92\n"
+ "%122 = OpTypePointer Output %121\n"
+ "%123 = OpVariable %122 Output\n"
+ "%128 = OpTypeVector %15 4\n"
+ "%129 = OpTypeArray %15 %28\n"
+ "%130 = OpTypeStruct %128 %15 %129 %129\n"
+ "%131 = OpTypeArray %130 %92\n"
+ "%132 = OpTypePointer Output %131\n"
+ "%133 = OpVariable %132 Output\n"
+ "%135 = OpTypeStruct %128 %15 %129 %129\n"
+ "%136 = OpConstant %16 32\n"
+ "%137 = OpTypeArray %135 %136\n"
+ "%138 = OpTypePointer Input %137\n"
+ "%139 = OpVariable %138 Input\n"
+ "%141 = OpTypePointer Input %128\n"
+ "%144 = OpTypePointer Output %128\n"
"%4 = OpFunction %2 None %3\n"
"%5 = OpLabel\n"
"%27 = OpVariable %26 Function\n"
- "%31 = OpVariable %30 Function\n"
- "%35 = OpVariable %30 Function\n"
- "%39 = OpVariable %26 Function\n"
+ "%29 = OpVariable %26 Function\n"
+ "%30 = OpVariable %26 Function\n"
+ "%34 = OpVariable %33 Function\n"
+ "%38 = OpVariable %33 Function\n"
+ "%42 = OpVariable %26 Function\n"
+ "%65 = OpVariable %26 Function\n"
"%9 = OpLoad %6 %8\n"
"%12 = OpIEqual %11 %9 %10\n"
"OpSelectionMerge %14 None\n"
"OpBranch %14\n"
"%14 = OpLabel\n"
"OpStore %27 %28\n"
- "%34 = OpGroupNonUniformBallot %29 %33 %32\n"
- "OpStore %31 %34\n"
- "%38 = OpLoad %29 %37\n"
- "OpStore %35 %38\n"
- "OpStore %39 %40\n"
- "OpBranch %41\n"
- "%41 = OpLabel\n"
- "OpLoopMerge %43 %44 None\n"
- "OpBranch %45\n"
- "%45 = OpLabel\n"
- "%46 = OpLoad %16 %39\n"
- "%49 = OpLoad %16 %48\n"
- "%50 = OpULessThan %11 %46 %49\n"
- "OpBranchConditional %50 %42 %43\n"
- "%42 = OpLabel\n"
- "%51 = OpLoad %16 %39\n"
- "%53 = OpLoad %16 %52\n"
- + comparison +
- "%55 = OpLoad %29 %35\n"
- "%56 = OpLoad %16 %39\n"
- "%57 = OpGroupNonUniformBallotBitExtract %11 %33 %55 %56\n"
- "%58 = OpLogicalNotEqual %11 %54 %57\n"
- "OpSelectionMerge %60 None\n"
- "OpBranchConditional %58 %59 %60\n"
- "%59 = OpLabel\n"
- "OpStore %27 %40\n"
- "OpBranch %60\n"
- "%60 = OpLabel\n"
- "OpBranch %44\n"
- "%44 = OpLabel\n"
- "%61 = OpLoad %16 %39\n"
- "%62 = OpIAdd %16 %61 %24\n"
- "OpStore %39 %62\n"
- "OpBranch %41\n"
+ "OpStore %29 %28\n"
+ "OpStore %30 %31\n"
+ "%37 = OpGroupNonUniformBallot %32 %36 %35\n"
+ "OpStore %34 %37\n"
+ "%41 = OpLoad %32 %40\n"
+ "OpStore %38 %41\n"
+ "OpStore %42 %31\n"
+ "OpBranch %43\n"
"%43 = OpLabel\n"
- "%67 = OpLoad %6 %8\n"
- "%68 = OpLoad %16 %27\n"
- "%69 = OpConvertUToF %15 %68\n"
- "%70 = OpAccessChain %22 %66 %67\n"
- "OpStore %70 %69\n"
- "%77 = OpLoad %6 %8\n"
- "%83 = OpLoad %6 %8\n"
- "%85 = OpAccessChain %84 %82 %83 %10\n"
- "%86 = OpLoad %71 %85\n"
- "%88 = OpAccessChain %87 %76 %77 %10\n"
- "OpStore %88 %86\n"
+ "OpLoopMerge %45 %46 None\n"
+ "OpBranch %47\n"
+ "%47 = OpLabel\n"
+ "%48 = OpLoad %16 %42\n"
+ "%51 = OpLoad %16 %50\n"
+ "%52 = OpULessThan %11 %48 %51\n"
+ "OpBranchConditional %52 %44 %45\n"
+ "%44 = OpLabel\n"
+ "%53 = OpLoad %16 %42\n"
+ "%55 = OpLoad %16 %54\n"
+ + comparison +
+ "%57 = OpLoad %32 %38\n"
+ "%58 = OpLoad %16 %42\n"
+ "%59 = OpGroupNonUniformBallotBitExtract %11 %36 %57 %58\n"
+ "%60 = OpLogicalNotEqual %11 %56 %59\n"
+ "OpSelectionMerge %62 None\n"
+ "OpBranchConditional %60 %61 %62\n"
+ "%61 = OpLabel\n"
+ "OpStore %27 %31\n"
+ "OpBranch %62\n"
+ "%62 = OpLabel\n"
+ "OpBranch %46\n"
+ "%46 = OpLabel\n"
+ "%63 = OpLoad %16 %42\n"
+ "%64 = OpIAdd %16 %63 %24\n"
+ "OpStore %42 %64\n"
+ "OpBranch %43\n"
+ "%45 = OpLabel\n"
+ "OpStore %65 %31\n"
+ "OpBranch %66\n"
+ "%66 = OpLabel\n"
+ "OpLoopMerge %68 %69 None\n"
+ "OpBranch %70\n"
+ "%70 = OpLabel\n"
+ "%71 = OpLoad %16 %65\n"
+ "%73 = OpULessThan %11 %71 %72\n"
+ "OpBranchConditional %73 %67 %68\n"
+ "%67 = OpLabel\n"
+ "%74 = OpAccessChain %26 %38 %31\n"
+ "%75 = OpLoad %16 %74\n"
+ "%76 = OpLoad %16 %29\n"
+ "%77 = OpBitwiseAnd %16 %75 %76\n"
+ "%78 = OpUGreaterThan %11 %77 %31\n"
+ "OpSelectionMerge %80 None\n"
+ "OpBranchConditional %78 %79 %80\n"
+ "%79 = OpLabel\n"
+ "%81 = OpLoad %16 %30\n"
+ "%82 = OpIAdd %16 %81 %24\n"
+ "OpStore %30 %82\n"
+ "OpBranch %80\n"
+ "%80 = OpLabel\n"
+ "%83 = OpAccessChain %26 %38 %28\n"
+ "%84 = OpLoad %16 %83\n"
+ "%85 = OpLoad %16 %29\n"
+ "%86 = OpBitwiseAnd %16 %84 %85\n"
+ "%87 = OpUGreaterThan %11 %86 %31\n"
+ "OpSelectionMerge %89 None\n"
+ "OpBranchConditional %87 %88 %89\n"
+ "%88 = OpLabel\n"
+ "%90 = OpLoad %16 %30\n"
+ "%91 = OpIAdd %16 %90 %24\n"
+ "OpStore %30 %91\n"
+ "OpBranch %89\n"
+ "%89 = OpLabel\n"
+ "%93 = OpAccessChain %26 %38 %92\n"
+ "%94 = OpLoad %16 %93\n"
+ "%95 = OpLoad %16 %29\n"
+ "%96 = OpBitwiseAnd %16 %94 %95\n"
+ "%97 = OpUGreaterThan %11 %96 %31\n"
+ "OpSelectionMerge %99 None\n"
+ "OpBranchConditional %97 %98 %99\n"
+ "%98 = OpLabel\n"
+ "%100 = OpLoad %16 %30\n"
+ "%101 = OpIAdd %16 %100 %24\n"
+ "OpStore %30 %101\n"
+ "OpBranch %99\n"
+ "%99 = OpLabel\n"
+ "%102 = OpAccessChain %26 %38 %36\n"
+ "%103 = OpLoad %16 %102\n"
+ "%104 = OpLoad %16 %29\n"
+ "%105 = OpBitwiseAnd %16 %103 %104\n"
+ "%106 = OpUGreaterThan %11 %105 %31\n"
+ "OpSelectionMerge %108 None\n"
+ "OpBranchConditional %106 %107 %108\n"
+ "%107 = OpLabel\n"
+ "%109 = OpLoad %16 %30\n"
+ "%110 = OpIAdd %16 %109 %24\n"
+ "OpStore %30 %110\n"
+ "OpBranch %108\n"
+ "%108 = OpLabel\n"
+ "%111 = OpLoad %16 %29\n"
+ "%112 = OpShiftLeftLogical %16 %111 %24\n"
+ "OpStore %29 %112\n"
+ "OpBranch %69\n"
+ "%69 = OpLabel\n"
+ "%113 = OpLoad %16 %65\n"
+ "%114 = OpIAdd %16 %113 %24\n"
+ "OpStore %65 %114\n"
+ "OpBranch %66\n"
+ "%68 = OpLabel\n"
+ "%115 = OpLoad %32 %38\n"
+ "%116 = OpGroupNonUniformBallotBitCount %16 %36 Reduce %115\n"
+ "%117 = OpLoad %16 %30\n"
+ "%118 = OpINotEqual %11 %116 %117\n"
+ "OpSelectionMerge %120 None\n"
+ "OpBranchConditional %118 %119 %120\n"
+ "%119 = OpLabel\n"
+ "OpStore %27 %31\n"
+ "OpBranch %120\n"
+ "%120 = OpLabel\n"
+ "%124 = OpLoad %6 %8\n"
+ "%125 = OpLoad %16 %27\n"
+ "%126 = OpConvertUToF %15 %125\n"
+ "%127 = OpAccessChain %22 %123 %124\n"
+ "OpStore %127 %126\n"
+ "%134 = OpLoad %6 %8\n"
+ "%140 = OpLoad %6 %8\n"
+ "%142 = OpAccessChain %141 %139 %140 %10\n"
+ "%143 = OpLoad %128 %142\n"
+ "%145 = OpAccessChain %144 %133 %134 %10\n"
+ "OpStore %145 %143\n"
"OpReturn\n"
"OpFunctionEnd\n";
programCollection.spirvAsmSources.add("tesc") << controlSource << buildOptionsSpr;
}
else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
{
+ /*
+ const string bdy = subgroupMask(caseDef);
const string geometry =
- "; SPIR-V\n"
- "; Version: 1.3\n"
- "; Generator: Khronos Glslang Reference Front End; 2\n"
- "; Bound: 67\n"
- "; Schema: 0\n"
- "OpCapability Geometry\n"
- "OpCapability GroupNonUniform\n"
- "OpCapability GroupNonUniformBallot\n"
- "%1 = OpExtInstImport \"GLSL.std.450\"\n"
- "OpMemoryModel Logical GLSL450\n"
- "OpEntryPoint Geometry %4 \"main\" %19 %30 %34 %49 %56 %61\n"
- "OpExecutionMode %4 InputPoints\n"
- "OpExecutionMode %4 Invocations 1\n"
- "OpExecutionMode %4 OutputPoints\n"
- "OpExecutionMode %4 OutputVertices 1\n"
- + mask +
- "OpDecorate %30 RelaxedPrecision\n"
- "OpDecorate %30 BuiltIn SubgroupSize\n"
- "OpDecorate %31 RelaxedPrecision\n"
- "OpDecorate %34 RelaxedPrecision\n"
- "OpDecorate %34 BuiltIn SubgroupLocalInvocationId\n"
- "OpDecorate %35 RelaxedPrecision\n"
- "OpDecorate %49 Location 0\n"
- "OpMemberDecorate %54 0 BuiltIn Position\n"
- "OpMemberDecorate %54 1 BuiltIn PointSize\n"
- "OpMemberDecorate %54 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %54 3 BuiltIn CullDistance\n"
- "OpDecorate %54 Block\n"
- "OpMemberDecorate %58 0 BuiltIn Position\n"
- "OpMemberDecorate %58 1 BuiltIn PointSize\n"
- "OpMemberDecorate %58 2 BuiltIn ClipDistance\n"
- "OpMemberDecorate %58 3 BuiltIn CullDistance\n"
- "OpDecorate %58 Block\n"
- "%2 = OpTypeVoid\n"
- "%3 = OpTypeFunction %2\n"
- "%6 = OpTypeInt 32 0\n"
- "%7 = OpTypePointer Function %6\n"
- "%9 = OpConstant %6 1\n"
- "%10 = OpTypeVector %6 4\n"
- "%11 = OpTypePointer Function %10\n"
- "%13 = OpTypeBool\n"
- "%14 = OpConstantTrue %13\n"
- "%15 = OpConstant %6 3\n"
- "%18 = OpTypePointer Input %10\n"
- "%19 = OpVariable %18 Input\n"
- "%22 = OpConstant %6 0\n"
- "%29 = OpTypePointer Input %6\n"
- "%30 = OpVariable %29 Input\n"
- "%34 = OpVariable %29 Input\n"
- "%44 = OpTypeInt 32 1\n"
- "%45 = OpConstant %44 1\n"
- "%47 = OpTypeFloat 32\n"
- "%48 = OpTypePointer Output %47\n"
- "%49 = OpVariable %48 Output\n"
- "%52 = OpTypeVector %47 4\n"
- "%53 = OpTypeArray %47 %9\n"
- "%54 = OpTypeStruct %52 %47 %53 %53\n"
- "%55 = OpTypePointer Output %54\n"
- "%56 = OpVariable %55 Output\n"
- "%57 = OpConstant %44 0\n"
- "%58 = OpTypeStruct %52 %47 %53 %53\n"
- "%59 = OpTypeArray %58 %9\n"
- "%60 = OpTypePointer Input %59\n"
- "%61 = OpVariable %60 Input\n"
- "%62 = OpTypePointer Input %52\n"
- "%65 = OpTypePointer Output %52\n"
- "%4 = OpFunction %2 None %3\n"
- "%5 = OpLabel\n"
- "%8 = OpVariable %7 Function\n"
- "%12 = OpVariable %11 Function\n"
- "%17 = OpVariable %11 Function\n"
- "%21 = OpVariable %7 Function\n"
- "OpStore %8 %9\n"
- "%16 = OpGroupNonUniformBallot %10 %15 %14\n"
- "OpStore %12 %16\n"
- "%20 = OpLoad %10 %19\n"
- "OpStore %17 %20\n"
- "OpStore %21 %22\n"
- "OpBranch %23\n"
- "%23 = OpLabel\n"
- "OpLoopMerge %25 %26 None\n"
- "OpBranch %27\n"
- "%27 = OpLabel\n"
- "%28 = OpLoad %6 %21\n"
- "%31 = OpLoad %6 %30\n"
- "%32 = OpULessThan %13 %28 %31\n"
- "OpBranchConditional %32 %24 %25\n"
- "%24 = OpLabel\n"
- "%33 = OpLoad %6 %21\n"
- "%35 = OpLoad %6 %34\n"
- + comparison +
- "%37 = OpLoad %10 %17\n"
- "%38 = OpLoad %6 %21\n"
- "%39 = OpGroupNonUniformBallotBitExtract %13 %15 %37 %38\n"
- "%40 = OpLogicalNotEqual %13 %36 %39\n"
- "OpSelectionMerge %42 None\n"
- "OpBranchConditional %40 %41 %42\n"
- "%41 = OpLabel\n"
- "OpStore %8 %22\n"
- "OpBranch %42\n"
- "%42 = OpLabel\n"
- "OpBranch %26\n"
- "%26 = OpLabel\n"
- "%43 = OpLoad %6 %21\n"
- "%46 = OpIAdd %6 %43 %45\n"
- "OpStore %21 %46\n"
- "OpBranch %23\n"
- "%25 = OpLabel\n"
- "%50 = OpLoad %6 %8\n"
- "%51 = OpConvertUToF %47 %50\n"
- "OpStore %49 %51\n"
- "%63 = OpAccessChain %62 %61 %57 %57\n"
- "%64 = OpLoad %52 %63\n"
- "%66 = OpAccessChain %65 %56 %57\n"
- "OpStore %66 %64\n"
- "OpEmitVertex\n"
- "OpEndPrimitive\n"
- "OpReturn\n"
- "OpFunctionEnd\n";
+ "#version 450\n"
+ "#extension GL_KHR_shader_subgroup_ballot: enable\n"
+ "layout(points) in;\n"
+ "layout(points, max_vertices = 1) out;\n"
+ "layout(location = 0) out float out_color;\n"
+ "\n"
+ "void main (void)\n"
+ "{\n"
+ + bdy +
+ " out_color = float(tempResult);\n"
+ " gl_Position = gl_in[0].gl_Position;\n"
+ " EmitVertex();\n"
+ " EndPrimitive();\n"
+ "}\n";
+ programCollection.glslSources.add("geometry")
+ << glu::GeometrySource(geometry) << vk::ShaderBuildOptions(vk::SPIRV_VERSION_1_3, 0u);
+ */
+
+ const string geometry =
+ "; SPIR-V\n"
+ "; Version: 1.3\n"
+ "; Generator: Khronos Glslang Reference Front End; 2\n"
+ "; Bound: 125\n"
+ "; Schema: 0\n"
+ "OpCapability Geometry\n"
+ "OpCapability GroupNonUniform\n"
+ "OpCapability GroupNonUniformBallot\n"
+ "%1 = OpExtInstImport \"GLSL.std.450\"\n"
+ "OpMemoryModel Logical GLSL450\n"
+ "OpEntryPoint Geometry %4 \"main\" %22 %32 %36 %107 %114 %119\n"
+ "OpExecutionMode %4 InputPoints\n"
+ "OpExecutionMode %4 Invocations 1\n"
+ "OpExecutionMode %4 OutputPoints\n"
+ "OpExecutionMode %4 OutputVertices 1\n"
+ + mask +
+ "OpDecorate %32 RelaxedPrecision\n"
+ "OpDecorate %32 BuiltIn SubgroupSize\n"
+ "OpDecorate %33 RelaxedPrecision\n"
+ "OpDecorate %36 RelaxedPrecision\n"
+ "OpDecorate %36 BuiltIn SubgroupLocalInvocationId\n"
+ "OpDecorate %37 RelaxedPrecision\n"
+ "OpDecorate %107 Location 0\n"
+ "OpMemberDecorate %112 0 BuiltIn Position\n"
+ "OpMemberDecorate %112 1 BuiltIn PointSize\n"
+ "OpMemberDecorate %112 2 BuiltIn ClipDistance\n"
+ "OpMemberDecorate %112 3 BuiltIn CullDistance\n"
+ "OpDecorate %112 Block\n"
+ "OpMemberDecorate %116 0 BuiltIn Position\n"
+ "OpMemberDecorate %116 1 BuiltIn PointSize\n"
+ "OpMemberDecorate %116 2 BuiltIn ClipDistance\n"
+ "OpMemberDecorate %116 3 BuiltIn CullDistance\n"
+ "OpDecorate %116 Block\n"
+ "%2 = OpTypeVoid\n"
+ "%3 = OpTypeFunction %2\n"
+ "%6 = OpTypeInt 32 0\n"
+ "%7 = OpTypePointer Function %6\n"
+ "%9 = OpConstant %6 1\n"
+ "%12 = OpConstant %6 0\n"
+ "%13 = OpTypeVector %6 4\n"
+ "%14 = OpTypePointer Function %13\n"
+ "%16 = OpTypeBool\n"
+ "%17 = OpConstantTrue %16\n"
+ "%18 = OpConstant %6 3\n"
+ "%21 = OpTypePointer Input %13\n"
+ "%22 = OpVariable %21 Input\n"
+ "%31 = OpTypePointer Input %6\n"
+ "%32 = OpVariable %31 Input\n"
+ "%36 = OpVariable %31 Input\n"
+ "%46 = OpTypeInt 32 1\n"
+ "%47 = OpConstant %46 1\n"
+ "%56 = OpConstant %6 32\n"
+ "%76 = OpConstant %6 2\n"
+ "%105 = OpTypeFloat 32\n"
+ "%106 = OpTypePointer Output %105\n"
+ "%107 = OpVariable %106 Output\n"
+ "%110 = OpTypeVector %105 4\n"
+ "%111 = OpTypeArray %105 %9\n"
+ "%112 = OpTypeStruct %110 %105 %111 %111\n"
+ "%113 = OpTypePointer Output %112\n"
+ "%114 = OpVariable %113 Output\n"
+ "%115 = OpConstant %46 0\n"
+ "%116 = OpTypeStruct %110 %105 %111 %111\n"
+ "%117 = OpTypeArray %116 %9\n"
+ "%118 = OpTypePointer Input %117\n"
+ "%119 = OpVariable %118 Input\n"
+ "%120 = OpTypePointer Input %110\n"
+ "%123 = OpTypePointer Output %110\n"
+ "%4 = OpFunction %2 None %3\n"
+ "%5 = OpLabel\n"
+ "%8 = OpVariable %7 Function\n"
+ "%10 = OpVariable %7 Function\n"
+ "%11 = OpVariable %7 Function\n"
+ "%15 = OpVariable %14 Function\n"
+ "%20 = OpVariable %14 Function\n"
+ "%24 = OpVariable %7 Function\n"
+ "%49 = OpVariable %7 Function\n"
+ "OpStore %8 %9\n"
+ "OpStore %10 %9\n"
+ "OpStore %11 %12\n"
+ "%19 = OpGroupNonUniformBallot %13 %18 %17\n"
+ "OpStore %15 %19\n"
+ "%23 = OpLoad %13 %22\n"
+ "OpStore %20 %23\n"
+ "OpStore %24 %12\n"
+ "OpBranch %25\n"
+ "%25 = OpLabel\n"
+ "OpLoopMerge %27 %28 None\n"
+ "OpBranch %29\n"
+ "%29 = OpLabel\n"
+ "%30 = OpLoad %6 %24\n"
+ "%33 = OpLoad %6 %32\n"
+ "%34 = OpULessThan %16 %30 %33\n"
+ "OpBranchConditional %34 %26 %27\n"
+ "%26 = OpLabel\n"
+ "%35 = OpLoad %6 %24\n"
+ "%37 = OpLoad %6 %36\n"
+ + comparison +
+ "%39 = OpLoad %13 %20\n"
+ "%40 = OpLoad %6 %24\n"
+ "%41 = OpGroupNonUniformBallotBitExtract %16 %18 %39 %40\n"
+ "%42 = OpLogicalNotEqual %16 %38 %41\n"
+ "OpSelectionMerge %44 None\n"
+ "OpBranchConditional %42 %43 %44\n"
+ "%43 = OpLabel\n"
+ "OpStore %8 %12\n"
+ "OpBranch %44\n"
+ "%44 = OpLabel\n"
+ "OpBranch %28\n"
+ "%28 = OpLabel\n"
+ "%45 = OpLoad %6 %24\n"
+ "%48 = OpIAdd %6 %45 %47\n"
+ "OpStore %24 %48\n"
+ "OpBranch %25\n"
+ "%27 = OpLabel\n"
+ "OpStore %49 %12\n"
+ "OpBranch %50\n"
+ "%50 = OpLabel\n"
+ "OpLoopMerge %52 %53 None\n"
+ "OpBranch %54\n"
+ "%54 = OpLabel\n"
+ "%55 = OpLoad %6 %49\n"
+ "%57 = OpULessThan %16 %55 %56\n"
+ "OpBranchConditional %57 %51 %52\n"
+ "%51 = OpLabel\n"
+ "%58 = OpAccessChain %7 %20 %12\n"
+ "%59 = OpLoad %6 %58\n"
+ "%60 = OpLoad %6 %10\n"
+ "%61 = OpBitwiseAnd %6 %59 %60\n"
+ "%62 = OpUGreaterThan %16 %61 %12\n"
+ "OpSelectionMerge %64 None\n"
+ "OpBranchConditional %62 %63 %64\n"
+ "%63 = OpLabel\n"
+ "%65 = OpLoad %6 %11\n"
+ "%66 = OpIAdd %6 %65 %47\n"
+ "OpStore %11 %66\n"
+ "OpBranch %64\n"
+ "%64 = OpLabel\n"
+ "%67 = OpAccessChain %7 %20 %9\n"
+ "%68 = OpLoad %6 %67\n"
+ "%69 = OpLoad %6 %10\n"
+ "%70 = OpBitwiseAnd %6 %68 %69\n"
+ "%71 = OpUGreaterThan %16 %70 %12\n"
+ "OpSelectionMerge %73 None\n"
+ "OpBranchConditional %71 %72 %73\n"
+ "%72 = OpLabel\n"
+ "%74 = OpLoad %6 %11\n"
+ "%75 = OpIAdd %6 %74 %47\n"
+ "OpStore %11 %75\n"
+ "OpBranch %73\n"
+ "%73 = OpLabel\n"
+ "%77 = OpAccessChain %7 %20 %76\n"
+ "%78 = OpLoad %6 %77\n"
+ "%79 = OpLoad %6 %10\n"
+ "%80 = OpBitwiseAnd %6 %78 %79\n"
+ "%81 = OpUGreaterThan %16 %80 %12\n"
+ "OpSelectionMerge %83 None\n"
+ "OpBranchConditional %81 %82 %83\n"
+ "%82 = OpLabel\n"
+ "%84 = OpLoad %6 %11\n"
+ "%85 = OpIAdd %6 %84 %47\n"
+ "OpStore %11 %85\n"
+ "OpBranch %83\n"
+ "%83 = OpLabel\n"
+ "%86 = OpAccessChain %7 %20 %18\n"
+ "%87 = OpLoad %6 %86\n"
+ "%88 = OpLoad %6 %10\n"
+ "%89 = OpBitwiseAnd %6 %87 %88\n"
+ "%90 = OpUGreaterThan %16 %89 %12\n"
+ "OpSelectionMerge %92 None\n"
+ "OpBranchConditional %90 %91 %92\n"
+ "%91 = OpLabel\n"
+ "%93 = OpLoad %6 %11\n"
+ "%94 = OpIAdd %6 %93 %47\n"
+ "OpStore %11 %94\n"
+ "OpBranch %92\n"
+ "%92 = OpLabel\n"
+ "%95 = OpLoad %6 %10\n"
+ "%96 = OpShiftLeftLogical %6 %95 %47\n"
+ "OpStore %10 %96\n"
+ "OpBranch %53\n"
+ "%53 = OpLabel\n"
+ "%97 = OpLoad %6 %49\n"
+ "%98 = OpIAdd %6 %97 %47\n"
+ "OpStore %49 %98\n"
+ "OpBranch %50\n"
+ "%52 = OpLabel\n"
+ "%99 = OpLoad %13 %20\n"
+ "%100 = OpGroupNonUniformBallotBitCount %6 %18 Reduce %99\n"
+ "%101 = OpLoad %6 %11\n"
+ "%102 = OpINotEqual %16 %100 %101\n"
+ "OpSelectionMerge %104 None\n"
+ "OpBranchConditional %102 %103 %104\n"
+ "%103 = OpLabel\n"
+ "OpStore %8 %12\n"
+ "OpBranch %104\n"
+ "%104 = OpLabel\n"
+ "%108 = OpLoad %6 %8\n"
+ "%109 = OpConvertUToF %105 %108\n"
+ "OpStore %107 %109\n"
+ "%121 = OpAccessChain %120 %119 %115 %115\n"
+ "%122 = OpLoad %110 %121\n"
+ "%124 = OpAccessChain %123 %114 %115\n"
+ "OpStore %124 %122\n"
+ "OpEmitVertex\n"
+ "OpEndPrimitive\n"
+ "OpReturn\n"
+ "OpFunctionEnd\n";
programCollection.spirvAsmSources.add("geometry") << geometry << buildOptionsSpr;
}
else
{
deUint32 val = data[x];
- if (0x7 != val)
+ if (0x1F != val)
{
return false;
}
return true;
}
+static bool checkFragmentPipelineStages(std::vector<const void*> datas,
+ deUint32 width, deUint32 height, deUint32)
+{
+ const deUint32* data =
+ reinterpret_cast<const deUint32*>(datas[0]);
+ for (deUint32 x = 0u; x < width; ++x)
+ {
+ for (deUint32 y = 0u; y < height; ++y)
+ {
+ const deUint32 ndx = (x * height + y);
+ deUint32 val = data[ndx] & 0x1F;
+
+ if (data[ndx] & 0x40) //Helper fragment shader invocation was executed
+ {
+ if(val != 0x1F)
+ return false;
+ }
+ else //Helper fragment shader invocation was not executed yet
+ {
+ if (val != 0x1E)
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
static bool checkCompute(std::vector<const void*> datas,
const deUint32 numWorkgroups[3], const deUint32 localSize[3],
deUint32)
globalInvocationX;
// The data should look (in binary) 0b111
- if (0x7 != data[offset])
+ if (0x1F != data[offset])
{
return false;
}
globalInvocationY) +
globalInvocationX;
- // The data should look (in binary) 0b111
- if (0x7 != data[offset])
+ // The data should look (in binary) 0b11111
+ if (0x1F != data[offset])
{
return false;
}
void initFrameBufferPrograms (SourceCollections& programCollection, CaseDefinition caseDef)
{
const vk::ShaderBuildOptions buildOptions (vk::SPIRV_VERSION_1_3, 0u);
- subgroups::setFragmentShaderFrameBuffer(programCollection);
- if (VK_SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
+ if (VK_SHADER_STAGE_FRAGMENT_BIT != caseDef.shaderStage)
+ subgroups::setFragmentShaderFrameBuffer(programCollection);
+
+ if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+ {
+ const string vertex = "#version 450\n"
+ "void main (void)\n"
+ "{\n"
+ " vec2 uv = vec2(float(gl_VertexIndex & 1), float((gl_VertexIndex >> 1) & 1));\n"
+ " gl_Position = vec4(uv * 4.0f -2.0f, 0.0f, 1.0f);\n"
+ " gl_PointSize = 1.0f;\n"
+ "}\n";
+ programCollection.glslSources.add("vert") << glu::VertexSource(vertex) << vk::ShaderBuildOptions(vk::SPIRV_VERSION_1_3, 0u);
+ }
+ else if (VK_SHADER_STAGE_VERTEX_BIT != caseDef.shaderStage)
subgroups::setVertexShaderFrameBuffer(programCollection);
+ const string source =
+ (OPTYPE_ALL == caseDef.opType) ?
+ " result = " + getOpTypeName(caseDef.opType) +
+ "(true) ? 0x1 : 0;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(false) ? 0 : 0x1A;\n"
+ " result |= 0x4;\n"
+ : (OPTYPE_ANY == caseDef.opType) ?
+ " result = " + getOpTypeName(caseDef.opType) +
+ "(true) ? 0x1 : 0;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(false) ? 0 : 0x1A;\n"
+ " result |= 0x4;\n"
+ : (OPTYPE_ALLEQUAL == caseDef.opType) ?
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(1.25 * float(data[gl_SubgroupInvocationID]) + 5.0);\n" +
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueNoEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(12.0 * float(data[gl_SubgroupInvocationID]) + ((gl_SubgroupInvocationID % 5)%2));\n"
+ " result = " + getOpTypeName(caseDef.opType) + "("
+ + subgroups::getFormatNameForGLSL(caseDef.format) + "(1)) ? 0x1 : 0;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(gl_SubgroupInvocationID) ? 0 : 0x2;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(data[0]) ? 0x4 : 0;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(valueEqual) ? 0x8 : 0x0;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(valueNoEqual) ? 0x0 : 0x10;\n"
+ " if (subgroupElect()) result |= 0x2 | 0x10;\n"
+ : "";
+
if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
{
std::ostringstream vertexSrc;
vertexSrc << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
<< "#extension GL_KHR_shader_subgroup_vote: enable\n"
- << "layout(location = 0) out float out_color;\n"
+ << "layout(location = 0) out vec4 out_color;\n"
<< "layout(location = 0) in highp vec4 in_position;\n"
<< "layout(set = 0, binding = 0) uniform Buffer1\n"
<< "{\n"
<< "\n"
<< "void main (void)\n"
<< "{\n"
- << " uint result;\n";
- if (OPTYPE_ALL == caseDef.opType)
- {
- vertexSrc << " result = " << getOpTypeName(caseDef.opType)
- << "(true) ? 0x1 : 0;\n"
- << " result |= " << getOpTypeName(caseDef.opType)
- << "(false) ? 0 : 0x2;\n"
- << " result |= 0x4;\n";
- }
- else if (OPTYPE_ANY == caseDef.opType)
- {
- vertexSrc << " result = " << getOpTypeName(caseDef.opType)
- << "(true) ? 0x1 : 0;\n"
- << " result |= " << getOpTypeName(caseDef.opType)
- << "(false) ? 0 : 0x2;\n"
- << " result |= 0x4;\n";
- }
- else if (OPTYPE_ALLEQUAL == caseDef.opType)
- {
- vertexSrc << " result = " << getOpTypeName(caseDef.opType) << "("
- << subgroups::getFormatNameForGLSL(caseDef.format) << "(1)) ? 0x1 : 0;\n"
- << " result |= " << getOpTypeName(caseDef.opType)
- << "(gl_SubgroupInvocationID) ? 0 : 0x2;\n"
- << " if (subgroupElect()) result |= 0x2;\n"
- << " result |= " << getOpTypeName(caseDef.opType)
- << "(data[0]) ? 0x4 : 0;\n";
- }
- vertexSrc << " out_color = float(result);\n"
+ << " uint result;\n"
+ << source
+ << " out_color.r = float(result);\n"
<< " gl_Position = in_position;\n"
<< " gl_PointSize = 1.0f;\n"
<< "}\n";
- programCollection.glslSources.add("vert") << glu::VertexSource(vertexSrc.str()) << buildOptions;
+
+ programCollection.glslSources.add("vert") << glu::VertexSource(vertexSrc.str()) << vk::ShaderBuildOptions(vk::SPIRV_VERSION_1_3, 0u);
}
else if (VK_SHADER_STAGE_GEOMETRY_BIT == caseDef.shaderStage)
{
<< "\n"
<< "void main (void)\n"
<< "{\n"
- << " uint result;\n";
- if (OPTYPE_ALL == caseDef.opType)
- {
- geometry << " result = " << getOpTypeName(caseDef.opType)
- << "(true) ? 0x1 : 0;\n"
- << " result |= " << getOpTypeName(caseDef.opType)
- << "(false) ? 0 : 0x2;\n"
- << " result |= 0x4;\n";
- }
- else if (OPTYPE_ANY == caseDef.opType)
- {
- geometry << " result = " << getOpTypeName(caseDef.opType)
- << "(true) ? 0x1 : 0;\n"
- << " result |= " << getOpTypeName(caseDef.opType)
- << "(false) ? 0 : 0x2;\n"
- << " result |= 0x4;\n";
- }
- else if (OPTYPE_ALLEQUAL == caseDef.opType)
- {
- geometry << " result= " << getOpTypeName(caseDef.opType) << "("
- << subgroups::getFormatNameForGLSL(caseDef.format) << "(1)) ? 0x1 : 0;\n"
- << " result |= " << getOpTypeName(caseDef.opType)
- << "(gl_SubgroupInvocationID) ? 0 : 0x2;\n"
- << " if (subgroupElect()) result |= 0x2;\n"
- << " result |= " << getOpTypeName(caseDef.opType)
- << "(data[0]) ? 0x4 : 0;\n";
- }
- geometry << " out_color = float(result);\n"
+ << " uint result;\n"
+ << source
+ << " out_color = float(result);\n"
<< " gl_Position = gl_in[0].gl_Position;\n"
<< " EmitVertex();\n"
<< " EndPrimitive();\n"
<<" {\n"
<< " gl_TessLevelOuter[0] = 1.0f;\n"
<< " gl_TessLevelOuter[1] = 1.0f;\n"
- << " }\n";
- if (OPTYPE_ALL == caseDef.opType)
- {
- controlSource << " result = " << getOpTypeName(caseDef.opType)
- << "(true) ? 0x1 : 0;\n"
- << " result |= " << getOpTypeName(caseDef.opType)
- << "(false) ? 0 : 0x2;\n"
- << " result|= 0x4;\n";
- }
- else if (OPTYPE_ANY == caseDef.opType)
- {
- controlSource << " result = " << getOpTypeName(caseDef.opType)
- << "(true) ? 0x1 : 0;\n"
- << " result |= " << getOpTypeName(caseDef.opType)
- << "(false) ? 0 : 0x2;\n"
- << " result |= 0x4;\n";
- }
- else if (OPTYPE_ALLEQUAL == caseDef.opType)
- {
- controlSource << " result= " << getOpTypeName(caseDef.opType) << "("
- << subgroups::getFormatNameForGLSL(caseDef.format) << "(1)) ? 0x1 : 0;\n"
- << " result |= " << getOpTypeName(caseDef.opType)
- << "(gl_SubgroupInvocationID) ? 0 : 0x2;\n"
- << " if (subgroupElect()) result |= 0x2;\n"
- << " result |= " << getOpTypeName(caseDef.opType)
- << "(data[0]) ? 0x4 : 0;\n";
- }
- controlSource << " out_color[gl_InvocationID] = float(result);"
+ << " }\n"
+ << source
+ << " out_color[gl_InvocationID] = float(result);"
<< " gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n"
<< "}\n";
<< "void main (void)\n"
<< "{\n"
<< " uint result;\n"
- << " highp uint offset = gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5);\n";
- if (OPTYPE_ALL == caseDef.opType)
- {
- evaluationSource << " result = " << getOpTypeName(caseDef.opType)
- << "(true) ? 0x1 : 0;\n"
- << " result |= " << getOpTypeName(caseDef.opType)
- << "(false) ? 0 : 0x2;\n"
- << " result |= 0x4;\n";
- }
- else if (OPTYPE_ANY == caseDef.opType)
- {
- evaluationSource << " result = " << getOpTypeName(caseDef.opType)
- << "(true) ? 0x1 : 0;\n"
- << " result |= " << getOpTypeName(caseDef.opType)
- << "(false) ? 0 : 0x2;\n"
- << " result |= 0x4;\n";
- }
- else if (OPTYPE_ALLEQUAL == caseDef.opType)
- {
- evaluationSource << " result = " << getOpTypeName(caseDef.opType) << "("
- << subgroups::getFormatNameForGLSL(caseDef.format) << "(1)) ? 0x1 : 0;\n"
- << " result |= " << getOpTypeName(caseDef.opType)
- << "(gl_SubgroupInvocationID) ? 0 : 0x2;\n"
- << " if (subgroupElect()) result |= 0x2;\n"
- << " result |= " << getOpTypeName(caseDef.opType)
- << "(data[0]) ? 0x4 : 0;\n";
- }
- evaluationSource
+ << " highp uint offset = gl_PrimitiveID * 2 + uint(gl_TessCoord.x + 0.5);\n"
+ << source
<< " out_color = float(result);\n"
<< " gl_Position = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);\n"
<< "}\n";
programCollection.glslSources.add("tese")
<< glu::TessellationEvaluationSource(evaluationSource.str()) << buildOptions;
}
+ else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+ {
+ const string sourceFragment =
+ (OPTYPE_ALL == caseDef.opType) ?
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(!gl_HelperInvocation) ? 0x0 : 0x1;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(false) ? 0 : 0x1A;\n"
+ " result |= 0x4;\n"
+ : (OPTYPE_ANY == caseDef.opType) ?
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(gl_HelperInvocation) ? 0x1 : 0x0;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(false) ? 0 : 0x1A;\n"
+ " result |= 0x4;\n"
+ : (OPTYPE_ALLEQUAL == caseDef.opType) ?
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(1.25 * float(data[gl_SubgroupInvocationID]) + 5.0);\n" +
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueNoEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(12.0 * float(data[gl_SubgroupInvocationID]) + ((int(gl_FragCoord.x*gl_SubgroupInvocationID) % 5)%2));\n"
+ " result |= " + getOpTypeName(caseDef.opType) + "("
+ + subgroups::getFormatNameForGLSL(caseDef.format) + "(1)) ? 0x10 : 0;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(gl_SubgroupInvocationID) ? 0 : 0x2;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(data[0]) ? 0x4 : 0;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(valueEqual) ? 0x8 : 0x0;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(gl_HelperInvocation) ? 0x0 : 0x1;\n"
+ " if (subgroupElect()) result |= 0x2 | 0x10;\n"
+ : "";
+
+ std::ostringstream fragmentSource;
+ fragmentSource << glu::getGLSLVersionDeclaration(glu::GLSL_VERSION_450)<<"\n"
+ << "#extension GL_KHR_shader_subgroup_vote: enable\n"
+ << "layout(location = 0) out uint out_color;\n"
+ << "layout(set = 0, binding = 0) uniform Buffer1\n"
+ << "{\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) << " data[" << subgroups::maxSupportedSubgroupSize() << "];\n"
+ << "};\n"
+ << ""
+ << "void main()\n"
+ << "{\n"
+ << " uint result = 0u;\n"
+ << " if (dFdx(gl_SubgroupInvocationID * gl_FragCoord.x * gl_FragCoord.y) - dFdy(gl_SubgroupInvocationID * gl_FragCoord.x * gl_FragCoord.y) > 0.0f)\n"
+ << " {\n"
+ << " result |= 0x20;\n" // to be sure that compiler doesn't remove dFdx and dFdy executions
+ << " }\n"
+ << " bool helper = subgroupAny(gl_HelperInvocation);\n"
+ << " if (helper)\n"
+ << " {\n"
+ << " result |= 0x40;\n"
+ << " }\n"
+ << sourceFragment
+ << " out_color = result;\n"
+ << "}\n";
+
+ programCollection.glslSources.add("fragment")
+ << glu::FragmentSource(fragmentSource.str())<< vk::ShaderBuildOptions(vk::SPIRV_VERSION_1_3, 0u);
+ }
else
{
DE_FATAL("Unsupported shader stage");
src << " result[offset] = " << getOpTypeName(caseDef.opType)
<< "(true) ? 0x1 : 0;\n"
<< " result[offset] |= " << getOpTypeName(caseDef.opType)
- << "(false) ? 0 : 0x2;\n"
+ << "(false) ? 0 : 0x1A;\n"
<< " result[offset] |= " << getOpTypeName(caseDef.opType)
<< "(data[gl_SubgroupInvocationID] > 0) ? 0x4 : 0;\n";
}
src << " result[offset] = " << getOpTypeName(caseDef.opType)
<< "(true) ? 0x1 : 0;\n"
<< " result[offset] |= " << getOpTypeName(caseDef.opType)
- << "(false) ? 0 : 0x2;\n"
+ << "(false) ? 0 : 0x1A;\n"
<< " result[offset] |= " << getOpTypeName(caseDef.opType)
<< "(data[gl_SubgroupInvocationID] == data[0]) ? 0x4 : 0;\n";
}
+
else if (OPTYPE_ALLEQUAL == caseDef.opType)
{
- src << " result[offset] = " << getOpTypeName(caseDef.opType) << "("
- << subgroups::getFormatNameForGLSL(caseDef.format) << "(1)) ? 0x1 : 0;\n"
+ src << " " << subgroups::getFormatNameForGLSL(caseDef.format) <<" valueEqual = " << subgroups::getFormatNameForGLSL(caseDef.format) << "(1.25 * float(data[gl_SubgroupInvocationID]) + 5.0);\n"
+ << " " << subgroups::getFormatNameForGLSL(caseDef.format) <<" valueNoEqual = " << subgroups::getFormatNameForGLSL(caseDef.format) << "(12.0 * float(data[gl_SubgroupInvocationID]) + ((offset % 5)%2));\n"
+ <<" result[offset] = " << getOpTypeName(caseDef.opType) << "("
+ << subgroups::getFormatNameForGLSL(caseDef.format) << "(1)) ? 0x1 : 0x0;\n"
<< " result[offset] |= " << getOpTypeName(caseDef.opType)
- << "(gl_SubgroupInvocationID) ? 0 : 0x2;\n"
- << " if (subgroupElect()) result[offset] |= 0x2;\n"
+ << "(gl_SubgroupInvocationID) ? 0x0 : 0x2;\n"
<< " result[offset] |= " << getOpTypeName(caseDef.opType)
- << "(data[0]) ? 0x4 : 0;\n";
+ << "(data[0]) ? 0x4 : 0x0;\n"
+ << " result[offset] |= "<< getOpTypeName(caseDef.opType)
+ << "(valueEqual) ? 0x8 : 0x0;\n"
+ << " result[offset] |= "<< getOpTypeName(caseDef.opType)
+ << "(valueNoEqual) ? 0x0 : 0x10;\n"
+ << " if (subgroupElect()) result[offset] |= 0x2 | 0x10;\n";
}
src << "}\n";
" result[offset] = " + getOpTypeName(caseDef.opType) +
"(true) ? 0x1 : 0;\n"
" result[offset] |= " + getOpTypeName(caseDef.opType) +
- "(false) ? 0 : 0x2;\n"
+ "(false) ? 0 : 0x1A;\n"
" result[offset] |= 0x4;\n"
: (OPTYPE_ANY == caseDef.opType) ?
" result[offset] = " + getOpTypeName(caseDef.opType) +
"(true) ? 0x1 : 0;\n"
" result[offset] |= " + getOpTypeName(caseDef.opType) +
- "(false) ? 0 : 0x2;\n"
+ "(false) ? 0 : 0x1A;\n"
" result[offset] |= 0x4;\n"
: (OPTYPE_ALLEQUAL == caseDef.opType) ?
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(1.25 * float(data[gl_SubgroupInvocationID]) + 5.0);\n" +
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueNoEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(12.0 * float(data[gl_SubgroupInvocationID]) + ((gl_SubgroupInvocationID % 5)%2));\n"
" result[offset] = " + getOpTypeName(caseDef.opType) + "("
+ subgroups::getFormatNameForGLSL(caseDef.format) + "(1)) ? 0x1 : 0;\n"
" result[offset] |= " + getOpTypeName(caseDef.opType) +
"(gl_SubgroupInvocationID) ? 0 : 0x2;\n"
- " if (subgroupElect()) result[offset] |= 0x2;\n"
" result[offset] |= " + getOpTypeName(caseDef.opType) +
"(data[0]) ? 0x4 : 0;\n"
+ " result[offset] |= " + getOpTypeName(caseDef.opType) +
+ "(valueEqual) ? 0x8 : 0x0;\n"
+ " result[offset] |= " + getOpTypeName(caseDef.opType) +
+ "(valueNoEqual) ? 0x0 : 0x10;\n"
+ " if (subgroupElect()) result[offset] |= 0x2 | 0x10;\n"
: "";
const string formatString = subgroups::getFormatNameForGLSL(caseDef.format);
" result = " + getOpTypeName(caseDef.opType) +
"(true) ? 0x1 : 0;\n"
" result |= " + getOpTypeName(caseDef.opType) +
- "(false) ? 0 : 0x2;\n"
+ "(false) ? 0 : 0x1A;\n"
" result |= 0x4;\n"
: (OPTYPE_ANY == caseDef.opType) ?
" result = " + getOpTypeName(caseDef.opType) +
"(true) ? 0x1 : 0;\n"
" result |= " + getOpTypeName(caseDef.opType) +
- "(false) ? 0 : 0x2;\n"
+ "(false) ? 0 : 0x1A;\n"
" result |= 0x4;\n"
: (OPTYPE_ALLEQUAL == caseDef.opType) ?
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(1.25 * float(data[gl_SubgroupInvocationID]) + 5.0);\n" +
+ " " + subgroups::getFormatNameForGLSL(caseDef.format) + " valueNoEqual = " + subgroups::getFormatNameForGLSL(caseDef.format) + "(12.0 * float(data[gl_SubgroupInvocationID]) + ((int(gl_FragCoord.x*gl_SubgroupInvocationID) % 5)%2));\n"
" result = " + getOpTypeName(caseDef.opType) + "("
+ subgroups::getFormatNameForGLSL(caseDef.format) + "(1)) ? 0x1 : 0;\n"
" result |= " + getOpTypeName(caseDef.opType) +
"(gl_SubgroupInvocationID) ? 0 : 0x2;\n"
- " if (subgroupElect()) result |= 0x2;\n"
" result |= " + getOpTypeName(caseDef.opType) +
"(data[0]) ? 0x4 : 0;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(valueEqual) ? 0x8 : 0x0;\n"
+ " result |= " + getOpTypeName(caseDef.opType) +
+ "(valueNoEqual) ? 0x0 : 0x10;\n"
+ " if (subgroupElect()) result |= 0x2 | 0x10;\n"
: "";
const string fragment =
"#version 450\n"
subgroups::SSBOData inputData;
inputData.format = caseDef.format;
inputData.numElements = subgroups::maxSupportedSubgroupSize();
- inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.initializeType = OPTYPE_ALLEQUAL == caseDef.opType ? subgroups::SSBOData::InitializeZero : subgroups::SSBOData::InitializeNonZero;
if (VK_SHADER_STAGE_VERTEX_BIT == caseDef.shaderStage)
return subgroups::makeVertexFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages);
else if (VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT == caseDef.shaderStage)
return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);
else if (VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT == caseDef.shaderStage)
- return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);
+ return subgroups::makeTessellationEvaluationFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkVertexPipelineStages, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);
+ else if (VK_SHADER_STAGE_FRAGMENT_BIT == caseDef.shaderStage)
+ return subgroups::makeFragmentFrameBufferTest(context, VK_FORMAT_R32_UINT, &inputData, 1, checkFragmentPipelineStages);
else
TCU_THROW(InternalError, "Unhandled shader stage");
}
subgroups::SSBOData inputData;
inputData.format = caseDef.format;
inputData.numElements = subgroups::maxSupportedSubgroupSize();
- inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.initializeType = OPTYPE_ALLEQUAL == caseDef.opType ? subgroups::SSBOData::InitializeZero : subgroups::SSBOData::InitializeNonZero;
return subgroups::makeComputeTest(context, VK_FORMAT_R32_UINT, &inputData,
1, (OPTYPE_ALLEQUAL == caseDef.opType) ? checkComputeAllEqual : checkCompute);
subgroups::SSBOData inputData;
inputData.format = caseDef.format;
inputData.numElements = subgroups::maxSupportedSubgroupSize();
- inputData.initializeType = subgroups::SSBOData::InitializeNonZero;
+ inputData.initializeType = OPTYPE_ALLEQUAL == caseDef.opType ? subgroups::SSBOData::InitializeZero : subgroups::SSBOData::InitializeNonZero;
inputData.binding = 4u;
inputData.stages = stages;
+ "_" + getShaderStageName(caseDef.shaderStage)+"_framebuffer", "",
initFrameBufferPrograms, noSSBOtest, caseDef);
}
+
+ const CaseDefinition caseDef = {opTypeIndex, VK_SHADER_STAGE_FRAGMENT_BIT, format};
+ addFunctionCaseWithPrograms(group.get(),
+ op + "_" +
+ subgroups::getFormatNameForGLSL(format)
+ + "_" + getShaderStageName(caseDef.shaderStage)+"_frag_helper", "",
+ initFrameBufferPrograms, noSSBOtest, caseDef);
}
}