diff options
| author | Eric Anholt <eric@anholt.net> | 2010-09-28 12:07:30 -0700 | 
|---|---|---|
| committer | Eric Anholt <eric@anholt.net> | 2010-09-28 12:37:21 -0700 | 
| commit | 86fd11262cb5697e5c3563e876781b3587788737 (patch) | |
| tree | ebde05ef26dca4703b730580539897ef169915b1 /src | |
| parent | f46a61554f2cc8904a381d3e514403dca9754360 (diff) | |
i965: Add support for non-color render target write data to new FS backend.
This is the first time these payload bits have made sense to me,
outside of brw_wm_pass* structure.
Fixes: glsl1-gl_FragDepth writing
Diffstat (limited to 'src')
| -rw-r--r-- | src/mesa/drivers/dri/i965/brw_fs.cpp | 43 | 
1 files changed, 39 insertions, 4 deletions
| diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index fd13349ae6..e8aff6bab9 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -75,6 +75,7 @@ enum fs_opcodes {  };  static int using_new_fs = -1; +static struct brw_reg brw_reg_from_fs_reg(class fs_reg *reg);  struct gl_shader *  brw_new_shader(GLcontext *ctx, GLuint name, GLuint type) @@ -613,7 +614,6 @@ fs_visitor::visit(ir_variable *ir)        this->frag_data = ir;     } else if (strcmp(ir->name, "gl_FragDepth") == 0) {        this->frag_depth = ir; -      assert(!"FINISHME: this hangs currently.");     }     if (ir->mode == ir_var_in) { @@ -1418,17 +1418,45 @@ void  fs_visitor::emit_fb_writes()  {     this->current_annotation = "FB write"; +   int nr = 0; + +   /* m0, m1 header */ +   nr += 2; + +   if (c->key.aa_dest_stencil_reg) { +      emit(fs_inst(BRW_OPCODE_MOV, fs_reg(MRF, nr++), +		   fs_reg(brw_vec8_grf(c->key.aa_dest_stencil_reg, 0)))); +   }     assert(this->frag_color || !"FINISHME: MRT");     fs_reg color = *(variable_storage(this->frag_color));     for (int i = 0; i < 4; i++) {        emit(fs_inst(BRW_OPCODE_MOV, -		   fs_reg(MRF, 2 + i), +		   fs_reg(MRF, nr++),  		   color));        color.reg_offset++;     } +   if (c->key.source_depth_to_render_target) { +      if (c->key.computes_depth) { +	 /* Hand over gl_FragDepth. */ +	 assert(this->frag_depth); +	 fs_reg depth = *(variable_storage(this->frag_depth)); + +	 emit(fs_inst(BRW_OPCODE_MOV, fs_reg(MRF, nr++), depth)); +      } else { +	 /* Pass through the payload depth. */ +	 emit(fs_inst(BRW_OPCODE_MOV, fs_reg(MRF, nr++), +		      fs_reg(brw_vec8_grf(c->key.source_depth_reg, 0)))); +      } +   } + +   if (c->key.dest_depth_reg) { +      emit(fs_inst(BRW_OPCODE_MOV, fs_reg(MRF, nr++), +		   fs_reg(brw_vec8_grf(c->key.dest_depth_reg, 0)))); +   } +     emit(fs_inst(FS_OPCODE_FB_WRITE,  		fs_reg(0),  		fs_reg(0))); @@ -1440,7 +1468,6 @@ void  fs_visitor::generate_fb_write(fs_inst *inst)  {     GLboolean eot = 1; /* FINISHME: MRT */ -   /* FINISHME: AADS */     /* Header is 2 regs, g0 and g1 are the contents. g0 will be implied      * move, here's g1. @@ -1453,7 +1480,15 @@ fs_visitor::generate_fb_write(fs_inst *inst)  	   brw_vec8_grf(1, 0));     brw_pop_insn_state(p); -   int nr = 2 + 4; +   int nr = 0; +   nr += 2; /* header */ +   if (c->key.aa_dest_stencil_reg) +      nr++; +   nr += 4; /* color */ +   if (c->key.source_depth_to_render_target) +      nr++; +   if (c->key.dest_depth_reg) +      nr++;     brw_fb_WRITE(p,  		8, /* dispatch_width */ | 
