freedreno/ir3: insert mov if same instruction in the outputs.
authorHyunjun Ko <zzoon@igalia.com>
Thu, 30 Aug 2018 02:58:54 +0000 (11:58 +0900)
committerRob Clark <robdclark@gmail.com>
Wed, 5 Sep 2018 17:38:43 +0000 (13:38 -0400)
For example,

    result0 = texture(sampler[indexBase + 5], coords);
    result1 = texture(sampler[indexBase + 0], coords);
    result2 = texture(sampler[indexBase + 0], coords);
    out_result0 = result0;
    out_result1 = result1;
    out_result2 = result2;

In this kind of case we need to insert an extra mov to the outputs
so that the result could be assigned to each register respectively.

Signed-off-by: Rob Clark <robdclark@gmail.com>
src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c

index 21b2a8b6d22bef6bd15216562b70fac27ba3cd07..79314140d874beaea8583306ef478e982e192ddc 100644 (file)
@@ -3679,6 +3679,20 @@ ir3_compile_shader_nir(struct ir3_compiler *compiler,
 
        ir3_cp(ir, so);
 
+       /* Insert mov if there's same instruction for each output.
+        * eg. dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler.const_expression.vertex.sampler2dshadow
+        */
+       for (int i = ir->noutputs - 1; i >= 0; i--) {
+               if (!ir->outputs[i])
+                       continue;
+               for (unsigned j = 0; j < i; j++) {
+                       if (ir->outputs[i] == ir->outputs[j]) {
+                               ir->outputs[i] =
+                                       ir3_MOV(ir->outputs[i]->block, ir->outputs[i], TYPE_F32);
+                       }
+               }
+       }
+
        if (fd_mesa_debug & FD_DBG_OPTMSGS) {
                printf("BEFORE GROUPING:\n");
                ir3_print(ir);