MainFunctionStart(); emit("\n"); emit(" "); emit(shader_helper.GuardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")); emit(";\n"); emit("\n"); emit(" let constant_value =\n"); if (param["is_float16"]) { emit(" bitcast>(uniforms.constant_value)[0];\n"); } else { emit(" bitcast(uniforms.constant_value);\n"); } if (param["dim_value_zero"]) { emit(" output[global_idx] = constant_value;\n"); } else { emit(" let output_indices = "); emit(variable["output"].OffsetToIndices("global_idx")); emit(";\n"); emit(" var input_index = u32(0);\n"); emit(" var use_pad_value = false;\n"); emit(" var in_coord = i32(0);\n"); emit("\n"); emit(" for (var dim = 0; dim < "); emit(variable["output"].Rank()); emit(" && !use_pad_value; dim++) {\n"); emit(" let output_index = i32("); emit(GetElementAt("output_indices", "dim", variable["output"].Rank())); emit(");\n"); emit(" let lower_pads = "); emit(GetElementAt("uniforms.lower_pads", "dim", variable["output"].Rank())); emit(";\n"); emit(" let data_shape = i32("); emit(GetElementAt("uniforms.data_shape", "dim", variable["output"].Rank())); emit(");\n"); if (param["pad_mode"] == 0) { emit(" if (output_index < lower_pads || output_index >= data_shape + lower_pads) {\n"); emit(" use_pad_value = true;\n"); } else if (param["pad_mode"] == 1) { emit(" if (output_index < lower_pads) {\n"); emit(" in_coord = 0;\n"); emit(" } else if (output_index >= data_shape + lower_pads) {\n"); emit(" in_coord = data_shape - 1;\n"); } else if (param["pad_mode"] == 2) { emit(" if (output_index < lower_pads || output_index >= data_shape + lower_pads) {\n"); emit(" in_coord = output_index - lower_pads;\n"); emit(" if (in_coord < 0) {\n"); emit(" in_coord = -in_coord;\n"); emit(" }\n"); emit(" let _2n_1 = 2 * (data_shape - 1);\n"); emit(" in_coord = in_coord % _2n_1;\n"); emit(" if (in_coord >= data_shape) {\n"); emit(" in_coord = _2n_1 - in_coord;\n"); emit(" }\n"); } else { emit(" if (output_index < lower_pads) {\n"); emit(" in_coord = data_shape + output_index - lower_pads;\n"); emit(" } else if (output_index >= data_shape + lower_pads) {\n"); emit(" in_coord = output_index - data_shape - lower_pads;\n"); } emit(" } else {\n"); emit(" in_coord = output_index - lower_pads;\n"); emit(" }\n"); emit("\n"); emit(" input_index += select(u32(in_coord)\n"); if (variable["output"].Rank() > 1) { emit(" * "); emit(GetElementAt("uniforms.data_stride", "dim", variable["output"].Rank() - 1)); emit("\n"); } emit(" , u32(in_coord), dim == "); emit(variable["output"].Rank()); emit(" - 1);\n"); emit(" }\n"); emit("\n"); emit(" "); emit(variable["output"].SetByOffset("global_idx", "select(data[input_index], constant_value, use_pad_value)")); emit(";\n"); } MainFunctionEnd(); emit("\n");