Re: [Mesa-dev] [PATCH] gallium: Query uvd handles info

2019-04-30 Thread Marek Olšák
It would be better to add a pipe cap for this. I don't think you need
uint64_t here.

Marek

On Tue, Apr 30, 2019, 6:45 AM Sahu, Satyajit  wrote:

> Query the uvd handles info. If the used uvd handles are equals to
> max possible handles then return error.
>
> Signed-off-by: Satyajit Sahu 
> ---
>  src/gallium/drivers/radeon/radeon_winsys.h|  1 +
>  src/gallium/drivers/radeonsi/si_get.c |  8 
>  src/gallium/include/pipe/p_screen.h   |  1 +
>  src/gallium/state_trackers/va/context.c   |  2 ++
>  src/gallium/state_trackers/va/picture.c   | 11 ++-
>  src/gallium/state_trackers/va/va_private.h|  1 +
>  src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c | 11 +++
>  7 files changed, 34 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/drivers/radeon/radeon_winsys.h
> b/src/gallium/drivers/radeon/radeon_winsys.h
> index 0c71b59ae04..b4f3a3ad09f 100644
> --- a/src/gallium/drivers/radeon/radeon_winsys.h
> +++ b/src/gallium/drivers/radeon/radeon_winsys.h
> @@ -125,6 +125,7 @@ enum radeon_value_id {
>  RADEON_CURRENT_MCLK,
>  RADEON_GPU_RESET_COUNTER, /* DRM 2.43.0 */
>  RADEON_CS_THREAD_TIME,
> +RADEON_UVD_HANDLES,
>  };
>
>  enum radeon_bo_priority {
> diff --git a/src/gallium/drivers/radeonsi/si_get.c
> b/src/gallium/drivers/radeonsi/si_get.c
> index 4e23d283ab7..6e27b0162e0 100644
> --- a/src/gallium/drivers/radeonsi/si_get.c
> +++ b/src/gallium/drivers/radeonsi/si_get.c
> @@ -887,6 +887,13 @@ static uint64_t si_get_timestamp(struct pipe_screen
> *screen)
> sscreen->info.clock_crystal_freq;
>  }
>
> +//ADD function for querying uvd handles info
> +static uint64_t si_get_handles_info(struct pipe_screen *screen)
> +{
> +   struct si_screen *sscreen = (struct si_screen*)screen;
> +
> +   return sscreen->ws->query_value(sscreen->ws, RADEON_UVD_HANDLES);
> +}
>  static void si_query_memory_info(struct pipe_screen *screen,
>  struct pipe_memory_info *info)
>  {
> @@ -975,6 +982,7 @@ void si_init_screen_get_functions(struct si_screen
> *sscreen)
> sscreen->b.get_device_uuid = si_get_device_uuid;
> sscreen->b.get_driver_uuid = si_get_driver_uuid;
> sscreen->b.query_memory_info = si_query_memory_info;
> +   sscreen->b.query_handles_info = si_get_handles_info;
> sscreen->b.get_disk_shader_cache = si_get_disk_shader_cache;
>
> if (sscreen->info.has_hw_decode) {
> diff --git a/src/gallium/include/pipe/p_screen.h
> b/src/gallium/include/pipe/p_screen.h
> index d4e2d9f63ac..c41af7b842f 100644
> --- a/src/gallium/include/pipe/p_screen.h
> +++ b/src/gallium/include/pipe/p_screen.h
> @@ -148,6 +148,7 @@ struct pipe_screen {
>  * wait for rendering to complete (which cannot be achieved with
> queries).
>  */
> uint64_t (*get_timestamp)(struct pipe_screen *);
> +   uint64_t (*query_handles_info)(struct pipe_screen *);
>
> /**
>  * Create a context.
> diff --git a/src/gallium/state_trackers/va/context.c
> b/src/gallium/state_trackers/va/context.c
> index 9176b7e8c5d..01dc618291f 100644
> --- a/src/gallium/state_trackers/va/context.c
> +++ b/src/gallium/state_trackers/va/context.c
> @@ -237,8 +237,10 @@ vlVaCreateContext(VADriverContextP ctx, VAConfigID
> config_id, int picture_width,
> if (!context)
>return VA_STATUS_ERROR_ALLOCATION_FAILED;
>
> +   context->is_vpp =false;
> if (is_vpp) {
>context->decoder = NULL;
> +  context->is_vpp =true;
> } else {
>context->templat.profile = config->profile;
>context->templat.entrypoint = config->entrypoint;
> diff --git a/src/gallium/state_trackers/va/picture.c
> b/src/gallium/state_trackers/va/picture.c
> index 04d2da0afeb..43ed53f8e82 100644
> --- a/src/gallium/state_trackers/va/picture.c
> +++ b/src/gallium/state_trackers/va/picture.c
> @@ -42,6 +42,8 @@ vlVaBeginPicture(VADriverContextP ctx, VAContextID
> context_id, VASurfaceID rende
> vlVaDriver *drv;
> vlVaContext *context;
> vlVaSurface *surf;
> +   struct pipe_screen *pscreen;
> +   int available_uvd_handles;
>
> if (!ctx)
>return VA_STATUS_ERROR_INVALID_CONTEXT;
> @@ -50,6 +52,8 @@ vlVaBeginPicture(VADriverContextP ctx, VAContextID
> context_id, VASurfaceID rende
> if (!drv)
>return VA_STATUS_ERROR_INVALID_CONTEXT;
>
> +   pscreen = VL_VA_PSCREEN(ctx);
> +
> mtx_lock(>mutex);
> context = handle_table_get(drv->htab, context_id);
> if (!context) {
> @@ -73,7 +77,12 @@ vlVaBeginPicture(VADriverContextP ctx, VAContextID
> context_id, VASurfaceID rende
> context->mjpeg.sampling_factor = 0;
>
> if (!context->decoder) {
> -
> +  if (!context->is_vpp) {
> + //Query available uvd handles. If uvd handles not available
> fallback to software.
> + available_uvd_handles =  pscreen->query_handles_info(pscreen);
> + if (available_uvd_handles <= 0)
> +return VA_STATUS_ERROR_ALLOCATION_FAILED;
> +  }
>

[Mesa-dev] [PATCH] gallium: Query uvd handles info

2019-04-30 Thread Sahu, Satyajit
Query the uvd handles info. If the used uvd handles are equals to
max possible handles then return error.

Signed-off-by: Satyajit Sahu 
---
 src/gallium/drivers/radeon/radeon_winsys.h|  1 +
 src/gallium/drivers/radeonsi/si_get.c |  8 
 src/gallium/include/pipe/p_screen.h   |  1 +
 src/gallium/state_trackers/va/context.c   |  2 ++
 src/gallium/state_trackers/va/picture.c   | 11 ++-
 src/gallium/state_trackers/va/va_private.h|  1 +
 src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c | 11 +++
 7 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/radeon/radeon_winsys.h 
b/src/gallium/drivers/radeon/radeon_winsys.h
index 0c71b59ae04..b4f3a3ad09f 100644
--- a/src/gallium/drivers/radeon/radeon_winsys.h
+++ b/src/gallium/drivers/radeon/radeon_winsys.h
@@ -125,6 +125,7 @@ enum radeon_value_id {
 RADEON_CURRENT_MCLK,
 RADEON_GPU_RESET_COUNTER, /* DRM 2.43.0 */
 RADEON_CS_THREAD_TIME,
+RADEON_UVD_HANDLES,
 };
 
 enum radeon_bo_priority {
diff --git a/src/gallium/drivers/radeonsi/si_get.c 
b/src/gallium/drivers/radeonsi/si_get.c
index 4e23d283ab7..6e27b0162e0 100644
--- a/src/gallium/drivers/radeonsi/si_get.c
+++ b/src/gallium/drivers/radeonsi/si_get.c
@@ -887,6 +887,13 @@ static uint64_t si_get_timestamp(struct pipe_screen 
*screen)
sscreen->info.clock_crystal_freq;
 }
 
+//ADD function for querying uvd handles info
+static uint64_t si_get_handles_info(struct pipe_screen *screen)
+{
+   struct si_screen *sscreen = (struct si_screen*)screen;
+
+   return sscreen->ws->query_value(sscreen->ws, RADEON_UVD_HANDLES);
+}
 static void si_query_memory_info(struct pipe_screen *screen,
 struct pipe_memory_info *info)
 {
@@ -975,6 +982,7 @@ void si_init_screen_get_functions(struct si_screen *sscreen)
sscreen->b.get_device_uuid = si_get_device_uuid;
sscreen->b.get_driver_uuid = si_get_driver_uuid;
sscreen->b.query_memory_info = si_query_memory_info;
+   sscreen->b.query_handles_info = si_get_handles_info;
sscreen->b.get_disk_shader_cache = si_get_disk_shader_cache;
 
if (sscreen->info.has_hw_decode) {
diff --git a/src/gallium/include/pipe/p_screen.h 
b/src/gallium/include/pipe/p_screen.h
index d4e2d9f63ac..c41af7b842f 100644
--- a/src/gallium/include/pipe/p_screen.h
+++ b/src/gallium/include/pipe/p_screen.h
@@ -148,6 +148,7 @@ struct pipe_screen {
 * wait for rendering to complete (which cannot be achieved with queries).
 */
uint64_t (*get_timestamp)(struct pipe_screen *);
+   uint64_t (*query_handles_info)(struct pipe_screen *);
 
/**
 * Create a context.
diff --git a/src/gallium/state_trackers/va/context.c 
b/src/gallium/state_trackers/va/context.c
index 9176b7e8c5d..01dc618291f 100644
--- a/src/gallium/state_trackers/va/context.c
+++ b/src/gallium/state_trackers/va/context.c
@@ -237,8 +237,10 @@ vlVaCreateContext(VADriverContextP ctx, VAConfigID 
config_id, int picture_width,
if (!context)
   return VA_STATUS_ERROR_ALLOCATION_FAILED;
 
+   context->is_vpp =false;
if (is_vpp) {
   context->decoder = NULL;
+  context->is_vpp =true;
} else {
   context->templat.profile = config->profile;
   context->templat.entrypoint = config->entrypoint;
diff --git a/src/gallium/state_trackers/va/picture.c 
b/src/gallium/state_trackers/va/picture.c
index 04d2da0afeb..43ed53f8e82 100644
--- a/src/gallium/state_trackers/va/picture.c
+++ b/src/gallium/state_trackers/va/picture.c
@@ -42,6 +42,8 @@ vlVaBeginPicture(VADriverContextP ctx, VAContextID 
context_id, VASurfaceID rende
vlVaDriver *drv;
vlVaContext *context;
vlVaSurface *surf;
+   struct pipe_screen *pscreen;
+   int available_uvd_handles;
 
if (!ctx)
   return VA_STATUS_ERROR_INVALID_CONTEXT;
@@ -50,6 +52,8 @@ vlVaBeginPicture(VADriverContextP ctx, VAContextID 
context_id, VASurfaceID rende
if (!drv)
   return VA_STATUS_ERROR_INVALID_CONTEXT;
 
+   pscreen = VL_VA_PSCREEN(ctx);
+
mtx_lock(>mutex);
context = handle_table_get(drv->htab, context_id);
if (!context) {
@@ -73,7 +77,12 @@ vlVaBeginPicture(VADriverContextP ctx, VAContextID 
context_id, VASurfaceID rende
context->mjpeg.sampling_factor = 0;
 
if (!context->decoder) {
-
+  if (!context->is_vpp) {
+ //Query available uvd handles. If uvd handles not available fallback 
to software.
+ available_uvd_handles =  pscreen->query_handles_info(pscreen);
+ if (available_uvd_handles <= 0)
+return VA_STATUS_ERROR_ALLOCATION_FAILED;
+  }
   /* VPP */
   if (context->templat.profile == PIPE_VIDEO_PROFILE_UNKNOWN &&
   context->target->buffer_format != PIPE_FORMAT_B8G8R8A8_UNORM &&
diff --git a/src/gallium/state_trackers/va/va_private.h 
b/src/gallium/state_trackers/va/va_private.h
index b2b997d4799..a34cd6785ce 100644
--- a/src/gallium/state_trackers/va/va_private.h
+++