<div dir="ltr"><div>I'd like a separate state for this, because set_framebuffer_state is a memory and execution barrier, so it decreases performance, thus there is a high incentive not to couple other states with it. Since cso_context won't be used for setting the state (as I suggested on patch 2), st/mesa will have to filter out redundant state changes, or at least no-op state changes that go from disabled to disabled.<br><br></div>Marek<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, May 4, 2018 at 8:09 AM, 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_framebuffer.c | 64 ++++++++++++++++++++++++++++<br>
 src/mesa/state_tracker/st_cb_<wbr>msaa.c          | 22 ++++++++++<br>
 src/mesa/state_tracker/st_<wbr>extensions.c       |  1 +<br>
 3 files changed, 87 insertions(+)<br>
<br>
diff --git a/src/mesa/state_tracker/st_<wbr>atom_framebuffer.c b/src/mesa/state_tracker/st_<wbr>atom_framebuffer.c<br>
index 3ef3ff34a9..bb5f02125f 100644<br>
--- a/src/mesa/state_tracker/st_<wbr>atom_framebuffer.c<br>
+++ b/src/mesa/state_tracker/st_<wbr>atom_framebuffer.c<br>
@@ -102,6 +102,68 @@ framebuffer_quantize_num_<wbr>samples(struct st_context *st, unsigned num_samples)<br>
    return quantized_samples;<br>
 }<br>
<br>
+/**<br>
+ * Update the pipe_context's sample location state<br>
+ */<br>
+static void<br>
+update_sample_locations(<wbr>struct st_context *st,<br>
+                        const struct pipe_framebuffer_state *fb_state)<br>
+{<br>
+   struct pipe_sample_locations_state locations;<br>
+   struct gl_framebuffer *fb = st->ctx->DrawBuffer;<br>
+<br>
+   if (!st->ctx->Extensions.ARB_<wbr>sample_locations)<br>
+      return;<br>
+<br>
+   locations.enabled = fb-><wbr>ProgrammableSampleLocations;<br>
+   if (locations.enabled) {<br>
+      unsigned grid_width, grid_height;<br>
+      int samples = _mesa_geometric_samples(fb);<br>
+      int pixel, sample_index;<br>
+      bool sample_location_pixel_grid = fb->SampleLocationPixelGrid;<br>
+<br>
+      st->pipe->get_sample_pixel_<wbr>grid(st->pipe, samples, &grid_width, &grid_height);<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_<wbr>LOCATION_GRID_SIZE ||<br>
+          grid_height>MAX_SAMPLE_<wbr>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.locations[pixel*<wbr>samples+sample_index] = loc;<br>
+         }<br>
+      }<br>
+<br>
+      util_sample_locations_flip_y(<wbr>st->pipe, &locations, fb_state);<br>
+   } else {<br>
+      /**<br>
+       * util_sample_locations_flip_y() initializes unused data to 0x88, so<br>
+       * this memset is not useful when locations.enabled is true.<br>
+       */<br>
+      memset(locations.locations, 0x88, sizeof(locations.locations));<br>
+   }<br>
+<br>
+   cso_set_sample_locations(st-><wbr>cso_context, &locations);<br>
+}<br>
+<br>
 /**<br>
  * Update framebuffer state (color, depth, stencil, etc. buffers)<br>
  */<br>
@@ -209,4 +271,6 @@ st_update_framebuffer_state( struct st_context *st )<br>
    st->state.fb_num_samples = util_framebuffer_get_num_<wbr>samples(&framebuffer);<br>
    st->state.fb_num_layers = util_framebuffer_get_num_<wbr>layers(&framebuffer);<br>
    st->state.fb_num_cb = framebuffer.nr_cbufs;<br>
+<br>
+   update_sample_locations(st, &framebuffer);<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..092e74d28e 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,30 @@ st_GetSamplePosition(struct gl_context *ctx,<br>
 }<br>
<br>
<br>
+static void<br>
+st_GetProgrammableSampleCaps(<wbr>struct gl_context *ctx, struct gl_framebuffer *fb,<br>
+                             GLuint *outBits, GLuint *outWidth, GLuint *outHeight)<br>
+{<br>
+   struct st_context *st = st_context(ctx);<br>
+<br>
+   st_validate_state(st, ST_PIPELINE_UPDATE_<wbr>FRAMEBUFFER);<br>
+<br>
+   if (st->pipe->get_sample_pixel_<wbr>grid)<br>
+      st->pipe->get_sample_pixel_<wbr>grid(st->pipe, _mesa_geometric_samples(fb),<br>
+                                      outWidth, outHeight);<br>
+   *outBits = 4;<br>
+<br>
+   /* We could handle this better in some circumstances,<br>
+    * but it's not really an issue */<br>
+   if (*outWidth>MAX_SAMPLE_<wbr>LOCATION_GRID_SIZE || *outHeight>MAX_SAMPLE_<wbr>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>extensions.c b/src/mesa/state_tracker/st_<wbr>extensions.c<br>
index 0dc8adb262..b74fb63cef 100644<br>
--- a/src/mesa/state_tracker/st_<wbr>extensions.c<br>
+++ b/src/mesa/state_tracker/st_<wbr>extensions.c<br>
@@ -636,6 +636,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>