vl/compositor: convert RGB buffer to YUV with color conversion
[mesa.git] / src / gallium / auxiliary / vl / vl_matrix_filter.c
index 56b7003f0fc3e39a79099272308b9f3dd423b7f7..1dacc7c6025ca6fa4d812ba74c19c2fd4f94b960 100644 (file)
@@ -18,7 +18,7 @@
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -52,7 +52,7 @@ create_vert_shader(struct vl_matrix_filter *filter)
    struct ureg_src i_vpos;
    struct ureg_dst o_vpos, o_vtex;
 
-   shader = ureg_create(TGSI_PROCESSOR_VERTEX);
+   shader = ureg_create(PIPE_SHADER_VERTEX);
    if (!shader)
       return NULL;
 
@@ -81,69 +81,50 @@ create_frag_shader(struct vl_matrix_filter *filter, unsigned num_offsets,
    struct ureg_program *shader;
    struct ureg_src i_vtex;
    struct ureg_src sampler;
-   struct ureg_dst *t_array = MALLOC(sizeof(struct ureg_dst) * num_offsets);
+   struct ureg_dst tmp;
    struct ureg_dst t_sum;
    struct ureg_dst o_fragment;
-   bool first;
-   int i;
+   unsigned i;
 
-   shader = ureg_create(TGSI_PROCESSOR_FRAGMENT);
+   shader = ureg_create(PIPE_SHADER_FRAGMENT);
    if (!shader) {
-      FREE(t_array);
       return NULL;
    }
 
    i_vtex = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTEX, TGSI_INTERPOLATE_LINEAR);
    sampler = ureg_DECL_sampler(shader, 0);
-
-   for (i = 0; i < num_offsets; ++i)
-      if (matrix_values[i] != 0.0f)
-         t_array[i] = ureg_DECL_temporary(shader);
-
+   ureg_DECL_sampler_view(shader, 0, TGSI_TEXTURE_2D,
+                          TGSI_RETURN_TYPE_FLOAT,
+                          TGSI_RETURN_TYPE_FLOAT,
+                          TGSI_RETURN_TYPE_FLOAT,
+                          TGSI_RETURN_TYPE_FLOAT);
+
+   tmp = ureg_DECL_temporary(shader);
+   t_sum = ureg_DECL_temporary(shader);
    o_fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0);
 
-   /*
-    * t_array[0..*] = vtex + offset[0..*]
-    * t_array[0..*] = tex(t_array[0..*], sampler)
-    * o_fragment = sum(t_array[0..*] * matrix_values[0..*])
-    */
-
+   ureg_MOV(shader, t_sum, ureg_imm1f(shader, 0.0f));
    for (i = 0; i < num_offsets; ++i) {
-      if (matrix_values[i] != 0.0f && !is_vec_zero(offsets[i])) {
-         ureg_ADD(shader, ureg_writemask(t_array[i], TGSI_WRITEMASK_XY),
+      if (matrix_values[i] == 0.0f)
+         continue;
+
+      if (!is_vec_zero(offsets[i])) {
+         ureg_ADD(shader, ureg_writemask(tmp, TGSI_WRITEMASK_XY),
                   i_vtex, ureg_imm2f(shader, offsets[i].x, offsets[i].y));
-         ureg_MOV(shader, ureg_writemask(t_array[i], TGSI_WRITEMASK_ZW),
+         ureg_MOV(shader, ureg_writemask(tmp, TGSI_WRITEMASK_ZW),
                   ureg_imm1f(shader, 0.0f));
+         ureg_TEX(shader, tmp, TGSI_TEXTURE_2D, ureg_src(tmp), sampler);
+      } else {
+         ureg_TEX(shader, tmp, TGSI_TEXTURE_2D, i_vtex, sampler);
       }
+      ureg_MAD(shader, t_sum, ureg_src(tmp), ureg_imm1f(shader, matrix_values[i]),
+               ureg_src(t_sum));
    }
 
-   for (i = 0; i < num_offsets; ++i) {
-      if (matrix_values[i] != 0.0f) {
-         struct ureg_src src = is_vec_zero(offsets[i]) ? i_vtex : ureg_src(t_array[i]);
-         ureg_TEX(shader, t_array[i], TGSI_TEXTURE_2D, src, sampler);
-      }
-   }
-
-   for (i = 0, first = true; i < num_offsets; ++i) {
-      if (matrix_values[i] != 0.0f) {
-         if (first) {
-            t_sum = t_array[i];
-            ureg_MUL(shader, t_sum, ureg_src(t_array[i]),
-                     ureg_imm1f(shader, matrix_values[i]));
-            first = false;
-         } else
-            ureg_MAD(shader, t_sum, ureg_src(t_array[i]),
-                     ureg_imm1f(shader, matrix_values[i]), ureg_src(t_sum));
-      }
-   }
-   if (first)
-      ureg_MOV(shader, o_fragment, ureg_imm1f(shader, 0.0f));
-   else
-      ureg_MOV(shader, o_fragment, ureg_src(t_sum));
+   ureg_MOV(shader, o_fragment, ureg_src(t_sum));
 
    ureg_END(shader);
 
-   FREE(t_array);
    return ureg_create_shader_and_destroy(shader, filter->pipe);
 }
 
@@ -203,7 +184,7 @@ vl_matrix_filter_init(struct vl_matrix_filter *filter, struct pipe_context *pipe
       goto error_sampler;
 
    filter->quad = vl_vb_upload_quads(pipe);
-   if(!filter->quad.buffer)
+   if(!filter->quad.buffer.resource)
       goto error_quad;
 
    memset(&ve, 0, sizeof(ve));
@@ -252,7 +233,7 @@ error_offsets:
    pipe->delete_vertex_elements_state(pipe, filter->ves);
 
 error_ves:
-   pipe_resource_reference(&filter->quad.buffer, NULL);
+   pipe_resource_reference(&filter->quad.buffer.resource, NULL);
 
 error_quad:
    pipe->delete_sampler_state(pipe, filter->sampler);
@@ -276,7 +257,7 @@ vl_matrix_filter_cleanup(struct vl_matrix_filter *filter)
    filter->pipe->delete_blend_state(filter->pipe, filter->blend);
    filter->pipe->delete_rasterizer_state(filter->pipe, filter->rs_state);
    filter->pipe->delete_vertex_elements_state(filter->pipe, filter->ves);
-   pipe_resource_reference(&filter->quad.buffer, NULL);
+   pipe_resource_reference(&filter->quad.buffer.resource, NULL);
 
    filter->pipe->delete_vs_state(filter->pipe, filter->vs);
    filter->pipe->delete_fs_state(filter->pipe, filter->fs);
@@ -296,7 +277,6 @@ vl_matrix_filter_render(struct vl_matrix_filter *filter,
    viewport.scale[0] = dst->width;
    viewport.scale[1] = dst->height;
    viewport.scale[2] = 1;
-   viewport.scale[3] = 1;
 
    memset(&fb_state, 0, sizeof(fb_state));
    fb_state.width = dst->width;