[g3dvl] move mapping/unmapping and uploading of blocks out of idct code

This commit is contained in:
Christian König
2011-04-07 19:24:22 +02:00
parent 2c21d28e83
commit 9d2e630cd0
4 changed files with 72 additions and 74 deletions
-54
View 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)
{
-12
View 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);
+69 -8
View 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
@@ -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