gallium/vl: fix compute tgsi shaders to not process undefined components
[mesa.git] / src / gallium / auxiliary / vl / vl_compositor_cs.c
index bad7d5f0ea8f3d521b3a3528cf43a004ffa74f85..abd2aa63f32142531b2ca60928240f96df459ac5 100644 (file)
@@ -61,7 +61,7 @@ const char *compute_shader_video_buffer =
       "IMM[0] UINT32 { 8, 8, 1, 0}\n"
       "IMM[1] FLT32 { 1.0, 2.0, 0.0, 0.0}\n"
 
-      "UMAD TEMP[0], SV[1], IMM[0], SV[0]\n"
+      "UMAD TEMP[0].xy, SV[1].xyyy, IMM[0].xyyy, SV[0].xyyy\n"
 
       /* Drawn area check */
       "USGE TEMP[1].xy, TEMP[0].xyxy, CONST[4].xyxy\n"
@@ -70,20 +70,20 @@ const char *compute_shader_video_buffer =
       "AND TEMP[1].x, TEMP[1].xxxx, TEMP[1].zzzz\n"
       "AND TEMP[1].x, TEMP[1].xxxx, TEMP[1].wwww\n"
 
-      "UIF TEMP[1]\n"
+      "UIF TEMP[1].xxxx\n"
          /* Translate */
-         "UADD TEMP[2].xy, TEMP[0], -CONST[5].xyxy\n"
-         "U2F TEMP[2], TEMP[2]\n"
-         "DIV TEMP[3], TEMP[2], IMM[1].yyyy\n"
+         "UADD TEMP[2].xy, TEMP[0].xyyy, -CONST[5].xyxy\n"
+         "U2F TEMP[2].xy, TEMP[2].xyyy\n"
+         "DIV TEMP[3].xy, TEMP[2].xyyy, IMM[1].yyyy\n"
 
          /* Scale */
-         "DIV TEMP[2], TEMP[2], CONST[3].zwzw\n"
-         "DIV TEMP[3], TEMP[3], CONST[3].zwzw\n"
+         "DIV TEMP[2].xy, TEMP[2].xyyy, CONST[3].zwww\n"
+         "DIV TEMP[3].xy, TEMP[3].xyyy, CONST[3].zwww\n"
 
          /* Fetch texels */
-         "TEX_LZ TEMP[4].x, TEMP[2], SAMP[0], RECT\n"
-         "TEX_LZ TEMP[4].y, TEMP[3], SAMP[1], RECT\n"
-         "TEX_LZ TEMP[4].z, TEMP[3], SAMP[2], RECT\n"
+         "TEX_LZ TEMP[4].x, TEMP[2].xyyy, SAMP[0], RECT\n"
+         "TEX_LZ TEMP[4].y, TEMP[3].xyyy, SAMP[1], RECT\n"
+         "TEX_LZ TEMP[4].z, TEMP[3].xyyy, SAMP[2], RECT\n"
 
          "MOV TEMP[4].w, IMM[1].xxxx\n"
 
@@ -93,12 +93,12 @@ const char *compute_shader_video_buffer =
          "DP4 TEMP[7].z, CONST[2], TEMP[4]\n"
 
          "MOV TEMP[5].w, TEMP[4].zzzz\n"
-         "SLE TEMP[6].w, TEMP[5], CONST[3].xxxx\n"
-         "SGT TEMP[5].w, TEMP[5], CONST[3].yyyy\n"
+         "SLE TEMP[6].w, TEMP[5].wwww, CONST[3].xxxx\n"
+         "SGT TEMP[5].w, TEMP[5].wwww, CONST[3].yyyy\n"
 
-         "MAX TEMP[7].w, TEMP[5], TEMP[6]\n"
+         "MAX TEMP[7].w, TEMP[5].wwww, TEMP[6].wwww\n"
 
-         "STORE IMAGE[0], TEMP[0], TEMP[7], 2D\n"
+         "STORE IMAGE[0], TEMP[0].xyyy, TEMP[7], 2D\n"
       "ENDIF\n"
 
       "END\n";
@@ -124,7 +124,7 @@ const char *compute_shader_weave =
       "IMM[2] UINT32 { 1, 2, 4, 0}\n"
       "IMM[3] FLT32 { 0.25, 0.5, 0.125, 0.125}\n"
 
-      "UMAD TEMP[0], SV[1], IMM[0], SV[0]\n"
+      "UMAD TEMP[0].xy, SV[1].xyyy, IMM[0].xyyy, SV[0].xyyy\n"
 
       /* Drawn area check */
       "USGE TEMP[1].xy, TEMP[0].xyxy, CONST[4].xyxy\n"
@@ -133,22 +133,22 @@ const char *compute_shader_weave =
       "AND TEMP[1].x, TEMP[1].xxxx, TEMP[1].zzzz\n"
       "AND TEMP[1].x, TEMP[1].xxxx, TEMP[1].wwww\n"
 
-      "UIF TEMP[1]\n"
-         "MOV TEMP[2], TEMP[0]\n"
+      "UIF TEMP[1].xxxx\n"
+         "MOV TEMP[2].xy, TEMP[0].xyyy\n"
          /* Translate */
-         "UADD TEMP[2].xy, TEMP[2], -CONST[5].xyxy\n"
+         "UADD TEMP[2].xy, TEMP[2].xyyy, -CONST[5].xyxy\n"
 
          /* Top Y */
-         "U2F TEMP[2], TEMP[2]\n"
+         "U2F TEMP[2].xy, TEMP[2].xyyy\n"
          "DIV TEMP[2].y, TEMP[2].yyyy, IMM[1].yyyy\n"
          /* Down Y */
-         "MOV TEMP[12], TEMP[2]\n"
+         "MOV TEMP[12].xy, TEMP[2].xyyy\n"
 
          /* Top UV */
-         "MOV TEMP[3], TEMP[2]\n"
+         "MOV TEMP[3].xy, TEMP[2].xyyy\n"
          "DIV TEMP[3].xy, TEMP[3], IMM[1].yyyy\n"
          /* Down UV */
-         "MOV TEMP[13], TEMP[3]\n"
+         "MOV TEMP[13].xy, TEMP[3].xyyy\n"
 
          /* Texture offset */
          "ADD TEMP[2].x, TEMP[2].xxxx, IMM[3].yyyy\n"
@@ -162,10 +162,10 @@ const char *compute_shader_weave =
          "ADD TEMP[13].y, TEMP[13].yyyy, IMM[3].wwww\n"
 
          /* Scale */
-         "DIV TEMP[2].xy, TEMP[2], CONST[3].zwzw\n"
-         "DIV TEMP[12].xy, TEMP[12], CONST[3].zwzw\n"
-         "DIV TEMP[3].xy, TEMP[3], CONST[3].zwzw\n"
-         "DIV TEMP[13].xy, TEMP[13], CONST[3].zwzw\n"
+         "DIV TEMP[2].xy, TEMP[2].xyyy, CONST[3].zwzw\n"
+         "DIV TEMP[12].xy, TEMP[12].xyyy, CONST[3].zwzw\n"
+         "DIV TEMP[3].xy, TEMP[3].xyyy, CONST[3].zwzw\n"
+         "DIV TEMP[13].xy, TEMP[13].xyyy, CONST[3].zwzw\n"
 
          /* Weave offset */
          "ADD TEMP[2].y, TEMP[2].yyyy, IMM[3].xxxx\n"
@@ -176,32 +176,32 @@ const char *compute_shader_weave =
          /* Texture layer */
          "MOV TEMP[14].x, TEMP[2].yyyy\n"
          "MOV TEMP[14].yz, TEMP[3].yyyy\n"
-         "ROUND TEMP[15], TEMP[14]\n"
-         "ADD TEMP[14], TEMP[14], -TEMP[15]\n"
-         "MOV TEMP[14], |TEMP[14]|\n"
-         "MUL TEMP[14], TEMP[14], IMM[1].yyyy\n"
+         "ROUND TEMP[15].xyz, TEMP[14].xyzz\n"
+         "ADD TEMP[14].xyz, TEMP[14].xyzz, -TEMP[15].xyzz\n"
+         "MOV TEMP[14].xyz, |TEMP[14].xyzz|\n"
+         "MUL TEMP[14].xyz, TEMP[14].xyzz, IMM[1].yyyy\n"
 
          /* Normalize */
-         "DIV TEMP[2].xy, TEMP[2], CONST[5].zwzw\n"
-         "DIV TEMP[12].xy, TEMP[12], CONST[5].zwzw\n"
+         "DIV TEMP[2].xy, TEMP[2].xyyy, CONST[5].zwzw\n"
+         "DIV TEMP[12].xy, TEMP[12].xyyy, CONST[5].zwzw\n"
          "DIV TEMP[15].xy, CONST[5].zwzw, IMM[1].yyyy\n"
-         "DIV TEMP[3].xy, TEMP[3], TEMP[15].xyxy\n"
-         "DIV TEMP[13].xy, TEMP[13], TEMP[15].xyxy\n"
+         "DIV TEMP[3].xy, TEMP[3].xyyy, TEMP[15].xyxy\n"
+         "DIV TEMP[13].xy, TEMP[13].xyyy, TEMP[15].xyxy\n"
 
          /* Fetch texels */
          "MOV TEMP[2].z, IMM[1].wwww\n"
          "MOV TEMP[3].z, IMM[1].wwww\n"
-         "TEX_LZ TEMP[10].x, TEMP[2], SAMP[0], 2D_ARRAY\n"
-         "TEX_LZ TEMP[10].y, TEMP[3], SAMP[1], 2D_ARRAY\n"
-         "TEX_LZ TEMP[10].z, TEMP[3], SAMP[2], 2D_ARRAY\n"
+         "TEX_LZ TEMP[10].x, TEMP[2].xyzz, SAMP[0], 2D_ARRAY\n"
+         "TEX_LZ TEMP[10].y, TEMP[3].xyzz, SAMP[1], 2D_ARRAY\n"
+         "TEX_LZ TEMP[10].z, TEMP[3].xyzz, SAMP[2], 2D_ARRAY\n"
 
          "MOV TEMP[12].z, IMM[1].xxxx\n"
          "MOV TEMP[13].z, IMM[1].xxxx\n"
-         "TEX_LZ TEMP[11].x, TEMP[12], SAMP[0], 2D_ARRAY\n"
-         "TEX_LZ TEMP[11].y, TEMP[13], SAMP[1], 2D_ARRAY\n"
-         "TEX_LZ TEMP[11].z, TEMP[13], SAMP[2], 2D_ARRAY\n"
+         "TEX_LZ TEMP[11].x, TEMP[12].xyzz, SAMP[0], 2D_ARRAY\n"
+         "TEX_LZ TEMP[11].y, TEMP[13].xyzz, SAMP[1], 2D_ARRAY\n"
+         "TEX_LZ TEMP[11].z, TEMP[13].xyzz, SAMP[2], 2D_ARRAY\n"
 
-         "LRP TEMP[6], TEMP[14], TEMP[11], TEMP[10]\n"
+         "LRP TEMP[6].xyz, TEMP[14].xyzz, TEMP[10].xyzz, TEMP[11].xyzz\n"
          "MOV TEMP[6].w, IMM[1].xxxx\n"
 
          /* Color Space Conversion */
@@ -210,12 +210,12 @@ const char *compute_shader_weave =
          "DP4 TEMP[9].z, CONST[2], TEMP[6]\n"
 
          "MOV TEMP[7].w, TEMP[6].zzzz\n"
-         "SLE TEMP[8].w, TEMP[7], CONST[3].xxxx\n"
-         "SGT TEMP[7].w, TEMP[7], CONST[3].yyyy\n"
+         "SLE TEMP[8].w, TEMP[7].wwww, CONST[3].xxxx\n"
+         "SGT TEMP[7].w, TEMP[7].wwww, CONST[3].yyyy\n"
 
-         "MAX TEMP[9].w, TEMP[7], TEMP[8]\n"
+         "MAX TEMP[9].w, TEMP[7].wwww, TEMP[8].wwww\n"
 
-         "STORE IMAGE[0], TEMP[0], TEMP[9], 2D\n"
+         "STORE IMAGE[0], TEMP[0].xyyy, TEMP[9], 2D\n"
       "ENDIF\n"
 
       "END\n";
@@ -239,7 +239,7 @@ const char *compute_shader_rgba =
       "IMM[0] UINT32 { 8, 8, 1, 0}\n"
       "IMM[1] FLT32 { 1.0, 2.0, 0.0, 0.0}\n"
 
-      "UMAD TEMP[0], SV[1], IMM[0], SV[0]\n"
+      "UMAD TEMP[0].xy, SV[1].xyyy, IMM[0].xyyy, SV[0].xyyy\n"
 
       /* Drawn area check */
       "USGE TEMP[1].xy, TEMP[0].xyxy, CONST[4].xyxy\n"
@@ -248,18 +248,18 @@ const char *compute_shader_rgba =
       "AND TEMP[1].x, TEMP[1].xxxx, TEMP[1].zzzz\n"
       "AND TEMP[1].x, TEMP[1].xxxx, TEMP[1].wwww\n"
 
-      "UIF TEMP[1]\n"
+      "UIF TEMP[1].xxxx\n"
          /* Translate */
-         "UADD TEMP[2].xy, TEMP[0], -CONST[5].xyxy\n"
-         "U2F TEMP[2], TEMP[2]\n"
+         "UADD TEMP[2].xy, TEMP[0].xyyy, -CONST[5].xyxy\n"
+         "U2F TEMP[2].xy, TEMP[2].xyyy\n"
 
          /* Scale */
-         "DIV TEMP[2], TEMP[2], CONST[3].zwzw\n"
+         "DIV TEMP[2].xy, TEMP[2].xyyy, CONST[3].zwzw\n"
 
          /* Fetch texels */
-         "TEX_LZ TEMP[3], TEMP[2], SAMP[0], RECT\n"
+         "TEX_LZ TEMP[3], TEMP[2].xyyy, SAMP[0], RECT\n"
 
-         "STORE IMAGE[0], TEMP[0], TEMP[3], 2D\n"
+         "STORE IMAGE[0], TEMP[0].xyyy, TEMP[3], 2D\n"
       "ENDIF\n"
 
       "END\n";
@@ -292,6 +292,10 @@ cs_launch(struct vl_compositor *c,
    info.grid[2] = 1;
 
    ctx->launch_grid(ctx, &info);
+
+   /* Make the result visible to all clients. */
+   ctx->memory_barrier(ctx, PIPE_BARRIER_ALL);
+
 }
 
 static inline struct u_rect
@@ -362,7 +366,6 @@ draw_layers(struct vl_compositor       *c,
             struct u_rect              *dirty)
 {
    unsigned i;
-   static struct cs_viewport old_drawn;
 
    assert(c);
 
@@ -381,11 +384,7 @@ draw_layers(struct vl_compositor       *c,
          drawn.translate_y = (int)layer->viewport.translate[1];
          drawn.sampler0_w = (float)layer->sampler_views[0]->texture->width0;
          drawn.sampler0_h = (float)layer->sampler_views[0]->texture->height0;
-
-         if (memcmp(&drawn, &old_drawn, sizeof(struct cs_viewport))) {
-            set_viewport(s, &drawn);
-            old_drawn = drawn;
-         }
+         set_viewport(s, &drawn);
 
          c->pipe->bind_sampler_states(c->pipe, PIPE_SHADER_COMPUTE, 0,
                         num_sampler_views, layer->samplers);
@@ -394,6 +393,15 @@ draw_layers(struct vl_compositor       *c,
 
          cs_launch(c, layer->cs, &(drawn.area));
 
+         /* Unbind. */
+         c->pipe->set_shader_images(c->pipe, PIPE_SHADER_COMPUTE, 0, 1, NULL);
+         c->pipe->set_constant_buffer(c->pipe, PIPE_SHADER_COMPUTE, 0, NULL);
+         c->pipe->set_sampler_views(c->pipe, PIPE_SHADER_FRAGMENT, 0,
+                        num_sampler_views, NULL);
+         c->pipe->bind_compute_state(c->pipe, NULL);
+         c->pipe->bind_sampler_states(c->pipe, PIPE_SHADER_COMPUTE, 0,
+                        num_sampler_views, NULL);
+
          if (dirty) {
             struct u_rect drawn = calc_drawn_area(s, layer);
             dirty->x0 = MIN2(drawn.x0, dirty->x0);