/** * Check if the hardware's cut index support can handle the primitive * restart case. */ static bool can_cut_index_handle_prims(struct gl_context *ctx, const struct _mesa_prim *prim, GLuint nr_prims, const struct _mesa_index_buffer *ib) { if (!can_cut_index_handle_restart_index(ctx, ib)) { /* The primitive restart index can't be handled, so take * the software path */ return false; } for ( ; nr_prims > 0; nr_prims--) { switch(prim->mode) { case GL_POINTS: case GL_LINES: case GL_LINE_STRIP: case GL_TRIANGLES: case GL_TRIANGLE_STRIP: /* Cut index supports these primitive types */ break; default: /* Cut index does not support these primitive types */ //case GL_LINE_LOOP: //case GL_TRIANGLE_FAN: //case GL_QUADS: //case GL_QUAD_STRIP: //case GL_POLYGON: return false; } } return true; }
/** * Check if the hardware's cut index support can handle the primitive * restart case. */ static bool can_cut_index_handle_prims(struct gl_context *ctx, const struct _mesa_prim *prim, GLuint nr_prims, const struct _mesa_index_buffer *ib) { struct brw_context *brw = brw_context(ctx); if (brw->sol.counting_primitives_generated || brw->sol.counting_primitives_written) { /* Counting primitives generated in hardware is not currently * supported, so take the software path. We need to investigate * the *_PRIMITIVES_COUNT registers to allow this to be handled * entirely in hardware. */ return false; } if (!can_cut_index_handle_restart_index(ctx, ib)) { /* The primitive restart index can't be handled, so take * the software path */ return false; } for ( ; nr_prims > 0; nr_prims--) { switch(prim->mode) { case GL_POINTS: case GL_LINES: case GL_LINE_STRIP: case GL_TRIANGLES: case GL_TRIANGLE_STRIP: /* Cut index supports these primitive types */ break; default: /* Cut index does not support these primitive types */ //case GL_LINE_LOOP: //case GL_TRIANGLE_FAN: //case GL_QUADS: //case GL_QUAD_STRIP: //case GL_POLYGON: return false; } } return true; }
/** * Check if the hardware's cut index support can handle the primitive * restart case. */ static bool can_cut_index_handle_prims(struct gl_context *ctx, const struct _mesa_prim *prim, GLuint nr_prims, const struct _mesa_index_buffer *ib) { struct brw_context *brw = brw_context(ctx); /* Otherwise Haswell can do it all. */ if (brw->gen >= 8 || brw->is_haswell) return true; if (!can_cut_index_handle_restart_index(ctx, ib)) { /* The primitive restart index can't be handled, so take * the software path */ return false; } for (int i = 0; i < nr_prims; i++) { switch (prim[i].mode) { case GL_POINTS: case GL_LINES: case GL_LINE_STRIP: case GL_TRIANGLES: case GL_TRIANGLE_STRIP: case GL_LINES_ADJACENCY: case GL_LINE_STRIP_ADJACENCY: case GL_TRIANGLES_ADJACENCY: case GL_TRIANGLE_STRIP_ADJACENCY: /* Cut index supports these primitive types */ break; default: /* Cut index does not support these primitive types */ //case GL_LINE_LOOP: //case GL_TRIANGLE_FAN: //case GL_QUADS: //case GL_QUAD_STRIP: //case GL_POLYGON: return false; } } return true; }