i965: Track the windowizer's dispatch for kill pixel, promoted, and OQ

Looks like the problem was we weren't passing the depth to the render
target as expected, so the chip would wedge.  Fixes GPU hang in
occlusion-query-discard.

Bug #30097
This commit is contained in:
Eric Anholt 2010-09-21 12:05:37 -07:00
parent 4a0bc4716d
commit dd9a88f4dd
3 changed files with 23 additions and 6 deletions

View File

@ -215,6 +215,7 @@ static void do_wm_prog( struct brw_context *brw,
static void brw_wm_populate_key( struct brw_context *brw,
struct brw_wm_prog_key *key )
{
struct intel_context *intel = &brw->intel;
GLcontext *ctx = &brw->intel.ctx;
/* BRW_NEW_FRAGMENT_PROGRAM */
const struct brw_fragment_program *fp =
@ -279,7 +280,8 @@ static void brw_wm_populate_key( struct brw_context *brw,
}
}
brw_wm_lookup_iz(line_aa,
brw_wm_lookup_iz(intel,
line_aa,
lookup,
uses_depth,
key);

View File

@ -299,7 +299,8 @@ void brw_wm_print_insn( struct brw_wm_compile *c,
void brw_wm_print_program( struct brw_wm_compile *c,
const char *stage );
void brw_wm_lookup_iz( GLuint line_aa,
void brw_wm_lookup_iz( struct intel_context *intel,
GLuint line_aa,
GLuint lookup,
GLboolean ps_uses_depth,
struct brw_wm_prog_key *key );

View File

@ -120,24 +120,38 @@ const struct {
* \param line_aa AA_NEVER, AA_ALWAYS or AA_SOMETIMES
* \param lookup bitmask of IZ_* flags
*/
void brw_wm_lookup_iz( GLuint line_aa,
void brw_wm_lookup_iz( struct intel_context *intel,
GLuint line_aa,
GLuint lookup,
GLboolean ps_uses_depth,
struct brw_wm_prog_key *key )
{
GLuint reg = 2;
GLboolean kill_stats_promoted_workaround = GL_FALSE;
assert (lookup < IZ_BIT_MAX);
/* Crazy workaround in the windowizer, which we need to track in
* our register allocation and render target writes. See the "If
* statistics are enabled..." paragraph of 11.5.3.2: Early Depth
* Test Cases [Pre-DevGT] of the 3D Pipeline - Windower B-Spec.
*/
if (intel->stats_wm &&
(lookup & IZ_PS_KILL_ALPHATEST_BIT) &&
wm_iz_table[lookup].mode == P) {
kill_stats_promoted_workaround = GL_TRUE;
}
if (lookup & IZ_PS_COMPUTES_DEPTH_BIT)
key->computes_depth = 1;
if (wm_iz_table[lookup].sd_present || ps_uses_depth) {
if (wm_iz_table[lookup].sd_present || ps_uses_depth ||
kill_stats_promoted_workaround) {
key->source_depth_reg = reg;
reg += 2;
}
if (wm_iz_table[lookup].sd_to_rt)
if (wm_iz_table[lookup].sd_to_rt || kill_stats_promoted_workaround)
key->source_depth_to_render_target = 1;
if (wm_iz_table[lookup].ds_present || line_aa != AA_NEVER) {