#include "nir_builtin_builder.h"
#include "nir_format_convert.h"
+static float bt601_csc_coeffs[9] = {
+ 1.16438356f, 1.16438356f, 1.16438356f,
+ 0.0f, -0.39176229f, 2.01723214f,
+ 1.59602678f, -0.81296764f, 0.0f,
+};
+static float bt709_csc_coeffs[9] = {
+ 1.16438356f, 1.16438356f, 1.16438356f,
+ 0.0f , -0.21324861f, 2.11240179f,
+ 1.79274107f, -0.53290933f, 0.0f,
+};
+static float bt2020_csc_coeffs[9] = {
+ 1.16438356f, 1.16438356f, 1.16438356f,
+ 0.0f , -0.18732610f, 2.14177232f,
+ 1.67867411f, -0.65042432f, 0.0f,
+};
+
+static float bt601_csc_offsets[3] = {
+ -0.874202218f, 0.531667823f, -1.085630789f
+};
+static float bt709_csc_offsets[3] = {
+ -0.972945075f, 0.301482665f, -1.133402218f
+};
+static float bt2020_csc_offsets[3] = {
+ -0.915687932f, 0.347458499f, -1.148145075f
+};
+
static bool
project_src(nir_builder *b, nir_tex_instr *tex)
{
static void
convert_yuv_to_rgb(nir_builder *b, nir_tex_instr *tex,
nir_ssa_def *y, nir_ssa_def *u, nir_ssa_def *v,
- nir_ssa_def *a)
+ nir_ssa_def *a,
+ const nir_lower_tex_options *options)
{
+
+ float *offset_vals;
+ float *m_vals;
+ assert((options->bt709_external & options->bt2020_external) == 0);
+ if (options->bt709_external & (1 << tex->texture_index)) {
+ m_vals = bt709_csc_coeffs;
+ offset_vals = bt709_csc_offsets;
+ } else if (options->bt2020_external & (1 << tex->texture_index)) {
+ m_vals = bt2020_csc_coeffs;
+ offset_vals = bt2020_csc_offsets;
+ } else {
+ m_vals = bt601_csc_coeffs;
+ offset_vals = bt601_csc_offsets;
+ }
+
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 } },
+ { { .f32 = m_vals[0] }, { .f32 = m_vals[1] }, { .f32 = m_vals[2] }, { .f32 = 0.0f } },
+ { { .f32 = m_vals[3] }, { .f32 = m_vals[4] }, { .f32 = m_vals[5] }, { .f32 = 0.0f } },
+ { { .f32 = m_vals[6] }, { .f32 = m_vals[7] }, { .f32 = m_vals[8] }, { .f32 = 0.0f } },
};
unsigned bit_size = nir_dest_bit_size(tex->dest);
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),
+ nir_imm_float(b, offset_vals[0]),
+ nir_imm_float(b, offset_vals[1]),
+ nir_imm_float(b, offset_vals[2]),
a);
offset = nir_f2fN(b, offset, bit_size);
nir_channel(b, y, 0),
nir_channel(b, uv, 0),
nir_channel(b, uv, 1),
- nir_imm_float(b, 1.0f));
+ nir_imm_float(b, 1.0f),
+ options);
}
static void
nir_channel(b, y, 0),
nir_channel(b, u, 0),
nir_channel(b, v, 0),
- nir_imm_float(b, 1.0f));
+ nir_imm_float(b, 1.0f),
+ options);
}
static void
nir_channel(b, y, 0),
nir_channel(b, xuxv, 1),
nir_channel(b, xuxv, 3),
- nir_imm_float(b, 1.0f));
+ nir_imm_float(b, 1.0f),
+ options);
}
static void
nir_channel(b, y, 1),
nir_channel(b, uxvx, 0),
nir_channel(b, uxvx, 2),
- nir_imm_float(b, 1.0f));
+ nir_imm_float(b, 1.0f),
+ options);
}
static void
nir_channel(b, ayuv, 2),
nir_channel(b, ayuv, 1),
nir_channel(b, ayuv, 0),
- nir_channel(b, ayuv, 3));
+ nir_channel(b, ayuv, 3),
+ options);
}
static void
nir_channel(b, xyuv, 2),
nir_channel(b, xyuv, 1),
nir_channel(b, xyuv, 0),
- nir_imm_float(b, 1.0f));
+ nir_imm_float(b, 1.0f),
+ options);
}
/*
switch (nir_alu_type_get_base_type(tex->dest_type)) {
case nir_type_float:
- if (tex->is_shadow && tex->is_new_style_shadow) {
+ switch (nir_tex_instr_dest_size(tex)) {
+ case 1:
+ assert(tex->is_shadow && tex->is_new_style_shadow);
color = nir_unpack_half_2x16_split_x(b, nir_channel(b, color, 0));
- } else {
+ break;
+ case 2: {
+ nir_ssa_def *rg = nir_channel(b, color, 0);
+ color = nir_vec2(b,
+ nir_unpack_half_2x16_split_x(b, rg),
+ nir_unpack_half_2x16_split_y(b, rg));
+ break;
+ }
+ case 4: {
nir_ssa_def *rg = nir_channel(b, color, 0);
nir_ssa_def *ba = nir_channel(b, color, 1);
color = nir_vec4(b,
nir_unpack_half_2x16_split_y(b, rg),
nir_unpack_half_2x16_split_x(b, ba),
nir_unpack_half_2x16_split_y(b, ba));
+ break;
+ }
+ default:
+ unreachable("wrong dest_size");
}
break;
if (options->lower_tex_packing[tex->sampler_index] !=
nir_lower_tex_packing_none &&
tex->op != nir_texop_txs &&
- tex->op != nir_texop_query_levels) {
+ tex->op != nir_texop_query_levels &&
+ tex->op != nir_texop_texture_samples) {
lower_tex_packing(b, tex, options);
progress = true;
}