<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">
<br class="">
<div>
<blockquote type="cite" class="">
<div class="">On Apr 14, 2017, at 11:35 AM, Ilia Mirkin <<a href="mailto:imirkin@alum.mit.edu" class="">imirkin@alum.mit.edu</a>> wrote:</div>
<br class="Apple-interchange-newline">
<div class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">On
 Fri, Apr 14, 2017 at 11:18 AM, Ilia Mirkin <</span><a href="mailto:imirkin@alum.mit.edu" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">imirkin@alum.mit.edu</a><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">>
 wrote:</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">
On Thu, Apr 13, 2017 at 4:30 PM, George Kyriazis<br class="">
<<a href="mailto:george.kyriazis@intel.com" class="">george.kyriazis@intel.com</a>> wrote:<br class="">
<blockquote type="cite" class="">Add polygon stipple functionality to the fragment shader.<br class="">
<br class="">
Explicitly turn off polygon stipple for lines and points, since we<br class="">
do them using tris.<br class="">
---<br class="">
src/gallium/drivers/swr/swr_context.h  |  4 ++-<br class="">
src/gallium/drivers/swr/swr_shader.cpp | 56 ++++++++++++++++++++++++++++++----<br class="">
src/gallium/drivers/swr/swr_shader.h   |  1 +<br class="">
src/gallium/drivers/swr/swr_state.cpp  | 27 ++++++++++++++--<br class="">
src/gallium/drivers/swr/swr_state.h    |  5 +++<br class="">
5 files changed, 84 insertions(+), 9 deletions(-)<br class="">
<br class="">
diff --git a/src/gallium/drivers/swr/swr_context.h b/src/gallium/drivers/swr/swr_context.h<br class="">
index be65a20..9d80c70 100644<br class="">
--- a/src/gallium/drivers/swr/swr_context.h<br class="">
+++ b/src/gallium/drivers/swr/swr_context.h<br class="">
@@ -98,6 +98,8 @@ struct swr_draw_context {<br class="">
<br class="">
   float userClipPlanes[PIPE_MAX_CLIP_PLANES][4];<br class="">
<br class="">
+   uint32_t polyStipple[32];<br class="">
+<br class="">
   SWR_SURFACE_STATE renderTargets[SWR_NUM_ATTACHMENTS];<br class="">
   void *pStats;<br class="">
};<br class="">
@@ -127,7 +129,7 @@ struct swr_context {<br class="">
   struct pipe_constant_buffer<br class="">
      constants[PIPE_SHADER_TYPES][PIPE_MAX_CONSTANT_BUFFERS];<br class="">
   struct pipe_framebuffer_state framebuffer;<br class="">
-   struct pipe_poly_stipple poly_stipple;<br class="">
+   struct swr_poly_stipple poly_stipple;<br class="">
   struct pipe_scissor_state scissor;<br class="">
   SWR_RECT swr_scissor;<br class="">
   struct pipe_sampler_view *<br class="">
diff --git a/src/gallium/drivers/swr/swr_shader.cpp b/src/gallium/drivers/swr/swr_shader.cpp<br class="">
index 6fc0596..d8f5512 100644<br class="">
--- a/src/gallium/drivers/swr/swr_shader.cpp<br class="">
+++ b/src/gallium/drivers/swr/swr_shader.cpp<br class="">
@@ -165,6 +165,9 @@ swr_generate_fs_key(struct swr_jit_fs_key &key,<br class="">
          sizeof(key.vs_output_semantic_idx));<br class="">
<br class="">
   swr_generate_sampler_key(swr_fs->info, ctx, PIPE_SHADER_FRAGMENT, key);<br class="">
+<br class="">
+   key.poly_stipple_enable = ctx->rasterizer->poly_stipple_enable &&<br class="">
+      ctx->poly_stipple.prim_is_poly;<br class="">
}<br class="">
<br class="">
void<br class="">
@@ -1099,17 +1102,58 @@ BuilderSWR::CompileFS(struct swr_context *ctx, swr_jit_fs_key &key)<br class="">
   memset(&system_values, 0, sizeof(system_values));<br class="">
<br class="">
   struct lp_build_mask_context mask;<br class="">
+   bool uses_mask = false;<br class="">
<br class="">
-   if (swr_fs->info.base.uses_kill) {<br class="">
-      Value *mask_val = LOAD(pPS, {0, SWR_PS_CONTEXT_activeMask}, "activeMask");<br class="">
+   if (swr_fs->info.base.uses_kill ||<br class="">
+       key.poly_stipple_enable) {<br class="">
+      Value *vActiveMask = NULL;<br class="">
+      if (swr_fs->info.base.uses_kill) {<br class="">
+         vActiveMask = LOAD(pPS, {0, SWR_PS_CONTEXT_activeMask}, "activeMask");<br class="">
+      }<br class="">
+      if (key.poly_stipple_enable) {<br class="">
+         // first get fragment xy coords and clip to stipple bounds<br class="">
+         Value *vXf = LOAD(pPS, {0, SWR_PS_CONTEXT_vX, PixelPositions_UL});<br class="">
+         Value *vYf = LOAD(pPS, {0, SWR_PS_CONTEXT_vY, PixelPositions_UL});<br class="">
+         Value *vXu = FP_TO_UI(vXf, mSimdInt32Ty);<br class="">
+         Value *vYu = FP_TO_UI(vYf, mSimdInt32Ty);<br class="">
+<br class="">
+         // stipple pattern is 32x32, which means that one line of stipple<br class="">
+         // is stored in one word:<br class="">
+         // vXstipple is bit offset inside 32-bit stipple word<br class="">
+         // vYstipple is word index is stipple array<br class="">
+         Value *vXstipple = AND(vXu, VIMMED1(0x1f)); // & (32-1)<br class="">
+         Value *vYstipple = AND(vYu, VIMMED1(0x1f)); // & (32-1)<br class="">
+<br class="">
+         // grab stipple pattern base address<br class="">
+         Value *stipplePtr = GEP(hPrivateData, {0, swr_draw_context_polyStipple, 0});<br class="">
+         stipplePtr = BITCAST(stipplePtr, mInt8PtrTy);<br class="">
+<br class="">
+         // peform a gather to grab stipple words for each lane<br class="">
+         Value *vStipple = GATHERDD(VUNDEF_I(), stipplePtr, vYstipple,<br class="">
+                                    VIMMED1(0xffffffff), C((char)4));<br class="">
+<br class="">
+         // create a mask with one bit corresponding to the x stipple<br class="">
+         // and AND it with the pattern, to see if we have a bit<br class="">
+         Value *vBitMask = LSHR(VIMMED1(0x80000000), vXstipple);<br class="">
+         Value *vStippleMask = AND(vStipple, vBitMask);<br class="">
+         vStippleMask = ICMP_NE(vStippleMask, VIMMED1(0));<br class="">
+         vStippleMask = VMASK(vStippleMask);<br class="">
+<br class="">
+         if (swr_fs->info.base.uses_kill) {<br class="">
+            vActiveMask = AND(vActiveMask, vStippleMask);<br class="">
+         } else {<br class="">
+            vActiveMask = vStippleMask;<br class="">
+         }<br class="">
+      }<br class="">
      lp_build_mask_begin(<br class="">
-         &mask, gallivm, lp_type_float_vec(32, 32 * 8), wrap(mask_val));<br class="">
+         &mask, gallivm, lp_type_float_vec(32, 32 * 8), wrap(vActiveMask));<br class="">
+      uses_mask = true;<br class="">
   }<br class="">
<br class="">
   lp_build_tgsi_soa(gallivm,<br class="">
                     swr_fs->pipe.tokens,<br class="">
                     lp_type_float_vec(32, 32 * 8),<br class="">
-                     swr_fs->info.base.uses_kill ? &mask : NULL, // mask<br class="">
+                     uses_mask ? &mask : NULL, // mask<br class="">
                     wrap(consts_ptr),<br class="">
                     wrap(const_sizes_ptr),<br class="">
                     &system_values,<br class="">
@@ -1172,13 +1216,13 @@ BuilderSWR::CompileFS(struct swr_context *ctx, swr_jit_fs_key &key)<br class="">
   }<br class="">
<br class="">
   LLVMValueRef mask_result = 0;<br class="">
-   if (swr_fs->info.base.uses_kill) {<br class="">
+   if (uses_mask) {<br class="">
      mask_result = lp_build_mask_end(&mask);<br class="">
   }<br class="">
<br class="">
   IRB()->SetInsertPoint(unwrap(LLVMGetInsertBlock(gallivm->builder)));<br class="">
<br class="">
-   if (swr_fs->info.base.uses_kill) {<br class="">
+   if (uses_mask) {<br class="">
      STORE(unwrap(mask_result), pPS, {0, SWR_PS_CONTEXT_activeMask});<br class="">
   }<br class="">
<br class="">
diff --git a/src/gallium/drivers/swr/swr_shader.h b/src/gallium/drivers/swr/swr_shader.h<br class="">
index c9df5b0..1ab6846 100644<br class="">
--- a/src/gallium/drivers/swr/swr_shader.h<br class="">
+++ b/src/gallium/drivers/swr/swr_shader.h<br class="">
@@ -66,6 +66,7 @@ struct swr_jit_fs_key : swr_jit_sampler_key {<br class="">
   unsigned sprite_coord_enable;<br class="">
   ubyte vs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];<br class="">
   ubyte vs_output_semantic_idx[PIPE_MAX_SHADER_OUTPUTS];<br class="">
+   bool poly_stipple_enable;<br class="">
};<br class="">
<br class="">
struct swr_jit_vs_key : swr_jit_sampler_key {<br class="">
diff --git a/src/gallium/drivers/swr/swr_state.cpp b/src/gallium/drivers/swr/swr_state.cpp<br class="">
index 5cc01dd..4f7ef66 100644<br class="">
--- a/src/gallium/drivers/swr/swr_state.cpp<br class="">
+++ b/src/gallium/drivers/swr/swr_state.cpp<br class="">
@@ -39,6 +39,7 @@<br class="">
#include "util/u_helpers.h"<br class="">
#include "util/u_framebuffer.h"<br class="">
#include "util/u_viewport.h"<br class="">
+#include "util/u_prim.h"<br class="">
<br class="">
#include "swr_state.h"<br class="">
#include "swr_context.h"<br class="">
@@ -608,7 +609,7 @@ swr_set_polygon_stipple(struct pipe_context *pipe,<br class="">
{<br class="">
   struct swr_context *ctx = swr_context(pipe);<br class="">
<br class="">
-   ctx->poly_stipple = *stipple; /* struct copy */<br class="">
+   ctx->poly_stipple.pipe = *stipple; /* struct copy */<br class="">
   ctx->dirty |= SWR_NEW_STIPPLE;<br class="">
}<br class="">
<br class="">
@@ -952,6 +953,17 @@ swr_user_vbuf_range(const struct pipe_draw_info *info,<br class="">
   }<br class="">
}<br class="">
<br class="">
+static void<br class="">
+swr_update_poly_stipple(struct swr_context *ctx)<br class="">
+{<br class="">
+   struct swr_draw_context *pDC = &ctx->swrDC;<br class="">
+<br class="">
+   assert(sizeof(ctx->poly_stipple.pipe.stipple) == sizeof(pDC->polyStipple));<br class="">
+   memcpy(pDC->polyStipple,<br class="">
+          ctx->poly_stipple.pipe.stipple,<br class="">
+          sizeof(ctx->poly_stipple.pipe.stipple));<br class="">
+}<br class="">
+<br class="">
void<br class="">
swr_update_derived(struct pipe_context *pipe,<br class="">
                   const struct pipe_draw_info *p_draw_info)<br class="">
@@ -1352,6 +1364,17 @@ swr_update_derived(struct pipe_context *pipe,<br class="">
      }<br class="">
   }<br class="">
<br class="">
+   /* work around the fact that poly stipple also affects lines */<br class="">
+   /* and points, since we rasterize them as triangles, too */<br class="">
+   /* Has to be before fragment shader, since it sets SWR_NEW_FS */<br class="">
+   if (p_draw_info) {<br class="">
+      bool new_prim_is_poly = (u_reduced_prim(p_draw_info->mode) == PIPE_PRIM_TRIANGLES);<br class="">
</blockquote>
<br class="">
What about glPolygonMode and what about geometry shaders that take in<br class="">
e.g. points and put out triangles? Perhaps you need to pass in a "is<br class="">
this *really* a triangle" parameter to the shader generated by the<br class="">
rasterizer.<br class="">
</blockquote>
<br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Actually
 the GS thing won't happen since polygon stippling is a</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">compat-only
 feature and we don't support GS in compat profiles. You do</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">need
 to check that the polymode == FILL here though.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
</div>
</blockquote>
<div>Well, currently we don’t have a working polygon mode.  Once we implement it, then we’ll look at stipple at that time.</div>
<br class="">
<blockquote type="cite" class="">
<div class="">
<blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">
Also it might be easy to just do all this masking directly in core<br class="">
instead of as a frag shader variant implemented in swr_shader...<br class="">
</blockquote>
<br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">I
 still think this would be a better place. Note that line stippling</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">is
 also a thing.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
</div>
</blockquote>
<div>We will consider pushing the implementation in the core, if we hear concerns regarding performance the way it’s currently implemented.  There are some other discussions that we need to do (internally) before moving it up in the core.</div>
<div><br class="">
</div>
<div>Regarding line stipple.  Yes, we have that in mind.  However, the right time to do this is when we get an actual line rasterizer, which is also in our list.  Currently we rasterize lines as triangles, with obvious side effects in line rasterization quality
 and precision.</div>
<div><br class="">
</div>
Thanks for the feedback,</div>
<div><br class="">
</div>
<div>George</div>
<div><br class="">
<blockquote type="cite" class="">
<div class="">
<blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">
<br class="">
Cheers,<br class="">
<br class="">
 -ilia<br class="">
</blockquote>
<span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">_______________________________________________</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">mesa-dev
 mailing list</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<a href="mailto:mesa-dev@lists.freedesktop.org" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">mesa-dev@lists.freedesktop.org</a><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a></div>
</blockquote>
</div>
<br class="">
</body>
</html>