Vulkan: Use macros to reduce code replication

Use macros to reduce code replication.

- `VKRenderGraph::add_node`
- `VKRenderGraphNode::build_commands`
- `VKRenderGraphNode::free_data`

Pull Request: https://projects.blender.org/blender/blender/pulls/122141
This commit is contained in:
Jeroen Bakker
2024-05-23 11:21:55 +02:00
parent 7b0f49f183
commit 5ee46b0ef3
2 changed files with 54 additions and 145 deletions

View File

@@ -162,58 +162,25 @@ class VKRenderGraph : public NonCopyable {
}
public:
void add_node(const VKBeginRenderingNode::CreateInfo &begin_rendering)
{
add_node<VKBeginRenderingNode>(begin_rendering);
}
void add_node(const VKEndRenderingNode::CreateInfo &end_rendering)
{
add_node<VKEndRenderingNode>(end_rendering);
}
void add_node(const VKClearAttachmentsNode::CreateInfo &clear_attachments)
{
add_node<VKClearAttachmentsNode>(clear_attachments);
}
void add_node(const VKClearColorImageNode::CreateInfo &clear_color_image)
{
add_node<VKClearColorImageNode>(clear_color_image);
}
void add_node(const VKClearDepthStencilImageNode::CreateInfo &clear_depth_stencil_image)
{
add_node<VKClearDepthStencilImageNode>(clear_depth_stencil_image);
}
void add_node(const VKFillBufferNode::CreateInfo &fill_buffer)
{
add_node<VKFillBufferNode>(fill_buffer);
}
void add_node(const VKCopyBufferNode::CreateInfo &copy_buffer)
{
add_node<VKCopyBufferNode>(copy_buffer);
}
void add_node(const VKCopyBufferToImageNode::CreateInfo &copy_buffer_to_image)
{
add_node<VKCopyBufferToImageNode>(copy_buffer_to_image);
}
void add_node(const VKCopyImageNode::CreateInfo &copy_image_to_buffer)
{
add_node<VKCopyImageNode>(copy_image_to_buffer);
}
void add_node(const VKCopyImageToBufferNode::CreateInfo &copy_image_to_buffer)
{
add_node<VKCopyImageToBufferNode>(copy_image_to_buffer);
}
void add_node(const VKBlitImageNode::CreateInfo &blit_image)
{
add_node<VKBlitImageNode>(blit_image);
}
void add_node(const VKDispatchNode::CreateInfo &dispatch)
{
add_node<VKDispatchNode>(dispatch);
}
void add_node(const VKDispatchIndirectNode::CreateInfo &dispatch)
{
add_node<VKDispatchIndirectNode>(dispatch);
#define ADD_NODE(NODE_CLASS) \
void add_node(const NODE_CLASS::CreateInfo &create_info) \
{ \
add_node<NODE_CLASS>(create_info); \
}
ADD_NODE(VKBeginRenderingNode)
ADD_NODE(VKEndRenderingNode)
ADD_NODE(VKClearAttachmentsNode)
ADD_NODE(VKClearColorImageNode)
ADD_NODE(VKClearDepthStencilImageNode)
ADD_NODE(VKFillBufferNode)
ADD_NODE(VKCopyBufferNode)
ADD_NODE(VKCopyBufferToImageNode)
ADD_NODE(VKCopyImageNode)
ADD_NODE(VKCopyImageToBufferNode)
ADD_NODE(VKBlitImageNode)
ADD_NODE(VKDispatchNode)
ADD_NODE(VKDispatchIndirectNode)
#undef ADD_NODE
/**
* Submit partial graph to be able to read the expected result of the rendering commands
@@ -256,6 +223,6 @@ class VKRenderGraph : public NonCopyable {
private:
void remove_nodes(Span<NodeHandle> node_handles);
};
}; // namespace blender::gpu::render_graph
} // namespace blender::gpu::render_graph

View File

@@ -146,90 +146,32 @@ struct VKRenderGraphNode {
case VKNodeType::UNUSED: {
break;
}
#define BUILD_COMMANDS(NODE_TYPE, NODE_CLASS, ATTRIBUTE_NAME) \
case NODE_TYPE: { \
NODE_CLASS node_info; \
node_info.build_commands(command_buffer, ATTRIBUTE_NAME, r_bound_pipelines); \
break; \
}
case VKNodeType::BEGIN_RENDERING: {
VKBeginRenderingNode node_info;
node_info.build_commands(command_buffer, begin_rendering, r_bound_pipelines);
break;
}
case VKNodeType::CLEAR_ATTACHMENTS: {
VKClearAttachmentsNode node_info;
node_info.build_commands(command_buffer, clear_attachments, r_bound_pipelines);
break;
}
case VKNodeType::CLEAR_COLOR_IMAGE: {
VKClearColorImageNode node_info;
node_info.build_commands(command_buffer, clear_color_image, r_bound_pipelines);
break;
}
case VKNodeType::CLEAR_DEPTH_STENCIL_IMAGE: {
VKClearDepthStencilImageNode node_info;
node_info.build_commands(command_buffer, clear_depth_stencil_image, r_bound_pipelines);
break;
}
case VKNodeType::END_RENDERING: {
VKEndRenderingNode node_info;
node_info.build_commands(command_buffer, end_rendering, r_bound_pipelines);
break;
}
case VKNodeType::FILL_BUFFER: {
VKFillBufferNode node_info;
node_info.build_commands(command_buffer, fill_buffer, r_bound_pipelines);
break;
}
case VKNodeType::COPY_BUFFER: {
VKCopyBufferNode node_info;
node_info.build_commands(command_buffer, copy_buffer, r_bound_pipelines);
break;
}
case VKNodeType::COPY_BUFFER_TO_IMAGE: {
VKCopyBufferToImageNode node_info;
node_info.build_commands(command_buffer, copy_buffer_to_image, r_bound_pipelines);
break;
}
case VKNodeType::COPY_IMAGE: {
VKCopyImageNode node_info;
node_info.build_commands(command_buffer, copy_image, r_bound_pipelines);
break;
}
case VKNodeType::COPY_IMAGE_TO_BUFFER: {
VKCopyImageToBufferNode node_info;
node_info.build_commands(command_buffer, copy_image_to_buffer, r_bound_pipelines);
break;
}
case VKNodeType::BLIT_IMAGE: {
VKBlitImageNode node_info;
node_info.build_commands(command_buffer, blit_image, r_bound_pipelines);
break;
}
case VKNodeType::SYNCHRONIZATION: {
VKSynchronizationNode node_info;
node_info.build_commands(command_buffer, synchronization, r_bound_pipelines);
break;
}
case VKNodeType::DISPATCH: {
VKDispatchNode node_info;
node_info.build_commands(command_buffer, dispatch, r_bound_pipelines);
break;
}
case VKNodeType::DISPATCH_INDIRECT: {
VKDispatchIndirectNode node_info;
node_info.build_commands(command_buffer, dispatch_indirect, r_bound_pipelines);
break;
}
BUILD_COMMANDS(VKNodeType::BEGIN_RENDERING, VKBeginRenderingNode, begin_rendering)
BUILD_COMMANDS(VKNodeType::CLEAR_ATTACHMENTS, VKClearAttachmentsNode, clear_attachments)
BUILD_COMMANDS(VKNodeType::CLEAR_COLOR_IMAGE, VKClearColorImageNode, clear_color_image)
BUILD_COMMANDS(VKNodeType::CLEAR_DEPTH_STENCIL_IMAGE,
VKClearDepthStencilImageNode,
clear_depth_stencil_image)
BUILD_COMMANDS(VKNodeType::END_RENDERING, VKEndRenderingNode, end_rendering)
BUILD_COMMANDS(VKNodeType::FILL_BUFFER, VKFillBufferNode, fill_buffer)
BUILD_COMMANDS(VKNodeType::COPY_BUFFER, VKCopyBufferNode, copy_buffer)
BUILD_COMMANDS(
VKNodeType::COPY_BUFFER_TO_IMAGE, VKCopyBufferToImageNode, copy_buffer_to_image)
BUILD_COMMANDS(VKNodeType::COPY_IMAGE, VKCopyImageNode, copy_image)
BUILD_COMMANDS(
VKNodeType::COPY_IMAGE_TO_BUFFER, VKCopyImageToBufferNode, copy_image_to_buffer)
BUILD_COMMANDS(VKNodeType::BLIT_IMAGE, VKBlitImageNode, blit_image)
BUILD_COMMANDS(VKNodeType::SYNCHRONIZATION, VKSynchronizationNode, synchronization)
BUILD_COMMANDS(VKNodeType::DISPATCH, VKDispatchNode, dispatch)
BUILD_COMMANDS(VKNodeType::DISPATCH_INDIRECT, VKDispatchIndirectNode, dispatch_indirect)
#undef BUILD_COMMANDS
}
}
@@ -239,17 +181,17 @@ struct VKRenderGraphNode {
void free_data()
{
switch (type) {
case VKNodeType::DISPATCH: {
VKDispatchNode node_info;
node_info.free_data(dispatch);
break;
}
case VKNodeType::DISPATCH_INDIRECT: {
VKDispatchIndirectNode node_info;
node_info.free_data(dispatch_indirect);
break;
}
#define FREE_DATA(NODE_TYPE, NODE_CLASS, ATTRIBUTE_NAME) \
case NODE_TYPE: { \
NODE_CLASS node_info; \
node_info.free_data(ATTRIBUTE_NAME); \
break; \
}
FREE_DATA(VKNodeType::DISPATCH, VKDispatchNode, dispatch)
FREE_DATA(VKNodeType::DISPATCH_INDIRECT, VKDispatchIndirectNode, dispatch_indirect)
#undef FREE_DATA
case VKNodeType::UNUSED:
case VKNodeType::BEGIN_RENDERING: