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:
@@ -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 ©_buffer)
|
||||
{
|
||||
add_node<VKCopyBufferNode>(copy_buffer);
|
||||
}
|
||||
void add_node(const VKCopyBufferToImageNode::CreateInfo ©_buffer_to_image)
|
||||
{
|
||||
add_node<VKCopyBufferToImageNode>(copy_buffer_to_image);
|
||||
}
|
||||
void add_node(const VKCopyImageNode::CreateInfo ©_image_to_buffer)
|
||||
{
|
||||
add_node<VKCopyImageNode>(copy_image_to_buffer);
|
||||
}
|
||||
void add_node(const VKCopyImageToBufferNode::CreateInfo ©_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
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user