<div dir="ltr"><div>For the first 3 patches:</div><div><br></div><div>Reviewed-by: Marek Olšák <<a href="mailto:marek.olsak@amd.com">marek.olsak@amd.com</a>></div><div><br></div><div>You can also update relnotes in patch 5.<br></div><div><br></div><div>Marek<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, May 10, 2018 at 12:28 PM, Rhys Perry <span dir="ltr"><<a href="mailto:pendingchaos02@gmail.com" target="_blank">pendingchaos02@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Signed-off-by: Rhys Perry <<a href="mailto:pendingchaos02@gmail.com">pendingchaos02@gmail.com</a>><br>
---<br>
 src/mesa/state_tracker/st_<wbr>atom.h       |  2 +-<br>
 src/mesa/state_tracker/st_<wbr>atom_list.h  |  2 +-<br>
 src/mesa/state_tracker/st_<wbr>atom_msaa.c  | 77 ++++++++++++++++++++++++++++++<wbr>+++-<br>
 src/mesa/state_tracker/st_cb_<wbr>msaa.c    | 27 ++++++++++++<br>
 src/mesa/state_tracker/st_<wbr>context.c    |  7 ++--<br>
 src/mesa/state_tracker/st_<wbr>context.h    |  6 +++<br>
 src/mesa/state_tracker/st_<wbr>extensions.c |  1 +<br>
 7 files changed, 115 insertions(+), 7 deletions(-)<br>
<br>
diff --git a/src/mesa/state_tracker/st_<wbr>atom.h b/src/mesa/state_tracker/st_<wbr>atom.h<br>
index 2567ad30df..96e128d38c 100644<br>
--- a/src/mesa/state_tracker/st_<wbr>atom.h<br>
+++ b/src/mesa/state_tracker/st_<wbr>atom.h<br>
@@ -86,7 +86,7 @@ enum {<br>
                                  ST_NEW_CS_SAMPLERS)<br>
<br>
 #define ST_NEW_FRAMEBUFFER      (ST_NEW_FB_STATE | \<br>
-                                 ST_NEW_SAMPLE_MASK | \<br>
+                                 ST_NEW_SAMPLE_STATE | \<br>
                                  ST_NEW_SAMPLE_SHADING)<br>
<br>
 #define ST_NEW_VERTEX_PROGRAM(st, p) (p->affected_states | \<br>
diff --git a/src/mesa/state_tracker/st_<wbr>atom_list.h b/src/mesa/state_tracker/st_<wbr>atom_list.h<br>
index 5391d4710c..e1aebc91e7 100644<br>
--- a/src/mesa/state_tracker/st_<wbr>atom_list.h<br>
+++ b/src/mesa/state_tracker/st_<wbr>atom_list.h<br>
@@ -34,7 +34,7 @@ ST_STATE(ST_NEW_FS_IMAGES, st_bind_fs_images)<br>
 ST_STATE(ST_NEW_FB_STATE, st_update_framebuffer_state) /* depends on update_*_texture and bind_*_images */<br>
 ST_STATE(ST_NEW_BLEND, st_update_blend) /* depends on update_framebuffer_state */<br>
 ST_STATE(ST_NEW_RASTERIZER, st_update_rasterizer) /* depends on update_framebuffer_state */<br>
-ST_STATE(ST_NEW_SAMPLE_MASK, st_update_sample_mask) /* depends on update_framebuffer_state */<br>
+ST_STATE(ST_NEW_SAMPLE_STATE, st_update_sample_state) /* depends on update_framebuffer_state */<br>
 ST_STATE(ST_NEW_SAMPLE_<wbr>SHADING, st_update_sample_shading)<br>
 ST_STATE(ST_NEW_SCISSOR, st_update_scissor) /* depends on update_framebuffer_state */<br>
 ST_STATE(ST_NEW_VIEWPORT, st_update_viewport) /* depends on update_framebuffer_state */<br>
diff --git a/src/mesa/state_tracker/st_<wbr>atom_msaa.c b/src/mesa/state_tracker/st_<wbr>atom_msaa.c<br>
index 556c7c5889..c6affec552 100644<br>
--- a/src/mesa/state_tracker/st_<wbr>atom_msaa.c<br>
+++ b/src/mesa/state_tracker/st_<wbr>atom_msaa.c<br>
@@ -33,13 +33,84 @@<br>
 #include "st_program.h"<br>
<br>
 #include "cso_cache/cso_context.h"<br>
+#include "util/u_framebuffer.h"<br>
 #include "main/framebuffer.h"<br>
<br>
<br>
-/* Update the sample mask for MSAA.<br>
+/**<br>
+ * Update the sample locations<br>
+ */<br>
+static void<br>
+update_sample_locations(<wbr>struct st_context *st)<br>
+{<br>
+   struct gl_framebuffer *fb = st->ctx->DrawBuffer;<br>
+<br>
+   if (!st->ctx->Extensions.ARB_<wbr>sample_locations)<br>
+      return;<br>
+<br>
+   if (fb-><wbr>ProgrammableSampleLocations) {<br>
+      unsigned grid_width, grid_height, size, pixel, sample_index;<br>
+      unsigned samples = st->state.fb_num_samples;<br>
+      bool sample_location_pixel_grid = fb->SampleLocationPixelGrid;<br>
+      uint8_t locations[<br>
+         PIPE_MAX_SAMPLE_LOCATION_GRID_<wbr>SIZE *<br>
+         PIPE_MAX_SAMPLE_LOCATION_GRID_<wbr>SIZE * 32];<br>
+<br>
+      st->pipe->screen->get_sample_<wbr>pixel_grid(<br>
+         st->pipe->screen, samples, &grid_width, &grid_height);<br>
+      size = grid_width * grid_height * samples;<br>
+<br>
+      /**<br>
+       * when a dimension is greater than MAX_SAMPLE_LOCATION_GRID_SIZE,<br>
+       * st->ctx->Driver.<wbr>GetSamplePixelGrid() returns 1 for both dimensions.<br>
+       */<br>
+      if (grid_width > MAX_SAMPLE_LOCATION_GRID_SIZE ||<br>
+          grid_height > MAX_SAMPLE_LOCATION_GRID_SIZE)<br>
+         sample_location_pixel_grid = false;<br>
+<br>
+      for (pixel = 0; pixel < grid_width * grid_height; pixel++) {<br>
+         for (sample_index = 0; sample_index < samples; sample_index++) {<br>
+            int table_index = sample_index;<br>
+            float x = 0.5f, y = 0.5f;<br>
+            uint8_t loc;<br>
+            if (sample_location_pixel_grid)<br>
+               table_index = pixel * samples + sample_index;<br>
+            if (fb->SampleLocationTable) {<br>
+               x = fb->SampleLocationTable[table_<wbr>index*2];<br>
+               y = fb->SampleLocationTable[table_<wbr>index*2+1];<br>
+            }<br>
+            if (st->state.fb_orientation == Y_0_BOTTOM)<br>
+               y = 1.0 - y;<br>
+<br>
+            loc = roundf(CLAMP(x * 16.0f, 0.0f, 15.0f));<br>
+            loc |= (int)roundf(CLAMP(y * 16.0f, 0.0f, 15.0f)) << 4;<br>
+            locations[pixel * samples + sample_index] = loc;<br>
+         }<br>
+      }<br>
+<br>
+      util_sample_locations_flip_y(<br>
+         st->pipe->screen, st->state.fb_height, samples, locations);<br>
+<br>
+      if (!st->state.enable_sample_<wbr>locations ||<br>
+          st->state.sample_locations_<wbr>samples != samples ||<br>
+          memcmp(locations, st->state.sample_locations, size) != 0) {<br>
+         st->pipe->set_sample_<wbr>locations( st->pipe, size, locations);<br>
+         <br>
+         st->state.sample_locations_<wbr>samples = samples;<br>
+         memcpy(st->state.sample_<wbr>locations, locations, size);<br>
+      }<br>
+   } else if (st->state.enable_sample_<wbr>locations) {<br>
+      st->pipe->set_sample_<wbr>locations(st->pipe, 0, NULL);<br>
+   }<br>
+<br>
+   st->state.enable_sample_<wbr>locations = fb-><wbr>ProgrammableSampleLocations;<br>
+}<br>
+<br>
+<br>
+/* Update the sample mask and locations for MSAA.<br>
  */<br>
 void<br>
-st_update_sample_mask(struct st_context *st)<br>
+st_update_sample_state(struct st_context *st)<br>
 {<br>
    unsigned sample_mask = 0xffffffff;<br>
    unsigned sample_count = st->state.fb_num_samples;<br>
@@ -64,6 +135,8 @@ st_update_sample_mask(struct st_context *st)<br>
    }<br>
<br>
    cso_set_sample_mask(st->cso_<wbr>context, sample_mask);<br>
+<br>
+   update_sample_locations(st);<br>
 }<br>
<br>
<br>
diff --git a/src/mesa/state_tracker/st_<wbr>cb_msaa.c b/src/mesa/state_tracker/st_<wbr>cb_msaa.c<br>
index 7f1b4fde91..6c5dc1fd43 100644<br>
--- a/src/mesa/state_tracker/st_<wbr>cb_msaa.c<br>
+++ b/src/mesa/state_tracker/st_<wbr>cb_msaa.c<br>
@@ -56,8 +56,35 @@ st_GetSamplePosition(struct gl_context *ctx,<br>
 }<br>
<br>
<br>
+static void<br>
+st_GetProgrammableSampleCaps(<wbr>struct gl_context *ctx, const struct gl_framebuffer *fb,<br>
+                             GLuint *outBits, GLuint *outWidth, GLuint *outHeight)<br>
+{<br>
+   struct st_context *st = st_context(ctx);<br>
+   struct pipe_screen *screen = st->pipe->screen;<br>
+<br>
+   st_validate_state(st, ST_PIPELINE_UPDATE_<wbr>FRAMEBUFFER);<br>
+<br>
+   *outBits = 4;<br>
+   *outWidth = 1;<br>
+   *outHeight = 1;<br>
+<br>
+   if (ctx->Extensions.ARB_sample_<wbr>locations)<br>
+      screen->get_sample_pixel_grid(<wbr>screen, st->state.fb_num_samples,<br>
+                                    outWidth, outHeight);<br>
+<br>
+   /* We could handle this better in some circumstances,<br>
+    * but it's not really an issue */<br>
+   if (*outWidth > MAX_SAMPLE_LOCATION_GRID_SIZE ||<br>
+       *outHeight > MAX_SAMPLE_LOCATION_GRID_SIZE) {<br>
+      *outWidth = 1;<br>
+      *outHeight = 1;<br>
+   }<br>
+}<br>
+<br>
 void<br>
 st_init_msaa_functions(struct dd_function_table *functions)<br>
 {<br>
    functions->GetSamplePosition = st_GetSamplePosition;<br>
+   functions-><wbr>GetProgrammableSampleCaps = st_GetProgrammableSampleCaps;<br>
 }<br>
diff --git a/src/mesa/state_tracker/st_<wbr>context.c b/src/mesa/state_tracker/st_<wbr>context.c<br>
index 061b8b9c4c..40b6849561 100644<br>
--- a/src/mesa/state_tracker/st_<wbr>context.c<br>
+++ b/src/mesa/state_tracker/st_<wbr>context.c<br>
@@ -172,7 +172,7 @@ st_invalidate_buffers(struct st_context *st)<br>
    st->dirty |= ST_NEW_BLEND |<br>
                 ST_NEW_DSA |<br>
                 ST_NEW_FB_STATE |<br>
-                ST_NEW_SAMPLE_MASK |<br>
+                ST_NEW_SAMPLE_STATE |<br>
                 ST_NEW_SAMPLE_SHADING |<br>
                 ST_NEW_FS_STATE |<br>
                 ST_NEW_POLY_STIPPLE |<br>
@@ -323,9 +323,10 @@ st_init_driver_flags(struct st_context *st)<br>
    f->NewLogicOp = ST_NEW_BLEND;<br>
    f->NewStencil = ST_NEW_DSA;<br>
    f->NewMultisampleEnable = ST_NEW_BLEND | ST_NEW_RASTERIZER |<br>
-                             ST_NEW_SAMPLE_MASK | ST_NEW_SAMPLE_SHADING;<br>
+                             ST_NEW_SAMPLE_STATE | ST_NEW_SAMPLE_SHADING;<br>
    f->NewSampleAlphaToXEnable = ST_NEW_BLEND;<br>
-   f->NewSampleMask = ST_NEW_SAMPLE_MASK;<br>
+   f->NewSampleMask = ST_NEW_SAMPLE_STATE;<br>
+   f->NewSampleLocations = ST_NEW_SAMPLE_STATE;<br>
    f->NewSampleShading = ST_NEW_SAMPLE_SHADING;<br>
<br>
    /* This depends on what the gallium driver wants. */<br>
diff --git a/src/mesa/state_tracker/st_<wbr>context.h b/src/mesa/state_tracker/st_<wbr>context.h<br>
index 9f5bfba3fd..a4d52b40ae 100644<br>
--- a/src/mesa/state_tracker/st_<wbr>context.h<br>
+++ b/src/mesa/state_tracker/st_<wbr>context.h<br>
@@ -178,6 +178,12 @@ struct st_context<br>
       GLuint poly_stipple[32];  /**< In OpenGL's bottom-to-top order */<br>
<br>
       GLuint fb_orientation;<br>
+<br>
+      bool enable_sample_locations;<br>
+      unsigned sample_locations_samples;<br>
+      uint8_t sample_locations[<br>
+         PIPE_MAX_SAMPLE_LOCATION_GRID_<wbr>SIZE *<br>
+         PIPE_MAX_SAMPLE_LOCATION_GRID_<wbr>SIZE * 32];<br>
    } state;<br>
<br>
    uint64_t dirty; /**< dirty states */<br>
diff --git a/src/mesa/state_tracker/st_<wbr>extensions.c b/src/mesa/state_tracker/st_<wbr>extensions.c<br>
index 19ef736e5b..6f759de9f8 100644<br>
--- a/src/mesa/state_tracker/st_<wbr>extensions.c<br>
+++ b/src/mesa/state_tracker/st_<wbr>extensions.c<br>
@@ -646,6 +646,7 @@ void st_init_extensions(struct pipe_screen *screen,<br>
       { o(ARB_query_buffer_object),          PIPE_CAP_QUERY_BUFFER_OBJECT              },<br>
       { o(ARB_robust_buffer_access_<wbr>behavior), PIPE_CAP_ROBUST_BUFFER_ACCESS_<wbr>BEHAVIOR   },<br>
       { o(ARB_sample_shading),               PIPE_CAP_SAMPLE_SHADING                   },<br>
+      { o(ARB_sample_locations),             PIPE_CAP_PROGRAMMABLE_SAMPLE_<wbr>LOCATIONS    },<br>
       { o(ARB_seamless_cube_map),            PIPE_CAP_SEAMLESS_CUBE_MAP                },<br>
       { o(ARB_shader_ballot),                PIPE_CAP_TGSI_BALLOT                      },<br>
       { o(ARB_shader_clock),                 PIPE_CAP_TGSI_CLOCK                       },<br>
<span class="HOEnZb"><font color="#888888">-- <br>
2.14.3<br>
<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div>