summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorDave Airlie <[email protected]>2013-12-19 05:17:00 +0000
committerDave Airlie <[email protected]>2014-02-05 10:49:39 +1000
commitb0e842bd9f90d6b77eae085a168d5a6c49962bf3 (patch)
treecd2a46e45483d274031c3566a8f6416a28922603 /src/gallium
parent20adc7449cc4abe2caf6d78d2c62cc0e6e86b87c (diff)
r600g: emit streamout from dma copy shader
This enables streamout with GS in the mix, from the VS dma shader. Signed-off-by: Dave Airlie <[email protected]> Reviewed-by: Alex Deucher <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/r600/r600_shader.c6
-rw-r--r--src/gallium/drivers/r600/r600_state_common.c4
2 files changed, 8 insertions, 2 deletions
diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
index 07b343bd5fe..e24b64d1781 100644
--- a/src/gallium/drivers/r600/r600_shader.c
+++ b/src/gallium/drivers/r600/r600_shader.c
@@ -1095,7 +1095,8 @@ out_err:
}
static int generate_gs_copy_shader(struct r600_context *rctx,
- struct r600_pipe_shader *gs)
+ struct r600_pipe_shader *gs,
+ struct pipe_stream_output_info *so)
{
struct r600_shader_ctx ctx = {};
struct r600_shader *gs_shader = &gs->shader;
@@ -1179,6 +1180,7 @@ static int generate_gs_copy_shader(struct r600_context *rctx,
}
/* XXX handle clipvertex, streamout? */
+ emit_streamout(&ctx, so);
/* export vertex data */
/* XXX factor out common code with r600_shader_from_tgsi ? */
@@ -1961,7 +1963,7 @@ static int r600_shader_from_tgsi(struct r600_context *rctx,
}
if (ctx.type == TGSI_PROCESSOR_GEOMETRY) {
- if ((r = generate_gs_copy_shader(rctx, pipeshader)))
+ if ((r = generate_gs_copy_shader(rctx, pipeshader, &so)))
return r;
}
diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
index 3221a8e24e8..6cc6ef048ba 100644
--- a/src/gallium/drivers/r600/r600_state_common.c
+++ b/src/gallium/drivers/r600/r600_state_common.c
@@ -826,6 +826,10 @@ static void r600_bind_gs_state(struct pipe_context *ctx, void *state)
struct r600_context *rctx = (struct r600_context *)ctx;
rctx->gs_shader = (struct r600_pipe_shader_selector *)state;
+
+ if (!state)
+ return;
+ rctx->b.streamout.stride_in_dw = rctx->gs_shader->so.stride;
}
static void r600_delete_shader_selector(struct pipe_context *ctx,