diff options
Diffstat (limited to 'src/gallium/drivers/nv50')
-rw-r--r-- | src/gallium/drivers/nv50/nv50_context.h | 14 | ||||
-rw-r--r-- | src/gallium/drivers/nv50/nv84_video.c | 40 | ||||
-rw-r--r-- | src/gallium/drivers/nv50/nv98_video.c | 45 |
3 files changed, 33 insertions, 66 deletions
diff --git a/src/gallium/drivers/nv50/nv50_context.h b/src/gallium/drivers/nv50/nv50_context.h index 52a1aa5147d..3c24546beef 100644 --- a/src/gallium/drivers/nv50/nv50_context.h +++ b/src/gallium/drivers/nv50/nv50_context.h @@ -292,12 +292,7 @@ void nv50_push_vbo(struct nv50_context *, const struct pipe_draw_info *); /* nv84_video.c */ struct pipe_video_decoder * nv84_create_decoder(struct pipe_context *context, - enum pipe_video_profile profile, - enum pipe_video_entrypoint entrypoint, - enum pipe_video_chroma_format chroma_format, - unsigned width, unsigned height, - unsigned max_references, - bool expect_chunked_decode); + const struct pipe_video_decoder *templ); struct pipe_video_buffer * nv84_video_buffer_create(struct pipe_context *pipe, @@ -316,12 +311,7 @@ nv84_screen_video_supported(struct pipe_screen *screen, /* nv98_video.c */ struct pipe_video_decoder * nv98_create_decoder(struct pipe_context *context, - enum pipe_video_profile profile, - enum pipe_video_entrypoint entrypoint, - enum pipe_video_chroma_format chroma_format, - unsigned width, unsigned height, - unsigned max_references, - bool expect_chunked_decode); + const struct pipe_video_decoder *templ); struct pipe_video_buffer * nv98_video_buffer_create(struct pipe_context *pipe, diff --git a/src/gallium/drivers/nv50/nv84_video.c b/src/gallium/drivers/nv50/nv84_video.c index 8c3c3b796c3..aedb9efc149 100644 --- a/src/gallium/drivers/nv50/nv84_video.c +++ b/src/gallium/drivers/nv50/nv84_video.c @@ -263,12 +263,7 @@ nv84_decoder_destroy(struct pipe_video_decoder *decoder) struct pipe_video_decoder * nv84_create_decoder(struct pipe_context *context, - enum pipe_video_profile profile, - enum pipe_video_entrypoint entrypoint, - enum pipe_video_chroma_format chroma_format, - unsigned width, unsigned height, - unsigned max_references, - bool chunked_decode) + const struct pipe_video_decoder *templ) { struct nv50_context *nv50 = (struct nv50_context *)context; struct nouveau_screen *screen = &nv50->screen->base; @@ -279,22 +274,20 @@ nv84_create_decoder(struct pipe_context *context, union pipe_color_union color; struct nv04_fifo nv04_data = { .vram = 0xbeef0201, .gart = 0xbeef0202 }; int ret, i; - int is_h264 = u_reduce_video_profile(profile) == PIPE_VIDEO_CODEC_MPEG4_AVC; - int is_mpeg12 = u_reduce_video_profile(profile) == PIPE_VIDEO_CODEC_MPEG12; + int is_h264 = u_reduce_video_profile(templ->profile) == PIPE_VIDEO_CODEC_MPEG4_AVC; + int is_mpeg12 = u_reduce_video_profile(templ->profile) == PIPE_VIDEO_CODEC_MPEG12; if (getenv("XVMC_VL")) - return vl_create_decoder(context, profile, entrypoint, - chroma_format, width, height, - max_references, chunked_decode); + return vl_create_decoder(context, templ); - if ((is_h264 && entrypoint != PIPE_VIDEO_ENTRYPOINT_BITSTREAM) || - (is_mpeg12 && entrypoint > PIPE_VIDEO_ENTRYPOINT_IDCT)) { - debug_printf("%x\n", entrypoint); + if ((is_h264 && templ->entrypoint != PIPE_VIDEO_ENTRYPOINT_BITSTREAM) || + (is_mpeg12 && templ->entrypoint > PIPE_VIDEO_ENTRYPOINT_IDCT)) { + debug_printf("%x\n", templ->entrypoint); return NULL; } if (!is_h264 && !is_mpeg12) { - debug_printf("invalid profile: %x\n", profile); + debug_printf("invalid profile: %x\n", templ->profile); return NULL; } @@ -302,13 +295,8 @@ nv84_create_decoder(struct pipe_context *context, if (!dec) return NULL; + dec->base = *templ; dec->base.context = context; - dec->base.profile = profile; - dec->base.entrypoint = entrypoint; - dec->base.chroma_format = chroma_format; - dec->base.width = width; - dec->base.height = height; - dec->base.max_references = max_references; dec->base.destroy = nv84_decoder_destroy; dec->base.flush = nv84_decoder_flush; if (is_h264) { @@ -326,7 +314,7 @@ nv84_create_decoder(struct pipe_context *context, dec->base.begin_frame = nv84_decoder_begin_frame_mpeg12; dec->base.end_frame = nv84_decoder_end_frame_mpeg12; - if (entrypoint == PIPE_VIDEO_ENTRYPOINT_BITSTREAM) { + if (templ->entrypoint == PIPE_VIDEO_ENTRYPOINT_BITSTREAM) { dec->mpeg12_bs = CALLOC_STRUCT(vl_mpg12_bs); if (!dec->mpeg12_bs) goto fail; @@ -409,7 +397,7 @@ nv84_create_decoder(struct pipe_context *context, goto fail; ret = nouveau_bo_new(screen->device, NOUVEAU_BO_VRAM | NOUVEAU_BO_NOSNOOP, 0, - (max_references + 1) * dec->frame_mbs * 0x40 + + (templ->max_references + 1) * dec->frame_mbs * 0x40 + dec->frame_size + 0x2000, NULL, &dec->mbring); if (ret) @@ -433,8 +421,8 @@ nv84_create_decoder(struct pipe_context *context, if (is_mpeg12) { ret = nouveau_bo_new(screen->device, NOUVEAU_BO_GART, 0, - align(0x20 * mb(width) * mb(height), 0x100) + - (6 * 64 * 8) * mb(width) * mb(height) + 0x100, + align(0x20 * mb(templ->width) * mb(templ->height), 0x100) + + (6 * 64 * 8) * mb(templ->width) * mb(templ->height) + 0x100, NULL, &dec->mpeg12_bo); if (ret) goto fail; @@ -485,7 +473,7 @@ nv84_create_decoder(struct pipe_context *context, color.f[0] = color.f[1] = color.f[2] = color.f[3] = 0; surf.offset = dec->frame_size; surf.width = 64; - surf.height = (max_references + 1) * dec->frame_mbs / 4; + surf.height = (templ->max_references + 1) * dec->frame_mbs / 4; surf.depth = 1; surf.base.format = PIPE_FORMAT_B8G8R8A8_UNORM; surf.base.u.tex.level = 0; diff --git a/src/gallium/drivers/nv50/nv98_video.c b/src/gallium/drivers/nv50/nv98_video.c index f16fbd07a9d..60bc79b222c 100644 --- a/src/gallium/drivers/nv50/nv98_video.c +++ b/src/gallium/drivers/nv50/nv98_video.c @@ -58,11 +58,7 @@ nv98_decoder_decode_bitstream(struct pipe_video_decoder *decoder, struct pipe_video_decoder * nv98_create_decoder(struct pipe_context *context, - enum pipe_video_profile profile, - enum pipe_video_entrypoint entrypoint, - enum pipe_video_chroma_format chroma_format, - unsigned width, unsigned height, unsigned max_references, - bool chunked_decode) + const struct pipe_video_decoder *templ) { struct nouveau_screen *screen = &((struct nv50_context *)context)->screen->base; struct nouveau_vp3_decoder *dec; @@ -79,12 +75,10 @@ nv98_create_decoder(struct pipe_context *context, u32 tmp_size = 0; if (getenv("XVMC_VL")) - return vl_create_decoder(context, profile, entrypoint, - chroma_format, width, height, - max_references, chunked_decode); + return vl_create_decoder(context, templ); - if (entrypoint != PIPE_VIDEO_ENTRYPOINT_BITSTREAM) { - debug_printf("%x\n", entrypoint); + if (templ->entrypoint != PIPE_VIDEO_ENTRYPOINT_BITSTREAM) { + debug_printf("%x\n", templ->entrypoint); return NULL; } @@ -142,13 +136,8 @@ nv98_create_decoder(struct pipe_context *context, for (i = 0; i < 5; i++) PUSH_DATA (push[2], nv04_data.vram); + dec->base = *templ; dec->base.context = context; - dec->base.profile = profile; - dec->base.entrypoint = entrypoint; - dec->base.chroma_format = chroma_format; - dec->base.width = width; - dec->base.height = height; - dec->base.max_references = max_references; dec->base.decode_bitstream = nv98_decoder_decode_bitstream; for (i = 0; i < NOUVEAU_VP3_VIDEO_QDEPTH && !ret; ++i) @@ -162,29 +151,29 @@ nv98_create_decoder(struct pipe_context *context, if (ret) goto fail; - switch (u_reduce_video_profile(profile)) { + switch (u_reduce_video_profile(templ->profile)) { case PIPE_VIDEO_CODEC_MPEG12: { codec = 1; - assert(max_references <= 2); + assert(templ->max_references <= 2); break; } case PIPE_VIDEO_CODEC_MPEG4: { codec = 4; - tmp_size = mb(height)*16 * mb(width)*16; - assert(max_references <= 2); + tmp_size = mb(templ->height)*16 * mb(templ->width)*16; + assert(templ->max_references <= 2); break; } case PIPE_VIDEO_CODEC_VC1: { ppp_codec = codec = 2; - tmp_size = mb(height)*16 * mb(width)*16; - assert(max_references <= 2); + tmp_size = mb(templ->height)*16 * mb(templ->width)*16; + assert(templ->max_references <= 2); break; } case PIPE_VIDEO_CODEC_MPEG4_AVC: { codec = 3; - dec->tmp_stride = 16 * mb_half(width) * nouveau_vp3_video_align(height) * 3 / 2; - tmp_size = dec->tmp_stride * (max_references + 1); - assert(max_references <= 16); + dec->tmp_stride = 16 * mb_half(templ->width) * nouveau_vp3_video_align(templ->height) * 3 / 2; + tmp_size = dec->tmp_stride * (templ->max_references + 1); + assert(templ->max_references <= 16); break; } default: @@ -197,7 +186,7 @@ nv98_create_decoder(struct pipe_context *context, if (ret) goto fail; - ret = nouveau_vp3_load_firmware(dec, profile, screen->device->chipset); + ret = nouveau_vp3_load_firmware(dec, templ->profile, screen->device->chipset); if (ret) goto fw_fail; @@ -208,9 +197,9 @@ nv98_create_decoder(struct pipe_context *context, goto fail; } - dec->ref_stride = mb(width)*16 * (mb_half(height)*32 + nouveau_vp3_video_align(height)/2); + dec->ref_stride = mb(templ->width)*16 * (mb_half(templ->height)*32 + nouveau_vp3_video_align(templ->height)/2); ret = nouveau_bo_new(screen->device, NOUVEAU_BO_VRAM, 0, - dec->ref_stride * (max_references+2) + tmp_size, + dec->ref_stride * (templ->max_references+2) + tmp_size, &cfg, &dec->ref_bo); if (ret) goto fail; |