r600g: Implement sm5 geometry shader instancing
Requires Evergreen or later hardware. Signed-off-by: Glenn Kennard <glenn.kennard@gmail.com>
This commit is contained in:

committed by
Marek Olšák

parent
482def592f
commit
8d0f6ff810
@@ -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 ()
|
||||
|
@@ -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);
|
||||
|
@@ -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:
|
||||
|
@@ -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;
|
||||
|
||||
|
Reference in New Issue
Block a user