Browse Source

r600g: Implement sm5 geometry shader instancing

Requires Evergreen or later hardware.

Signed-off-by: Glenn Kennard <glenn.kennard@gmail.com>
tags/10.4-branchpoint
Glenn Kennard 11 years ago
parent
commit
8d0f6ff810

+ 1
- 1
docs/GL3.txt View File

@@ -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 ()

+ 2
- 2
src/gallium/drivers/r600/evergreen_state.c View File

@@ -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);

+ 11
- 0
src/gallium/drivers/r600/r600_shader.c View File

@@ -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:

+ 1
- 0
src/gallium/drivers/r600/r600_shader.h View File

@@ -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;


Loading…
Cancel
Save