[g3dvl] cleanup idct init

This commit is contained in:
Christian König
2011-03-20 19:29:47 +01:00
parent 1a238efe42
commit 713a52d856
+70 -47
View File
@@ -258,8 +258,7 @@ vl_mpeg12_create_surface(struct pipe_video_context *vpipe,
static boolean
vl_mpeg12_is_format_supported(struct pipe_video_context *vpipe,
enum pipe_format format,
unsigned usage,
unsigned geom)
unsigned usage)
{
struct vl_mpeg12_context *ctx = (struct vl_mpeg12_context*)vpipe;
@@ -600,6 +599,51 @@ init_pipe_state(struct vl_mpeg12_context *ctx)
return true;
}
static bool
init_idct(struct vl_mpeg12_context *ctx, unsigned buffer_width, unsigned buffer_height)
{
unsigned chroma_width, chroma_height, chroma_blocks_x, chroma_blocks_y;
struct pipe_resource *idct_matrix;
/* TODO: Implement 422, 444 */
assert(ctx->base.chroma_format == PIPE_VIDEO_CHROMA_FORMAT_420);
ctx->empty_block_mask = &const_empty_block_mask_420;
if (!(idct_matrix = vl_idct_upload_matrix(ctx->pipe)))
return false;
if (!vl_idct_init(&ctx->idct_y, ctx->pipe, buffer_width, buffer_height,
2, 2, TGSI_SWIZZLE_X, idct_matrix))
return false;
if (ctx->base.chroma_format == PIPE_VIDEO_CHROMA_FORMAT_420) {
chroma_width = buffer_width / 2;
chroma_height = buffer_height / 2;
chroma_blocks_x = 1;
chroma_blocks_y = 1;
} else if (ctx->base.chroma_format == PIPE_VIDEO_CHROMA_FORMAT_422) {
chroma_width = buffer_width;
chroma_height = buffer_height / 2;
chroma_blocks_x = 2;
chroma_blocks_y = 1;
} else {
chroma_width = buffer_width;
chroma_height = buffer_height;
chroma_blocks_x = 2;
chroma_blocks_y = 2;
}
if(!vl_idct_init(&ctx->idct_cr, ctx->pipe, chroma_width, chroma_height,
chroma_blocks_x, chroma_blocks_y, TGSI_SWIZZLE_Z, idct_matrix))
return false;
if(!vl_idct_init(&ctx->idct_cb, ctx->pipe, chroma_width, chroma_height,
chroma_blocks_x, chroma_blocks_y, TGSI_SWIZZLE_Y, idct_matrix))
return false;
return true;
}
struct pipe_video_context *
vl_create_mpeg12_context(struct pipe_context *pipe,
enum pipe_video_profile profile,
@@ -608,10 +652,8 @@ vl_create_mpeg12_context(struct pipe_context *pipe,
bool pot_buffers,
enum pipe_format decode_format)
{
struct pipe_resource *idct_matrix;
unsigned buffer_width, buffer_height;
unsigned chroma_width, chroma_height, chroma_blocks_x, chroma_blocks_y;
struct vl_mpeg12_context *ctx;
unsigned buffer_width, buffer_height;
assert(u_reduce_video_profile(profile) == PIPE_VIDEO_CODEC_MPEG12);
@@ -620,12 +662,6 @@ vl_create_mpeg12_context(struct pipe_context *pipe,
if (!ctx)
return NULL;
/* TODO: Non-pot buffers untested, probably doesn't work without changes to texcoord generation, vert shader, etc */
assert(pot_buffers);
buffer_width = pot_buffers ? util_next_power_of_two(width) : width;
buffer_height = pot_buffers ? util_next_power_of_two(height) : height;
ctx->base.profile = profile;
ctx->base.chroma_format = chroma_format;
ctx->base.width = width;
@@ -666,44 +702,22 @@ vl_create_mpeg12_context(struct pipe_context *pipe,
return NULL;
}
/* TODO: Implement 422, 444 */
assert(chroma_format == PIPE_VIDEO_CHROMA_FORMAT_420);
ctx->empty_block_mask = &const_empty_block_mask_420;
/* TODO: Non-pot buffers untested, probably doesn't work without changes to texcoord generation, vert shader, etc */
assert(pot_buffers);
buffer_width = pot_buffers ? util_next_power_of_two(width) : width;
buffer_height = pot_buffers ? util_next_power_of_two(height) : height;
if (!(idct_matrix = vl_idct_upload_matrix(ctx->pipe)))
return false;
if (!vl_idct_init(&ctx->idct_y, ctx->pipe, buffer_width, buffer_height,
2, 2, TGSI_SWIZZLE_X, idct_matrix))
return false;
if (chroma_format == PIPE_VIDEO_CHROMA_FORMAT_420) {
chroma_width = buffer_width / 2;
chroma_height = buffer_height / 2;
chroma_blocks_x = 1;
chroma_blocks_y = 1;
} else if (chroma_format == PIPE_VIDEO_CHROMA_FORMAT_422) {
chroma_width = buffer_width;
chroma_height = buffer_height / 2;
chroma_blocks_x = 2;
chroma_blocks_y = 1;
} else {
chroma_width = buffer_width;
chroma_height = buffer_height;
chroma_blocks_x = 2;
chroma_blocks_y = 2;
if (!init_idct(ctx, buffer_width, buffer_height)) {
ctx->pipe->destroy(ctx->pipe);
FREE(ctx);
return NULL;
}
if(!vl_idct_init(&ctx->idct_cr, ctx->pipe, chroma_width, chroma_height,
chroma_blocks_x, chroma_blocks_y, TGSI_SWIZZLE_Z, idct_matrix))
return false;
if(!vl_idct_init(&ctx->idct_cb, ctx->pipe, chroma_width, chroma_height,
chroma_blocks_x, chroma_blocks_y, TGSI_SWIZZLE_Y, idct_matrix))
return false;
if (!vl_mpeg12_mc_renderer_init(&ctx->mc_renderer, ctx->pipe,
buffer_width, buffer_height, chroma_format)) {
vl_idct_cleanup(&ctx->idct_y);
vl_idct_cleanup(&ctx->idct_cr);
vl_idct_cleanup(&ctx->idct_cb);
ctx->pipe->destroy(ctx->pipe);
FREE(ctx);
return NULL;
@@ -711,6 +725,9 @@ vl_create_mpeg12_context(struct pipe_context *pipe,
ctx->buffer_map = util_new_keymap(sizeof(unsigned), -1, delete_buffer);
if (!ctx->buffer_map) {
vl_idct_cleanup(&ctx->idct_y);
vl_idct_cleanup(&ctx->idct_cr);
vl_idct_cleanup(&ctx->idct_cb);
vl_mpeg12_mc_renderer_cleanup(&ctx->mc_renderer);
ctx->pipe->destroy(ctx->pipe);
FREE(ctx);
@@ -718,17 +735,23 @@ vl_create_mpeg12_context(struct pipe_context *pipe,
}
if (!vl_compositor_init(&ctx->compositor, ctx->pipe)) {
util_delete_keymap(ctx->buffer_map, ctx);
vl_idct_cleanup(&ctx->idct_y);
vl_idct_cleanup(&ctx->idct_cr);
vl_idct_cleanup(&ctx->idct_cb);
vl_mpeg12_mc_renderer_cleanup(&ctx->mc_renderer);
util_delete_keymap(ctx->buffer_map, ctx);
ctx->pipe->destroy(ctx->pipe);
FREE(ctx);
return NULL;
}
if (!init_pipe_state(ctx)) {
vl_compositor_cleanup(&ctx->compositor);
util_delete_keymap(ctx->buffer_map, ctx);
vl_idct_cleanup(&ctx->idct_y);
vl_idct_cleanup(&ctx->idct_cr);
vl_idct_cleanup(&ctx->idct_cb);
vl_mpeg12_mc_renderer_cleanup(&ctx->mc_renderer);
util_delete_keymap(ctx->buffer_map, ctx);
vl_compositor_cleanup(&ctx->compositor);
ctx->pipe->destroy(ctx->pipe);
FREE(ctx);
return NULL;