On Fri, Jun 9, 2017 at 3:35 PM, Samuel Pitoiset <samuel.pitoi...@gmail.com> wrote: > This adds some new helper functions to know if the current draw > call (or dispatch compute) is using bindless samplers/images, > based on TGSI analysis. > > v3: - add si_context::uses_bindless_{samplers,images} > - add si_bind_shader_common() to limit code duplication > > Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> > --- > src/gallium/drivers/radeonsi/si_compute.c | 2 ++ > src/gallium/drivers/radeonsi/si_compute.h | 14 +++++++++++ > src/gallium/drivers/radeonsi/si_pipe.h | 16 +++++++++++++ > src/gallium/drivers/radeonsi/si_shader.h | 12 ++++++++++ > src/gallium/drivers/radeonsi/si_state_shaders.c | 31 > +++++++++++++++++++++---- > 5 files changed, 70 insertions(+), 5 deletions(-) > > diff --git a/src/gallium/drivers/radeonsi/si_compute.c > b/src/gallium/drivers/radeonsi/si_compute.c > index 0338b8a123..79b107e96f 100644 > --- a/src/gallium/drivers/radeonsi/si_compute.c > +++ b/src/gallium/drivers/radeonsi/si_compute.c > @@ -108,6 +108,8 @@ static void si_create_compute_state_async(void *job, int > thread_index) > program->shader.is_monolithic = true; > program->uses_grid_size = sel.info.uses_grid_size; > program->uses_block_size = sel.info.uses_block_size; > + program->uses_bindless_samplers = sel.info.uses_bindless_samplers; > + program->uses_bindless_images = sel.info.uses_bindless_images; > > if (si_shader_create(program->screen, tm, &program->shader, debug)) { > program->shader.compilation_failed = true; > diff --git a/src/gallium/drivers/radeonsi/si_compute.h > b/src/gallium/drivers/radeonsi/si_compute.h > index 764d708c4f..3cf1538267 100644 > --- a/src/gallium/drivers/radeonsi/si_compute.h > +++ b/src/gallium/drivers/radeonsi/si_compute.h > @@ -49,6 +49,20 @@ struct si_compute { > unsigned variable_group_size : 1; > unsigned uses_grid_size:1; > unsigned uses_block_size:1; > + unsigned uses_bindless_samplers:1; > + unsigned uses_bindless_images:1; > }; > > +static inline bool > +si_compute_uses_bindless_samplers(struct si_context *sctx) > +{ > + return sctx->cs_shader_state.program->uses_bindless_samplers; > +} > + > +static inline bool > +si_compute_uses_bindless_images(struct si_context *sctx) > +{ > + return sctx->cs_shader_state.program->uses_bindless_images; > +}
Can you inline these functions? > + > #endif /* SI_COMPUTE_H */ > diff --git a/src/gallium/drivers/radeonsi/si_pipe.h > b/src/gallium/drivers/radeonsi/si_pipe.h > index 252cec3b91..b87fa856cd 100644 > --- a/src/gallium/drivers/radeonsi/si_pipe.h > +++ b/src/gallium/drivers/radeonsi/si_pipe.h > @@ -428,6 +428,10 @@ struct si_context { > /* Resident bindless handles */ > struct util_dynarray resident_tex_handles; > struct util_dynarray resident_img_handles; > + > + /* Bindless state */ > + bool uses_bindless_samplers; > + bool uses_bindless_images; > }; > > /* cik_sdma.c */ > @@ -548,6 +552,18 @@ static inline struct tgsi_shader_info > *si_get_vs_info(struct si_context *sctx) > return vs->cso ? &vs->cso->info : NULL; > } > > +static inline bool > +si_graphics_uses_bindless_samplers(struct si_context *sctx) > +{ > + return sctx->uses_bindless_samplers; > +} > + > +static inline bool > +si_graphics_uses_bindless_images(struct si_context *sctx) > +{ > + return sctx->uses_bindless_images; > +} Can you inline these functions? > + > static inline struct si_shader* si_get_vs_state(struct si_context *sctx) > { > if (sctx->gs_shader.cso) > diff --git a/src/gallium/drivers/radeonsi/si_shader.h > b/src/gallium/drivers/radeonsi/si_shader.h > index 7c04b7e253..4ebb745cb6 100644 > --- a/src/gallium/drivers/radeonsi/si_shader.h > +++ b/src/gallium/drivers/radeonsi/si_shader.h > @@ -629,4 +629,16 @@ si_get_main_shader_part(struct si_shader_selector *sel, > return &sel->main_shader_part; > } > > +static inline bool > +si_shader_uses_bindless_samplers(struct si_shader_selector *selector) > +{ > + return selector ? selector->info.uses_bindless_samplers : false; > +} > + > +static inline bool > +si_shader_uses_bindless_images(struct si_shader_selector *selector) > +{ > + return selector ? selector->info.uses_bindless_images : false; > +} > + > #endif > diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c > b/src/gallium/drivers/radeonsi/si_state_shaders.c > index 677a6de88c..776dd0b67a 100644 > --- a/src/gallium/drivers/radeonsi/si_state_shaders.c > +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c > @@ -2200,6 +2200,23 @@ static void si_update_clip_regs(struct si_context > *sctx, > si_mark_atom_dirty(sctx, &sctx->clip_regs); > } > > +static void si_bind_shader_common(struct si_context *sctx) si_update_common_shader_state Thanks, Marek _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev