From: Marek Olšák Date: Mon, 31 May 2021 23:21:28 +0000 (-0400) Subject: radeonsi: drop support for triangle fans from the prim discard CS X-Git-Tag: upstream/21.2.3~1592 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=df4de12af48b66578e5fe2fce557abd713f28980;p=platform%2Fupstream%2Fmesa.git radeonsi: drop support for triangle fans from the prim discard CS because it doesn't implement triangle fan splitting, so it's incomplete Acked-by: Pierre-Eric Pelloux-Prayer Part-of: --- diff --git a/src/gallium/drivers/radeonsi/si_compute_prim_discard.c b/src/gallium/drivers/radeonsi/si_compute_prim_discard.c index 0d24fd2..61b42c9 100644 --- a/src/gallium/drivers/radeonsi/si_compute_prim_discard.c +++ b/src/gallium/drivers/radeonsi/si_compute_prim_discard.c @@ -42,7 +42,7 @@ * * It takes a monolithic VS in LLVM IR returning gl_Position and invokes it * in a compute shader. The shader processes 1 primitive/thread by invoking - * the VS for each vertex to get the positions, decomposes strips and fans + * the VS for each vertex to get the positions, decomposes strips * into triangles (if needed), eliminates primitive restart (if needed), * does (W<0) culling, face culling, view XY culling, zero-area and * small-primitive culling, and generates a new index buffer that doesn't @@ -77,7 +77,7 @@ * represents the barrier in the previous gfx IB. * * Features: - * - Triangle strips and fans are decomposed into an indexed triangle list. + * - Triangle strips are decomposed into an indexed triangle list. * The decomposition differs based on the provoking vertex state. * - Instanced draws are converted into non-instanced draws for 16-bit indices. * (InstanceID is stored in the high bits of VertexID and unpacked by VS) @@ -96,7 +96,7 @@ * - HiZ culling. * * Limitations (and unimplemented features that may be possible to implement): - * - Only triangles, triangle strips, and triangle fans are supported. + * - Only triangles and triangle strips are supported. * - Primitive restart is only supported with triangle strips. * - Instancing and primitive restart can't be used together. * - Instancing is only supported with 16-bit indices and instance count <= 2^16. @@ -432,22 +432,6 @@ void si_build_prim_discard_compute_shader(struct si_shader_context *ctx) index[i] = LLVMBuildAdd(builder, prim_id, LLVMConstInt(ctx->ac.i32, i, 0), ""); } break; - case PIPE_PRIM_TRIANGLE_FAN: - /* Vertex 1 is first and vertex 2 is last. This will go to the hw clipper - * and rasterizer as a normal triangle, so we need to put the provoking - * vertex into the correct index variable and preserve orientation at the same time. - * gl_VertexID is preserved, because it's equal to the index. - */ - if (key->opt.cs_provoking_vertex_first) { - index[0] = LLVMBuildAdd(builder, prim_id, LLVMConstInt(ctx->ac.i32, 1, 0), ""); - index[1] = LLVMBuildAdd(builder, prim_id, LLVMConstInt(ctx->ac.i32, 2, 0), ""); - index[2] = ctx->ac.i32_0; - } else { - index[0] = ctx->ac.i32_0; - index[1] = LLVMBuildAdd(builder, prim_id, LLVMConstInt(ctx->ac.i32, 1, 0), ""); - index[2] = LLVMBuildAdd(builder, prim_id, LLVMConstInt(ctx->ac.i32, 2, 0), ""); - } - break; default: unreachable("unexpected primitive type"); } @@ -967,9 +951,8 @@ si_prepare_prim_discard_or_split_draw(struct si_context *sctx, const struct pipe /* Split draws at the draw call level if the ring is full. This makes * better use of the ring space. */ - if (ring_full && num_prims > split_prims_draw_level && - instance_count == 1 && /* TODO: support splitting instanced draws */ - (1 << prim) & ((1 << PIPE_PRIM_TRIANGLES) | (1 << PIPE_PRIM_TRIANGLE_STRIP))) { + if (ring_full && num_prims > PRIMS_PER_BATCH && + instance_count == 1) { /* TODO: support splitting instanced draws */ unsigned vert_count_per_subdraw = 0; if (prim == PIPE_PRIM_TRIANGLES) @@ -1136,7 +1119,6 @@ void si_dispatch_prim_discard_cs_and_draw(struct si_context *sctx, switch (info->mode) { case PIPE_PRIM_TRIANGLES: case PIPE_PRIM_TRIANGLE_STRIP: - case PIPE_PRIM_TRIANGLE_FAN: vertices_per_prim = 3; output_indexbuf_format = V_008F0C_BUF_DATA_FORMAT_32_32_32; gfx10_output_indexbuf_format = V_008F0C_GFX10_FORMAT_32_32_32_UINT; diff --git a/src/gallium/drivers/radeonsi/si_state_draw.cpp b/src/gallium/drivers/radeonsi/si_state_draw.cpp index 3fcac6a..52d1087 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.cpp +++ b/src/gallium/drivers/radeonsi/si_state_draw.cpp @@ -1933,8 +1933,7 @@ static void si_draw_vbo(struct pipe_context *ctx, (instance_count == 1 || pd_msg("instance_count > 1 with primitive restart")) : /* Supported prim types without primitive restart + allow instancing: */ - (1 << prim) & ((1 << PIPE_PRIM_TRIANGLES) | (1 << PIPE_PRIM_TRIANGLE_STRIP) | - (1 << PIPE_PRIM_TRIANGLE_FAN)) && + (1 << prim) & ((1 << PIPE_PRIM_TRIANGLES) | (1 << PIPE_PRIM_TRIANGLE_STRIP)) && /* Instancing is limited to 16-bit indices, because InstanceID is packed into VertexID. */ /* TODO: DrawArraysInstanced doesn't sometimes work, so it's disabled. */