<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Nov 9, 2017 at 12:45 AM, Kenneth Graunke <span dir="ltr"><<a href="mailto:kenneth@whitecape.org" target="_blank">kenneth@whitecape.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This fixes the missing AutomaticSize handling in the ABO code, removes<br>
a bunch of duplicated code, and drops an extra layer of wrapping around<br>
brw_emit_buffer_surface_state(<wbr>).<br>
---<br>
 src/mesa/drivers/dri/i965/brw_<wbr>context.h          |  10 --<br>
 src/mesa/drivers/dri/i965/brw_<wbr>wm_surface_state.c | 113 +++++++----------------<br>
 src/mesa/drivers/dri/i965/<wbr>gen6_constant_state.c  |   7 +-<br>
 3 files changed, 36 insertions(+), 94 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>brw_context.h b/src/mesa/drivers/dri/i965/<wbr>brw_context.h<br>
index 8aa0c5ff64c..5d19a6bfc9a 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>brw_context.h<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>brw_context.h<br>
@@ -1395,16 +1395,6 @@ brw_get_index_type(unsigned index_size)<br>
 void brw_prepare_vertices(struct brw_context *brw);<br>
<br>
 /* brw_wm_surface_state.c */<br>
-void brw_create_constant_surface(<wbr>struct brw_context *brw,<br>
-                                 struct brw_bo *bo,<br>
-                                 uint32_t offset,<br>
-                                 uint32_t size,<br>
-                                 uint32_t *out_offset);<br>
-void brw_create_buffer_surface(<wbr>struct brw_context *brw,<br>
-                               struct brw_bo *bo,<br>
-                               uint32_t offset,<br>
-                               uint32_t size,<br>
-                               uint32_t *out_offset);<br>
 void brw_update_buffer_texture_<wbr>surface(struct gl_context *ctx,<br>
                                        unsigned unit,<br>
                                        uint32_t *surf_offset);<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/<wbr>brw_wm_surface_state.c<br>
index 27c241a87af..a483ba34151 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>brw_wm_surface_state.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>brw_wm_surface_state.c<br>
@@ -672,44 +672,6 @@ brw_update_buffer_texture_<wbr>surface(struct gl_context *ctx,<br>
                                  0);<br>
 }<br>
<br>
-/**<br>
- * Create the constant buffer surface.  Vertex/fragment shader constants will be<br>
- * read from this buffer with Data Port Read instructions/messages.<br>
- */<br>
-void<br>
-brw_create_constant_surface(<wbr>struct brw_context *brw,<br>
-                           struct brw_bo *bo,<br>
-                           uint32_t offset,<br>
-                           uint32_t size,<br>
-                           uint32_t *out_offset)<br>
-{<br>
-   brw_emit_buffer_surface_state(<wbr>brw, out_offset, bo, offset,<br>
-                                 ISL_FORMAT_R32G32B32A32_FLOAT,<br>
-                                 size, 1, 0);<br>
-}<br>
-<br>
-/**<br>
- * Create the buffer surface. Shader buffer variables will be<br>
- * read from / write to this buffer with Data Port Read/Write<br>
- * instructions/messages.<br>
- */<br>
-void<br>
-brw_create_buffer_surface(<wbr>struct brw_context *brw,<br>
-                          struct brw_bo *bo,<br>
-                          uint32_t offset,<br>
-                          uint32_t size,<br>
-                          uint32_t *out_offset)<br>
-{<br>
-   /* Use a raw surface so we can reuse existing untyped read/write/atomic<br>
-    * messages. We need these specifically for the fragment shader since they<br>
-    * include a pixel mask header that we need to ensure correct behavior<br>
-    * with helper invocations, which cannot write to the buffer.<br>
-    */<br>
-   brw_emit_buffer_surface_state(<wbr>brw, out_offset, bo, offset,<br>
-                                 ISL_FORMAT_RAW,<br>
-                                 size, 1, RELOC_WRITE);<br>
-}<br>
-<br>
 /**<br>
  * Set up a binding table entry for use by stream output logic (transform<br>
  * feedback).<br>
@@ -1271,6 +1233,31 @@ const struct brw_tracked_state brw_cs_texture_surfaces = {<br>
    .emit = brw_update_cs_texture_<wbr>surfaces,<br>
 };<br>
<br>
+static void<br>
+upload_buffer_surface(struct brw_context *brw,<br>
+                      struct gl_buffer_binding *binding,<br>
+                      uint32_t *out_offset,<br>
+                      enum isl_format format,<br>
+                      unsigned reloc_flags)<br>
+{<br>
+   struct gl_context *ctx = &brw->ctx;<br>
+<br>
+   if (binding->BufferObject == ctx->Shared->NullBufferObj) {<br>
+      emit_null_surface_state(brw, NULL, out_offset);<br>
+   } else {<br>
+      ptrdiff_t size = binding->BufferObject->Size - binding->Offset;<br>
+      if (!binding->AutomaticSize)<br>
+         size = MIN2(size, binding->Size);<br>
+<br>
+      struct intel_buffer_object *iobj =<br>
+         intel_buffer_object(binding-><wbr>BufferObject);<br>
+      struct brw_bo *bo =<br>
+         intel_bufferobj_buffer(brw, iobj, binding->Offset, size, false);<br></blockquote><div><br></div><div>You're using this for both reads and writes.  I think you need another boolean parameter instead of simply passing false all the time.  Other than that, looks good.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
+      brw_emit_buffer_surface_state(<wbr>brw, out_offset, bo, binding->Offset,<br>
+                                    format, size, 1, reloc_flags);<br>
+   }<br>
+}<br>
<br>
 void<br>
 brw_upload_ubo_surfaces(struct brw_context *brw, struct gl_program *prog,<br>
@@ -1288,23 +1275,8 @@ brw_upload_ubo_surfaces(struct brw_context *brw, struct gl_program *prog,<br>
    for (int i = 0; i < prog->info.num_ubos; i++) {<br>
       struct gl_buffer_binding *binding =<br>
          &ctx->UniformBufferBindings[<wbr>prog->sh.UniformBlocks[i]-><wbr>Binding];<br>
-<br>
-      if (binding->BufferObject == ctx->Shared->NullBufferObj) {<br>
-         emit_null_surface_state(brw, NULL, &ubo_surf_offsets[i]);<br>
-      } else {<br>
-         struct intel_buffer_object *intel_bo =<br>
-            intel_buffer_object(binding-><wbr>BufferObject);<br>
-         GLsizeiptr size = binding->BufferObject->Size - binding->Offset;<br>
-         if (!binding->AutomaticSize)<br>
-            size = MIN2(size, binding->Size);<br>
-         struct brw_bo *bo =<br>
-            intel_bufferobj_buffer(brw, intel_bo,<br>
-                                   binding->Offset,<br>
-                                   size, false);<br>
-         brw_create_constant_surface(<wbr>brw, bo, binding->Offset,<br>
-                                     size,<br>
-                                     &ubo_surf_offsets[i]);<br>
-      }<br>
+      upload_buffer_surface(brw, binding, &ubo_surf_offsets[i],<br>
+                            ISL_FORMAT_R32G32B32A32_FLOAT, 0);<br>
    }<br>
<br>
    uint32_t *ssbo_surf_offsets =<br>
@@ -1314,22 +1286,8 @@ brw_upload_ubo_surfaces(struct brw_context *brw, struct gl_program *prog,<br>
       struct gl_buffer_binding *binding =<br>
          &ctx-><wbr>ShaderStorageBufferBindings[<wbr>prog->sh.ShaderStorageBlocks[<wbr>i]->Binding];<br>
<br>
-      if (binding->BufferObject == ctx->Shared->NullBufferObj) {<br>
-         emit_null_surface_state(brw, NULL, &ssbo_surf_offsets[i]);<br>
-      } else {<br>
-         struct intel_buffer_object *intel_bo =<br>
-            intel_buffer_object(binding-><wbr>BufferObject);<br>
-         GLsizeiptr size = binding->BufferObject->Size - binding->Offset;<br>
-         if (!binding->AutomaticSize)<br>
-            size = MIN2(size, binding->Size);<br>
-         struct brw_bo *bo =<br>
-            intel_bufferobj_buffer(brw, intel_bo,<br>
-                                   binding->Offset,<br>
-                                   size, true);<br>
-         brw_create_buffer_surface(brw, bo, binding->Offset,<br>
-                                   size,<br>
-                                   &ssbo_surf_offsets[i]);<br>
-      }<br>
+      upload_buffer_surface(brw, binding, &ssbo_surf_offsets[i],<br>
+                            ISL_FORMAT_RAW, RELOC_WRITE);<br>
    }<br>
<br>
    stage_state->push_constants_<wbr>dirty = true;<br>
@@ -1395,17 +1353,8 @@ brw_upload_abo_surfaces(struct brw_context *brw,<br>
       for (unsigned i = 0; i < prog->info.num_abos; i++) {<br>
          struct gl_buffer_binding *binding =<br>
             &ctx->AtomicBufferBindings[<wbr>prog->sh.AtomicBuffers[i]-><wbr>Binding];<br>
-         struct intel_buffer_object *intel_bo =<br>
-            intel_buffer_object(binding-><wbr>BufferObject);<br>
-         struct brw_bo *bo =<br>
-            intel_bufferobj_buffer(brw, intel_bo, binding->Offset,<br>
-                                   intel_bo->Base.Size - binding->Offset,<br>
-                                   true);<br>
-<br>
-         brw_emit_buffer_surface_state(<wbr>brw, &surf_offsets[i], bo,<br>
-                                       binding->Offset, ISL_FORMAT_RAW,<br>
-                                       bo->size - binding->Offset, 1,<br>
-                                       RELOC_WRITE);<br>
+         upload_buffer_surface(brw, binding, &surf_offsets[i],<br>
+                               ISL_FORMAT_RAW, RELOC_WRITE);<br>
       }<br>
<br>
       brw->ctx.NewDriverState |= BRW_NEW_SURFACES;<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>gen6_constant_state.c b/src/mesa/drivers/dri/i965/<wbr>gen6_constant_state.c<br>
index d89e7bde24b..89b1202dd65 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>gen6_constant_state.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>gen6_constant_state.c<br>
@@ -266,8 +266,11 @@ brw_upload_pull_constants(<wbr>struct brw_context *brw,<br>
       }<br>
    }<br>
<br>
-   brw_create_constant_surface(<wbr>brw, const_bo, const_offset, size,<br>
-                               &stage_state->surf_offset[<wbr>surf_index]);<br>
+   brw_emit_buffer_surface_state(<wbr>brw, &stage_state->surf_offset[<wbr>surf_index],<br>
+                                 const_bo, const_offset,<br>
+                                 ISL_FORMAT_R32G32B32A32_FLOAT,<br>
+                                 size, 1, 0);<br>
+<br>
    brw_bo_unreference(const_bo);<br>
<br>
    brw->ctx.NewDriverState |= brw_new_constbuf;<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.15.0<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>