From 8d0f6ff810e9bc16ef7c2fd8d5a34d12f2643f91 Mon Sep 17 00:00:00 2001 From: Glenn Kennard Date: Mon, 25 Aug 2014 11:05:06 +0200 Subject: [PATCH] r600g: Implement sm5 geometry shader instancing Requires Evergreen or later hardware. Signed-off-by: Glenn Kennard --- docs/GL3.txt | 2 +- src/gallium/drivers/r600/evergreen_state.c | 4 ++-- src/gallium/drivers/r600/r600_shader.c | 11 +++++++++++ src/gallium/drivers/r600/r600_shader.h | 1 + 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/docs/GL3.txt b/docs/GL3.txt index 3d7a450c9e9..f5d5e72c961 100644 --- a/docs/GL3.txt +++ b/docs/GL3.txt @@ -104,7 +104,7 @@ GL 4.0, GLSL 4.00: - Fused multiply-add DONE () - Packing/bitfield/conversion functions DONE (r600) - Enhanced textureGather DONE (r600, radeonsi) - - Geometry shader instancing DONE () + - Geometry shader instancing DONE (r600) - Geometry shader multiple streams DONE () - Enhanced per-sample shading DONE (r600) - Interpolation functions DONE () diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c index 9f0e82dd1c0..8ce31dca81e 100644 --- a/src/gallium/drivers/r600/evergreen_state.c +++ b/src/gallium/drivers/r600/evergreen_state.c @@ -2963,8 +2963,8 @@ void evergreen_update_gs_state(struct pipe_context *ctx, struct r600_pipe_shader if (rctx->screen->b.info.drm_minor >= 35) { r600_store_context_reg(cb, R_028B90_VGT_GS_INSTANCE_CNT, - S_028B90_CNT(0) | - S_028B90_ENABLE(0)); + S_028B90_CNT(MIN2(rshader->gs_num_invocations, 127)) | + S_028B90_ENABLE(rshader->gs_num_invocations > 0)); } r600_store_context_reg_seq(cb, R_02891C_SQ_GS_VERT_ITEMSIZE, 4); r600_store_value(cb, cp_shader->ring_item_size >> 2); diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c index 3f089b4f7d9..9f10c20c4c3 100644 --- a/src/gallium/drivers/r600/r600_shader.c +++ b/src/gallium/drivers/r600/r600_shader.c @@ -706,6 +706,8 @@ static int tgsi_declaration(struct r600_shader_ctx *ctx) break; } else if (d->Semantic.Name == TGSI_SEMANTIC_VERTEXID) break; + else if (d->Semantic.Name == TGSI_SEMANTIC_INVOCATIONID) + break; default: R600_ERR("unsupported file %d declaration\n", d->Declaration.File); return -EINVAL; @@ -811,6 +813,12 @@ static void tgsi_src(struct r600_shader_ctx *ctx, r600_src->swizzle[2] = 0; r600_src->swizzle[3] = 0; r600_src->sel = 0; + } else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INVOCATIONID) { + r600_src->swizzle[0] = 3; + r600_src->swizzle[1] = 3; + r600_src->swizzle[2] = 3; + r600_src->swizzle[3] = 3; + r600_src->sel = 1; } } else { if (tgsi_src->Register.Indirect) @@ -1753,6 +1761,9 @@ static int r600_shader_from_tgsi(struct r600_context *rctx, case TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES: shader->gs_max_out_vertices = property->u[0].Data; break; + case TGSI_PROPERTY_GS_INVOCATIONS: + shader->gs_num_invocations = property->u[0].Data; + break; } break; default: diff --git a/src/gallium/drivers/r600/r600_shader.h b/src/gallium/drivers/r600/r600_shader.h index d6db8f063ac..4b27ede96dd 100644 --- a/src/gallium/drivers/r600/r600_shader.h +++ b/src/gallium/drivers/r600/r600_shader.h @@ -74,6 +74,7 @@ struct r600_shader { unsigned gs_input_prim; unsigned gs_output_prim; unsigned gs_max_out_vertices; + unsigned gs_num_invocations; /* size in bytes of a data item in the ring (single vertex data) */ unsigned ring_item_size; -- 2.30.2