1e5c31af7Sopenharmony_ci#!amber 2e5c31af7Sopenharmony_ci 3e5c31af7Sopenharmony_ci# Copyright 2020 Google LLC 4e5c31af7Sopenharmony_ci# 5e5c31af7Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License"); 6e5c31af7Sopenharmony_ci# you may not use this file except in compliance with the License. 7e5c31af7Sopenharmony_ci# You may obtain a copy of the License at 8e5c31af7Sopenharmony_ci# 9e5c31af7Sopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0 10e5c31af7Sopenharmony_ci# 11e5c31af7Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software 12e5c31af7Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS, 13e5c31af7Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14e5c31af7Sopenharmony_ci# See the License for the specific language governing permissions and 15e5c31af7Sopenharmony_ci# limitations under the License. 16e5c31af7Sopenharmony_ci 17e5c31af7Sopenharmony_ci 18e5c31af7Sopenharmony_ci# A test for a bug found by GraphicsFuzz. 19e5c31af7Sopenharmony_ci 20e5c31af7Sopenharmony_ci# Short description: A fragment shader with push constant and nested min max 21e5c31af7Sopenharmony_ci 22e5c31af7Sopenharmony_ci# The test passes because both shaders render the same image. 23e5c31af7Sopenharmony_ci 24e5c31af7Sopenharmony_ciSHADER vertex reference_vertex_shader PASSTHROUGH 25e5c31af7Sopenharmony_ci 26e5c31af7Sopenharmony_ci# reference_fragment_shader is derived from the following GLSL: 27e5c31af7Sopenharmony_ci# #version 320 es 28e5c31af7Sopenharmony_ci# precision highp float; 29e5c31af7Sopenharmony_ci# 30e5c31af7Sopenharmony_ci# precision highp int; 31e5c31af7Sopenharmony_ci# 32e5c31af7Sopenharmony_ci# layout(location = 0) out vec4 _GLF_color; 33e5c31af7Sopenharmony_ci# 34e5c31af7Sopenharmony_ci# layout(set = 0, binding = 0) uniform buf0 { 35e5c31af7Sopenharmony_ci# vec2 resolution; 36e5c31af7Sopenharmony_ci# }; 37e5c31af7Sopenharmony_ci# const vec4 pal[16] = vec4[16](vec4(0.0, 0.0, 0.0, 1.0), vec4(0.5, 0.0, 0.0, 1.0), vec4(0.0, 0.5, 0.0, 1.0), vec4(0.5, 0.5, 0.0, 1.0), vec4(0.0, 0.0, 0.5, 1.0), vec4(0.5, 0.0, 0.5, 1.0), vec4(0.0, 0.5, 0.5, 1.0), vec4(0.5, 0.5, 0.5, 1.0), vec4(0.0, 0.0, 0.0, 1.0), vec4(1.0, 0.0, 0.0, 1.0), vec4(0.0, 1.0, 0.0, 1.0), vec4(1.0, 1.0, 0.0, 1.0), vec4(0.0, 0.0, 1.0, 1.0), vec4(1.0, 0.0, 1.0, 1.0), vec4(0.0, 1.0, 1.0, 1.0), vec4(1.0, 1.0, 1.0, 1.0)); 38e5c31af7Sopenharmony_ci# 39e5c31af7Sopenharmony_ci# int collatz(int v) 40e5c31af7Sopenharmony_ci# { 41e5c31af7Sopenharmony_ci# int count = 0; 42e5c31af7Sopenharmony_ci# while(v > 1) 43e5c31af7Sopenharmony_ci# { 44e5c31af7Sopenharmony_ci# if((v & 1) == 1) 45e5c31af7Sopenharmony_ci# { 46e5c31af7Sopenharmony_ci# v = 3 * v + 1; 47e5c31af7Sopenharmony_ci# } 48e5c31af7Sopenharmony_ci# else 49e5c31af7Sopenharmony_ci# { 50e5c31af7Sopenharmony_ci# v /= 2; 51e5c31af7Sopenharmony_ci# } 52e5c31af7Sopenharmony_ci# count ++; 53e5c31af7Sopenharmony_ci# } 54e5c31af7Sopenharmony_ci# return count; 55e5c31af7Sopenharmony_ci# } 56e5c31af7Sopenharmony_ci# void main() 57e5c31af7Sopenharmony_ci# { 58e5c31af7Sopenharmony_ci# vec2 lin = gl_FragCoord.xy / resolution; 59e5c31af7Sopenharmony_ci# lin = floor(lin * 8.0); 60e5c31af7Sopenharmony_ci# int v = int(lin.x) * 8 + int(lin.y); 61e5c31af7Sopenharmony_ci# _GLF_color = pal[collatz(v) % 16]; 62e5c31af7Sopenharmony_ci# } 63e5c31af7Sopenharmony_ciSHADER fragment reference_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 64e5c31af7Sopenharmony_ci; SPIR-V 65e5c31af7Sopenharmony_ci; Version: 1.0 66e5c31af7Sopenharmony_ci; Generator: Khronos Glslang Reference Front End; 10 67e5c31af7Sopenharmony_ci; Bound: 108 68e5c31af7Sopenharmony_ci; Schema: 0 69e5c31af7Sopenharmony_ci OpCapability Shader 70e5c31af7Sopenharmony_ci %1 = OpExtInstImport "GLSL.std.450" 71e5c31af7Sopenharmony_ci OpMemoryModel Logical GLSL450 72e5c31af7Sopenharmony_ci OpEntryPoint Fragment %4 "main" %47 %76 73e5c31af7Sopenharmony_ci OpExecutionMode %4 OriginUpperLeft 74e5c31af7Sopenharmony_ci OpSource ESSL 320 75e5c31af7Sopenharmony_ci OpName %4 "main" 76e5c31af7Sopenharmony_ci OpName %10 "collatz(i1;" 77e5c31af7Sopenharmony_ci OpName %9 "v" 78e5c31af7Sopenharmony_ci OpName %12 "count" 79e5c31af7Sopenharmony_ci OpName %44 "lin" 80e5c31af7Sopenharmony_ci OpName %47 "gl_FragCoord" 81e5c31af7Sopenharmony_ci OpName %50 "buf0" 82e5c31af7Sopenharmony_ci OpMemberName %50 0 "resolution" 83e5c31af7Sopenharmony_ci OpName %52 "" 84e5c31af7Sopenharmony_ci OpName %61 "v" 85e5c31af7Sopenharmony_ci OpName %76 "_GLF_color" 86e5c31af7Sopenharmony_ci OpName %98 "param" 87e5c31af7Sopenharmony_ci OpName %104 "indexable" 88e5c31af7Sopenharmony_ci OpDecorate %47 BuiltIn FragCoord 89e5c31af7Sopenharmony_ci OpMemberDecorate %50 0 Offset 0 90e5c31af7Sopenharmony_ci OpDecorate %50 Block 91e5c31af7Sopenharmony_ci OpDecorate %52 DescriptorSet 0 92e5c31af7Sopenharmony_ci OpDecorate %52 Binding 0 93e5c31af7Sopenharmony_ci OpDecorate %76 Location 0 94e5c31af7Sopenharmony_ci %2 = OpTypeVoid 95e5c31af7Sopenharmony_ci %3 = OpTypeFunction %2 96e5c31af7Sopenharmony_ci %6 = OpTypeInt 32 1 97e5c31af7Sopenharmony_ci %7 = OpTypePointer Function %6 98e5c31af7Sopenharmony_ci %8 = OpTypeFunction %6 %7 99e5c31af7Sopenharmony_ci %13 = OpConstant %6 0 100e5c31af7Sopenharmony_ci %20 = OpConstant %6 1 101e5c31af7Sopenharmony_ci %21 = OpTypeBool 102e5c31af7Sopenharmony_ci %28 = OpConstant %6 3 103e5c31af7Sopenharmony_ci %33 = OpConstant %6 2 104e5c31af7Sopenharmony_ci %41 = OpTypeFloat 32 105e5c31af7Sopenharmony_ci %42 = OpTypeVector %41 2 106e5c31af7Sopenharmony_ci %43 = OpTypePointer Function %42 107e5c31af7Sopenharmony_ci %45 = OpTypeVector %41 4 108e5c31af7Sopenharmony_ci %46 = OpTypePointer Input %45 109e5c31af7Sopenharmony_ci %47 = OpVariable %46 Input 110e5c31af7Sopenharmony_ci %50 = OpTypeStruct %42 111e5c31af7Sopenharmony_ci %51 = OpTypePointer Uniform %50 112e5c31af7Sopenharmony_ci %52 = OpVariable %51 Uniform 113e5c31af7Sopenharmony_ci %53 = OpTypePointer Uniform %42 114e5c31af7Sopenharmony_ci %58 = OpConstant %41 8 115e5c31af7Sopenharmony_ci %62 = OpTypeInt 32 0 116e5c31af7Sopenharmony_ci %63 = OpConstant %62 0 117e5c31af7Sopenharmony_ci %64 = OpTypePointer Function %41 118e5c31af7Sopenharmony_ci %68 = OpConstant %6 8 119e5c31af7Sopenharmony_ci %70 = OpConstant %62 1 120e5c31af7Sopenharmony_ci %75 = OpTypePointer Output %45 121e5c31af7Sopenharmony_ci %76 = OpVariable %75 Output 122e5c31af7Sopenharmony_ci %77 = OpConstant %62 16 123e5c31af7Sopenharmony_ci %78 = OpTypeArray %45 %77 124e5c31af7Sopenharmony_ci %79 = OpConstant %41 0 125e5c31af7Sopenharmony_ci %80 = OpConstant %41 1 126e5c31af7Sopenharmony_ci %81 = OpConstantComposite %45 %79 %79 %79 %80 127e5c31af7Sopenharmony_ci %82 = OpConstant %41 0.5 128e5c31af7Sopenharmony_ci %83 = OpConstantComposite %45 %82 %79 %79 %80 129e5c31af7Sopenharmony_ci %84 = OpConstantComposite %45 %79 %82 %79 %80 130e5c31af7Sopenharmony_ci %85 = OpConstantComposite %45 %82 %82 %79 %80 131e5c31af7Sopenharmony_ci %86 = OpConstantComposite %45 %79 %79 %82 %80 132e5c31af7Sopenharmony_ci %87 = OpConstantComposite %45 %82 %79 %82 %80 133e5c31af7Sopenharmony_ci %88 = OpConstantComposite %45 %79 %82 %82 %80 134e5c31af7Sopenharmony_ci %89 = OpConstantComposite %45 %82 %82 %82 %80 135e5c31af7Sopenharmony_ci %90 = OpConstantComposite %45 %80 %79 %79 %80 136e5c31af7Sopenharmony_ci %91 = OpConstantComposite %45 %79 %80 %79 %80 137e5c31af7Sopenharmony_ci %92 = OpConstantComposite %45 %80 %80 %79 %80 138e5c31af7Sopenharmony_ci %93 = OpConstantComposite %45 %79 %79 %80 %80 139e5c31af7Sopenharmony_ci %94 = OpConstantComposite %45 %80 %79 %80 %80 140e5c31af7Sopenharmony_ci %95 = OpConstantComposite %45 %79 %80 %80 %80 141e5c31af7Sopenharmony_ci %96 = OpConstantComposite %45 %80 %80 %80 %80 142e5c31af7Sopenharmony_ci %97 = OpConstantComposite %78 %81 %83 %84 %85 %86 %87 %88 %89 %81 %90 %91 %92 %93 %94 %95 %96 143e5c31af7Sopenharmony_ci %101 = OpConstant %6 16 144e5c31af7Sopenharmony_ci %103 = OpTypePointer Function %78 145e5c31af7Sopenharmony_ci %105 = OpTypePointer Function %45 146e5c31af7Sopenharmony_ci %4 = OpFunction %2 None %3 147e5c31af7Sopenharmony_ci %5 = OpLabel 148e5c31af7Sopenharmony_ci %44 = OpVariable %43 Function 149e5c31af7Sopenharmony_ci %61 = OpVariable %7 Function 150e5c31af7Sopenharmony_ci %98 = OpVariable %7 Function 151e5c31af7Sopenharmony_ci %104 = OpVariable %103 Function 152e5c31af7Sopenharmony_ci %48 = OpLoad %45 %47 153e5c31af7Sopenharmony_ci %49 = OpVectorShuffle %42 %48 %48 0 1 154e5c31af7Sopenharmony_ci %54 = OpAccessChain %53 %52 %13 155e5c31af7Sopenharmony_ci %55 = OpLoad %42 %54 156e5c31af7Sopenharmony_ci %56 = OpFDiv %42 %49 %55 157e5c31af7Sopenharmony_ci OpStore %44 %56 158e5c31af7Sopenharmony_ci %57 = OpLoad %42 %44 159e5c31af7Sopenharmony_ci %59 = OpVectorTimesScalar %42 %57 %58 160e5c31af7Sopenharmony_ci %60 = OpExtInst %42 %1 Floor %59 161e5c31af7Sopenharmony_ci OpStore %44 %60 162e5c31af7Sopenharmony_ci %65 = OpAccessChain %64 %44 %63 163e5c31af7Sopenharmony_ci %66 = OpLoad %41 %65 164e5c31af7Sopenharmony_ci %67 = OpConvertFToS %6 %66 165e5c31af7Sopenharmony_ci %69 = OpIMul %6 %67 %68 166e5c31af7Sopenharmony_ci %71 = OpAccessChain %64 %44 %70 167e5c31af7Sopenharmony_ci %72 = OpLoad %41 %71 168e5c31af7Sopenharmony_ci %73 = OpConvertFToS %6 %72 169e5c31af7Sopenharmony_ci %74 = OpIAdd %6 %69 %73 170e5c31af7Sopenharmony_ci OpStore %61 %74 171e5c31af7Sopenharmony_ci %99 = OpLoad %6 %61 172e5c31af7Sopenharmony_ci OpStore %98 %99 173e5c31af7Sopenharmony_ci %100 = OpFunctionCall %6 %10 %98 174e5c31af7Sopenharmony_ci %102 = OpSMod %6 %100 %101 175e5c31af7Sopenharmony_ci OpStore %104 %97 176e5c31af7Sopenharmony_ci %106 = OpAccessChain %105 %104 %102 177e5c31af7Sopenharmony_ci %107 = OpLoad %45 %106 178e5c31af7Sopenharmony_ci OpStore %76 %107 179e5c31af7Sopenharmony_ci OpReturn 180e5c31af7Sopenharmony_ci OpFunctionEnd 181e5c31af7Sopenharmony_ci %10 = OpFunction %6 None %8 182e5c31af7Sopenharmony_ci %9 = OpFunctionParameter %7 183e5c31af7Sopenharmony_ci %11 = OpLabel 184e5c31af7Sopenharmony_ci %12 = OpVariable %7 Function 185e5c31af7Sopenharmony_ci OpStore %12 %13 186e5c31af7Sopenharmony_ci OpBranch %14 187e5c31af7Sopenharmony_ci %14 = OpLabel 188e5c31af7Sopenharmony_ci OpLoopMerge %16 %17 None 189e5c31af7Sopenharmony_ci OpBranch %18 190e5c31af7Sopenharmony_ci %18 = OpLabel 191e5c31af7Sopenharmony_ci %19 = OpLoad %6 %9 192e5c31af7Sopenharmony_ci %22 = OpSGreaterThan %21 %19 %20 193e5c31af7Sopenharmony_ci OpBranchConditional %22 %15 %16 194e5c31af7Sopenharmony_ci %15 = OpLabel 195e5c31af7Sopenharmony_ci %23 = OpLoad %6 %9 196e5c31af7Sopenharmony_ci %24 = OpBitwiseAnd %6 %23 %20 197e5c31af7Sopenharmony_ci %25 = OpIEqual %21 %24 %20 198e5c31af7Sopenharmony_ci OpSelectionMerge %27 None 199e5c31af7Sopenharmony_ci OpBranchConditional %25 %26 %32 200e5c31af7Sopenharmony_ci %26 = OpLabel 201e5c31af7Sopenharmony_ci %29 = OpLoad %6 %9 202e5c31af7Sopenharmony_ci %30 = OpIMul %6 %28 %29 203e5c31af7Sopenharmony_ci %31 = OpIAdd %6 %30 %20 204e5c31af7Sopenharmony_ci OpStore %9 %31 205e5c31af7Sopenharmony_ci OpBranch %27 206e5c31af7Sopenharmony_ci %32 = OpLabel 207e5c31af7Sopenharmony_ci %34 = OpLoad %6 %9 208e5c31af7Sopenharmony_ci %35 = OpSDiv %6 %34 %33 209e5c31af7Sopenharmony_ci OpStore %9 %35 210e5c31af7Sopenharmony_ci OpBranch %27 211e5c31af7Sopenharmony_ci %27 = OpLabel 212e5c31af7Sopenharmony_ci %36 = OpLoad %6 %12 213e5c31af7Sopenharmony_ci %37 = OpIAdd %6 %36 %20 214e5c31af7Sopenharmony_ci OpStore %12 %37 215e5c31af7Sopenharmony_ci OpBranch %17 216e5c31af7Sopenharmony_ci %17 = OpLabel 217e5c31af7Sopenharmony_ci OpBranch %14 218e5c31af7Sopenharmony_ci %16 = OpLabel 219e5c31af7Sopenharmony_ci %38 = OpLoad %6 %12 220e5c31af7Sopenharmony_ci OpReturnValue %38 221e5c31af7Sopenharmony_ci OpFunctionEnd 222e5c31af7Sopenharmony_ciEND 223e5c31af7Sopenharmony_ci 224e5c31af7Sopenharmony_ci# uniforms for reference 225e5c31af7Sopenharmony_ci 226e5c31af7Sopenharmony_ci# resolution 227e5c31af7Sopenharmony_ciBUFFER reference_resolution DATA_TYPE vec2<float> DATA 228e5c31af7Sopenharmony_ci 256.0 256.0 229e5c31af7Sopenharmony_ciEND 230e5c31af7Sopenharmony_ci 231e5c31af7Sopenharmony_ciBUFFER reference_framebuffer FORMAT B8G8R8A8_UNORM 232e5c31af7Sopenharmony_ci 233e5c31af7Sopenharmony_ciPIPELINE graphics reference_pipeline 234e5c31af7Sopenharmony_ci ATTACH reference_vertex_shader 235e5c31af7Sopenharmony_ci ATTACH reference_fragment_shader 236e5c31af7Sopenharmony_ci FRAMEBUFFER_SIZE 256 256 237e5c31af7Sopenharmony_ci BIND BUFFER reference_framebuffer AS color LOCATION 0 238e5c31af7Sopenharmony_ci BIND BUFFER reference_resolution AS uniform DESCRIPTOR_SET 0 BINDING 0 239e5c31af7Sopenharmony_ciEND 240e5c31af7Sopenharmony_ciCLEAR_COLOR reference_pipeline 0 0 0 255 241e5c31af7Sopenharmony_ci 242e5c31af7Sopenharmony_ciCLEAR reference_pipeline 243e5c31af7Sopenharmony_ciRUN reference_pipeline DRAW_RECT POS 0 0 SIZE 256 256 244e5c31af7Sopenharmony_ci 245e5c31af7Sopenharmony_ci 246e5c31af7Sopenharmony_ciSHADER vertex variant_vertex_shader PASSTHROUGH 247e5c31af7Sopenharmony_ci 248e5c31af7Sopenharmony_ci# variant_fragment_shader is derived from the following GLSL: 249e5c31af7Sopenharmony_ci# #version 320 es 250e5c31af7Sopenharmony_ci# precision highp float; 251e5c31af7Sopenharmony_ci# 252e5c31af7Sopenharmony_ci# precision highp int; 253e5c31af7Sopenharmony_ci# 254e5c31af7Sopenharmony_ci# layout(location = 0) out vec4 _GLF_color; 255e5c31af7Sopenharmony_ci# 256e5c31af7Sopenharmony_ci# layout(push_constant) uniform buf_push { 257e5c31af7Sopenharmony_ci# vec2 resolution; 258e5c31af7Sopenharmony_ci# }; 259e5c31af7Sopenharmony_ci# const vec4 pal[16] = vec4[16](vec4(0.0, 0.0, 0.0, 1.0), vec4(0.5, 0.0, 0.0, 1.0), vec4(0.0, 0.5, 0.0, 1.0), vec4(0.5, 0.5, 0.0, 1.0), vec4(0.0, 0.0, 0.5, 1.0), vec4(0.5, 0.0, 0.5, 1.0), vec4(0.0, 0.5, 0.5, 1.0), vec4(0.5, 0.5, 0.5, 1.0), vec4(0.0, 0.0, 0.0, 1.0), vec4(1.0, 0.0, 0.0, 1.0), vec4(0.0, 1.0, 0.0, 1.0), vec4(1.0, 1.0, 0.0, 1.0), vec4(0.0, 0.0, 1.0, 1.0), vec4(1.0, 0.0, 1.0, 1.0), vec4(0.0, 1.0, 1.0, 1.0), vec4(1.0, 1.0, 1.0, 1.0)); 260e5c31af7Sopenharmony_ci# 261e5c31af7Sopenharmony_ci# int collatz(int v) 262e5c31af7Sopenharmony_ci# { 263e5c31af7Sopenharmony_ci# int count = 0; 264e5c31af7Sopenharmony_ci# while(v > 1) 265e5c31af7Sopenharmony_ci# { 266e5c31af7Sopenharmony_ci# if((v & 1) == 1) 267e5c31af7Sopenharmony_ci# { 268e5c31af7Sopenharmony_ci# v = 3 * v + 1; 269e5c31af7Sopenharmony_ci# } 270e5c31af7Sopenharmony_ci# else 271e5c31af7Sopenharmony_ci# { 272e5c31af7Sopenharmony_ci# v /= 2; 273e5c31af7Sopenharmony_ci# } 274e5c31af7Sopenharmony_ci# count ++; 275e5c31af7Sopenharmony_ci# } 276e5c31af7Sopenharmony_ci# return count; 277e5c31af7Sopenharmony_ci# } 278e5c31af7Sopenharmony_ci# void main() 279e5c31af7Sopenharmony_ci# { 280e5c31af7Sopenharmony_ci# // vec2 max_c == (gl_FragCoord.xy / resolution). 281e5c31af7Sopenharmony_ci# vec2 max_c = max( // This should return the same result. 282e5c31af7Sopenharmony_ci# gl_FragCoord.xy / resolution, 283e5c31af7Sopenharmony_ci# gl_FragCoord.xy / (vec2(resolution.x, resolution.y)) 284e5c31af7Sopenharmony_ci# ); 285e5c31af7Sopenharmony_ci# // vec2 max_a == (gl_FragCoord.xy / resolution) 286e5c31af7Sopenharmony_ci# vec2 max_a = max( 287e5c31af7Sopenharmony_ci# // gl_FragCoord.y < 0 is always false. 288e5c31af7Sopenharmony_ci# // mix operation returns vec2(0.0 , 0.0). 289e5c31af7Sopenharmony_ci# // cosine of 0 is 1. 290e5c31af7Sopenharmony_ci# // anything divided by 1 stays the same. 291e5c31af7Sopenharmony_ci# max_c / cos(mix(vec2(1.0, 0.0), vec2(0.0, 218.851), bvec2(true, (gl_FragCoord.y < 0.0)))), 292e5c31af7Sopenharmony_ci# gl_FragCoord.xy / resolution 293e5c31af7Sopenharmony_ci# ); 294e5c31af7Sopenharmony_ci# // vec2 max_d == vec2(1.0, 1.0) 295e5c31af7Sopenharmony_ci# vec2 max_d = max( 296e5c31af7Sopenharmony_ci# // Same cosine fucntion as in max_a. 297e5c31af7Sopenharmony_ci# 1.0 / cos(mix(vec2(1.0, 0.0), vec2(0.0, 218.851), bvec2(true, (gl_FragCoord.y < 0.0)))), 298e5c31af7Sopenharmony_ci# vec2(1.0, 1.0) 299e5c31af7Sopenharmony_ci# ); 300e5c31af7Sopenharmony_ci# // vec2 max_b == vec2(1.0, 1.0) 301e5c31af7Sopenharmony_ci# vec2 max_b = max( 302e5c31af7Sopenharmony_ci# vec2(1.0, 1.0), 303e5c31af7Sopenharmony_ci# max_d // max_d == vec2(1.0, 1.0) 304e5c31af7Sopenharmony_ci# ); 305e5c31af7Sopenharmony_ci# // vec2 lin == (gl_FragCoord.xy / resolution) 306e5c31af7Sopenharmony_ci# vec2 lin = min( 307e5c31af7Sopenharmony_ci# max_a, // max_a == gl_FragCoord.xy / resolution 308e5c31af7Sopenharmony_ci# max_b // max_b == vec2(1.0, 1.0) 309e5c31af7Sopenharmony_ci# ); 310e5c31af7Sopenharmony_ci# lin = floor(lin * 8.0); 311e5c31af7Sopenharmony_ci# int v = int(lin.x) * 8 + int(lin.y); 312e5c31af7Sopenharmony_ci# _GLF_color = pal[collatz(v) % 16]; 313e5c31af7Sopenharmony_ci# } 314e5c31af7Sopenharmony_ciSHADER fragment variant_fragment_shader SPIRV-ASM TARGET_ENV spv1.0 315e5c31af7Sopenharmony_ci; SPIR-V 316e5c31af7Sopenharmony_ci; Version: 1.0 317e5c31af7Sopenharmony_ci; Generator: Khronos Glslang Reference Front End; 10 318e5c31af7Sopenharmony_ci; Bound: 157 319e5c31af7Sopenharmony_ci; Schema: 0 320e5c31af7Sopenharmony_ci OpCapability Shader 321e5c31af7Sopenharmony_ci %1 = OpExtInstImport "GLSL.std.450" 322e5c31af7Sopenharmony_ci OpMemoryModel Logical GLSL450 323e5c31af7Sopenharmony_ci OpEntryPoint Fragment %4 "main" %47 %127 324e5c31af7Sopenharmony_ci OpExecutionMode %4 OriginUpperLeft 325e5c31af7Sopenharmony_ci OpSource ESSL 320 326e5c31af7Sopenharmony_ci OpName %4 "main" 327e5c31af7Sopenharmony_ci OpName %10 "collatz(i1;" 328e5c31af7Sopenharmony_ci OpName %9 "v" 329e5c31af7Sopenharmony_ci OpName %12 "count" 330e5c31af7Sopenharmony_ci OpName %44 "max_c" 331e5c31af7Sopenharmony_ci OpName %47 "gl_FragCoord" 332e5c31af7Sopenharmony_ci OpName %50 "buf_push" 333e5c31af7Sopenharmony_ci OpMemberName %50 0 "resolution" 334e5c31af7Sopenharmony_ci OpName %52 "" 335e5c31af7Sopenharmony_ci OpName %70 "max_a" 336e5c31af7Sopenharmony_ci OpName %93 "max_d" 337e5c31af7Sopenharmony_ci OpName %104 "max_b" 338e5c31af7Sopenharmony_ci OpName %107 "lin" 339e5c31af7Sopenharmony_ci OpName %115 "v" 340e5c31af7Sopenharmony_ci OpName %127 "_GLF_color" 341e5c31af7Sopenharmony_ci OpName %147 "param" 342e5c31af7Sopenharmony_ci OpName %153 "indexable" 343e5c31af7Sopenharmony_ci OpDecorate %47 BuiltIn FragCoord 344e5c31af7Sopenharmony_ci OpMemberDecorate %50 0 Offset 0 345e5c31af7Sopenharmony_ci OpDecorate %50 Block 346e5c31af7Sopenharmony_ci OpDecorate %127 Location 0 347e5c31af7Sopenharmony_ci %2 = OpTypeVoid 348e5c31af7Sopenharmony_ci %3 = OpTypeFunction %2 349e5c31af7Sopenharmony_ci %6 = OpTypeInt 32 1 350e5c31af7Sopenharmony_ci %7 = OpTypePointer Function %6 351e5c31af7Sopenharmony_ci %8 = OpTypeFunction %6 %7 352e5c31af7Sopenharmony_ci %13 = OpConstant %6 0 353e5c31af7Sopenharmony_ci %20 = OpConstant %6 1 354e5c31af7Sopenharmony_ci %21 = OpTypeBool 355e5c31af7Sopenharmony_ci %28 = OpConstant %6 3 356e5c31af7Sopenharmony_ci %33 = OpConstant %6 2 357e5c31af7Sopenharmony_ci %41 = OpTypeFloat 32 358e5c31af7Sopenharmony_ci %42 = OpTypeVector %41 2 359e5c31af7Sopenharmony_ci %43 = OpTypePointer Function %42 360e5c31af7Sopenharmony_ci %45 = OpTypeVector %41 4 361e5c31af7Sopenharmony_ci %46 = OpTypePointer Input %45 362e5c31af7Sopenharmony_ci %47 = OpVariable %46 Input 363e5c31af7Sopenharmony_ci %50 = OpTypeStruct %42 364e5c31af7Sopenharmony_ci %51 = OpTypePointer PushConstant %50 365e5c31af7Sopenharmony_ci %52 = OpVariable %51 PushConstant 366e5c31af7Sopenharmony_ci %53 = OpTypePointer PushConstant %42 367e5c31af7Sopenharmony_ci %59 = OpTypeInt 32 0 368e5c31af7Sopenharmony_ci %60 = OpConstant %59 0 369e5c31af7Sopenharmony_ci %61 = OpTypePointer PushConstant %41 370e5c31af7Sopenharmony_ci %64 = OpConstant %59 1 371e5c31af7Sopenharmony_ci %72 = OpConstant %41 1 372e5c31af7Sopenharmony_ci %73 = OpConstant %41 0 373e5c31af7Sopenharmony_ci %74 = OpConstantComposite %42 %72 %73 374e5c31af7Sopenharmony_ci %75 = OpConstant %41 218.850998 375e5c31af7Sopenharmony_ci %76 = OpConstantComposite %42 %73 %75 376e5c31af7Sopenharmony_ci %77 = OpConstantTrue %21 377e5c31af7Sopenharmony_ci %78 = OpTypePointer Input %41 378e5c31af7Sopenharmony_ci %82 = OpTypeVector %21 2 379e5c31af7Sopenharmony_ci %102 = OpConstantComposite %42 %72 %72 380e5c31af7Sopenharmony_ci %112 = OpConstant %41 8 381e5c31af7Sopenharmony_ci %116 = OpTypePointer Function %41 382e5c31af7Sopenharmony_ci %120 = OpConstant %6 8 383e5c31af7Sopenharmony_ci %126 = OpTypePointer Output %45 384e5c31af7Sopenharmony_ci %127 = OpVariable %126 Output 385e5c31af7Sopenharmony_ci %128 = OpConstant %59 16 386e5c31af7Sopenharmony_ci %129 = OpTypeArray %45 %128 387e5c31af7Sopenharmony_ci %130 = OpConstantComposite %45 %73 %73 %73 %72 388e5c31af7Sopenharmony_ci %131 = OpConstant %41 0.5 389e5c31af7Sopenharmony_ci %132 = OpConstantComposite %45 %131 %73 %73 %72 390e5c31af7Sopenharmony_ci %133 = OpConstantComposite %45 %73 %131 %73 %72 391e5c31af7Sopenharmony_ci %134 = OpConstantComposite %45 %131 %131 %73 %72 392e5c31af7Sopenharmony_ci %135 = OpConstantComposite %45 %73 %73 %131 %72 393e5c31af7Sopenharmony_ci %136 = OpConstantComposite %45 %131 %73 %131 %72 394e5c31af7Sopenharmony_ci %137 = OpConstantComposite %45 %73 %131 %131 %72 395e5c31af7Sopenharmony_ci %138 = OpConstantComposite %45 %131 %131 %131 %72 396e5c31af7Sopenharmony_ci %139 = OpConstantComposite %45 %72 %73 %73 %72 397e5c31af7Sopenharmony_ci %140 = OpConstantComposite %45 %73 %72 %73 %72 398e5c31af7Sopenharmony_ci %141 = OpConstantComposite %45 %72 %72 %73 %72 399e5c31af7Sopenharmony_ci %142 = OpConstantComposite %45 %73 %73 %72 %72 400e5c31af7Sopenharmony_ci %143 = OpConstantComposite %45 %72 %73 %72 %72 401e5c31af7Sopenharmony_ci %144 = OpConstantComposite %45 %73 %72 %72 %72 402e5c31af7Sopenharmony_ci %145 = OpConstantComposite %45 %72 %72 %72 %72 403e5c31af7Sopenharmony_ci %146 = OpConstantComposite %129 %130 %132 %133 %134 %135 %136 %137 %138 %130 %139 %140 %141 %142 %143 %144 %145 404e5c31af7Sopenharmony_ci %150 = OpConstant %6 16 405e5c31af7Sopenharmony_ci %152 = OpTypePointer Function %129 406e5c31af7Sopenharmony_ci %154 = OpTypePointer Function %45 407e5c31af7Sopenharmony_ci %4 = OpFunction %2 None %3 408e5c31af7Sopenharmony_ci %5 = OpLabel 409e5c31af7Sopenharmony_ci %44 = OpVariable %43 Function 410e5c31af7Sopenharmony_ci %70 = OpVariable %43 Function 411e5c31af7Sopenharmony_ci %93 = OpVariable %43 Function 412e5c31af7Sopenharmony_ci %104 = OpVariable %43 Function 413e5c31af7Sopenharmony_ci %107 = OpVariable %43 Function 414e5c31af7Sopenharmony_ci %115 = OpVariable %7 Function 415e5c31af7Sopenharmony_ci %147 = OpVariable %7 Function 416e5c31af7Sopenharmony_ci %153 = OpVariable %152 Function 417e5c31af7Sopenharmony_ci %48 = OpLoad %45 %47 418e5c31af7Sopenharmony_ci %49 = OpVectorShuffle %42 %48 %48 0 1 419e5c31af7Sopenharmony_ci %54 = OpAccessChain %53 %52 %13 420e5c31af7Sopenharmony_ci %55 = OpLoad %42 %54 421e5c31af7Sopenharmony_ci %56 = OpFDiv %42 %49 %55 422e5c31af7Sopenharmony_ci %57 = OpLoad %45 %47 423e5c31af7Sopenharmony_ci %58 = OpVectorShuffle %42 %57 %57 0 1 424e5c31af7Sopenharmony_ci %62 = OpAccessChain %61 %52 %13 %60 425e5c31af7Sopenharmony_ci %63 = OpLoad %41 %62 426e5c31af7Sopenharmony_ci %65 = OpAccessChain %61 %52 %13 %64 427e5c31af7Sopenharmony_ci %66 = OpLoad %41 %65 428e5c31af7Sopenharmony_ci %67 = OpCompositeConstruct %42 %63 %66 429e5c31af7Sopenharmony_ci %68 = OpFDiv %42 %58 %67 430e5c31af7Sopenharmony_ci %69 = OpExtInst %42 %1 FMax %56 %68 431e5c31af7Sopenharmony_ci OpStore %44 %69 432e5c31af7Sopenharmony_ci %71 = OpLoad %42 %44 433e5c31af7Sopenharmony_ci %79 = OpAccessChain %78 %47 %64 434e5c31af7Sopenharmony_ci %80 = OpLoad %41 %79 435e5c31af7Sopenharmony_ci %81 = OpFOrdLessThan %21 %80 %73 436e5c31af7Sopenharmony_ci %83 = OpCompositeConstruct %82 %77 %81 437e5c31af7Sopenharmony_ci %84 = OpSelect %42 %83 %76 %74 438e5c31af7Sopenharmony_ci %85 = OpExtInst %42 %1 Cos %84 439e5c31af7Sopenharmony_ci %86 = OpFDiv %42 %71 %85 440e5c31af7Sopenharmony_ci %87 = OpLoad %45 %47 441e5c31af7Sopenharmony_ci %88 = OpVectorShuffle %42 %87 %87 0 1 442e5c31af7Sopenharmony_ci %89 = OpAccessChain %53 %52 %13 443e5c31af7Sopenharmony_ci %90 = OpLoad %42 %89 444e5c31af7Sopenharmony_ci %91 = OpFDiv %42 %88 %90 445e5c31af7Sopenharmony_ci %92 = OpExtInst %42 %1 FMax %86 %91 446e5c31af7Sopenharmony_ci OpStore %70 %92 447e5c31af7Sopenharmony_ci %94 = OpAccessChain %78 %47 %64 448e5c31af7Sopenharmony_ci %95 = OpLoad %41 %94 449e5c31af7Sopenharmony_ci %96 = OpFOrdLessThan %21 %95 %73 450e5c31af7Sopenharmony_ci %97 = OpCompositeConstruct %82 %77 %96 451e5c31af7Sopenharmony_ci %98 = OpSelect %42 %97 %76 %74 452e5c31af7Sopenharmony_ci %99 = OpExtInst %42 %1 Cos %98 453e5c31af7Sopenharmony_ci %100 = OpCompositeConstruct %42 %72 %72 454e5c31af7Sopenharmony_ci %101 = OpFDiv %42 %100 %99 455e5c31af7Sopenharmony_ci %103 = OpExtInst %42 %1 FMax %101 %102 456e5c31af7Sopenharmony_ci OpStore %93 %103 457e5c31af7Sopenharmony_ci %105 = OpLoad %42 %93 458e5c31af7Sopenharmony_ci %106 = OpExtInst %42 %1 FMax %102 %105 459e5c31af7Sopenharmony_ci OpStore %104 %106 460e5c31af7Sopenharmony_ci %108 = OpLoad %42 %70 461e5c31af7Sopenharmony_ci %109 = OpLoad %42 %104 462e5c31af7Sopenharmony_ci %110 = OpExtInst %42 %1 FMin %108 %109 463e5c31af7Sopenharmony_ci OpStore %107 %110 464e5c31af7Sopenharmony_ci %111 = OpLoad %42 %107 465e5c31af7Sopenharmony_ci %113 = OpVectorTimesScalar %42 %111 %112 466e5c31af7Sopenharmony_ci %114 = OpExtInst %42 %1 Floor %113 467e5c31af7Sopenharmony_ci OpStore %107 %114 468e5c31af7Sopenharmony_ci %117 = OpAccessChain %116 %107 %60 469e5c31af7Sopenharmony_ci %118 = OpLoad %41 %117 470e5c31af7Sopenharmony_ci %119 = OpConvertFToS %6 %118 471e5c31af7Sopenharmony_ci %121 = OpIMul %6 %119 %120 472e5c31af7Sopenharmony_ci %122 = OpAccessChain %116 %107 %64 473e5c31af7Sopenharmony_ci %123 = OpLoad %41 %122 474e5c31af7Sopenharmony_ci %124 = OpConvertFToS %6 %123 475e5c31af7Sopenharmony_ci %125 = OpIAdd %6 %121 %124 476e5c31af7Sopenharmony_ci OpStore %115 %125 477e5c31af7Sopenharmony_ci %148 = OpLoad %6 %115 478e5c31af7Sopenharmony_ci OpStore %147 %148 479e5c31af7Sopenharmony_ci %149 = OpFunctionCall %6 %10 %147 480e5c31af7Sopenharmony_ci %151 = OpSMod %6 %149 %150 481e5c31af7Sopenharmony_ci OpStore %153 %146 482e5c31af7Sopenharmony_ci %155 = OpAccessChain %154 %153 %151 483e5c31af7Sopenharmony_ci %156 = OpLoad %45 %155 484e5c31af7Sopenharmony_ci OpStore %127 %156 485e5c31af7Sopenharmony_ci OpReturn 486e5c31af7Sopenharmony_ci OpFunctionEnd 487e5c31af7Sopenharmony_ci %10 = OpFunction %6 None %8 488e5c31af7Sopenharmony_ci %9 = OpFunctionParameter %7 489e5c31af7Sopenharmony_ci %11 = OpLabel 490e5c31af7Sopenharmony_ci %12 = OpVariable %7 Function 491e5c31af7Sopenharmony_ci OpStore %12 %13 492e5c31af7Sopenharmony_ci OpBranch %14 493e5c31af7Sopenharmony_ci %14 = OpLabel 494e5c31af7Sopenharmony_ci OpLoopMerge %16 %17 None 495e5c31af7Sopenharmony_ci OpBranch %18 496e5c31af7Sopenharmony_ci %18 = OpLabel 497e5c31af7Sopenharmony_ci %19 = OpLoad %6 %9 498e5c31af7Sopenharmony_ci %22 = OpSGreaterThan %21 %19 %20 499e5c31af7Sopenharmony_ci OpBranchConditional %22 %15 %16 500e5c31af7Sopenharmony_ci %15 = OpLabel 501e5c31af7Sopenharmony_ci %23 = OpLoad %6 %9 502e5c31af7Sopenharmony_ci %24 = OpBitwiseAnd %6 %23 %20 503e5c31af7Sopenharmony_ci %25 = OpIEqual %21 %24 %20 504e5c31af7Sopenharmony_ci OpSelectionMerge %27 None 505e5c31af7Sopenharmony_ci OpBranchConditional %25 %26 %32 506e5c31af7Sopenharmony_ci %26 = OpLabel 507e5c31af7Sopenharmony_ci %29 = OpLoad %6 %9 508e5c31af7Sopenharmony_ci %30 = OpIMul %6 %28 %29 509e5c31af7Sopenharmony_ci %31 = OpIAdd %6 %30 %20 510e5c31af7Sopenharmony_ci OpStore %9 %31 511e5c31af7Sopenharmony_ci OpBranch %27 512e5c31af7Sopenharmony_ci %32 = OpLabel 513e5c31af7Sopenharmony_ci %34 = OpLoad %6 %9 514e5c31af7Sopenharmony_ci %35 = OpSDiv %6 %34 %33 515e5c31af7Sopenharmony_ci OpStore %9 %35 516e5c31af7Sopenharmony_ci OpBranch %27 517e5c31af7Sopenharmony_ci %27 = OpLabel 518e5c31af7Sopenharmony_ci %36 = OpLoad %6 %12 519e5c31af7Sopenharmony_ci %37 = OpIAdd %6 %36 %20 520e5c31af7Sopenharmony_ci OpStore %12 %37 521e5c31af7Sopenharmony_ci OpBranch %17 522e5c31af7Sopenharmony_ci %17 = OpLabel 523e5c31af7Sopenharmony_ci OpBranch %14 524e5c31af7Sopenharmony_ci %16 = OpLabel 525e5c31af7Sopenharmony_ci %38 = OpLoad %6 %12 526e5c31af7Sopenharmony_ci OpReturnValue %38 527e5c31af7Sopenharmony_ci OpFunctionEnd 528e5c31af7Sopenharmony_ciEND 529e5c31af7Sopenharmony_ci 530e5c31af7Sopenharmony_ci# uniforms for variant 531e5c31af7Sopenharmony_ci 532e5c31af7Sopenharmony_ci# resolution 533e5c31af7Sopenharmony_ciBUFFER variant_resolution DATA_TYPE vec2<float> DATA 534e5c31af7Sopenharmony_ci 256.0 256.0 535e5c31af7Sopenharmony_ciEND 536e5c31af7Sopenharmony_ci 537e5c31af7Sopenharmony_ciBUFFER variant_framebuffer FORMAT B8G8R8A8_UNORM 538e5c31af7Sopenharmony_ci 539e5c31af7Sopenharmony_ciPIPELINE graphics variant_pipeline 540e5c31af7Sopenharmony_ci ATTACH variant_vertex_shader 541e5c31af7Sopenharmony_ci ATTACH variant_fragment_shader 542e5c31af7Sopenharmony_ci FRAMEBUFFER_SIZE 256 256 543e5c31af7Sopenharmony_ci BIND BUFFER variant_framebuffer AS color LOCATION 0 544e5c31af7Sopenharmony_ci BIND BUFFER variant_resolution AS push_constant 545e5c31af7Sopenharmony_ciEND 546e5c31af7Sopenharmony_ciCLEAR_COLOR variant_pipeline 0 0 0 255 547e5c31af7Sopenharmony_ci 548e5c31af7Sopenharmony_ciCLEAR variant_pipeline 549e5c31af7Sopenharmony_ciRUN variant_pipeline DRAW_RECT POS 0 0 SIZE 256 256 550e5c31af7Sopenharmony_ci 551e5c31af7Sopenharmony_ciEXPECT reference_framebuffer EQ_HISTOGRAM_EMD_BUFFER variant_framebuffer TOLERANCE 0.005 552