<div dir="ltr">On 25 October 2013 16:45, Anuj Phogat <span dir="ltr"><<a href="mailto:anuj.phogat@gmail.com" target="_blank">anuj.phogat@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">V2:<br>
   - Update comments.<br>
   - Make changes to support simd16 mode.<br>
   - Add compute_pos_offset variable in brw_wm_prog_key.<br>
   - Add variable uses_omask in brw_wm_prog_data.<br>
<br>
Signed-off-by: Anuj Phogat <<a href="mailto:anuj.phogat@gmail.com">anuj.phogat@gmail.com</a>><br>
---<br>
 src/mesa/drivers/dri/i965/brw_context.h      |  1 +<br>
 src/mesa/drivers/dri/i965/brw_fs.cpp         | 65 ++++++++++++++++++++++++++++<br>
 src/mesa/drivers/dri/i965/brw_fs.h           |  2 +<br>
 src/mesa/drivers/dri/i965/brw_fs_visitor.cpp |  5 +++<br>
 src/mesa/drivers/dri/i965/brw_wm.c           |  6 +++<br>
 src/mesa/drivers/dri/i965/brw_wm.h           |  2 +<br>
 6 files changed, 81 insertions(+)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h<br>
index 3b95922..d16f257 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_context.h<br>
+++ b/src/mesa/drivers/dri/i965/brw_context.h<br>
@@ -380,6 +380,7 @@ struct brw_wm_prog_data {<br>
    GLuint nr_params;       /**< number of float params/constants */<br>
    GLuint nr_pull_params;<br>
    bool dual_src_blend;<br>
+   bool uses_pos_offset;<br>
    uint32_t prog_offset_16;<br>
<br>
    /**<br>
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
index 65a4b66..0f8213e 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
@@ -1118,6 +1118,64 @@ fs_visitor::emit_frontfacing_interpolation(ir_variable *ir)<br>
    return reg;<br>
 }<br>
<br>
+void<br>
+fs_visitor::compute_sample_position(fs_reg dst, fs_reg int_sample_pos)<br>
+{<br>
+   assert(dst.type == BRW_REGISTER_TYPE_F);<br>
+<br>
+   if (c->key.compute_pos_offset) {<br>
+      /* Convert int_sample_pos to floating point */<br>
+      emit(MOV(dst, int_sample_pos));<br>
+      /* Scale to the range [0, 1] */<br>
+      emit(MUL(dst, dst, fs_reg(1 / 16.0f)));<br>
+   }<br>
+   else {<br>
+      /* From ARB_sample_shading specification:<br>
+       * "When rendering to a non-multisample buffer, or if multisample<br>
+       *  rasterization is disabled, gl_SamplePosition will always be<br>
+       *  (0.5, 0.5).<br>
+       */<br>
+      emit(MOV(dst, fs_reg(0.5f)));<br>
+   }<br>
+}<br>
+<br>
+fs_reg *<br>
+fs_visitor::emit_samplepos_setup(ir_variable *ir)<br>
+{<br>
+   assert(brw->gen >= 6);<br>
+   assert(ir->type == glsl_type::vec2_type);<br>
+<br>
+   this->current_annotation = "compute sample position";<br>
+   fs_reg *reg = new(this->mem_ctx) fs_reg(this, ir->type);<br>
+   fs_reg pos = *reg;<br>
+   fs_reg int_sample_x = fs_reg(this, glsl_type::int_type);<br>
+   fs_reg int_sample_y = fs_reg(this, glsl_type::int_type);<br>
+<br>
+   /* WM will be run in MSDISPMODE_PERSAMPLE. So, only one of SIMD8 or SIMD16<br>
+    * mode will be enabled.<br>
+    *<br>
+    * From the Ivy Bridge PRM, volume 2 part 1, page 344:<br>
+    * R31.1:0         Position Offset X/Y for Slot[3:0]<br>
+    * R31.3:2         Position Offset X/Y for Slot[7:4]<br>
+    * .....<br>
+    *<br>
+    * The X, Y sample positions come in as bytes in  thread payload. So, read<br>
+    * the positions using vstride=16, width=8, hstride=2.<br>
+    */<br>
+   struct brw_reg sample_pos_reg =<br>
+      stride(retype(brw_vec1_grf(c->sample_pos_reg, 0),<br>
+                    BRW_REGISTER_TYPE_B), 16, 8, 2);<br>
+<br>
+   emit(MOV(int_sample_x, fs_reg(sample_pos_reg)));<br>
+   /* Compute gl_SamplePosition.x */<br>
+   compute_sample_position(pos, int_sample_x);<br>
+   pos.reg_offset += dispatch_width / 8;<br>
+   emit(MOV(int_sample_y, fs_reg(suboffset(sample_pos_reg, 1))));<br>
+   /* Compute gl_SamplePosition.y */<br>
+   compute_sample_position(pos, int_sample_y);<br>
+   return reg;<br>
+}<br>
+<br>
 fs_reg<br>
 fs_visitor::fix_math_operand(fs_reg src)<br>
 {<br>
@@ -2985,7 +3043,14 @@ fs_visitor::setup_payload_gen6()<br>
          c->nr_payload_regs++;<br>
       }<br>
    }<br>
+<br>
+   c->prog_data.uses_pos_offset = c->key.compute_pos_offset;<br>
    /* R31: MSAA position offsets. */<br>
+   if (c->prog_data.uses_pos_offset) {<br>
+      c->sample_pos_reg = c->nr_payload_regs;<br>
+      c->nr_payload_regs++;<br>
+   }<br>
+<br>
    /* R32-: bary for 32-pixel. */<br>
    /* R58-59: interp W for 32-pixel. */<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h<br>
index b5aed23..db5df39 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_fs.h<br>
+++ b/src/mesa/drivers/dri/i965/brw_fs.h<br>
@@ -333,9 +333,11 @@ public:<br>
                          glsl_interp_qualifier interpolation_mode,<br>
                          bool is_centroid);<br>
    fs_reg *emit_frontfacing_interpolation(ir_variable *ir);<br>
+   fs_reg *emit_samplepos_setup(ir_variable *ir);<br>
    fs_reg *emit_general_interpolation(ir_variable *ir);<br>
    void emit_interpolation_setup_gen4();<br>
    void emit_interpolation_setup_gen6();<br>
+   void compute_sample_position(fs_reg dst, fs_reg int_sample_pos);<br>
    fs_reg rescale_texcoord(ir_texture *ir, fs_reg coordinate,<br>
                            bool is_rect, int sampler, int texunit);<br>
    fs_inst *emit_texture_gen4(ir_texture *ir, fs_reg dst, fs_reg coordinate,<br>
diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp<br>
index 9f37013..51972fe 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp<br>
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp<br>
@@ -125,6 +125,11 @@ fs_visitor::visit(ir_variable *ir)<br>
<br>
       reg = new(this->mem_ctx) fs_reg(UNIFORM, param_index);<br>
       reg->type = brw_type_for_base_type(ir->type);<br>
+<br>
+   } else if (ir->mode == ir_var_system_value) {<br>
+      if (!strcmp(ir->name, "gl_SamplePosition")) {<br>
+        reg = emit_samplepos_setup(ir);<br>
+      }<br></blockquote><div><br></div><div>Rather than do a strcmp on the name, I'd recommend just looking at ir->location.  For gl_SamplePosition it will be equal to SYSTEM_VALUE_SAMPLE_POS.<br><br>With that fixed, this patch is:<br>
<br>Reviewed-by: Paul Berry <<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

    }<br>
<br>
    if (!reg)<br>
diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c<br>
index 0fda490..d2a5a9f 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_wm.c<br>
+++ b/src/mesa/drivers/dri/i965/brw_wm.c<br>
@@ -37,6 +37,7 @@<br>
 #include "main/fbobject.h"<br>
 #include "main/samplerobj.h"<br>
 #include "program/prog_parameter.h"<br>
+#include "program/program.h"<br>
<br>
 #include "glsl/ralloc.h"<br>
<br>
@@ -483,6 +484,11 @@ static void brw_wm_populate_key( struct brw_context *brw,<br>
    key->replicate_alpha = ctx->DrawBuffer->_NumColorDrawBuffers > 1 &&<br>
       (ctx->Multisample.SampleAlphaToCoverage || ctx->Color.AlphaEnabled);<br>
<br>
+   /* _NEW_BUFFERS _NEW_MULTISAMPLE */<br>
+   key->compute_pos_offset =<br>
+      _mesa_get_min_invocations_per_fragment(ctx, &fp->program) > 1 &&<br>
+      fp->program.Base.SystemValuesRead & SYSTEM_BIT_SAMPLE_POS;<br>
+<br>
    /* BRW_NEW_VUE_MAP_GEOM_OUT */<br>
    if (brw->gen < 6 || _mesa_bitcount_64(fp->program.Base.InputsRead &<br>
                                          BRW_FS_VARYING_INPUT_MASK) > 16)<br>
diff --git a/src/mesa/drivers/dri/i965/brw_wm.h b/src/mesa/drivers/dri/i965/brw_wm.h<br>
index 259a4b6..eb740ad 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_wm.h<br>
+++ b/src/mesa/drivers/dri/i965/brw_wm.h<br>
@@ -65,6 +65,7 @@ struct brw_wm_prog_key {<br>
    GLuint replicate_alpha:1;<br>
    GLuint render_to_fbo:1;<br>
    GLuint clamp_fragment_color:1;<br>
+   GLuint compute_pos_offset:1;<br>
    GLuint line_aa:2;<br>
    GLuint high_quality_derivatives:1;<br>
<br>
@@ -83,6 +84,7 @@ struct brw_wm_compile {<br>
    uint8_t source_w_reg;<br>
    uint8_t aa_dest_stencil_reg;<br>
    uint8_t dest_depth_reg;<br>
+   uint8_t sample_pos_reg;<br>
    uint8_t barycentric_coord_reg[BRW_WM_BARYCENTRIC_INTERP_MODE_COUNT];<br>
    uint8_t nr_payload_regs;<br>
    GLuint source_depth_to_render_target:1;<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.8.1.4<br>
<br>
</font></span></blockquote></div><br></div></div>