diff options
author | José Fonseca <jrfonseca@tungstengraphics.com> | 2007-11-01 22:19:42 +0000 |
---|---|---|
committer | José Fonseca <jrfonseca@tungstengraphics.com> | 2007-11-01 22:23:46 +0000 |
commit | 54be3a7added5b6675a78f6df711d3bebc4c6cd5 (patch) | |
tree | af1d11ef396b534e45f1904615d306f6660763d0 | |
parent | c4e9bfedbc78e4e38d3ca47d6e5a756f9a07416f (diff) |
Reserve the right number of dwords for hardware state, and handle the case where it fails.
-rw-r--r-- | src/mesa/pipe/i915simple/i915_state_emit.c | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/src/mesa/pipe/i915simple/i915_state_emit.c b/src/mesa/pipe/i915simple/i915_state_emit.c index 4804b0caee..15eff97813 100644 --- a/src/mesa/pipe/i915simple/i915_state_emit.c +++ b/src/mesa/pipe/i915simple/i915_state_emit.c @@ -60,8 +60,31 @@ static unsigned translate_depth_format( unsigned zformat ) void i915_emit_hardware_state(struct i915_context *i915 ) { - BEGIN_BATCH(100, 10); + /* XXX: there must be an easier way */ + const unsigned dwords = ( 14 + + 5 + + I915_MAX_DYNAMIC + + 8 + + 2 + I915_TEX_UNITS*3 + + 2 + I915_TEX_UNITS*3 + + 2 + I915_MAX_CONSTANT*4 + + i915->current.program_len + + 6 + ) * 3/2; /* plus 50% margin */ + const unsigned relocs = ( I915_TEX_UNITS + + 2 + ) * 3/2; /* plus 50% margin */ + +#if 0 + fprintf (stderr, "i915_emit_hardware_state: %d dwords, %d relocs\n", dwords, relocs); +#endif + + if(!BEGIN_BATCH(dwords, relocs)) { + FLUSH_BATCH(); + BEGIN_BATCH(dwords, relocs); + } + /* 14 dwords, 0 relocs */ if (i915->hardware_dirty & I915_HW_INVARIENT) { OUT_BATCH(_3DSTATE_AA_CMD | @@ -111,7 +134,7 @@ i915_emit_hardware_state(struct i915_context *i915 ) OUT_BATCH(0); } - + /* 5 dwords, 0 relocs */ if (i915->hardware_dirty & I915_HW_IMMEDIATE) { OUT_BATCH(_3DSTATE_LOAD_STATE_IMMEDIATE_1 | @@ -125,9 +148,9 @@ i915_emit_hardware_state(struct i915_context *i915 ) OUT_BATCH(i915->current.immediate[I915_IMMEDIATE_S4]); OUT_BATCH(i915->current.immediate[I915_IMMEDIATE_S5]); OUT_BATCH(i915->current.immediate[I915_IMMEDIATE_S6]); - } + } - + /* I915_MAX_DYNAMIC dwords, 0 relocs */ if (i915->hardware_dirty & I915_HW_DYNAMIC) { int i; @@ -135,7 +158,8 @@ i915_emit_hardware_state(struct i915_context *i915 ) OUT_BATCH(i915->current.dynamic[i]); } } - + + /* 8 dwords, 2 relocs */ if (i915->hardware_dirty & I915_HW_STATIC) { if (i915->framebuffer.cbufs[0]) { @@ -189,9 +213,9 @@ i915_emit_hardware_state(struct i915_context *i915 ) } } - #if 01 /* texture images */ + /* 2 + I915_TEX_UNITS*3 dwords, I915_TEX_UNITS relocs */ if (i915->hardware_dirty & (I915_HW_MAP | I915_HW_SAMPLER)) { /* XXX: we were refering to sampler state @@ -230,6 +254,7 @@ i915_emit_hardware_state(struct i915_context *i915 ) #if 01 /* samplers */ + /* 2 + I915_TEX_UNITS*3 dwords, 0 relocs */ if (i915->hardware_dirty & I915_HW_SAMPLER) { if (i915->current.sampler_enable_nr) { @@ -252,6 +277,7 @@ i915_emit_hardware_state(struct i915_context *i915 ) #endif /* constants */ + /* 2 + I915_MAX_CONSTANT*4 dwords, 0 relocs */ if (i915->hardware_dirty & I915_HW_PROGRAM) { const uint nr = i915->current.num_constants[PIPE_SHADER_FRAGMENT]; @@ -272,6 +298,7 @@ i915_emit_hardware_state(struct i915_context *i915 ) } /* Fragment program */ + /* i915->current.program_len dwords, 0 relocs */ if (i915->hardware_dirty & I915_HW_PROGRAM) { uint i; @@ -283,6 +310,7 @@ i915_emit_hardware_state(struct i915_context *i915 ) } /* drawing surface size */ + /* 6 dwords, 0 relocs */ { int w = i915->framebuffer.cbufs[0]->width; int h = i915->framebuffer.cbufs[0]->height; |