diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs_analysis.c b/src/gallium/drivers/llvmpipe/lp_state_fs_analysis.c index c9b1c2c790f..4572e4cc146 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_fs_analysis.c +++ b/src/gallium/drivers/llvmpipe/lp_state_fs_analysis.c @@ -504,6 +504,14 @@ llvmpipe_nir_is_linear_compat(struct nir_shader *shader, struct lp_tgsi_info *info) { int num_tex = info->num_texs; + + if (util_bitcount64(shader->info.inputs_read) > LP_MAX_LINEAR_INPUTS) + return false; + + if (!shader->info.outputs_written || shader->info.fs.color_is_dual_source || + (shader->info.outputs_written & ~BITFIELD64_BIT(FRAG_RESULT_DATA0))) + return false; + info->num_texs = 0; nir_foreach_function_impl(impl, shader) { if (!llvmpipe_nir_fn_is_linear_compat(shader, impl, info)) @@ -521,11 +529,7 @@ llvmpipe_nir_is_linear_compat(struct nir_shader *shader, void llvmpipe_fs_analyse_nir(struct lp_fragment_shader *shader) { - if (shader->info.base.num_inputs <= LP_MAX_LINEAR_INPUTS && - shader->info.base.num_outputs == 1 && - shader->info.base.output_semantic_name[0] == TGSI_SEMANTIC_COLOR && - shader->info.base.output_semantic_index[0] == 0 && - !shader->info.indirect_textures && + if (!shader->info.indirect_textures && !shader->info.sampler_texture_units_different && shader->info.num_texs <= LP_MAX_LINEAR_TEXTURES && llvmpipe_nir_is_linear_compat(shader->base.ir.nir, &shader->info)) {