[Mesa-dev] [PATCH] r600g: Fallback to shader decoding if UVD isn't available

Andreas Boll andreas.boll.dev at gmail.com
Wed Apr 3 10:47:54 PDT 2013


Cc: Christian König <deathsimple at vodafone.de>
---
 src/gallium/drivers/r600/r600_pipe.c |   63 +++++++++++++++++++++++++++++++---
 src/gallium/drivers/r600/r600_pipe.h |    1 +
 2 files changed, 60 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
index 5b82aed..7a80661 100644
--- a/src/gallium/drivers/r600/r600_pipe.c
+++ b/src/gallium/drivers/r600/r600_pipe.c
@@ -380,8 +380,13 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen, void
 	r600_init_context_resource_functions(rctx);
 	r600_init_surface_functions(rctx);
 
-	rctx->context.create_video_decoder = r600_uvd_create_decoder;
-	rctx->context.create_video_buffer = r600_video_buffer_create;
+	if (rscreen->has_uvd) {
+		rctx->context.create_video_decoder = r600_uvd_create_decoder;
+		rctx->context.create_video_buffer = r600_video_buffer_create;
+	} else {
+		rctx->context.create_video_decoder = vl_create_decoder;
+		rctx->context.create_video_buffer = vl_video_buffer_create;
+	}
 
 	r600_init_common_state_functions(rctx);
 
@@ -787,6 +792,31 @@ 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;
+	case PIPE_VIDEO_CAP_PREFERS_INTERLACED:
+		return false;
+	case PIPE_VIDEO_CAP_SUPPORTS_INTERLACED:
+		return false;
+	case PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE:
+		return true;
+	default:
+		return 0;
+	}
+}
+
 static int r600_get_compute_param(struct pipe_screen *screen,
         enum pipe_compute_cap param,
         void *ret)
@@ -1214,6 +1244,19 @@ struct pipe_screen *r600_screen_create(struct radeon_winsys *ws)
 	rscreen->has_cp_dma = rscreen->info.drm_minor >= 27 &&
 			      !(rscreen->debug_flags & DBG_NO_CP_DMA);
 
+	/* UVD support. */
+	switch (rscreen->chip_class) {
+	/* The R6xx and RS780/RS880 chipset generations are currently not supported, but might be added in the future. */
+	case R700:
+	case EVERGREEN:
+	case CAYMAN:
+		rscreen->has_uvd = rscreen->info.drm_minor >= 31;
+		break;
+	default:
+		rscreen->has_uvd = FALSE;
+		break;
+	}
+
 	if (r600_init_tiling(rscreen)) {
 		FREE(rscreen);
 		return NULL;
@@ -1225,7 +1268,13 @@ struct pipe_screen *r600_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.get_compute_param = r600_get_compute_param;
 	rscreen->screen.get_timestamp = r600_get_timestamp;
 
@@ -1236,7 +1285,13 @@ struct pipe_screen *r600_screen_create(struct radeon_winsys *ws)
 		rscreen->screen.is_format_supported = r600_is_format_supported;
 		rscreen->dma_blit = &r600_dma_blit;
 	}
-	rscreen->screen.is_video_format_supported = r600_is_video_format_supported;
+
+	if (rscreen->has_uvd) {
+		rscreen->screen.is_video_format_supported = r600_is_video_format_supported;
+	} else {
+		rscreen->screen.is_video_format_supported = vl_video_buffer_is_format_supported;
+	}
+
 	rscreen->screen.context_create = r600_create_context;
 	rscreen->screen.fence_reference = r600_fence_reference;
 	rscreen->screen.fence_signalled = r600_fence_signalled;
diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
index f3433e7..944f9fe 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -273,6 +273,7 @@ struct r600_screen {
 	bool				has_streamout;
 	bool				has_msaa;
 	bool				has_cp_dma;
+	bool				has_uvd;
 	enum r600_msaa_texture_mode	msaa_texture_support;
 	struct r600_tiling_info		tiling_info;
 	struct r600_pipe_fences		fences;
-- 
1.7.10.4



More information about the mesa-dev mailing list