<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>