<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>