v3d/tex: Configuration Parameter 1 can be only skipped if P2 can be skipped too
authorAlejandro Piñeiro <apinheiro@igalia.com>
Mon, 20 Apr 2020 23:09:00 +0000 (01:09 +0200)
committerAlejandro Piñeiro <apinheiro@igalia.com>
Wed, 22 Apr 2020 21:39:34 +0000 (23:39 +0200)
Configuration Parameter packets 1 and 2 are pointed as optional, but
it is not clearly stated if you can skip only P1 when P2 is needed.

In the practice, it seems that the situation P0 - non-P1 - P2 can
causes problems, and at least on the simulator, it seems that sampler
info are attempted to be accessed. So let's just be conservative, and
only skip P1 configuration if we can skip P2 configuration too.

Reviewed-by: Eric Anholt <eric@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4677>

src/broadcom/compiler/v3d40_tex.c

index 1e40e63f4ea5b41adea16572695859ffa7c56068..c3f7d94344aca2b932d3fbf68357bcbaf2a321cf 100644 (file)
@@ -216,7 +216,14 @@ v3d40_vir_emit_tex(struct v3d_compile *c, nir_tex_instr *instr)
         bool output_type_32_bit = (c->key->tex[unit].return_size == 32 &&
                                    !instr->is_shadow);
 
         bool output_type_32_bit = (c->key->tex[unit].return_size == 32 &&
                                    !instr->is_shadow);
 
-        if (output_type_32_bit || texture_instr_need_sampler(instr)) {
+        /*
+         * p1 is optional, but we can skip it only if p2 can be skipped too
+         */
+        bool needs_p2_config =
+                memcmp(&p2_unpacked, &p2_unpacked_default, sizeof(p2_unpacked)) != 0;
+
+        if (needs_p2_config || output_type_32_bit ||
+            texture_instr_need_sampler(instr)) {
                 struct V3D41_TMU_CONFIG_PARAMETER_1 p1_unpacked = {
                         .output_type_32_bit = output_type_32_bit,
 
                 struct V3D41_TMU_CONFIG_PARAMETER_1 p1_unpacked = {
                         .output_type_32_bit = output_type_32_bit,
 
@@ -248,7 +255,7 @@ v3d40_vir_emit_tex(struct v3d_compile *c, nir_tex_instr *instr)
                 vir_WRTMUC(c, QUNIFORM_TMU_CONFIG_P1, p1_packed);
         }
 
                 vir_WRTMUC(c, QUNIFORM_TMU_CONFIG_P1, p1_packed);
         }
 
-        if (memcmp(&p2_unpacked, &p2_unpacked_default, sizeof(p2_unpacked)) != 0)
+        if (needs_p2_config)
                 vir_WRTMUC(c, QUNIFORM_CONSTANT, p2_packed);
 
         if (instr->op == nir_texop_txf) {
                 vir_WRTMUC(c, QUNIFORM_CONSTANT, p2_packed);
 
         if (instr->op == nir_texop_txf) {