<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Mar 8, 2017 at 1:04 AM, Iago Toral <span dir="ltr"><<a href="mailto:itoral@igalia.com" target="_blank">itoral@igalia.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Tue, 2017-03-07 at 13:25 -0800, Jason Ekstrand wrote:<br>
> On Mon, Mar 6, 2017 at 11:16 PM, Iago Toral Quiroga <<a href="mailto:itoral@igalia.co">itoral@igalia.co</a><br>
> m> wrote:<br>
> > ---<br>
> >  src/intel/vulkan/genX_cmd_<wbr>buffer.c | 7 +++++--<br>
> >  1 file changed, 5 insertions(+), 2 deletions(-)<br>
> ><br>
> > diff --git a/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
> > b/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
> > index 8b752c4..23d7493 100644<br>
> > --- a/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
> > +++ b/src/intel/vulkan/genX_cmd_<wbr>buffer.c<br>
> > @@ -1112,7 +1112,7 @@ emit_binding_table(struct anv_cmd_buffer<br>
> > *cmd_buffer,<br>
> >     uint32_t *bt_map = bt_state->map;<br>
> ><br>
> >     if (bt_state->map == NULL)<br>
> > -      return VK_ERROR_OUT_OF_DEVICE_MEMORY;<br>
> > +      return cmd_buffer->error_status =<br>
> > VK_ERROR_OUT_OF_DEVICE_MEMORY;<br>
> ><br>
> >     if (stage == MESA_SHADER_COMPUTE &&<br>
> >         get_cs_prog_data(cmd_buffer-><wbr>state.compute_pipeline)-<br>
> > >uses_num_work_groups) {<br>
> > @@ -1295,7 +1295,7 @@ emit_samplers(struct anv_cmd_buffer<br>
> > *cmd_buffer,<br>
> >     *state = anv_cmd_buffer_alloc_dynamic_<wbr>state(cmd_buffer, size,<br>
> > 32);<br>
> ><br>
> >     if (state->map == NULL)<br>
> > -      return VK_ERROR_OUT_OF_DEVICE_MEMORY;<br>
> > +      return cmd_buffer->error_status =<br>
> > VK_ERROR_OUT_OF_DEVICE_MEMORY;<br>
> ><br>
> >     for (uint32_t s = 0; s < map->sampler_count; s++) {<br>
> >        struct anv_pipeline_binding *binding = &map-<br>
> > >sampler_to_descriptor[s];<br>
> > @@ -1345,6 +1345,7 @@ flush_descriptor_sets(struct anv_cmd_buffer<br>
> > *cmd_buffer)<br>
> >     if (result != VK_SUCCESS) {<br>
> >        assert(result == VK_ERROR_OUT_OF_DEVICE_MEMORY)<wbr>;<br>
> ><br>
> > +      cmd_buffer->error_status = VK_SUCCESS;<br>
> This doesn't seem right.  If we're setting it back to success in<br>
> anywhere other than cmd_buffer_reset, we're doing our error handling<br>
> wrong.<br>
<br>
</div></div>The thing is that this seems to be a controlled error inside the<br>
driver, so we only really want to report an error if the fallback path<br>
below fails. The problem I see is that we might be stomping a previous<br>
error produced before this function, so maybe the right thing to do<br>
here is to simply avoid executing this function if we have seen an<br>
error for this command buffer before (that is, if error_status !=<br>
VK_SUCCESS by the time we call this function). That way, if we get here<br>
it is because we failed to allocate memory during binding table<br>
emission above and since that is an error we can recover from we can<br>
safely reset the error status for the fallback path below.<br><div class="HOEnZb"><div class="h5"></div></div></blockquote><div><br></div><div>The other option would be to make emit_binding_table leave the command buffer error state alone and wait to set it in flush_descriptor_sets.  Then it could error all it wants and we could do a single re-try and if the re-try fails, we set the error.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">
> >        result = anv_cmd_buffer_new_binding_<wbr>table_block(cmd_buffer);<br>
> >        assert(result == VK_SUCCESS);<br>
> ><br>
> > @@ -1817,6 +1818,8 @@ flush_compute_descriptor_set(<wbr>struct<br>
> > anv_cmd_buffer *cmd_buffer)<br>
> >     result = emit_binding_table(cmd_buffer, MESA_SHADER_COMPUTE,<br>
> > &surfaces);<br>
> >     if (result != VK_SUCCESS) {<br>
> >        assert(result == VK_ERROR_OUT_OF_DEVICE_MEMORY)<wbr>;<br>
> > +<br>
> > +      cmd_buffer->error_status = VK_SUCCESS;<br>
> >        result = anv_cmd_buffer_new_binding_<wbr>table_block(cmd_buffer);<br>
> >        assert(result == VK_SUCCESS);<br>
> ><br>
> > --<br>
> > 2.7.4<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>
> ><br>
</div></div></blockquote></div><br></div></div>