<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Mar 8, 2018 at 8:48 AM, Rafael Antognolli <span dir="ltr"><<a href="mailto:rafael.antognolli@intel.com" target="_blank">rafael.antognolli@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The size of the clear color struct (expected by the hardware) is 8<br>
dwords (isl_dev.ss.clear_value_state_<wbr>size here). But we still need to<br>
track the size of the clear color, used when memcopying it to/from the<br>
state buffer. For that we keep isl_dev.ss.clear_value_size.<br>
<br>
v4:<br>
 - Add struct to gen11 too (Jason, Jordan)<br>
 - Add field for Converted Clear Color to gen11 (Jason)<br>
 - Add clear_color_state_offset to differentiate from<br>
 clear_value_offset.<br>
 - Fix all the places where clear_value_size was used.<br>
<br>
[<a href="mailto:jordan.l.justen@intel.com">jordan.l.justen@intel.com</a>: isl_device_init changes]<br>
Signed-off-by: Rafael Antognolli <<a href="mailto:rafael.antognolli@intel.com">rafael.antognolli@intel.com</a>><br>
Signed-off-by: Jordan Justen <<a href="mailto:jordan.l.justen@intel.com">jordan.l.justen@intel.com</a>><br>
---<br>
 src/intel/blorp/blorp_genX_<wbr>exec.h  |  5 +++--<br>
 src/intel/genxml/gen10.xml         |  8 ++++++++<br>
 src/intel/genxml/gen11.xml         | 10 ++++++++++<br>
 src/intel/isl/isl.c                | 23 +++++++++++++++--------<br>
 src/intel/isl/isl.h                |  6 ++++++<br>
 src/intel/vulkan/anv_image.c       |  6 +++++-<br>
 src/intel/vulkan/anv_private.h     |  6 +++++-<br>
 src/intel/vulkan/genX_cmd_<wbr>buffer.c | 22 +++++++++++-----------<br>
 8 files changed, 63 insertions(+), 23 deletions(-)<br>
<br>
diff --git a/src/intel/blorp/blorp_genX_<wbr>exec.h b/src/intel/blorp/blorp_genX_<wbr>exec.h<br>
index 1348659233c..7f5a4539e8d 100644<br>
--- a/src/intel/blorp/blorp_genX_<wbr>exec.h<br>
+++ b/src/intel/blorp/blorp_genX_<wbr>exec.h<br>
@@ -310,10 +310,11 @@ blorp_emit_vertex_buffers(<wbr>struct blorp_batch *batch,<br>
<br>
    uint32_t num_vbs = 2;<br>
    if (params->dst_clear_color_as_<wbr>input) {<br>
+      const unsigned clear_color_size =<br>
+         GEN_GEN < 10 ? batch->blorp->isl_dev->ss.<wbr>clear_value_size : 4 * 4;<br>
       blorp_fill_vertex_buffer_<wbr>state(batch, vb, num_vbs++,<br>
                                      params->dst.clear_color_addr,<br>
-                                     batch->blorp->isl_dev->ss.<wbr>clear_value_size,<br>
-                                     0);<br>
+                                     clear_color_size, 0);<br>
    }<br>
<br>
    const unsigned num_dwords = 1 + num_vbs * GENX(VERTEX_BUFFER_STATE_<wbr>length);<br>
diff --git a/src/intel/genxml/gen10.xml b/src/intel/genxml/gen10.xml<br>
index 6302497a5e9..fdb12bace03 100644<br>
--- a/src/intel/genxml/gen10.xml<br>
+++ b/src/intel/genxml/gen10.xml<br>
@@ -584,6 +584,14 @@<br>
     <field name="Alpha Clear Color" start="480" end="511" type="int"/><br>
   </struct><br>
<br>
+  <struct name="CLEAR_COLOR" length="8"><br>
+    <field name="Raw Clear Color Red" start="0" end="31" type="int"/><br>
+    <field name="Raw Clear Color Green" start="32" end="63" type="int"/><br>
+    <field name="Raw Clear Color Blue" start="64" end="95" type="int"/><br>
+    <field name="Raw Clear Color Alpha" start="96" end="127" type="int"/><br>
+    <!-- Reserved - MBZ --><br>
+  </struct><br></blockquote><div><br></div><div>genxml changes should probably go in their own commit.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
   <struct name="SAMPLER_INDIRECT_STATE_<wbr>BORDER_COLOR" length="4"><br>
     <field name="Border Color Red As S31" start="0" end="31" type="int"/><br>
     <field name="Border Color Red As U32" start="0" end="31" type="uint"/><br>
diff --git a/src/intel/genxml/gen11.xml b/src/intel/genxml/gen11.xml<br>
index 023b56f83f1..28b06b8b2e2 100644<br>
--- a/src/intel/genxml/gen11.xml<br>
+++ b/src/intel/genxml/gen11.xml<br>
@@ -586,6 +586,16 @@<br>
     <field name="Alpha Clear Color" start="480" end="511" type="int"/><br>
   </struct><br>
<br>
+  <struct name="CLEAR_COLOR" length="8"><br>
+    <field name="Raw Clear Color Red" start="0" end="31" type="int"/><br>
+    <field name="Raw Clear Color Green" start="32" end="63" type="int"/><br>
+    <field name="Raw Clear Color Blue" start="64" end="95" type="int"/><br>
+    <field name="Raw Clear Color Alpha" start="96" end="127" type="int"/><br>
+    <!-- This field is used only by the hardware --><br>
+    <field name="Converted Clear Value Hi/Low" start="128" end="191" type="uint"/><br>
+    <!-- Reserved - MBZ --><br>
+  </struct><br>
+<br>
   <struct name="SAMPLER_INDIRECT_STATE_<wbr>BORDER_COLOR" length="4"><br>
     <field name="Border Color Red As S31" start="0" end="31" type="int"/><br>
     <field name="Border Color Red As U32" start="0" end="31" type="uint"/><br>
diff --git a/src/intel/isl/isl.c b/src/intel/isl/isl.c<br>
index 1a32c028183..3566bd3f0dd 100644<br>
--- a/src/intel/isl/isl.c<br>
+++ b/src/intel/isl/isl.c<br>
@@ -73,14 +73,21 @@ isl_device_init(struct isl_device *dev,<br>
    dev->ss.size = RENDER_SURFACE_STATE_length(<wbr>info) * 4;<br>
    dev->ss.align = isl_align(dev->ss.size, 32);<br>
<br>
-   dev->ss.clear_value_size =<br>
-      isl_align(RENDER_SURFACE_<wbr>STATE_RedClearColor_bits(info) +<br>
-                RENDER_SURFACE_STATE_<wbr>GreenClearColor_bits(info) +<br>
-                RENDER_SURFACE_STATE_<wbr>BlueClearColor_bits(info) +<br>
-                RENDER_SURFACE_STATE_<wbr>AlphaClearColor_bits(info), 32) / 8;<br>
-<br>
-   dev->ss.clear_value_offset =<br>
-      RENDER_SURFACE_STATE_<wbr>RedClearColor_start(info) / 32 * 4;<br>
+   if (ISL_DEV_GEN(dev) >= 10) {<br>
+      dev->ss.clear_color_state_size = CLEAR_COLOR_length(info) * 4;<br>
+      dev->ss.clear_color_state_<wbr>offset =<br>
+         RENDER_SURFACE_STATE_<wbr>ClearValueAddress_start(info) / 32 * 4;<br>
+   }<br>
+<br>
+   if (ISL_DEV_GEN(dev) <= 10) {<br>
+      dev->ss.clear_value_size =<br>
+         isl_align(RENDER_SURFACE_<wbr>STATE_RedClearColor_bits(info) +<br>
+                   RENDER_SURFACE_STATE_<wbr>GreenClearColor_bits(info) +<br>
+                   RENDER_SURFACE_STATE_<wbr>BlueClearColor_bits(info) +<br>
+                   RENDER_SURFACE_STATE_<wbr>AlphaClearColor_bits(info), 32) / 8;<br>
+      dev->ss.clear_value_offset =<br>
+         RENDER_SURFACE_STATE_<wbr>RedClearColor_start(info) / 32 * 4;<br>
+   }<br></blockquote><div><br></div><div>You don't need the gen checks here the _bits and _start functions will return 0 on older platforms.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
    assert(RENDER_SURFACE_STATE_<wbr>SurfaceBaseAddress_start(info) % 8 == 0);<br>
    dev->ss.addr_offset =<br>
diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h<br>
index 0da6abb71d4..2edf0522e32 100644<br>
--- a/src/intel/isl/isl.h<br>
+++ b/src/intel/isl/isl.h<br>
@@ -963,6 +963,12 @@ struct isl_device {<br>
       uint8_t aux_addr_offset;<br>
<br>
       /* Rounded up to the nearest dword to simplify GPU memcpy operations. */<br>
+<br>
+      /* size of the state buffer used to store the clear color + extra<br>
+       * additional space used by the hardware */<br>
+      uint8_t clear_color_state_size;<br>
+      uint8_t clear_color_state_offset;<br>
+      /* size of the clear color itself - used to copy it to/from a BO */<br>
       uint8_t clear_value_size;<br>
       uint8_t clear_value_offset;<br>
    } ss;<br>
diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c<br>
index b20d791751d..d9b5d266020 100644<br>
--- a/src/intel/vulkan/anv_image.c<br>
+++ b/src/intel/vulkan/anv_image.c<br>
@@ -267,8 +267,12 @@ add_aux_state_tracking_buffer(<wbr>struct anv_image *image,<br>
              (image->planes[plane].offset + image->planes[plane].size));<br>
    }<br>
<br>
+   const unsigned clear_color_state_size = device->info.gen >= 10 ?<br>
+      device->isl_dev.ss.clear_<wbr>color_state_size :<br>
+      device->isl_dev.ss.clear_<wbr>value_size;<br>
+<br>
    /* Clear color and fast clear type */<br>
-   unsigned state_size = device->isl_dev.ss.clear_<wbr>value_size + 4;<br>
+   unsigned state_size = clear_color_state_size + 4;<br>
<br>
    /* We only need to track compression on CCS_E surfaces. */<br>
    if (image->planes[plane].aux_<wbr>usage == ISL_AUX_USAGE_CCS_E) {<br>
diff --git a/src/intel/vulkan/anv_<wbr>private.h b/src/intel/vulkan/anv_<wbr>private.h<br>
index ee533581ab4..3af81e16025 100644<br>
--- a/src/intel/vulkan/anv_<wbr>private.h<br>
+++ b/src/intel/vulkan/anv_<wbr>private.h<br>
@@ -2606,7 +2606,11 @@ anv_image_get_fast_clear_type_<wbr>addr(const struct anv_device *device,<br>
 {<br>
    struct anv_address addr =<br>
       anv_image_get_clear_color_<wbr>addr(device, image, aspect);<br>
-   addr.offset += device->isl_dev.ss.clear_<wbr>value_size;<br>
+<br>
+   const unsigned clear_color_state_size = device->info.gen >= 10 ?<br>
+      device->isl_dev.ss.clear_<wbr>color_state_size :<br>
+      device->isl_dev.ss.clear_<wbr>value_size;<br>
+   addr.offset += clear_color_state_size;<br>
    return addr;<br>
 }<br>
<br>
diff --git a/src/intel/vulkan/genX_cmd_<wbr>buffer.c b/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
index b5741fb8dc1..53d095a6ee2 100644<br>
--- a/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
+++ b/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
@@ -826,35 +826,35 @@ init_fast_clear_color(struct anv_cmd_buffer *cmd_buffer,<br>
     */<br>
    struct anv_address addr =<br>
       anv_image_get_clear_color_<wbr>addr(cmd_buffer->device, image, aspect);<br>
-   unsigned i = 0;<br>
-   for (; i < cmd_buffer->device->isl_dev.<wbr>ss.clear_value_size; i += 4) {<br>
-      anv_batch_emit(&cmd_buffer-><wbr>batch, GENX(MI_STORE_DATA_IMM), sdi) {<br>
-         sdi.Address = addr;<br>
<br>
-         if (GEN_GEN >= 9) {<br>
+   if (GEN_GEN >= 9) {<br>
+      for (unsigned i = 0; i < 4; i++) {<br>
+         anv_batch_emit(&cmd_buffer-><wbr>batch, GENX(MI_STORE_DATA_IMM), sdi) {<br>
+            sdi.Address = addr;<br>
             /* MCS buffers on SKL+ can only have 1/0 clear colors. */<br>
             assert(image->samples > 1);<br>
             sdi.ImmediateData = 0;<br>
-         } else if (GEN_VERSIONx10 >= 75) {<br>
+         }<br>
+      }<br>
+   } else {<br>
+      anv_batch_emit(&cmd_buffer-><wbr>batch, GENX(MI_STORE_DATA_IMM), sdi) {<br>
+         sdi.Address = addr;<br>
+         if (GEN_VERSIONx10 >= 75) {<br>
             /* Pre-SKL, the dword containing the clear values also contains<br>
              * other fields, so we need to initialize those fields to match the<br>
              * values that would be in a color attachment.<br>
              */<br>
-            assert(i == 0);<br>
             sdi.ImmediateData = ISL_CHANNEL_SELECT_RED   << 25 |<br>
                                 ISL_CHANNEL_SELECT_GREEN << 22 |<br>
                                 ISL_CHANNEL_SELECT_BLUE  << 19 |<br>
                                 ISL_CHANNEL_SELECT_ALPHA << 16;<br>
-         }  else if (GEN_VERSIONx10 == 70) {<br>
+         } else if (GEN_VERSIONx10 == 70) {<br>
             /* On IVB, the dword containing the clear values also contains<br>
              * other fields that must be zero or can be zero.<br>
              */<br>
-            assert(i == 0);<br>
             sdi.ImmediateData = 0;<br>
          }<br>
       }<br>
-<br>
-      addr.offset += 4;<br></blockquote><div><br></div><div>This needs to be part of your gen >= 9 loop somehow.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
    }<br>
 }<br>
<span class="HOEnZb"><font color="#888888"><br>
--<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></div>