Cc: Christian König <[email protected]>
---
 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

_______________________________________________
mesa-dev mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to