[Mesa-dev] [PATCH 02/18] anv: Add a new block-based batch emit macro

Jason Ekstrand jason at jlekstrand.net
Tue Apr 19 00:10:29 UTC 2016


This new macro uses a for loop to create an actual code block in which to
place the macro setup code.  One advantage of this is that you syntatically
use braces instead of parentheses.  Another is that the code in the block
doesn't even get executed if anv_batch_emit_dwords fails.
---
 src/intel/vulkan/anv_private.h | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index ae2e08d..d59b7ed 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -861,6 +861,15 @@ __gen_combine_address(struct anv_batch *batch, void *location,
       VG(VALGRIND_CHECK_MEM_IS_DEFINED(dw, ARRAY_SIZE(dwords0) * 4));\
    } while (0)
 
+#define anv_batch_emit_blk(batch, cmd, name)                            \
+   for (struct cmd name = { __anv_cmd_header(cmd) },                    \
+        *_dst = anv_batch_emit_dwords(batch, __anv_cmd_length(cmd));    \
+        __builtin_expect(_dst != NULL, 1);                              \
+        ({ __anv_cmd_pack(cmd)(batch, _dst, &name);                     \
+           VG(VALGRIND_CHECK_MEM_IS_DEFINED(_dst, __anv_cmd_length(cmd) * 4)); \
+           _dst = NULL;                                                 \
+         }))
+
 #define anv_state_pool_emit(pool, cmd, align, ...) ({                   \
       const uint32_t __size = __anv_cmd_length(cmd) * 4;                \
       struct anv_state __state =                                        \
-- 
2.5.0.400.gff86faf



More information about the mesa-dev mailing list