From: Nicolai Hähnle <nicolai.haeh...@amd.com> Allow the driver to configure the state tracker's nir_lower_tex pass when using NIR. --- src/gallium/docs/source/screen.rst | 20 ++++++++++++++++++++ src/gallium/drivers/freedreno/freedreno_screen.c | 14 ++++++++++++++ src/gallium/drivers/vc4/vc4_screen.c | 15 +++++++++++++++ src/gallium/include/pipe/p_defines.h | 6 ++++++ src/gallium/include/pipe/p_screen.h | 11 +++++++++++ 5 files changed, 66 insertions(+)
diff --git a/src/gallium/docs/source/screen.rst b/src/gallium/docs/source/screen.rst index 32da228..f18109a 100644 --- a/src/gallium/docs/source/screen.rst +++ b/src/gallium/docs/source/screen.rst @@ -494,20 +494,33 @@ to be 0. * ``PIPE_SHADER_CAP_MAX_SHADER_IMAGES``: Maximum number of image units. * ``PIPE_SHADER_CAP_LOWER_IF_THRESHOLD``: IF and ELSE branches with a lower cost than this value should be lowered by the state tracker for better performance. This is a tunable for the GLSL compiler and the behavior is specific to the compiler. * ``PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS``: Whether the merge registers TGSI pass is skipped. This might reduce code size and register pressure if the underlying driver has a real backend compiler. +.. _pipe_struct_cap: + +PIPE_STRUCT_CAP_* +^^^^^^^^^^^^^^^^^^ + +Struct-valued capabilities and options. They can be queried using +pipe_screen::get_struct_param. + +* ``PIPE_CAP_NIR_LOWER_TEX_OPTIONS``: struct nir_lower_tex_options-valued + parameter that indicates which texture lowerings the state tracker should + apply to NIR shaders. Can be NULL to indicate that no lowering is needed. + + .. _pipe_compute_cap: PIPE_COMPUTE_CAP_* ^^^^^^^^^^^^^^^^^^ Compute-specific capabilities. They can be queried using pipe_screen::get_compute_param. * ``PIPE_COMPUTE_CAP_IR_TARGET``: A description of the target of the form ``processor-arch-manufacturer-os`` that will be passed on to the compiler. @@ -657,20 +670,27 @@ Get an integer/boolean screen parameter. .. _get_paramf: get_paramf ^^^^^^^^^^ Get a floating-point screen parameter. **param** is one of the :ref:`PIPE_CAP` names. +get_struct_param +^^^^^^^^^^^^^^^^ + +Get a struct-valued screen parameter. + +**param** is one of the :ref:`PIPE_STRUCT_CAP` names. + context_create ^^^^^^^^^^^^^^ Create a pipe_context. **priv** is private data of the caller, which may be put to various unspecified uses, typically to do with implementing swapbuffers and/or front-buffer rendering. is_format_supported diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c index b1c2c03..2a6c320 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.c +++ b/src/gallium/drivers/freedreno/freedreno_screen.c @@ -664,20 +664,33 @@ fd_get_compiler_options(struct pipe_screen *pscreen, enum pipe_shader_ir ir, unsigned shader) { struct fd_screen *screen = fd_screen(pscreen); if (is_ir3(screen)) return ir3_get_compiler_options(screen->compiler); return NULL; } +static const void * +fd_get_struct_param(struct pipe_screen *pscreen, + enum pipe_struct_cap param) +{ + switch (param) { + case PIPE_STRUCT_CAP_NIR_LOWER_TEX_OPTIONS: + return NULL; + default: + assert(false); + return NULL; + } +} + boolean fd_screen_bo_get_handle(struct pipe_screen *pscreen, struct fd_bo *bo, unsigned stride, struct winsys_handle *whandle) { whandle->stride = stride; if (whandle->type == DRM_API_HANDLE_TYPE_SHARED) { return fd_bo_get_name(bo, &whandle->handle) == 0; @@ -848,20 +861,21 @@ fd_screen_create(struct fd_device *dev) fd_bc_init(&screen->batch_cache); (void) mtx_init(&screen->lock, mtx_plain); pscreen->destroy = fd_screen_destroy; pscreen->get_param = fd_screen_get_param; pscreen->get_paramf = fd_screen_get_paramf; pscreen->get_shader_param = fd_screen_get_shader_param; pscreen->get_compute_param = fd_get_compute_param; pscreen->get_compiler_options = fd_get_compiler_options; + pscreen->get_struct_param = fd_get_struct_param; fd_resource_screen_init(pscreen); fd_query_screen_init(pscreen); pscreen->get_name = fd_screen_get_name; pscreen->get_vendor = fd_screen_get_vendor; pscreen->get_device_vendor = fd_screen_get_device_vendor; pscreen->get_timestamp = fd_screen_get_timestamp; diff --git a/src/gallium/drivers/vc4/vc4_screen.c b/src/gallium/drivers/vc4/vc4_screen.c index cbeb683..4cea36d 100644 --- a/src/gallium/drivers/vc4/vc4_screen.c +++ b/src/gallium/drivers/vc4/vc4_screen.c @@ -598,32 +598,47 @@ vc4_get_chip_info(struct vc4_screen *screen) fprintf(stderr, "V3D %d.%d not supported by this version of Mesa.\n", screen->v3d_ver / 10, screen->v3d_ver % 10); return false; } return true; } +static const void * +vc4_screen_get_struct_param(struct pipe_screen *pscreen, + enum pipe_struct_cap param) +{ + switch (param) { + case PIPE_STRUCT_CAP_NIR_LOWER_TEX_OPTIONS: + return NULL; + + default: + assert(false); + return NULL; + } +} + struct pipe_screen * vc4_screen_create(int fd, struct renderonly *ro) { struct vc4_screen *screen = rzalloc(NULL, struct vc4_screen); struct pipe_screen *pscreen; pscreen = &screen->base; pscreen->destroy = vc4_screen_destroy; pscreen->get_param = vc4_screen_get_param; pscreen->get_paramf = vc4_screen_get_paramf; pscreen->get_shader_param = vc4_screen_get_shader_param; + pscreen->get_struct_param = vc4_screen_get_struct_param; pscreen->context_create = vc4_context_create; pscreen->is_format_supported = vc4_screen_is_format_supported; screen->fd = fd; if (ro) { screen->ro = renderonly_dup(ro); if (!screen->ro) { fprintf(stderr, "Failed to dup renderonly object\n"); ralloc_free(screen); return NULL; diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h index 2ccdf44..89add9d 100644 --- a/src/gallium/include/pipe/p_defines.h +++ b/src/gallium/include/pipe/p_defines.h @@ -844,20 +844,26 @@ enum pipe_shader_cap PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED, PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE, PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT, PIPE_SHADER_CAP_MAX_SHADER_BUFFERS, PIPE_SHADER_CAP_SUPPORTED_IRS, PIPE_SHADER_CAP_MAX_SHADER_IMAGES, PIPE_SHADER_CAP_LOWER_IF_THRESHOLD, PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS, }; +/** Struct-values capabilities/options */ +enum pipe_struct_cap +{ + PIPE_STRUCT_CAP_NIR_LOWER_TEX_OPTIONS, +}; + /** * Shader intermediate representation. * * Note that if the driver requests something other than TGSI, it must * always be prepared to receive TGSI in addition to its preferred IR. * If the driver requests TGSI as its preferred IR, it will *always* * get TGSI. * * Note that PIPE_SHADER_IR_TGSI should be zero for backwards compat with * state trackers that only understand TGSI. diff --git a/src/gallium/include/pipe/p_screen.h b/src/gallium/include/pipe/p_screen.h index 65e954a..14d9e96 100644 --- a/src/gallium/include/pipe/p_screen.h +++ b/src/gallium/include/pipe/p_screen.h @@ -94,20 +94,31 @@ struct pipe_screen { float (*get_paramf)( struct pipe_screen *, enum pipe_capf param ); /** * Query a per-shader-stage integer-valued capability/parameter/limit * \param param one of PIPE_CAP_x */ int (*get_shader_param)( struct pipe_screen *, enum pipe_shader_type shader, enum pipe_shader_cap param ); /** + * Query a struct-valued capability/parameter/limit. + * + * The lifetime of the returned struct must be at least the lifetime of the + * screen. + * + * \param param one of PIPE_CAP_x + */ + const void *(*get_struct_param)( struct pipe_screen *, + enum pipe_struct_cap param ); + + /** * Query an integer-valued capability/parameter/limit for a codec/profile * \param param one of PIPE_VIDEO_CAP_x */ int (*get_video_param)( struct pipe_screen *, enum pipe_video_profile profile, enum pipe_video_entrypoint entrypoint, enum pipe_video_cap param ); /** * Query a compute-specific capability/parameter/limit. -- 2.9.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev