Merge pull request #422 from KhronosGroup/fix-419

Fix case where loop header branches into continue block.
This commit is contained in:
Hans-Kristian Arntzen 2018-02-01 10:14:12 +01:00 коммит произвёл GitHub
Родитель cfae1d44a9 8841f15283
Коммит a1857a4d58
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
4 изменённых файлов: 232 добавлений и 4 удалений

Просмотреть файл

@ -0,0 +1,39 @@
#version 450
struct Params
{
vec4 TextureSize;
vec4 Params1;
vec4 Params2;
vec4 Params3;
vec4 Params4;
vec4 Bloom;
};
layout(binding = 1, std140) uniform CB1
{
Params CB1;
} _8;
uniform sampler2D SPIRV_Cross_CombinedmapTexturemapSampler;
layout(location = 0) in vec2 IN_uv;
layout(location = 0) out vec4 _entryPointOutput;
void main()
{
vec4 _49 = texture(SPIRV_Cross_CombinedmapTexturemapSampler, IN_uv);
float _50 = _49.y;
float _55;
float _58;
_55 = 0.0;
_58 = 0.0;
float _64;
vec4 _72;
float _78;
for (int _60 = -3; _60 <= 3; _64 = float(_60), _72 = texture(SPIRV_Cross_CombinedmapTexturemapSampler, IN_uv + (vec2(0.0, _8.CB1.TextureSize.w) * _64)), _78 = exp(((-_64) * _64) * 0.2222220003604888916015625) * float(abs(_72.y - _50) < clamp((_50 * 80.0) * 0.0007999999797903001308441162109375, 7.999999797903001308441162109375e-05, 0.008000000379979610443115234375)), _55 += (_72.x * _78), _58 += _78, _60++)
{
}
_entryPointOutput = vec4(_55 / _58, _50, 0.0, 1.0);
}

Просмотреть файл

@ -0,0 +1,39 @@
#version 450
struct Params
{
vec4 TextureSize;
vec4 Params1;
vec4 Params2;
vec4 Params3;
vec4 Params4;
vec4 Bloom;
};
layout(binding = 1, std140) uniform CB1
{
Params CB1;
} _8;
uniform sampler2D SPIRV_Cross_CombinedmapTexturemapSampler;
layout(location = 0) in vec2 IN_uv;
layout(location = 0) out vec4 _entryPointOutput;
void main()
{
vec4 _49 = texture(SPIRV_Cross_CombinedmapTexturemapSampler, IN_uv);
float _50 = _49.y;
float _55;
float _58;
_55 = 0.0;
_58 = 0.0;
float _64;
vec4 _72;
float _78;
for (int _60 = -3; _60 <= 3; _64 = float(_60), _72 = texture(SPIRV_Cross_CombinedmapTexturemapSampler, IN_uv + (vec2(0.0, _8.CB1.TextureSize.w) * _64)), _78 = exp(((-_64) * _64) * 0.2222220003604888916015625) * float(abs(_72.y - _50) < clamp((_50 * 80.0) * 0.0007999999797903001308441162109375, 7.999999797903001308441162109375e-05, 0.008000000379979610443115234375)), _55 += (_72.x * _78), _58 += _78, _60++)
{
}
_entryPointOutput = vec4(_55 / _58, _50, 0.0, 1.0);
}

Просмотреть файл

@ -0,0 +1,132 @@
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 3
; Bound: 279
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main" %IN_p %IN_uv %_entryPointOutput
OpExecutionMode %main OriginUpperLeft
OpSource HLSL 500
OpName %main "main"
OpName %Params "Params"
OpMemberName %Params 0 "TextureSize"
OpMemberName %Params 1 "Params1"
OpMemberName %Params 2 "Params2"
OpMemberName %Params 3 "Params3"
OpMemberName %Params 4 "Params4"
OpMemberName %Params 5 "Bloom"
OpName %CB1 "CB1"
OpMemberName %CB1 0 "CB1"
OpName %_ ""
OpName %mapSampler "mapSampler"
OpName %mapTexture "mapTexture"
OpName %IN_p "IN.p"
OpName %IN_uv "IN.uv"
OpName %_entryPointOutput "@entryPointOutput"
OpMemberDecorate %Params 0 Offset 0
OpMemberDecorate %Params 1 Offset 16
OpMemberDecorate %Params 2 Offset 32
OpMemberDecorate %Params 3 Offset 48
OpMemberDecorate %Params 4 Offset 64
OpMemberDecorate %Params 5 Offset 80
OpMemberDecorate %CB1 0 Offset 0
OpDecorate %CB1 Block
OpDecorate %_ DescriptorSet 0
OpDecorate %_ Binding 1
OpDecorate %mapSampler DescriptorSet 1
OpDecorate %mapSampler Binding 2
OpDecorate %mapTexture DescriptorSet 1
OpDecorate %mapTexture Binding 2
OpDecorate %IN_p BuiltIn FragCoord
OpDecorate %IN_uv Location 0
OpDecorate %_entryPointOutput Location 0
%void = OpTypeVoid
%3 = OpTypeFunction %void
%float = OpTypeFloat 32
%v2float = OpTypeVector %float 2
%9 = OpTypeSampler
%11 = OpTypeImage %float 2D 0 0 0 1 Unknown
%v4float = OpTypeVector %float 4
%float_0_222222 = OpConstant %float 0.222222
%33 = OpTypeSampledImage %11
%uint = OpTypeInt 32 0
%float_80 = OpConstant %float 80
%float_0_0008 = OpConstant %float 0.0008
%float_8en05 = OpConstant %float 8e-05
%float_0_008 = OpConstant %float 0.008
%float_0 = OpConstant %float 0
%int = OpTypeInt 32 1
%int_n3 = OpConstant %int -3
%int_3 = OpConstant %int 3
%bool = OpTypeBool
%float_1 = OpConstant %float 1
%int_1 = OpConstant %int 1
%Params = OpTypeStruct %v4float %v4float %v4float %v4float %v4float %v4float
%CB1 = OpTypeStruct %Params
%_ptr_Uniform_CB1 = OpTypePointer Uniform %CB1
%_ = OpVariable %_ptr_Uniform_CB1 Uniform
%int_0 = OpConstant %int 0
%uint_3 = OpConstant %uint 3
%_ptr_Uniform_float = OpTypePointer Uniform %float
%_ptr_UniformConstant_9 = OpTypePointer UniformConstant %9
%mapSampler = OpVariable %_ptr_UniformConstant_9 UniformConstant
%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11
%mapTexture = OpVariable %_ptr_UniformConstant_11 UniformConstant
%_ptr_Input_v4float = OpTypePointer Input %v4float
%IN_p = OpVariable %_ptr_Input_v4float Input
%_ptr_Input_v2float = OpTypePointer Input %v2float
%IN_uv = OpVariable %_ptr_Input_v2float Input
%_ptr_Output_v4float = OpTypePointer Output %v4float
%_entryPointOutput = OpVariable %_ptr_Output_v4float Output
%main = OpFunction %void None %3
%5 = OpLabel
%158 = OpLoad %v2float %IN_uv
%178 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %int_0 %uint_3
%179 = OpLoad %float %178
%180 = OpCompositeConstruct %v2float %float_0 %179
%184 = OpLoad %9 %mapSampler
%185 = OpLoad %11 %mapTexture
%204 = OpSampledImage %33 %185 %184
%206 = OpImageSampleImplicitLod %v4float %204 %158
%207 = OpCompositeExtract %float %206 1
%209 = OpFMul %float %207 %float_80
%210 = OpFMul %float %209 %float_0_0008
%211 = OpExtInst %float %1 FClamp %210 %float_8en05 %float_0_008
OpBranch %212
%212 = OpLabel
%276 = OpPhi %float %float_0 %5 %252 %218
%277 = OpPhi %float %float_0 %5 %255 %218
%278 = OpPhi %int %int_n3 %5 %257 %218
%217 = OpSLessThanEqual %bool %278 %int_3
OpLoopMerge %213 %218 None
OpBranchConditional %217 %218 %213
%218 = OpLabel
%220 = OpConvertSToF %float %278
%222 = OpFNegate %float %220
%224 = OpFMul %float %222 %220
%226 = OpFMul %float %224 %float_0_222222
%227 = OpExtInst %float %1 Exp %226
%230 = OpSampledImage %33 %185 %184
%234 = OpVectorTimesScalar %v2float %180 %220
%235 = OpFAdd %v2float %158 %234
%236 = OpImageSampleImplicitLod %v4float %230 %235
%273 = OpCompositeExtract %float %236 1
%241 = OpFSub %float %273 %207
%242 = OpExtInst %float %1 FAbs %241
%244 = OpFOrdLessThan %bool %242 %211
%245 = OpSelect %float %244 %float_1 %float_0
%246 = OpFMul %float %227 %245
%275 = OpCompositeExtract %float %236 0
%250 = OpFMul %float %275 %246
%252 = OpFAdd %float %276 %250
%255 = OpFAdd %float %277 %246
%257 = OpIAdd %int %278 %int_1
OpBranch %212
%213 = OpLabel
%260 = OpFDiv %float %276 %277
%190 = OpCompositeConstruct %v4float %260 %207 %float_0 %float_1
OpStore %_entryPointOutput %190
OpReturn
OpFunctionEnd

Просмотреть файл

@ -7881,11 +7881,29 @@ void CompilerGLSL::branch(uint32_t from, uint32_t to)
else
{
auto &from_block = get<SPIRBlock>(from);
auto &dominator = get<SPIRBlock>(from_block.loop_dominator);
bool outside_control_flow = false;
uint32_t loop_dominator = 0;
// FIXME: Refactor this to not use the old loop_dominator tracking.
if (from_block.merge_block)
{
// If we are a loop header, we don't set the loop dominator,
// so just use "self" here.
loop_dominator = from;
}
else if (from_block.loop_dominator != -1u)
{
loop_dominator = from_block.loop_dominator;
}
if (loop_dominator != 0)
{
auto &dominator = get<SPIRBlock>(loop_dominator);
// For non-complex continue blocks, we implicitly branch to the continue block
// by having the continue block be part of the loop header in for (; ; continue-block).
bool outside_control_flow = block_is_outside_flow_control_from_block(dominator, from_block);
outside_control_flow = block_is_outside_flow_control_from_block(dominator, from_block);
}
// Some simplification for for-loops. We always end up with a useless continue;
// statement since we branch to a loop block.