Module: Mesa Branch: master Commit: 510dac76abb64c28f06debbafd867141a71911c6 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=510dac76abb64c28f06debbafd867141a71911c6
Author: Gert Wollny <gert.wol...@collabora.com> Date: Wed Dec 23 22:42:26 2020 +0100 r600/sfn: add lowering pass for cube textures Signed-off-by: Gert Wollny <gert.wol...@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9302> --- .../drivers/r600/sfn/sfn_emittexinstruction.cpp | 2 +- .../drivers/r600/sfn/sfn_instruction_tex.cpp | 77 ++++++++++++++++++++++ src/gallium/drivers/r600/sfn/sfn_instruction_tex.h | 1 + 3 files changed, 79 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/r600/sfn/sfn_emittexinstruction.cpp b/src/gallium/drivers/r600/sfn/sfn_emittexinstruction.cpp index 177063595ae..f17e7f5f90f 100644 --- a/src/gallium/drivers/r600/sfn/sfn_emittexinstruction.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_emittexinstruction.cpp @@ -873,7 +873,7 @@ bool EmitTexInstruction::get_inputs(const nir_tex_instr& instr, TexInputs &src) sfn_log << SfnLog::tex << "Get Inputs with " << instr.coord_components << " components\n"; unsigned grad_components = instr.coord_components; - if (instr.is_array) + if (instr.is_array && !instr.array_is_lowered_cube) --grad_components; diff --git a/src/gallium/drivers/r600/sfn/sfn_instruction_tex.cpp b/src/gallium/drivers/r600/sfn/sfn_instruction_tex.cpp index 41e879365aa..da6ea4717ca 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instruction_tex.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_instruction_tex.cpp @@ -314,5 +314,82 @@ r600_nir_lower_txl_txf_array_or_cube(nir_shader *shader) return progress; } +static bool +r600_nir_lower_cube_to_2darray_filer(const nir_instr *instr, const void *_options) +{ + if (instr->type != nir_instr_type_tex) + return false; + + auto tex = nir_instr_as_tex(instr); + if (tex->sampler_dim != GLSL_SAMPLER_DIM_CUBE) + return false; + + switch (tex->op) { + case nir_texop_tex: + case nir_texop_txb: + case nir_texop_txf: + case nir_texop_txl: + case nir_texop_lod: + case nir_texop_tg4: + case nir_texop_txd: + return true; + } + return false; +} + +static nir_ssa_def * +r600_nir_lower_cube_to_2darray_impl(nir_builder *b, nir_instr *instr, void *_options) +{ + b->cursor = nir_before_instr(instr); + + auto tex = nir_instr_as_tex(instr); + int coord_idx = nir_tex_instr_src_index(tex, nir_tex_src_coord); + assert(coord_idx >= 0); + + auto cubed = nir_cube_r600(b, nir_channels(b, tex->src[coord_idx].src.ssa, 0x7)); + auto xy = nir_fmad(b, + nir_vec2(b, nir_channel(b, cubed, 1), nir_channel(b, cubed, 0)), + nir_frcp(b, nir_fabs(b, nir_channel(b, cubed, 2))), + nir_imm_float(b, 1.5)); + + nir_ssa_def *z = nir_channel(b, cubed, 3); + if (tex->is_array) { + auto slice = nir_fround_even(b, nir_channel(b, tex->src[coord_idx].src.ssa, 3)); + z = nir_fmad(b, nir_fmax(b, slice, nir_imm_float(b, 0.0)), nir_imm_float(b, 8.0), + z); + } + + if (tex->op == nir_texop_txd) { + int ddx_idx = nir_tex_instr_src_index(tex, nir_tex_src_ddx); + auto zero_dot_5 = nir_imm_float(b, 0.5); + nir_instr_rewrite_src(&tex->instr, &tex->src[ddx_idx].src, + nir_src_for_ssa(nir_fmul(b, nir_ssa_for_src(b, tex->src[ddx_idx].src, 3), zero_dot_5))); + + int ddy_idx = nir_tex_instr_src_index(tex, nir_tex_src_ddy); + nir_instr_rewrite_src(&tex->instr, &tex->src[ddy_idx].src, + nir_src_for_ssa(nir_fmul(b, nir_ssa_for_src(b, tex->src[ddy_idx].src, 3), zero_dot_5))); + } + + auto new_coord = nir_vec3(b, nir_channel(b, xy, 0), nir_channel(b, xy, 1), z); + nir_instr_rewrite_src(&tex->instr, &tex->src[coord_idx].src, + nir_src_for_ssa(new_coord)); + tex->sampler_dim = GLSL_SAMPLER_DIM_2D; + tex->is_array = true; + tex->array_is_lowered_cube = true; + + tex->coord_components = 3; + + return NIR_LOWER_INSTR_PROGRESS; +} + +bool +r600_nir_lower_cube_to_2darray(nir_shader *shader) +{ + return nir_shader_lower_instructions(shader, + r600_nir_lower_cube_to_2darray_filer, + r600_nir_lower_cube_to_2darray_impl, nullptr); +} + + } diff --git a/src/gallium/drivers/r600/sfn/sfn_instruction_tex.h b/src/gallium/drivers/r600/sfn/sfn_instruction_tex.h index 1603a70960b..70f2e1a0a5c 100644 --- a/src/gallium/drivers/r600/sfn/sfn_instruction_tex.h +++ b/src/gallium/drivers/r600/sfn/sfn_instruction_tex.h @@ -133,6 +133,7 @@ private: bool r600_nir_lower_int_tg4(nir_shader *nir); bool r600_nir_lower_txl_txf_array_or_cube(nir_shader *shader); +bool r600_nir_lower_cube_to_2darray(nir_shader *shader); } _______________________________________________ mesa-commit mailing list mesa-commit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-commit