[g3dvl] join empty blocks to get larger slices
authorChristian König <deathsimple@vodafone.de>
Sun, 28 Nov 2010 00:21:41 +0000 (01:21 +0100)
committerChristian König <deathsimple@vodafone.de>
Sun, 28 Nov 2010 00:21:41 +0000 (01:21 +0100)
src/gallium/auxiliary/vl/vl_idct.c
src/gallium/auxiliary/vl/vl_idct.h

index 00aa829f6d2f217dc1c6d6f65b877cd33ad919c5..74adaf3dd4c539943ec5980aa42977ba44f24c65 100644 (file)
@@ -355,45 +355,6 @@ create_empty_block_frag_shader(struct vl_idct *idct)
    return ureg_create_shader_and_destroy(shader, idct->pipe);
 }
 
-static void
-xfer_buffers_map(struct vl_idct *idct)
-{
-   struct pipe_box rect =
-   {
-      0, 0, 0,
-      idct->textures.individual.source->width0,
-      idct->textures.individual.source->height0,
-      1
-   };
-
-   idct->tex_transfer = idct->pipe->get_transfer
-   (
-      idct->pipe, idct->textures.individual.source,
-      u_subresource(0, 0),
-      PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD,
-      &rect
-   );
-
-   idct->texels = idct->pipe->transfer_map(idct->pipe, idct->tex_transfer);
-
-   idct->vectors = pipe_buffer_map
-   (
-      idct->pipe,
-      idct->vertex_bufs.individual.pos.buffer,
-      PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD,
-      &idct->vec_transfer
-   );
-}
-
-static void
-xfer_buffers_unmap(struct vl_idct *idct)
-{
-   pipe_buffer_unmap(idct->pipe, idct->vertex_bufs.individual.pos.buffer, idct->vec_transfer);
-
-   idct->pipe->transfer_unmap(idct->pipe, idct->tex_transfer);
-   idct->pipe->transfer_destroy(idct->pipe, idct->tex_transfer);
-}
-
 static bool
 init_shaders(struct vl_idct *idct)
 {
@@ -678,6 +639,50 @@ vl_idct_upload_matrix(struct pipe_context *pipe)
    return matrix;
 }
 
+static void
+xfer_buffers_map(struct vl_idct *idct)
+{
+   struct pipe_box rect =
+   {
+      0, 0, 0,
+      idct->textures.individual.source->width0,
+      idct->textures.individual.source->height0,
+      1
+   };
+
+   idct->tex_transfer = idct->pipe->get_transfer
+   (
+      idct->pipe, idct->textures.individual.source,
+      u_subresource(0, 0),
+      PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD,
+      &rect
+   );
+
+   idct->texels = idct->pipe->transfer_map(idct->pipe, idct->tex_transfer);
+
+   idct->vectors = pipe_buffer_map
+   (
+      idct->pipe,
+      idct->vertex_bufs.individual.pos.buffer,
+      PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD,
+      &idct->vec_transfer
+   );
+
+   idct->next_empty_block.l_x = ~1;
+   idct->next_empty_block.l_y = ~1;
+   idct->next_empty_block.r_x = ~1;
+   idct->next_empty_block.r_y = ~1;
+}
+
+static void
+xfer_buffers_unmap(struct vl_idct *idct)
+{
+   pipe_buffer_unmap(idct->pipe, idct->vertex_bufs.individual.pos.buffer, idct->vec_transfer);
+
+   idct->pipe->transfer_unmap(idct->pipe, idct->tex_transfer);
+   idct->pipe->transfer_destroy(idct->pipe, idct->tex_transfer);
+}
+
 bool
 vl_idct_init(struct vl_idct *idct, struct pipe_context *pipe, struct pipe_resource *dst, struct pipe_resource *matrix)
 {
@@ -715,13 +720,44 @@ vl_idct_cleanup(struct vl_idct *idct)
    pipe_resource_reference(&idct->destination, NULL);
 }
 
+static void
+flush_empty_block(struct vl_idct *idct, unsigned new_x, unsigned new_y)
+{
+   if (idct->next_empty_block.l_x == ~1 ||
+       idct->next_empty_block.l_y == ~1) {
+   
+      idct->next_empty_block.l_x = new_x;
+      idct->next_empty_block.l_y = new_y;
+
+   } else if (idct->next_empty_block.r_x != (new_x - 1) ||
+              idct->next_empty_block.r_y != new_y) {
+
+      struct vertex2f l, r, *v_dst;
+
+      v_dst = idct->vectors + (idct->max_blocks - idct->num_empty_blocks) * 4 - 4;
+
+      l.x = idct->next_empty_block.l_x;
+      l.y = idct->next_empty_block.l_y;
+      r.x = idct->next_empty_block.r_x;
+      r.y = idct->next_empty_block.r_y;
+      v_dst[0] = v_dst[3] = l;
+      v_dst[1] = v_dst[2] = r;
+
+      idct->next_empty_block.l_x = new_x;
+      idct->next_empty_block.l_y = new_y;
+      idct->num_empty_blocks++;
+   }
+
+   idct->next_empty_block.r_x = new_x;
+   idct->next_empty_block.r_y = new_y;
+}
+
 void
 vl_idct_add_block(struct vl_idct *idct, unsigned x, unsigned y, short *block)
 {
    struct vertex2f v, *v_dst;
 
    unsigned tex_pitch;
-   unsigned nr_components;
    short *texels;
 
    unsigned i;
@@ -729,8 +765,6 @@ vl_idct_add_block(struct vl_idct *idct, unsigned x, unsigned y, short *block)
    assert(idct);
 
    if(block) {
-      nr_components = util_format_get_nr_components(idct->tex_transfer->resource->format);
-      
       tex_pitch = idct->tex_transfer->stride / sizeof(short);
       texels = idct->texels + y * tex_pitch * BLOCK_HEIGHT + x * BLOCK_WIDTH;
 
@@ -742,25 +776,24 @@ vl_idct_add_block(struct vl_idct *idct, unsigned x, unsigned y, short *block)
 
       idct->num_blocks++;
 
-   } else {
-
-      /* while empty blocks fills the vector buffer from right to left */
-      v_dst = idct->vectors + (idct->max_blocks - idct->num_empty_blocks) * 4 - 4;
+      v.x = x;
+      v.y = y;
 
-      idct->num_empty_blocks++;
-   }
+      for (i = 0; i < 4; ++i) {
+         v_dst[i] = v;
+      }
 
-   v.x = x;
-   v.y = y;
+   } else {
 
-   for (i = 0; i < 4; ++i) {
-      v_dst[i] = v;
+      /* while empty blocks fills the vector buffer from right to left */
+      flush_empty_block(idct, x, y);
    }
 }
 
 void
 vl_idct_flush(struct vl_idct *idct)
 {
+   flush_empty_block(idct, ~1, ~1);
    xfer_buffers_unmap(idct);
 
    if(idct->num_blocks > 0) {
index 7234382196febdb74642445a8cd72216aa8c21e5..c26f5cb8c09592ef5e0bc96d05a86e4b34fe2396 100644 (file)
@@ -83,6 +83,12 @@ struct vl_idct
    } vertex_bufs;
 
    unsigned num_blocks;
+
+   struct
+   {
+      unsigned l_x, l_y, r_x, r_y;
+   } next_empty_block;
+
    unsigned num_empty_blocks;
 
    struct pipe_transfer *tex_transfer;