On Wed, Jun 22, 2016 at 6:01 AM, Michael Schellenberger Costa <mschellenbergerco...@googlemail.com> wrote: > Hi Nicolai > > Am 22.06.2016 um 11:40 schrieb Nicolai Hähnle: >> From: Nicolai Hähnle <nicolai.haeh...@amd.com> >> >> --- >> src/gallium/drivers/radeon/r600_pipe_common.c | 53 >> +++++++++++++++++++++++++++ >> src/gallium/drivers/radeon/r600_pipe_common.h | 12 ++++++ >> src/gallium/drivers/radeonsi/si_debug.c | 39 +++++++++----------- >> src/gallium/drivers/radeonsi/si_hw_context.c | 25 +------------ >> src/gallium/drivers/radeonsi/si_pipe.c | 8 +--- >> src/gallium/drivers/radeonsi/si_pipe.h | 5 +-- >> 6 files changed, 88 insertions(+), 54 deletions(-) >> >> diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c >> b/src/gallium/drivers/radeon/r600_pipe_common.c >> index fa9f70d..ee70a1a 100644 >> --- a/src/gallium/drivers/radeon/r600_pipe_common.c >> +++ b/src/gallium/drivers/radeon/r600_pipe_common.c >> @@ -302,6 +302,59 @@ static void r600_flush_dma_ring(void *ctx, unsigned >> flags, >> rctx->ws->fence_reference(fence, rctx->last_sdma_fence); >> } >> >> +/** >> + * Store a linearized copy of all chunks of \p cs together with the buffer >> + * list in \p saved. >> + */ >> +void radeon_save_cs(struct radeon_winsys *ws, struct radeon_winsys_cs *cs, >> + struct radeon_saved_cs *saved) >> +{ >> + void *buf; >> + unsigned i; >> + >> + /* Save the IB chunks. */ >> + saved->num_dw = cs->prev_dw + cs->current.cdw; >> + saved->ib = MALLOC(4 * saved->num_dw); >> + if (!saved->ib) >> + goto oom; >> + >> + buf = saved->ib; >> + for (i = 0; i < cs->num_prev; ++i) { >> + memcpy(buf, cs->prev[i].buf, cs->prev[i].cdw * 4); >> + buf += cs->prev[i].cdw; >> + } >> + memcpy(buf, cs->current.buf, cs->current.cdw * 4); >> + >> + /* Save the buffer list. */ >> + saved->bo_count = ws->cs_get_buffer_list(cs, NULL); >> + saved->bo_list = CALLOC(saved->bo_count, >> + sizeof(saved->bo_list[0])); >> + if (!saved->bo_list) { >> + FREE(saved->ib); >> + goto oom; >> + } >> + ws->cs_get_buffer_list(cs, saved->bo_list); >> + >> + return; >> + >> +oom: >> + fprintf(stderr, "%s: out of memory\n", __func__); >> + memset(saved, 0, sizeof(*saved)); > Is that Goto really worth it? It costs you one extra line of code and > obfuscates things.
goto is a pretty common way to do error handling in C. This is perfectly fine, and, in fact, preferable to an alternative that duplicates the code. -ilia _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev