Cc: Christian König <deathsim...@vodafone.de> --- Note: Compile tested only
src/gallium/drivers/radeonsi/radeonsi_pipe.c | 39 ++++++++++++++++++++++++-- src/gallium/drivers/radeonsi/radeonsi_pipe.h | 1 + 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/radeonsi/radeonsi_pipe.c b/src/gallium/drivers/radeonsi/radeonsi_pipe.c index 23197f2..1b83e40 100644 --- a/src/gallium/drivers/radeonsi/radeonsi_pipe.c +++ b/src/gallium/drivers/radeonsi/radeonsi_pipe.c @@ -219,8 +219,13 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen, void r600_init_context_resource_functions(rctx); si_init_surface_functions(rctx); - rctx->context.create_video_decoder = radeonsi_uvd_create_decoder; - rctx->context.create_video_buffer = radeonsi_video_buffer_create; + if (rscreen->has_uvd) { + rctx->context.create_video_decoder = radeonsi_uvd_create_decoder; + rctx->context.create_video_buffer = radeonsi_video_buffer_create; + } else { + rctx->context.create_video_decoder = vl_create_decoder; + rctx->context.create_video_buffer = vl_video_buffer_create; + } switch (rctx->chip_class) { case TAHITI: @@ -534,6 +539,25 @@ static int r600_get_video_param(struct pipe_screen *screen, } } +static int r600_get_video_param_fallback(struct pipe_screen *screen, + enum pipe_video_profile profile, + enum pipe_video_cap param) +{ + switch (param) { + case PIPE_VIDEO_CAP_SUPPORTED: + return vl_profile_supported(screen, profile); + case PIPE_VIDEO_CAP_NPOT_TEXTURES: + return 1; + case PIPE_VIDEO_CAP_MAX_WIDTH: + case PIPE_VIDEO_CAP_MAX_HEIGHT: + return vl_video_buffer_max_size(screen); + case PIPE_VIDEO_CAP_PREFERED_FORMAT: + return PIPE_FORMAT_NV12; + default: + return 0; + } +} + static void r600_destroy_screen(struct pipe_screen* pscreen) { struct r600_screen *rscreen = (struct r600_screen *)pscreen; @@ -733,6 +757,9 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws) return NULL; } + /* UVD support. */ + rscreen->has_uvd = rscreen->info.drm_minor >= 31; + if (r600_init_tiling(rscreen)) { FREE(rscreen); return NULL; @@ -744,7 +771,13 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws) rscreen->screen.get_param = r600_get_param; rscreen->screen.get_shader_param = r600_get_shader_param; rscreen->screen.get_paramf = r600_get_paramf; - rscreen->screen.get_video_param = r600_get_video_param; + + if (rscreen->has_uvd) { + rscreen->screen.get_video_param = r600_get_video_param; + } else { + rscreen->screen.get_video_param = r600_get_video_param_fallback; + } + rscreen->screen.is_format_supported = si_is_format_supported; rscreen->screen.is_video_format_supported = vl_video_buffer_is_format_supported; rscreen->screen.context_create = r600_create_context; diff --git a/src/gallium/drivers/radeonsi/radeonsi_pipe.h b/src/gallium/drivers/radeonsi/radeonsi_pipe.h index d0e91c8..4dcb2de 100644 --- a/src/gallium/drivers/radeonsi/radeonsi_pipe.h +++ b/src/gallium/drivers/radeonsi/radeonsi_pipe.h @@ -67,6 +67,7 @@ struct r600_screen { unsigned family; enum chip_class chip_class; struct radeon_info info; + bool has_uvd; struct r600_tiling_info tiling_info; struct util_slab_mempool pool_buffers; struct r600_pipe_fences fences; -- 1.7.10.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev