[g3dvl] move mapping/unmapping and uploading of blocks out of idct code
authorChristian König <deathsimple@vodafone.de>
Thu, 7 Apr 2011 17:24:22 +0000 (19:24 +0200)
committerChristian König <deathsimple@vodafone.de>
Thu, 7 Apr 2011 17:24:22 +0000 (19:24 +0200)
src/gallium/auxiliary/vl/vl_idct.c
src/gallium/auxiliary/vl/vl_idct.h
src/gallium/auxiliary/vl/vl_mpeg12_decoder.c
src/gallium/auxiliary/vl/vl_mpeg12_decoder.h

index c92659bc5b05a009571debf593904d0888de83d3..a7b8a18dec3848c8a140ca75bc3c3113d274a7b6 100644 (file)
@@ -702,60 +702,6 @@ vl_idct_cleanup_buffer(struct vl_idct *idct, struct vl_idct_buffer *buffer)
    cleanup_intermediate(idct, buffer);
 }
 
-void
-vl_idct_map_buffers(struct vl_idct *idct, struct vl_idct_buffer *buffer)
-{
-   struct pipe_resource *tex;
-
-   assert(idct && buffer);
-
-   tex = buffer->sampler_views.individual.source->texture;
-
-   struct pipe_box rect =
-   {
-      0, 0, 0,
-      tex->width0,
-      tex->height0,
-      1
-   };
-
-   buffer->tex_transfer = idct->pipe->get_transfer
-   (
-      idct->pipe, tex,
-      0, PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD,
-      &rect
-   );
-
-   buffer->texels = idct->pipe->transfer_map(idct->pipe, buffer->tex_transfer);
-}
-
-void
-vl_idct_add_block(struct vl_idct_buffer *buffer, unsigned x, unsigned y, short *block)
-{
-   unsigned tex_pitch;
-   short *texels;
-
-   unsigned i;
-
-   assert(buffer);
-   assert(block);
-
-   tex_pitch = buffer->tex_transfer->stride / sizeof(short);
-   texels = buffer->texels + y * tex_pitch * BLOCK_HEIGHT + x * BLOCK_WIDTH;
-
-   for (i = 0; i < BLOCK_HEIGHT; ++i)
-      memcpy(texels + i * tex_pitch, block + i * BLOCK_WIDTH, BLOCK_WIDTH * sizeof(short));
-}
-
-void
-vl_idct_unmap_buffers(struct vl_idct *idct, struct vl_idct_buffer *buffer)
-{
-   assert(idct && buffer);
-
-   idct->pipe->transfer_unmap(idct->pipe, buffer->tex_transfer);
-   idct->pipe->transfer_destroy(idct->pipe, buffer->tex_transfer);
-}
-
 void
 vl_idct_flush(struct vl_idct *idct, struct vl_idct_buffer *buffer, unsigned num_instances)
 {
index fedebd3ff215e03b7ef08e5166303491cb3763a7..cd62cde449b5a203bb2918ab1c325f16f2ba783a 100644 (file)
@@ -66,9 +66,6 @@ struct vl_idct_buffer
          struct pipe_sampler_view *transpose, *intermediate;
       } individual;
    } sampler_views;
-
-   struct pipe_transfer *tex_transfer;
-   short *texels;
 };
 
 /* upload the idct matrix, which can be shared by all idct instances of a pipe */
@@ -90,15 +87,6 @@ bool vl_idct_init_buffer(struct vl_idct *idct, struct vl_idct_buffer *buffer,
 /* cleanup a buffer of an idct instance */
 void vl_idct_cleanup_buffer(struct vl_idct *idct, struct vl_idct_buffer *buffer);
 
-/* map a buffer for use with vl_idct_add_block */
-void vl_idct_map_buffers(struct vl_idct *idct, struct vl_idct_buffer *buffer);
-
-/* add an block of to be tranformed data a the given x and y coordinate */
-void vl_idct_add_block(struct vl_idct_buffer *buffer, unsigned x, unsigned y, short *block);
-
-/* unmaps the buffers before flushing */
-void vl_idct_unmap_buffers(struct vl_idct *idct, struct vl_idct_buffer *buffer);
-
 /* flush the buffer and start rendering, vertex buffers needs to be setup before calling this */
 void vl_idct_flush(struct vl_idct *idct, struct vl_idct_buffer *buffer, unsigned num_verts);
 
index c07b1bb369eabf28ef8e3df0ffea4f5da269c074..24f385681c2edb4287f668c630306536bc1a942f 100644 (file)
@@ -50,6 +50,58 @@ static const unsigned const_empty_block_mask_420[3][2][2] = {
         { { 0x01, 0x01 },  { 0x01, 0x01 } }
 };
 
+static void
+map_buffers(struct vl_mpeg12_decoder *ctx, struct vl_mpeg12_buffer *buffer)
+{
+   struct pipe_sampler_view **sampler_views;
+   struct pipe_resource *tex;
+   unsigned i;
+
+   assert(ctx && buffer);
+
+   sampler_views = buffer->idct_source->get_sampler_views(buffer->idct_source);
+   assert(sampler_views);
+
+   for (i = 0; i < VL_MAX_PLANES; ++i) {
+      tex = sampler_views[i]->texture;
+
+      struct pipe_box rect =
+      {
+         0, 0, 0,
+         tex->width0,
+         tex->height0,
+         1
+      };
+
+      buffer->tex_transfer[i] = ctx->pipe->get_transfer
+      (
+         ctx->pipe, tex,
+         0, PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD,
+         &rect
+      );
+
+      buffer->texels[i] = ctx->pipe->transfer_map(ctx->pipe, buffer->tex_transfer[i]);
+   }
+}
+
+static void
+upload_block(struct vl_mpeg12_buffer *buffer, unsigned plane, unsigned x, unsigned y, short *block)
+{
+   unsigned tex_pitch;
+   short *texels;
+
+   unsigned i;
+
+   assert(buffer);
+   assert(block);
+
+   tex_pitch = buffer->tex_transfer[plane]->stride / sizeof(short);
+   texels = buffer->texels[plane] + y * tex_pitch * BLOCK_HEIGHT + x * BLOCK_WIDTH;
+
+   for (i = 0; i < BLOCK_HEIGHT; ++i)
+      memcpy(texels + i * tex_pitch, block + i * BLOCK_WIDTH, BLOCK_WIDTH * sizeof(short));
+}
+
 static void
 upload_buffer(struct vl_mpeg12_decoder *ctx,
               struct vl_mpeg12_buffer *buffer,
@@ -67,7 +119,7 @@ upload_buffer(struct vl_mpeg12_decoder *ctx,
    for (y = 0; y < 2; ++y) {
       for (x = 0; x < 2; ++x, ++tb) {
          if (mb->cbp & (*ctx->empty_block_mask)[0][y][x]) {
-            vl_idct_add_block(&buffer->idct[0], mb->mbx * 2 + x, mb->mby * 2 + y, blocks);
+            upload_block(buffer, 0, mb->mbx * 2 + x, mb->mby * 2 + y, blocks);
             blocks += BLOCK_WIDTH * BLOCK_HEIGHT;
          }
       }
@@ -78,12 +130,25 @@ upload_buffer(struct vl_mpeg12_decoder *ctx,
 
    for (tb = 1; tb < 3; ++tb) {
       if (mb->cbp & (*ctx->empty_block_mask)[tb][0][0]) {
-         vl_idct_add_block(&buffer->idct[tb], mb->mbx, mb->mby, blocks);
+         upload_block(buffer, tb, mb->mbx, mb->mby, blocks);
          blocks += BLOCK_WIDTH * BLOCK_HEIGHT;
       }
    }
 }
 
+static void
+unmap_buffers(struct vl_mpeg12_decoder *ctx, struct vl_mpeg12_buffer *buffer)
+{
+   unsigned i;
+
+   assert(ctx && buffer);
+
+   for (i = 0; i < VL_MAX_PLANES; ++i) {
+      ctx->pipe->transfer_unmap(ctx->pipe, buffer->tex_transfer[i]);
+      ctx->pipe->transfer_destroy(ctx->pipe, buffer->tex_transfer[i]);
+   }
+}
+
 static void
 vl_mpeg12_buffer_destroy(struct pipe_video_decode_buffer *buffer)
 {
@@ -115,9 +180,7 @@ vl_mpeg12_buffer_map(struct pipe_video_decode_buffer *buffer)
    assert(dec);
 
    vl_vb_map(&buf->vertex_stream, dec->pipe);
-   vl_idct_map_buffers(&dec->idct_y, &buf->idct[0]);
-   vl_idct_map_buffers(&dec->idct_c, &buf->idct[1]);
-   vl_idct_map_buffers(&dec->idct_c, &buf->idct[2]);
+   map_buffers(dec, buf);
 }
 
 static void
@@ -156,9 +219,7 @@ vl_mpeg12_buffer_unmap(struct pipe_video_decode_buffer *buffer)
    assert(dec);
 
    vl_vb_unmap(&buf->vertex_stream, dec->pipe);
-   vl_idct_unmap_buffers(&dec->idct_y, &buf->idct[0]);
-   vl_idct_unmap_buffers(&dec->idct_c, &buf->idct[1]);
-   vl_idct_unmap_buffers(&dec->idct_c, &buf->idct[2]);
+   unmap_buffers(dec, buf);
 }
 
 static void
index f7dc2d5799a7394fc9660e733950bfac269adace..69d649b179a981370c965e2c13d519723f2482d3 100644 (file)
@@ -76,6 +76,9 @@ struct vl_mpeg12_buffer
 
    struct vl_idct_buffer idct[VL_MAX_PLANES];
    struct vl_mpeg12_mc_buffer mc[VL_MAX_PLANES];
+
+   struct pipe_transfer *tex_transfer[VL_MAX_PLANES];
+   short *texels[VL_MAX_PLANES];
 };
 
 /* drivers can call this function in their pipe_video_context constructors and pass it