diff --git a/docs/gallium/screen.rst b/docs/gallium/screen.rst index 19dd2948bb2..96914e5fcc7 100644 --- a/docs/gallium/screen.rst +++ b/docs/gallium/screen.rst @@ -617,6 +617,7 @@ The integer capabilities: * ``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_SUPPORTED_PRIM_MODES``: A bitmask of the ``pipe_prim_type`` enum values that the driver can natively support. +* ``PIPE_CAP_SUPPORTED_PRIM_MODES_WITH_RESTART``: A bitmask of the ``pipe_prim_type`` enum values that the driver can natively support for primitive restart. Only useful if ``PIPE_CAP_PRIMITIVE_RESTART`` is also exported. ``PIPE_PRIM_PATCHES`` must be supported to prevent incorrect lowering of primitive restart. .. _pipe_capf: diff --git a/src/gallium/auxiliary/util/u_screen.c b/src/gallium/auxiliary/util/u_screen.c index 70ac8a94aad..f682eede342 100644 --- a/src/gallium/auxiliary/util/u_screen.c +++ b/src/gallium/auxiliary/util/u_screen.c @@ -87,6 +87,7 @@ u_pipe_screen_get_param_defaults(struct pipe_screen *pscreen, case PIPE_CAP_RGB_OVERRIDE_DST_ALPHA_BLEND: return 0; + case PIPE_CAP_SUPPORTED_PRIM_MODES_WITH_RESTART: case PIPE_CAP_SUPPORTED_PRIM_MODES: return BITFIELD_MASK(PIPE_PRIM_MAX); @@ -272,7 +273,6 @@ u_pipe_screen_get_param_defaults(struct pipe_screen *pscreen, case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT: case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR: case PIPE_CAP_CULL_DISTANCE: - case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES: case PIPE_CAP_TGSI_VOTE: case PIPE_CAP_MAX_WINDOW_RECTANGLES: /* Enables EXT_window_rectangles */ case PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED: diff --git a/src/gallium/auxiliary/util/u_vbuf.c b/src/gallium/auxiliary/util/u_vbuf.c index c09f785d3ae..513b79ba38f 100644 --- a/src/gallium/auxiliary/util/u_vbuf.c +++ b/src/gallium/auxiliary/util/u_vbuf.c @@ -308,6 +308,7 @@ void u_vbuf_get_caps(struct pipe_screen *screen, struct u_vbuf_caps *caps, if (screen->get_param(screen, PIPE_CAP_PRIMITIVE_RESTART) || screen->get_param(screen, PIPE_CAP_PRIMITIVE_RESTART_FIXED_INDEX)) { caps->rewrite_restart_index = screen->get_param(screen, PIPE_CAP_EMULATE_NONFIXED_PRIMITIVE_RESTART); + caps->supported_restart_modes = screen->get_param(screen, PIPE_CAP_SUPPORTED_PRIM_MODES_WITH_RESTART); caps->fallback_always |= caps->rewrite_restart_index; } caps->supported_prim_modes = screen->get_param(screen, PIPE_CAP_SUPPORTED_PRIM_MODES); @@ -338,11 +339,13 @@ u_vbuf_create(struct pipe_context *pipe, struct u_vbuf_caps *caps) mgr->caps = *caps; mgr->pipe = pipe; if (caps->rewrite_ubyte_ibs || caps->rewrite_restart_index || - (caps->supported_prim_modes & BITFIELD_MASK(PIPE_PRIM_MAX)) != BITFIELD_MASK(PIPE_PRIM_MAX)) { + /* require all but patches */ + ((caps->supported_prim_modes & caps->supported_restart_modes & BITFIELD_MASK(PIPE_PRIM_MAX))) != + BITFIELD_MASK(PIPE_PRIM_MAX)) { struct primconvert_config cfg; cfg.fixed_prim_restart = caps->rewrite_restart_index; cfg.primtypes_mask = caps->supported_prim_modes; - cfg.restart_primtypes_mask = 0xff; + cfg.restart_primtypes_mask = caps->supported_restart_modes; mgr->pc = util_primconvert_create_config(pipe, &cfg); } mgr->translate_cache = translate_cache_create(); @@ -1392,6 +1395,7 @@ void u_vbuf_draw_vbo(struct u_vbuf *mgr, const struct pipe_draw_info *info, (!info->primitive_restart || info->restart_index == fixed_restart_index || !mgr->caps.rewrite_restart_index) && + (!info->primitive_restart || mgr->caps.supported_restart_modes & BITFIELD_BIT(info->mode)) && mgr->caps.supported_prim_modes & BITFIELD_BIT(info->mode)) { /* Set vertex buffers if needed. */ @@ -1673,7 +1677,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) || (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_restart_modes & BITFIELD_BIT(new_info.mode)))) || !(mgr->caps.supported_prim_modes & BITFIELD_BIT(new_info.mode))) { util_primconvert_save_flatshade_first(mgr->pc, mgr->flatshade_first); util_primconvert_draw_vbo(mgr->pc, &new_info, drawid_offset, indirect, &new_draw, 1); diff --git a/src/gallium/auxiliary/util/u_vbuf.h b/src/gallium/auxiliary/util/u_vbuf.h index 486cd5d2f3d..5cefac56700 100644 --- a/src/gallium/auxiliary/util/u_vbuf.h +++ b/src/gallium/auxiliary/util/u_vbuf.h @@ -57,6 +57,7 @@ struct u_vbuf_caps { /* Maximum number of vertex buffers */ unsigned max_vertex_buffers:6; + uint16_t supported_restart_modes; uint16_t supported_prim_modes; bool fallback_always; bool fallback_only_for_user_vbuffers; diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c b/src/gallium/drivers/nouveau/nv30/nv30_screen.c index 8f5d2eb1b7a..cd5c50fbc72 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c @@ -105,6 +105,7 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) /* nv35 capabilities */ case PIPE_CAP_DEPTH_BOUNDS_TEST: return eng3d->oclass == NV35_3D_CLASS || eng3d->oclass >= NV40_3D_CLASS; + case PIPE_CAP_SUPPORTED_PRIM_MODES_WITH_RESTART: case PIPE_CAP_SUPPORTED_PRIM_MODES: return BITFIELD_MASK(PIPE_PRIM_MAX); /* nv4x capabilities */ @@ -208,7 +209,6 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT: case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR: case PIPE_CAP_CULL_DISTANCE: - case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES: case PIPE_CAP_TGSI_VOTE: case PIPE_CAP_MAX_WINDOW_RECTANGLES: case PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED: diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c index 92343e54346..b2a0b16eff4 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c @@ -188,6 +188,7 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_MAX_TEXTURE_MB: return 0; /* TODO: use 1/2 of VRAM for this? */ + case PIPE_CAP_SUPPORTED_PRIM_MODES_WITH_RESTART: case PIPE_CAP_SUPPORTED_PRIM_MODES: return BITFIELD_MASK(PIPE_PRIM_MAX); @@ -316,7 +317,6 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_PCI_DEVICE: case PIPE_CAP_PCI_FUNCTION: case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR: - case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES: case PIPE_CAP_TGSI_VOTE: case PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED: case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS: diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c index 6cd4aab1f09..de6dd2be0a3 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c @@ -208,6 +208,7 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_MAX_TEXTURE_MB: return 0; /* TODO: use 1/2 of VRAM for this? */ + case PIPE_CAP_SUPPORTED_PRIM_MODES_WITH_RESTART: case PIPE_CAP_SUPPORTED_PRIM_MODES: return BITFIELD_MASK(PIPE_PRIM_MAX); @@ -283,7 +284,6 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_STRING_MARKER: case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT: case PIPE_CAP_CULL_DISTANCE: - case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES: case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR: case PIPE_CAP_TGSI_VOTE: case PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED: diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h index 2e683d989f4..09db0b8b334 100644 --- a/src/gallium/include/pipe/p_defines.h +++ b/src/gallium/include/pipe/p_defines.h @@ -869,7 +869,6 @@ enum pipe_cap PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT, PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR, PIPE_CAP_CULL_DISTANCE, - PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES, PIPE_CAP_TGSI_VOTE, PIPE_CAP_MAX_WINDOW_RECTANGLES, PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED, @@ -991,6 +990,7 @@ enum pipe_cap PIPE_CAP_ALLOW_DYNAMIC_VAO_FASTPATH, PIPE_CAP_EMULATE_NONFIXED_PRIMITIVE_RESTART, PIPE_CAP_SUPPORTED_PRIM_MODES, + PIPE_CAP_SUPPORTED_PRIM_MODES_WITH_RESTART, PIPE_CAP_LAST, /* XXX do not add caps after PIPE_CAP_LAST! */ diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index 18131af3166..075bb28e14d 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -410,8 +410,7 @@ void st_init_limits(struct pipe_screen *screen, !screen->get_param(screen, PIPE_CAP_NIR_COMPACT_ARRAYS); c->LowerCsDerivedVariables = !screen->get_param(screen, PIPE_CAP_CS_DERIVED_SYSTEM_VALUES_SUPPORTED); - c->PrimitiveRestartForPatches = - screen->get_param(screen, PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES); + c->PrimitiveRestartForPatches = false; c->MaxCombinedTextureImageUnits = _min(c->Program[MESA_SHADER_VERTEX].MaxTextureImageUnits +