* ``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:
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);
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:
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);
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();
(!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. */
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);
/* 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;
/* 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 */
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:
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);
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:
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);
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:
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,
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! */
!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 +