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 <satyajit.s...@amd.com> 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 <satyajit.s...@amd.com> > --- > 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(&drv->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 > +++ b/src/gallium/state_trackers/va/va_private.h > @@ -313,6 +313,7 @@ typedef struct { > int gop_coeff; > bool needs_begin_frame; > void *blit_cs; > + bool is_vpp; > } vlVaContext; > > typedef struct { > diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c > b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c > index e847c5cff10..9e0574d389d 100644 > --- a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c > +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c > @@ -46,6 +46,12 @@ > #define AMDGPU_INFO_NUM_VRAM_CPU_PAGE_FAULTS 0x1E > #endif > > +struct amdgpu_info_num_handles { > + /** Max handles as supported by firmware for UVD */ > + uint32_t uvd_max_handles; > + /** Handles currently in use for UVD */ > + uint32_t uvd_used_handles; > +}; > static struct util_hash_table *dev_tab = NULL; > static simple_mtx_t dev_tab_mutex = _SIMPLE_MTX_INITIALIZER_NP; > > @@ -166,6 +172,7 @@ static uint64_t amdgpu_query_value(struct > radeon_winsys *rws, > struct amdgpu_winsys *ws = (struct amdgpu_winsys*)rws; > struct amdgpu_heap_info heap; > uint64_t retval = 0; > + struct amdgpu_info_num_handles info_handles; > > switch (value) { > case RADEON_REQUESTED_VRAM_MEMORY: > @@ -183,6 +190,10 @@ static uint64_t amdgpu_query_value(struct > radeon_winsys *rws, > case RADEON_TIMESTAMP: > amdgpu_query_info(ws->dev, AMDGPU_INFO_TIMESTAMP, 8, &retval); > return retval; > + case RADEON_UVD_HANDLES: > + amdgpu_query_uvd_handles(ws->dev, sizeof(info_handles), > &info_handles); > + retval = info_handles.uvd_max_handles - > info_handles.uvd_used_handles; > + return retval; > case RADEON_NUM_GFX_IBS: > return ws->num_gfx_IBs; > case RADEON_NUM_SDMA_IBS: > -- > 2.19.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev