<div dir="auto">It would be better to add a pipe cap for this. I don't think you need uint64_t here.<div dir="auto"><br></div><div dir="auto">Marek</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Apr 30, 2019, 6:45 AM Sahu, Satyajit <<a href="mailto:Satyajit.Sahu@amd.com">Satyajit.Sahu@amd.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Query the uvd handles info. If the used uvd handles are equals to<br>
max possible handles then return error.<br>
<br>
Signed-off-by: Satyajit Sahu <<a href="mailto:satyajit.sahu@amd.com" target="_blank" rel="noreferrer">satyajit.sahu@amd.com</a>><br>
---<br>
 src/gallium/drivers/radeon/radeon_winsys.h    |  1 +<br>
 src/gallium/drivers/radeonsi/si_get.c         |  8 ++++++++<br>
 src/gallium/include/pipe/p_screen.h           |  1 +<br>
 src/gallium/state_trackers/va/context.c       |  2 ++<br>
 src/gallium/state_trackers/va/picture.c       | 11 ++++++++++-<br>
 src/gallium/state_trackers/va/va_private.h    |  1 +<br>
 src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c | 11 +++++++++++<br>
 7 files changed, 34 insertions(+), 1 deletion(-)<br>
<br>
diff --git a/src/gallium/drivers/radeon/radeon_winsys.h b/src/gallium/drivers/radeon/radeon_winsys.h<br>
index 0c71b59ae04..b4f3a3ad09f 100644<br>
--- a/src/gallium/drivers/radeon/radeon_winsys.h<br>
+++ b/src/gallium/drivers/radeon/radeon_winsys.h<br>
@@ -125,6 +125,7 @@ enum radeon_value_id {<br>
     RADEON_CURRENT_MCLK,<br>
     RADEON_GPU_RESET_COUNTER, /* DRM 2.43.0 */<br>
     RADEON_CS_THREAD_TIME,<br>
+    RADEON_UVD_HANDLES,<br>
 };<br>
<br>
 enum radeon_bo_priority {<br>
diff --git a/src/gallium/drivers/radeonsi/si_get.c b/src/gallium/drivers/radeonsi/si_get.c<br>
index 4e23d283ab7..6e27b0162e0 100644<br>
--- a/src/gallium/drivers/radeonsi/si_get.c<br>
+++ b/src/gallium/drivers/radeonsi/si_get.c<br>
@@ -887,6 +887,13 @@ static uint64_t si_get_timestamp(struct pipe_screen *screen)<br>
                        sscreen->info.clock_crystal_freq;<br>
 }<br>
<br>
+//ADD function for querying uvd handles info<br>
+static uint64_t si_get_handles_info(struct pipe_screen *screen)<br>
+{<br>
+       struct si_screen *sscreen = (struct si_screen*)screen;<br>
+<br>
+       return sscreen->ws->query_value(sscreen->ws, RADEON_UVD_HANDLES);<br>
+}<br>
 static void si_query_memory_info(struct pipe_screen *screen,<br>
                                 struct pipe_memory_info *info)<br>
 {<br>
@@ -975,6 +982,7 @@ void si_init_screen_get_functions(struct si_screen *sscreen)<br>
        sscreen->b.get_device_uuid = si_get_device_uuid;<br>
        sscreen->b.get_driver_uuid = si_get_driver_uuid;<br>
        sscreen->b.query_memory_info = si_query_memory_info;<br>
+       sscreen->b.query_handles_info = si_get_handles_info;<br>
        sscreen->b.get_disk_shader_cache = si_get_disk_shader_cache;<br>
<br>
        if (sscreen->info.has_hw_decode) {<br>
diff --git a/src/gallium/include/pipe/p_screen.h b/src/gallium/include/pipe/p_screen.h<br>
index d4e2d9f63ac..c41af7b842f 100644<br>
--- a/src/gallium/include/pipe/p_screen.h<br>
+++ b/src/gallium/include/pipe/p_screen.h<br>
@@ -148,6 +148,7 @@ struct pipe_screen {<br>
     * wait for rendering to complete (which cannot be achieved with queries).<br>
     */<br>
    uint64_t (*get_timestamp)(struct pipe_screen *);<br>
+   uint64_t (*query_handles_info)(struct pipe_screen *);<br>
<br>
    /**<br>
     * Create a context.<br>
diff --git a/src/gallium/state_trackers/va/context.c b/src/gallium/state_trackers/va/context.c<br>
index 9176b7e8c5d..01dc618291f 100644<br>
--- a/src/gallium/state_trackers/va/context.c<br>
+++ b/src/gallium/state_trackers/va/context.c<br>
@@ -237,8 +237,10 @@ vlVaCreateContext(VADriverContextP ctx, VAConfigID config_id, int picture_width,<br>
    if (!context)<br>
       return VA_STATUS_ERROR_ALLOCATION_FAILED;<br>
<br>
+   context->is_vpp =false;<br>
    if (is_vpp) {<br>
       context->decoder = NULL;<br>
+      context->is_vpp =true;<br>
    } else {<br>
       context->templat.profile = config->profile;<br>
       context->templat.entrypoint = config->entrypoint;<br>
diff --git a/src/gallium/state_trackers/va/picture.c b/src/gallium/state_trackers/va/picture.c<br>
index 04d2da0afeb..43ed53f8e82 100644<br>
--- a/src/gallium/state_trackers/va/picture.c<br>
+++ b/src/gallium/state_trackers/va/picture.c<br>
@@ -42,6 +42,8 @@ vlVaBeginPicture(VADriverContextP ctx, VAContextID context_id, VASurfaceID rende<br>
    vlVaDriver *drv;<br>
    vlVaContext *context;<br>
    vlVaSurface *surf;<br>
+   struct pipe_screen *pscreen;<br>
+   int available_uvd_handles;<br>
<br>
    if (!ctx)<br>
       return VA_STATUS_ERROR_INVALID_CONTEXT;<br>
@@ -50,6 +52,8 @@ vlVaBeginPicture(VADriverContextP ctx, VAContextID context_id, VASurfaceID rende<br>
    if (!drv)<br>
       return VA_STATUS_ERROR_INVALID_CONTEXT;<br>
<br>
+   pscreen = VL_VA_PSCREEN(ctx);<br>
+<br>
    mtx_lock(&drv->mutex);<br>
    context = handle_table_get(drv->htab, context_id);<br>
    if (!context) {<br>
@@ -73,7 +77,12 @@ vlVaBeginPicture(VADriverContextP ctx, VAContextID context_id, VASurfaceID rende<br>
    context->mjpeg.sampling_factor = 0;<br>
<br>
    if (!context->decoder) {<br>
-<br>
+      if (!context->is_vpp) {<br>
+         //Query available uvd handles. If uvd handles not available fallback to software.<br>
+         available_uvd_handles =  pscreen->query_handles_info(pscreen);<br>
+         if (available_uvd_handles <= 0)<br>
+            return VA_STATUS_ERROR_ALLOCATION_FAILED;<br>
+      }<br>
       /* VPP */<br>
       if (context->templat.profile == PIPE_VIDEO_PROFILE_UNKNOWN &&<br>
           context->target->buffer_format != PIPE_FORMAT_B8G8R8A8_UNORM &&<br>
diff --git a/src/gallium/state_trackers/va/va_private.h b/src/gallium/state_trackers/va/va_private.h<br>
index b2b997d4799..a34cd6785ce 100644<br>
--- a/src/gallium/state_trackers/va/va_private.h<br>
+++ b/src/gallium/state_trackers/va/va_private.h<br>
@@ -313,6 +313,7 @@ typedef struct {<br>
    int gop_coeff;<br>
    bool needs_begin_frame;<br>
    void *blit_cs;<br>
+   bool is_vpp;<br>
 } vlVaContext;<br>
<br>
 typedef struct {<br>
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c<br>
index e847c5cff10..9e0574d389d 100644<br>
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c<br>
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c<br>
@@ -46,6 +46,12 @@<br>
 #define AMDGPU_INFO_NUM_VRAM_CPU_PAGE_FAULTS   0x1E<br>
 #endif<br>
<br>
+struct amdgpu_info_num_handles {<br>
+        /** Max handles as supported by firmware for UVD */<br>
+        uint32_t  uvd_max_handles;<br>
+        /** Handles currently in use for UVD */<br>
+        uint32_t  uvd_used_handles;<br>
+};<br>
 static struct util_hash_table *dev_tab = NULL;<br>
 static simple_mtx_t dev_tab_mutex = _SIMPLE_MTX_INITIALIZER_NP;<br>
<br>
@@ -166,6 +172,7 @@ static uint64_t amdgpu_query_value(struct radeon_winsys *rws,<br>
    struct amdgpu_winsys *ws = (struct amdgpu_winsys*)rws;<br>
    struct amdgpu_heap_info heap;<br>
    uint64_t retval = 0;<br>
+   struct amdgpu_info_num_handles info_handles;<br>
<br>
    switch (value) {<br>
    case RADEON_REQUESTED_VRAM_MEMORY:<br>
@@ -183,6 +190,10 @@ static uint64_t amdgpu_query_value(struct radeon_winsys *rws,<br>
    case RADEON_TIMESTAMP:<br>
       amdgpu_query_info(ws->dev, AMDGPU_INFO_TIMESTAMP, 8, &retval);<br>
       return retval;<br>
+   case RADEON_UVD_HANDLES:<br>
+      amdgpu_query_uvd_handles(ws->dev, sizeof(info_handles), &info_handles);<br>
+      retval = info_handles.uvd_max_handles - info_handles.uvd_used_handles;<br>
+      return retval;<br>
    case RADEON_NUM_GFX_IBS:<br>
       return ws->num_gfx_IBs;<br>
    case RADEON_NUM_SDMA_IBS:<br>
-- <br>
2.19.1<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank" rel="noreferrer">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a></blockquote></div>