X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fr600%2Fr600_uvd.c;h=eeac76f3e2340278bd92ebdcb252edf19569f765;hb=9bc47dbe5062fe1f462f62bf3a2dda7b2f3ddea3;hp=a077a50d190f613088c1a8bed456c25f80900531;hpb=085c695488acc3408bf455ea3f97517a68cad714;p=mesa.git diff --git a/src/gallium/drivers/r600/r600_uvd.c b/src/gallium/drivers/r600/r600_uvd.c index a077a50d190..eeac76f3e23 100644 --- a/src/gallium/drivers/r600/r600_uvd.c +++ b/src/gallium/drivers/r600/r600_uvd.c @@ -36,7 +36,7 @@ #include #include -#include "pipe/p_video_decoder.h" +#include "pipe/p_video_codec.h" #include "util/u_memory.h" #include "util/u_video.h" @@ -76,7 +76,7 @@ struct pipe_video_buffer *r600_video_buffer_create(struct pipe_context *pipe, template.height = align(tmpl->height / array_size, VL_MACROBLOCK_HEIGHT); vl_video_buffer_template(&templ, &template, resource_formats[0], 1, array_size, PIPE_USAGE_STATIC, 0); - if (ctx->chip_class < EVERGREEN || tmpl->interlaced) + if (ctx->b.chip_class < EVERGREEN || tmpl->interlaced) templ.flags = R600_RESOURCE_FLAG_TRANSFER; resources[0] = (struct r600_texture *) pipe->screen->resource_create(pipe->screen, &templ); @@ -85,7 +85,7 @@ struct pipe_video_buffer *r600_video_buffer_create(struct pipe_context *pipe, if (resource_formats[1] != PIPE_FORMAT_NONE) { vl_video_buffer_template(&templ, &template, resource_formats[1], 1, array_size, PIPE_USAGE_STATIC, 1); - if (ctx->chip_class < EVERGREEN || tmpl->interlaced) + if (ctx->b.chip_class < EVERGREEN || tmpl->interlaced) templ.flags = R600_RESOURCE_FLAG_TRANSFER; resources[1] = (struct r600_texture *) pipe->screen->resource_create(pipe->screen, &templ); @@ -95,7 +95,7 @@ struct pipe_video_buffer *r600_video_buffer_create(struct pipe_context *pipe, if (resource_formats[2] != PIPE_FORMAT_NONE) { vl_video_buffer_template(&templ, &template, resource_formats[2], 1, array_size, PIPE_USAGE_STATIC, 2); - if (ctx->chip_class < EVERGREEN || tmpl->interlaced) + if (ctx->b.chip_class < EVERGREEN || tmpl->interlaced) templ.flags = R600_RESOURCE_FLAG_TRANSFER; resources[2] = (struct r600_texture *) pipe->screen->resource_create(pipe->screen, &templ); @@ -111,14 +111,14 @@ struct pipe_video_buffer *r600_video_buffer_create(struct pipe_context *pipe, surfaces[i] = &resources[i]->surface; } - ruvd_join_surfaces(ctx->ws, templ.bind, pbs, surfaces); + ruvd_join_surfaces(ctx->b.ws, templ.bind, pbs, surfaces); for (i = 0; i < VL_NUM_COMPONENTS; ++i) { if (!resources[i]) continue; /* recreate the CS handle */ - resources[i]->resource.cs_buf = ctx->ws->buffer_get_cs_handle( + resources[i]->resource.cs_buf = ctx->b.ws->buffer_get_cs_handle( resources[i]->resource.buf); } @@ -164,30 +164,36 @@ static struct radeon_winsys_cs_handle* r600_uvd_set_dtb(struct ruvd_msg *msg, st } /* create decoder */ -struct pipe_video_decoder *r600_uvd_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) +struct pipe_video_codec *r600_uvd_create_decoder(struct pipe_context *context, + const struct pipe_video_codec *templat) { struct r600_context *ctx = (struct r600_context *)context; - return ruvd_create_decoder(context, profile, entrypoint, chroma_format, - width, height, max_references, expect_chunked_decode, - ctx->ws, r600_uvd_set_dtb); + return ruvd_create_decoder(context, templat, ctx->b.ws, r600_uvd_set_dtb); } int r600_uvd_get_video_param(struct pipe_screen *screen, enum pipe_video_profile profile, + enum pipe_video_entrypoint entrypoint, enum pipe_video_cap param) { struct r600_screen *rscreen = (struct r600_screen *)screen; - /* No support for MPEG4 on UVD 2.x */ - if (param == PIPE_VIDEO_CAP_SUPPORTED && rscreen->family < CHIP_PALM && - u_reduce_video_profile(profile) == PIPE_VIDEO_CODEC_MPEG4) - return false; + /* UVD 2.x limits */ + if (rscreen->b.family < CHIP_PALM) { + enum pipe_video_format codec = u_reduce_video_profile(profile); + switch (param) { + case PIPE_VIDEO_CAP_SUPPORTED: + /* no support for MPEG4 */ + return codec != PIPE_VIDEO_FORMAT_MPEG4; + case PIPE_VIDEO_CAP_PREFERS_INTERLACED: + case PIPE_VIDEO_CAP_SUPPORTS_INTERLACED: + /* and MPEG2 only with shaders */ + return codec != PIPE_VIDEO_FORMAT_MPEG12; + default: + break; + } + } - return ruvd_get_video_param(screen, profile, param); + return ruvd_get_video_param(screen, profile, entrypoint, param); }