pan/mdg: Implement texture gathers
As previously shown, it is a mode on top of textureLod. The main gotcha is the results are swizzled; we reuse the Broadcom lowering for that. Also, there's a pretty significant erratum affecting gathers of cubemaps which can be dealt with... eventually. Fixes: dEQP-GLES31.functional.texture.gather.basic.2d.* dEQP-GLES31.functional.texture.gather.basic.2d_array.* Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6516>
This commit is contained in:
@@ -497,6 +497,7 @@ optimise_nir(nir_shader *nir, unsigned quirks, bool is_blend)
|
|||||||
.lower_txp = ~0,
|
.lower_txp = ~0,
|
||||||
.lower_tex_without_implicit_lod =
|
.lower_tex_without_implicit_lod =
|
||||||
(quirks & MIDGARD_EXPLICIT_LOD),
|
(quirks & MIDGARD_EXPLICIT_LOD),
|
||||||
|
.lower_tg4_broadcom_swizzle = true,
|
||||||
|
|
||||||
/* TODO: we have native gradient.. */
|
/* TODO: we have native gradient.. */
|
||||||
.lower_txd = true,
|
.lower_txd = true,
|
||||||
@@ -2068,7 +2069,11 @@ pan_attach_constant_bias(
|
|||||||
static enum mali_texture_mode
|
static enum mali_texture_mode
|
||||||
mdg_texture_mode(nir_tex_instr *instr)
|
mdg_texture_mode(nir_tex_instr *instr)
|
||||||
{
|
{
|
||||||
if (instr->is_shadow)
|
if (instr->op == nir_texop_tg4 && instr->is_shadow)
|
||||||
|
return TEXTURE_GATHER_SHADOW;
|
||||||
|
else if (instr->op == nir_texop_tg4)
|
||||||
|
return TEXTURE_GATHER_X + instr->component;
|
||||||
|
else if (instr->is_shadow)
|
||||||
return TEXTURE_SHADOW;
|
return TEXTURE_SHADOW;
|
||||||
else
|
else
|
||||||
return TEXTURE_NORMAL;
|
return TEXTURE_NORMAL;
|
||||||
@@ -2112,7 +2117,7 @@ emit_texop_native(compiler_context *ctx, nir_tex_instr *instr,
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (instr->is_shadow && !instr->is_new_style_shadow)
|
if (instr->is_shadow && !instr->is_new_style_shadow && instr->op != nir_texop_tg4)
|
||||||
for (int i = 0; i < 4; ++i)
|
for (int i = 0; i < 4; ++i)
|
||||||
ins.swizzle[0][i] = COMPONENT_X;
|
ins.swizzle[0][i] = COMPONENT_X;
|
||||||
|
|
||||||
@@ -2282,6 +2287,7 @@ emit_tex(compiler_context *ctx, nir_tex_instr *instr)
|
|||||||
emit_texop_native(ctx, instr, TEXTURE_OP_NORMAL);
|
emit_texop_native(ctx, instr, TEXTURE_OP_NORMAL);
|
||||||
break;
|
break;
|
||||||
case nir_texop_txl:
|
case nir_texop_txl:
|
||||||
|
case nir_texop_tg4:
|
||||||
emit_texop_native(ctx, instr, TEXTURE_OP_LOD);
|
emit_texop_native(ctx, instr, TEXTURE_OP_LOD);
|
||||||
break;
|
break;
|
||||||
case nir_texop_txf:
|
case nir_texop_txf:
|
||||||
|
Reference in New Issue
Block a user