gallium: add a pipe cap for performing automatic prim type conversion
drivers can now export a bitmask of the primitive types they support, and all others will be automatically be rewritten the default value is set to all primitive types supported to preserve existing behavior Reviewed-by: Marek Olšák <marek.olsak@amd.com> Reviewed-by: Rob Clark <robdclark@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10973>
This commit is contained in:

committed by
Marge Bot

parent
c8e674d4e3
commit
f8ff6eb78b
@@ -616,6 +616,7 @@ The integer capabilities:
|
|||||||
* ``PIPE_CAP_SAMPLER_REDUCTION_MINMAX``: Driver supports EXT min/max sampler reduction.
|
* ``PIPE_CAP_SAMPLER_REDUCTION_MINMAX``: Driver supports EXT min/max sampler reduction.
|
||||||
* ``PIPE_CAP_SAMPLER_REDUCTION_MINMAX_ARB``: Driver supports ARB min/max sampler reduction with format queries.
|
* ``PIPE_CAP_SAMPLER_REDUCTION_MINMAX_ARB``: Driver supports ARB min/max sampler reduction with format queries.
|
||||||
* ``PIPE_CAP_EMULATE_NONFIXED_PRIMITIVE_RESTART``: Driver requests all draws using a non-fixed restart index to be rewritten to use a fixed restart index.
|
* ``PIPE_CAP_EMULATE_NONFIXED_PRIMITIVE_RESTART``: Driver requests all draws using a non-fixed restart index to be rewritten to use a fixed restart index.
|
||||||
|
* ``PIPE_CAP_SUPPORTED_PRIM_MODES``: A bitmask of the ``pipe_prim_type`` enum values that the driver can natively support.
|
||||||
|
|
||||||
.. _pipe_capf:
|
.. _pipe_capf:
|
||||||
|
|
||||||
|
@@ -87,6 +87,9 @@ u_pipe_screen_get_param_defaults(struct pipe_screen *pscreen,
|
|||||||
case PIPE_CAP_RGB_OVERRIDE_DST_ALPHA_BLEND:
|
case PIPE_CAP_RGB_OVERRIDE_DST_ALPHA_BLEND:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
case PIPE_CAP_SUPPORTED_PRIM_MODES:
|
||||||
|
return BITFIELD_MASK(PIPE_PRIM_MAX);
|
||||||
|
|
||||||
case PIPE_CAP_MIN_TEXEL_OFFSET:
|
case PIPE_CAP_MIN_TEXEL_OFFSET:
|
||||||
/* GL 3.x minimum value. */
|
/* GL 3.x minimum value. */
|
||||||
return -8;
|
return -8;
|
||||||
|
@@ -310,6 +310,9 @@ void u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps,
|
|||||||
caps->rewrite_restart_index = screen->get_param(screen, PIPE_CAP_EMULATE_NONFIXED_PRIMITIVE_RESTART);
|
caps->rewrite_restart_index = screen->get_param(screen, PIPE_CAP_EMULATE_NONFIXED_PRIMITIVE_RESTART);
|
||||||
caps->fallback_always |= caps->rewrite_restart_index;
|
caps->fallback_always |= caps->rewrite_restart_index;
|
||||||
}
|
}
|
||||||
|
caps->supported_prim_modes = screen->get_param(screen, PIPE_CAP_SUPPORTED_PRIM_MODES);
|
||||||
|
if (caps->supported_prim_modes != BITFIELD_MASK(PIPE_PRIM_MAX))
|
||||||
|
caps->fallback_always = true;
|
||||||
|
|
||||||
if (!screen->is_format_supported(screen, PIPE_FORMAT_R8_UINT, PIPE_BUFFER, 0, 0, PIPE_BIND_INDEX_BUFFER))
|
if (!screen->is_format_supported(screen, PIPE_FORMAT_R8_UINT, PIPE_BUFFER, 0, 0, PIPE_BIND_INDEX_BUFFER))
|
||||||
caps->fallback_always = caps->rewrite_ubyte_ibs = true;
|
caps->fallback_always = caps->rewrite_ubyte_ibs = true;
|
||||||
@@ -334,10 +337,11 @@ u_vbuf_create(struct pipe_context *pipe, struct u_vbuf_caps *caps)
|
|||||||
|
|
||||||
mgr->caps = *caps;
|
mgr->caps = *caps;
|
||||||
mgr->pipe = pipe;
|
mgr->pipe = pipe;
|
||||||
if (caps->rewrite_ubyte_ibs || caps->rewrite_restart_index) {
|
if (caps->rewrite_ubyte_ibs || caps->rewrite_restart_index ||
|
||||||
|
(caps->supported_prim_modes & BITFIELD_MASK(PIPE_PRIM_MAX)) != BITFIELD_MASK(PIPE_PRIM_MAX)) {
|
||||||
struct primconvert_config cfg;
|
struct primconvert_config cfg;
|
||||||
cfg.fixed_prim_restart = caps->rewrite_restart_index;
|
cfg.fixed_prim_restart = caps->rewrite_restart_index;
|
||||||
cfg.primtypes_mask = 0xff;
|
cfg.primtypes_mask = caps->supported_prim_modes;
|
||||||
cfg.restart_primtypes_mask = 0xff;
|
cfg.restart_primtypes_mask = 0xff;
|
||||||
mgr->pc = util_primconvert_create_config(pipe, &cfg);
|
mgr->pc = util_primconvert_create_config(pipe, &cfg);
|
||||||
}
|
}
|
||||||
@@ -1387,7 +1391,8 @@ void u_vbuf_draw_vbo(struct u_vbuf *mgr, const struct pipe_draw_info *info,
|
|||||||
(info->index_size != 1 || !mgr->caps.rewrite_ubyte_ibs) &&
|
(info->index_size != 1 || !mgr->caps.rewrite_ubyte_ibs) &&
|
||||||
(!info->primitive_restart ||
|
(!info->primitive_restart ||
|
||||||
info->restart_index == fixed_restart_index ||
|
info->restart_index == fixed_restart_index ||
|
||||||
!mgr->caps.rewrite_restart_index)) {
|
!mgr->caps.rewrite_restart_index) &&
|
||||||
|
mgr->caps.supported_prim_modes & BITFIELD_BIT(info->mode)) {
|
||||||
|
|
||||||
/* Set vertex buffers if needed. */
|
/* Set vertex buffers if needed. */
|
||||||
if (mgr->dirty_real_vb_mask & used_vb_mask) {
|
if (mgr->dirty_real_vb_mask & used_vb_mask) {
|
||||||
@@ -1668,7 +1673,8 @@ void u_vbuf_draw_vbo(struct u_vbuf *mgr, const struct pipe_draw_info *info,
|
|||||||
|
|
||||||
if ((new_info.index_size == 1 && mgr->caps.rewrite_ubyte_ibs) ||
|
if ((new_info.index_size == 1 && mgr->caps.rewrite_ubyte_ibs) ||
|
||||||
(new_info.primitive_restart &&
|
(new_info.primitive_restart &&
|
||||||
(new_info.restart_index != fixed_restart_index && mgr->caps.rewrite_restart_index))) {
|
new_info.restart_index != fixed_restart_index && mgr->caps.rewrite_restart_index) ||
|
||||||
|
!(mgr->caps.supported_prim_modes & BITFIELD_BIT(new_info.mode))) {
|
||||||
util_primconvert_save_flatshade_first(mgr->pc, mgr->flatshade_first);
|
util_primconvert_save_flatshade_first(mgr->pc, mgr->flatshade_first);
|
||||||
util_primconvert_draw_vbo(mgr->pc, &new_info, drawid_offset, indirect, &new_draw, 1);
|
util_primconvert_draw_vbo(mgr->pc, &new_info, drawid_offset, indirect, &new_draw, 1);
|
||||||
} else
|
} else
|
||||||
|
@@ -57,6 +57,7 @@ struct u_vbuf_caps {
|
|||||||
/* Maximum number of vertex buffers */
|
/* Maximum number of vertex buffers */
|
||||||
unsigned max_vertex_buffers:6;
|
unsigned max_vertex_buffers:6;
|
||||||
|
|
||||||
|
uint16_t supported_prim_modes;
|
||||||
bool fallback_always;
|
bool fallback_always;
|
||||||
bool fallback_only_for_user_vbuffers;
|
bool fallback_only_for_user_vbuffers;
|
||||||
bool rewrite_ubyte_ibs;
|
bool rewrite_ubyte_ibs;
|
||||||
|
@@ -105,6 +105,8 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
|
|||||||
/* nv35 capabilities */
|
/* nv35 capabilities */
|
||||||
case PIPE_CAP_DEPTH_BOUNDS_TEST:
|
case PIPE_CAP_DEPTH_BOUNDS_TEST:
|
||||||
return eng3d->oclass == NV35_3D_CLASS || eng3d->oclass >= NV40_3D_CLASS;
|
return eng3d->oclass == NV35_3D_CLASS || eng3d->oclass >= NV40_3D_CLASS;
|
||||||
|
case PIPE_CAP_SUPPORTED_PRIM_MODES:
|
||||||
|
return BITFIELD_MASK(PIPE_PRIM_MAX);
|
||||||
/* nv4x capabilities */
|
/* nv4x capabilities */
|
||||||
case PIPE_CAP_BLEND_EQUATION_SEPARATE:
|
case PIPE_CAP_BLEND_EQUATION_SEPARATE:
|
||||||
case PIPE_CAP_NPOT_TEXTURES:
|
case PIPE_CAP_NPOT_TEXTURES:
|
||||||
|
@@ -188,6 +188,9 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
|
|||||||
case PIPE_CAP_MAX_TEXTURE_MB:
|
case PIPE_CAP_MAX_TEXTURE_MB:
|
||||||
return 0; /* TODO: use 1/2 of VRAM for this? */
|
return 0; /* TODO: use 1/2 of VRAM for this? */
|
||||||
|
|
||||||
|
case PIPE_CAP_SUPPORTED_PRIM_MODES:
|
||||||
|
return BITFIELD_MASK(PIPE_PRIM_MAX);
|
||||||
|
|
||||||
/* supported caps */
|
/* supported caps */
|
||||||
case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
|
case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
|
||||||
case PIPE_CAP_TEXTURE_MIRROR_CLAMP_TO_EDGE:
|
case PIPE_CAP_TEXTURE_MIRROR_CLAMP_TO_EDGE:
|
||||||
|
@@ -208,6 +208,9 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
|
|||||||
case PIPE_CAP_MAX_TEXTURE_MB:
|
case PIPE_CAP_MAX_TEXTURE_MB:
|
||||||
return 0; /* TODO: use 1/2 of VRAM for this? */
|
return 0; /* TODO: use 1/2 of VRAM for this? */
|
||||||
|
|
||||||
|
case PIPE_CAP_SUPPORTED_PRIM_MODES:
|
||||||
|
return BITFIELD_MASK(PIPE_PRIM_MAX);
|
||||||
|
|
||||||
/* supported caps */
|
/* supported caps */
|
||||||
case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
|
case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
|
||||||
case PIPE_CAP_TEXTURE_MIRROR_CLAMP_TO_EDGE:
|
case PIPE_CAP_TEXTURE_MIRROR_CLAMP_TO_EDGE:
|
||||||
|
@@ -990,6 +990,7 @@ enum pipe_cap
|
|||||||
PIPE_CAP_SAMPLER_REDUCTION_MINMAX_ARB,
|
PIPE_CAP_SAMPLER_REDUCTION_MINMAX_ARB,
|
||||||
PIPE_CAP_ALLOW_DYNAMIC_VAO_FASTPATH,
|
PIPE_CAP_ALLOW_DYNAMIC_VAO_FASTPATH,
|
||||||
PIPE_CAP_EMULATE_NONFIXED_PRIMITIVE_RESTART,
|
PIPE_CAP_EMULATE_NONFIXED_PRIMITIVE_RESTART,
|
||||||
|
PIPE_CAP_SUPPORTED_PRIM_MODES,
|
||||||
|
|
||||||
PIPE_CAP_LAST,
|
PIPE_CAP_LAST,
|
||||||
/* XXX do not add caps after PIPE_CAP_LAST! */
|
/* XXX do not add caps after PIPE_CAP_LAST! */
|
||||||
|
Reference in New Issue
Block a user