From a0d3915663fb7cbd3c1a5561450e256e00ecf11b Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Fri, 10 Jul 2015 14:46:42 -0700 Subject: [PATCH] vc4: Make a helper function for getting the current offset in the CL. I needed to rewrite this a bit for safety checking in the next commit. Despite being a static inline of the same thing that was being done, we lose 36 bytes of code for some reason. --- src/gallium/drivers/vc4/vc4_cl.c | 9 ++++----- src/gallium/drivers/vc4/vc4_cl.h | 15 ++++++++++----- src/gallium/drivers/vc4/vc4_context.c | 3 +-- src/gallium/drivers/vc4/vc4_job.c | 14 ++++++-------- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/gallium/drivers/vc4/vc4_cl.c b/src/gallium/drivers/vc4/vc4_cl.c index 0700e885cbf..97f6b89024c 100644 --- a/src/gallium/drivers/vc4/vc4_cl.c +++ b/src/gallium/drivers/vc4/vc4_cl.c @@ -36,11 +36,12 @@ vc4_init_cl(struct vc4_context *vc4, struct vc4_cl *cl) void cl_ensure_space(struct vc4_cl *cl, uint32_t space) { - if ((cl->next - cl->base) + space <= cl->size) + uint32_t offset = cl_offset(cl); + + if (offset + space <= cl->size) return; uint32_t size = MAX2(cl->size + space, cl->size * 2); - uint32_t offset = cl->next -cl->base; cl->base = reralloc(ralloc_parent(cl->base), cl->base, uint8_t, size); cl->size = size; @@ -60,9 +61,7 @@ vc4_gem_hindex(struct vc4_context *vc4, struct vc4_bo *bo) uint32_t hindex; uint32_t *current_handles = vc4->bo_handles.base; - for (hindex = 0; - hindex < (vc4->bo_handles.next - vc4->bo_handles.base) / 4; - hindex++) { + for (hindex = 0; hindex < cl_offset(&vc4->bo_handles) / 4; hindex++) { if (current_handles[hindex] == bo->handle) return hindex; } diff --git a/src/gallium/drivers/vc4/vc4_cl.h b/src/gallium/drivers/vc4/vc4_cl.h index 3aa4721a414..b914745ed4f 100644 --- a/src/gallium/drivers/vc4/vc4_cl.h +++ b/src/gallium/drivers/vc4/vc4_cl.h @@ -49,6 +49,11 @@ uint32_t vc4_gem_hindex(struct vc4_context *vc4, struct vc4_bo *bo); struct PACKED unaligned_16 { uint16_t x; }; struct PACKED unaligned_32 { uint32_t x; }; +static inline uint32_t cl_offset(struct vc4_cl *cl) +{ + return (char *)cl->next - (char *)cl->base; +} + static inline void put_unaligned_32(void *ptr, uint32_t val) { @@ -66,7 +71,7 @@ put_unaligned_16(void *ptr, uint16_t val) static inline void cl_u8(struct vc4_cl *cl, uint8_t n) { - assert((cl->next - cl->base) + 1 <= cl->size); + assert(cl_offset(cl) + 1 <= cl->size); *(uint8_t *)cl->next = n; cl->next++; @@ -75,7 +80,7 @@ cl_u8(struct vc4_cl *cl, uint8_t n) static inline void cl_u16(struct vc4_cl *cl, uint16_t n) { - assert((cl->next - cl->base) + 2 <= cl->size); + assert(cl_offset(cl) + 2 <= cl->size); put_unaligned_16(cl->next, n); cl->next += 2; @@ -84,7 +89,7 @@ cl_u16(struct vc4_cl *cl, uint16_t n) static inline void cl_u32(struct vc4_cl *cl, uint32_t n) { - assert((cl->next - cl->base) + 4 <= cl->size); + assert(cl_offset(cl) + 4 <= cl->size); put_unaligned_32(cl->next, n); cl->next += 4; @@ -93,7 +98,7 @@ cl_u32(struct vc4_cl *cl, uint32_t n) static inline void cl_aligned_u32(struct vc4_cl *cl, uint32_t n) { - assert((cl->next - cl->base) + 4 <= cl->size); + assert(cl_offset(cl) + 4 <= cl->size); *(uint32_t *)cl->next = n; cl->next += 4; @@ -102,7 +107,7 @@ cl_aligned_u32(struct vc4_cl *cl, uint32_t n) static inline void cl_ptr(struct vc4_cl *cl, void *ptr) { - assert((cl->next - cl->base) + sizeof(void *) <= cl->size); + assert(cl_offset(cl) + sizeof(void *) <= cl->size); *(void **)cl->next = ptr; cl->next += sizeof(void *); diff --git a/src/gallium/drivers/vc4/vc4_context.c b/src/gallium/drivers/vc4/vc4_context.c index 316598f0a9d..60da218e59e 100644 --- a/src/gallium/drivers/vc4/vc4_context.c +++ b/src/gallium/drivers/vc4/vc4_context.c @@ -128,8 +128,7 @@ vc4_cl_references_bo(struct pipe_context *pctx, struct vc4_bo *bo) * they match. */ struct vc4_bo **referenced_bos = vc4->bo_pointers.base; - for (int i = 0; i < (vc4->bo_handles.next - - vc4->bo_handles.base) / 4; i++) { + for (int i = 0; i < cl_offset(&vc4->bo_handles) / 4; i++) { if (referenced_bos[i] == bo) { return true; } diff --git a/src/gallium/drivers/vc4/vc4_job.c b/src/gallium/drivers/vc4/vc4_job.c index 6435dbb333e..7ebd9f160eb 100644 --- a/src/gallium/drivers/vc4/vc4_job.c +++ b/src/gallium/drivers/vc4/vc4_job.c @@ -44,8 +44,7 @@ void vc4_job_reset(struct vc4_context *vc4) { struct vc4_bo **referenced_bos = vc4->bo_pointers.base; - for (int i = 0; i < (vc4->bo_handles.next - - vc4->bo_handles.base) / 4; i++) { + for (int i = 0; i < cl_offset(&vc4->bo_handles) / 4; i++) { vc4_bo_unreference(&referenced_bos[i]); } vc4_reset_cl(&vc4->bcl); @@ -145,7 +144,7 @@ vc4_job_submit(struct vc4_context *vc4) { if (vc4_debug & VC4_DEBUG_CL) { fprintf(stderr, "BCL:\n"); - vc4_dump_cl(vc4->bcl.base, vc4->bcl.next - vc4->bcl.base, false); + vc4_dump_cl(vc4->bcl.base, cl_offset(&vc4->bcl), false); } struct drm_vc4_submit_cl submit; @@ -164,15 +163,14 @@ vc4_job_submit(struct vc4_context *vc4) vc4->zs_write, true, true); submit.bo_handles = (uintptr_t)vc4->bo_handles.base; - submit.bo_handle_count = (vc4->bo_handles.next - - vc4->bo_handles.base) / 4; + submit.bo_handle_count = cl_offset(&vc4->bo_handles) / 4; submit.bin_cl = (uintptr_t)vc4->bcl.base; - submit.bin_cl_size = vc4->bcl.next - vc4->bcl.base; + submit.bin_cl_size = cl_offset(&vc4->bcl); submit.shader_rec = (uintptr_t)vc4->shader_rec.base; - submit.shader_rec_size = vc4->shader_rec.next - vc4->shader_rec.base; + submit.shader_rec_size = cl_offset(&vc4->shader_rec); submit.shader_rec_count = vc4->shader_rec_count; submit.uniforms = (uintptr_t)vc4->uniforms.base; - submit.uniforms_size = vc4->uniforms.next - vc4->uniforms.base; + submit.uniforms_size = cl_offset(&vc4->uniforms); assert(vc4->draw_min_x != ~0 && vc4->draw_min_y != ~0); submit.min_x_tile = vc4->draw_min_x / 64; -- 2.30.2