static nir_ssa_def * get_zero_or_one(nir_builder *b, nir_alu_type type, uint8_t swizzle_val) { nir_const_value v; memset(&v, 0, sizeof(v)); if (swizzle_val == 4) { v.u[0] = v.u[1] = v.u[2] = v.u[3] = 0; } else { assert(swizzle_val == 5); if (type == nir_type_float) v.f[0] = v.f[1] = v.f[2] = v.f[3] = 1.0; else v.u[0] = v.u[1] = v.u[2] = v.u[3] = 1; } return nir_build_imm(b, 4, v); }
{ nir_const_value m[3][4] = { { { .f32 = 1.16438356f }, { .f32 = 1.16438356f }, { .f32 = 1.16438356f }, { .f32 = 0.0f } }, { { .f32 = 0.0f }, { .f32 = -0.39176229f }, { .f32 = 2.01723214f }, { .f32 = 0.0f } }, { { .f32 = 1.59602678f }, { .f32 = -0.81296764f }, { .f32 = 0.0f }, { .f32 = 0.0f } }, }; nir_ssa_def *offset = nir_vec4(b, nir_imm_float(b, -0.874202214f), nir_imm_float(b, 0.531667820f), nir_imm_float(b, -1.085630787f), a); nir_ssa_def *result = nir_ffma(b, y, nir_build_imm(b, 4, 32, m[0]), nir_ffma(b, u, nir_build_imm(b, 4, 32, m[1]), nir_ffma(b, v, nir_build_imm(b, 4, 32, m[2]), offset))); nir_ssa_def_rewrite_uses(&tex->dest.ssa, nir_src_for_ssa(result)); } static void lower_y_uv_external(nir_builder *b, nir_tex_instr *tex, const nir_lower_tex_options *options) { b->cursor = nir_after_instr(&tex->instr); nir_ssa_def *y = sample_plane(b, tex, 0, options); nir_ssa_def *uv = sample_plane(b, tex, 1, options);
{ nir_const_value m[3] = { { .f32 = { 1.0f, 0.0f, 1.59602678f, 0.0f } }, { .f32 = { 1.0f, -0.39176229f, -0.81296764f, 0.0f } }, { .f32 = { 1.0f, 2.01723214f, 0.0f, 0.0f } } }; nir_ssa_def *yuv = nir_vec4(b, nir_fmul(b, nir_imm_float(b, 1.16438356f), nir_fadd(b, y, nir_imm_float(b, -0.0625f))), nir_channel(b, nir_fadd(b, u, nir_imm_float(b, -0.5f)), 0), nir_channel(b, nir_fadd(b, v, nir_imm_float(b, -0.5f)), 0), nir_imm_float(b, 0.0)); nir_ssa_def *red = nir_fdot4(b, yuv, nir_build_imm(b, 4, 32, m[0])); nir_ssa_def *green = nir_fdot4(b, yuv, nir_build_imm(b, 4, 32, m[1])); nir_ssa_def *blue = nir_fdot4(b, yuv, nir_build_imm(b, 4, 32, m[2])); nir_ssa_def *result = nir_vec4(b, red, green, blue, nir_imm_float(b, 1.0f)); nir_ssa_def_rewrite_uses(&tex->dest.ssa, nir_src_for_ssa(result)); } static void lower_y_uv_external(nir_builder *b, nir_tex_instr *tex) { b->cursor = nir_after_instr(&tex->instr); nir_ssa_def *y = sample_plane(b, tex, 0); nir_ssa_def *uv = sample_plane(b, tex, 1);