summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaciej Cencora <maciej@osiris.(none)>2009-11-01 18:50:52 +0100
committerCorbin Simpson <[email protected]>2009-11-01 11:02:02 -0800
commit3d73852121f13832f6bc87918798ff96589d0349 (patch)
tree585d06c6c0f713c7d53ec480a9515d15334bb13b
parent2db46af8758bf77a2748460f617d0ead5b08a454 (diff)
r300g: fix geometry corruptions
PVS flush is needed before changing the vertex shader or vertex shader constants.
-rw-r--r--src/gallium/drivers/r300/r300_emit.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/gallium/drivers/r300/r300_emit.c b/src/gallium/drivers/r300/r300_emit.c
index de27f0939b0..5b03c1aa6c1 100644
--- a/src/gallium/drivers/r300/r300_emit.c
+++ b/src/gallium/drivers/r300/r300_emit.c
@@ -652,7 +652,7 @@ void r300_emit_vertex_program_code(struct r300_context* r300,
return;
}
- BEGIN_CS(11 + code->length);
+ BEGIN_CS(9 + code->length);
/* R300_VAP_PVS_CODE_CNTL_0
* R300_VAP_PVS_CONST_CNTL
* R300_VAP_PVS_CODE_CNTL_1
@@ -674,7 +674,6 @@ void r300_emit_vertex_program_code(struct r300_context* r300,
R300_PVS_NUM_CNTLRS(5) |
R300_PVS_NUM_FPUS(r300screen->caps->num_vert_fpus) |
R300_PVS_VF_MAX_VTX_NUM(12));
- OUT_CS_REG(R300_VAP_PVS_STATE_FLUSH_REG, 0x0);
END_CS;
}
@@ -749,6 +748,15 @@ void r300_flush_textures(struct r300_context* r300)
END_CS;
}
+static void r300_flush_pvs(struct r300_context* r300)
+{
+ CS_LOCALS(r300);
+
+ BEGIN_CS(2);
+ OUT_CS_REG(R300_VAP_PVS_STATE_FLUSH_REG, 0x0);
+ END_CS;
+}
+
/* Emit all dirty state. */
void r300_emit_dirty_state(struct r300_context* r300)
{
@@ -922,6 +930,10 @@ validate:
r300->dirty_state &= ~R300_NEW_VERTEX_FORMAT;
}
+ if (r300->dirty_state & (R300_NEW_VERTEX_SHADER | R300_NEW_VERTEX_SHADER_CONSTANTS)) {
+ r300_flush_pvs(r300);
+ }
+
if (r300->dirty_state & R300_NEW_VERTEX_SHADER) {
r300_emit_vertex_shader(r300, r300->vs);
r300->dirty_state &= ~R300_NEW_VERTEX_SHADER;