aboutsummaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers
diff options
context:
space:
mode:
authorSamuel Iglesias Gonsalvez <[email protected]>2014-07-01 08:52:47 +0200
committerIago Toral Quiroga <[email protected]>2014-09-19 15:01:14 +0200
commitbc383cb55b9d342a77b44328cb4acb5bbdf4a80c (patch)
tree8b4a60f19100b1d8f9b899505059bf685bdc6a9e /src/mesa/drivers
parentdd376bdb254888f156e24d4360b6f6a408e2c5a2 (diff)
i965/gen6/gs: use brw_gs_prog atom instead of brw_ff_gs_prog
This is needed to support user-provided geometry shaders, since the brw_ff_gs_prog atom in gen6 only takes care of implementing transform feedback for vertex shaders. If there is no user-provided geometry shader the implementation falls back to the original code. Signed-off-by: Samuel Iglesias Gonsalvez <[email protected]> Reviewed-by: Jordan Justen <[email protected]> Acked-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/mesa/drivers')
-rw-r--r--src/mesa/drivers/dri/i965/brw_gs.c4
-rw-r--r--src/mesa/drivers/dri/i965/brw_gs.h1
-rw-r--r--src/mesa/drivers/dri/i965/brw_state_upload.c2
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4_gs.c11
4 files changed, 16 insertions, 2 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_gs.c b/src/mesa/drivers/dri/i965/brw_gs.c
index fbd728f67c3..c0c4c13f13c 100644
--- a/src/mesa/drivers/dri/i965/brw_gs.c
+++ b/src/mesa/drivers/dri/i965/brw_gs.c
@@ -243,6 +243,10 @@ brw_upload_ff_gs_prog(struct brw_context *brw)
}
}
+void gen6_brw_upload_ff_gs_prog(struct brw_context *brw)
+{
+ brw_upload_ff_gs_prog(brw);
+}
const struct brw_tracked_state brw_ff_gs_prog = {
.dirty = {
diff --git a/src/mesa/drivers/dri/i965/brw_gs.h b/src/mesa/drivers/dri/i965/brw_gs.h
index f8f430c157a..a538948e9ac 100644
--- a/src/mesa/drivers/dri/i965/brw_gs.h
+++ b/src/mesa/drivers/dri/i965/brw_gs.h
@@ -110,5 +110,6 @@ void brw_ff_gs_lines(struct brw_ff_gs_compile *c);
void gen6_sol_program(struct brw_ff_gs_compile *c,
struct brw_ff_gs_prog_key *key,
unsigned num_verts, bool check_edge_flag);
+void gen6_brw_upload_ff_gs_prog(struct brw_context *brw);
#endif
diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c b/src/mesa/drivers/dri/i965/brw_state_upload.c
index e9466212280..87cc0eaba23 100644
--- a/src/mesa/drivers/dri/i965/brw_state_upload.c
+++ b/src/mesa/drivers/dri/i965/brw_state_upload.c
@@ -108,7 +108,7 @@ static const struct brw_tracked_state *gen4_atoms[] =
static const struct brw_tracked_state *gen6_atoms[] =
{
&brw_vs_prog, /* must do before state base address */
- &brw_ff_gs_prog, /* must do before state base address */
+ &brw_gs_prog, /* must do before state base address */
&brw_wm_prog, /* must do before state base address */
&gen6_clip_vp,
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_gs.c b/src/mesa/drivers/dri/i965/brw_vec4_gs.c
index b5b2a0f454f..b00e584f7a2 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_gs.c
+++ b/src/mesa/drivers/dri/i965/brw_vec4_gs.c
@@ -31,6 +31,7 @@
#include "brw_context.h"
#include "brw_vec4_gs_visitor.h"
#include "brw_state.h"
+#include "brw_gs.h"
static bool
@@ -272,6 +273,12 @@ brw_upload_gs_prog(struct brw_context *brw)
(struct brw_geometry_program *) brw->geometry_program;
if (gp == NULL) {
+ if (brw->gen == 6) {
+ if (brw->state.dirty.brw & BRW_NEW_TRANSFORM_FEEDBACK)
+ gen6_brw_upload_ff_gs_prog(brw);
+ return;
+ }
+
/* No geometry shader. Vertex data just passes straight through. */
if (brw->state.dirty.brw & BRW_NEW_VUE_MAP_VS) {
brw->vue_map_geom_out = brw->vue_map_vs;
@@ -327,7 +334,9 @@ brw_upload_gs_prog(struct brw_context *brw)
const struct brw_tracked_state brw_gs_prog = {
.dirty = {
.mesa = (_NEW_LIGHT | _NEW_BUFFERS | _NEW_TEXTURE),
- .brw = BRW_NEW_GEOMETRY_PROGRAM | BRW_NEW_VUE_MAP_VS,
+ .brw = (BRW_NEW_GEOMETRY_PROGRAM |
+ BRW_NEW_VUE_MAP_VS |
+ BRW_NEW_TRANSFORM_FEEDBACK),
},
.emit = brw_upload_gs_prog
};