Blender V4.3
vk_batch.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2022 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "vk_batch.hh"
10
11#include "vk_context.hh"
12#include "vk_framebuffer.hh"
13#include "vk_index_buffer.hh"
14#include "vk_state_manager.hh"
15#include "vk_storage_buffer.hh"
17#include "vk_vertex_buffer.hh"
18
19namespace blender::gpu {
20
21void VKBatch::draw(int vertex_first, int vertex_count, int instance_first, int instance_count)
22{
23 VKContext &context = *VKContext::get();
24 render_graph::VKResourceAccessInfo &resource_access_info = context.reset_and_get_access_info();
26 vao.update_bindings(context, *this);
27
28 VKIndexBuffer *index_buffer = index_buffer_get();
29 const bool draw_indexed = index_buffer != nullptr;
30
31 /* Upload geometry */
32 if (draw_indexed) {
33 index_buffer->upload_data();
34 }
35 context.active_framebuffer_get()->rendering_ensure(context);
36
37 if (draw_indexed) {
38 render_graph::VKDrawIndexedNode::CreateInfo draw_indexed(resource_access_info);
39 draw_indexed.node_data.index_count = vertex_count;
40 draw_indexed.node_data.instance_count = instance_count;
41 draw_indexed.node_data.first_index = vertex_first;
42 draw_indexed.node_data.vertex_offset = index_buffer->index_start_get();
43 draw_indexed.node_data.first_instance = instance_first;
44
45 draw_indexed.node_data.index_buffer.buffer = index_buffer->vk_handle();
46 draw_indexed.node_data.index_buffer.index_type = index_buffer->vk_index_type();
47 vao.bind(draw_indexed.node_data.vertex_buffers);
48 context.update_pipeline_data(prim_type, vao, draw_indexed.node_data.pipeline_data);
49
50 context.render_graph.add_node(draw_indexed);
51 }
52 else {
53 render_graph::VKDrawNode::CreateInfo draw(resource_access_info);
54 draw.node_data.vertex_count = vertex_count;
55 draw.node_data.instance_count = instance_count;
56 draw.node_data.first_vertex = vertex_first;
57 draw.node_data.first_instance = instance_first;
59 context.update_pipeline_data(prim_type, vao, draw.node_data.pipeline_data);
60
61 context.render_graph.add_node(draw);
62 }
63}
64
65void VKBatch::draw_indirect(GPUStorageBuf *indirect_buf, intptr_t offset)
66{
67 multi_draw_indirect(indirect_buf, 1, offset, 0);
68}
69
70void VKBatch::multi_draw_indirect(GPUStorageBuf *indirect_buf,
71 const int count,
72 const intptr_t offset,
73 const intptr_t stride)
74{
75 VKStorageBuffer &indirect_buffer = *unwrap(unwrap(indirect_buf));
76 multi_draw_indirect(indirect_buffer.vk_handle(), count, offset, stride);
77}
78
79void VKBatch::multi_draw_indirect(const VkBuffer indirect_buffer,
80 const int count,
81 const intptr_t offset,
82 const intptr_t stride)
83{
84 VKContext &context = *VKContext::get();
85 render_graph::VKResourceAccessInfo &resource_access_info = context.reset_and_get_access_info();
87 vao.update_bindings(context, *this);
88
89 VKIndexBuffer *index_buffer = index_buffer_get();
90 const bool draw_indexed = index_buffer != nullptr;
91
92 /* Upload geometry */
93 if (draw_indexed) {
94 index_buffer->upload_data();
95 }
96 context.active_framebuffer_get()->rendering_ensure(context);
97
98 if (draw_indexed) {
100 resource_access_info);
101 draw_indexed_indirect.node_data.indirect_buffer = indirect_buffer;
102 draw_indexed_indirect.node_data.offset = offset;
103 draw_indexed_indirect.node_data.draw_count = count;
104 draw_indexed_indirect.node_data.stride = stride;
105
106 draw_indexed_indirect.node_data.index_buffer.buffer = index_buffer->vk_handle();
107 draw_indexed_indirect.node_data.index_buffer.index_type = index_buffer->vk_index_type();
108 vao.bind(draw_indexed_indirect.node_data.vertex_buffers);
109 context.update_pipeline_data(prim_type, vao, draw_indexed_indirect.node_data.pipeline_data);
110
111 context.render_graph.add_node(draw_indexed_indirect);
112 }
113 else {
115 draw.node_data.indirect_buffer = indirect_buffer;
116 draw.node_data.offset = offset;
118 draw.node_data.stride = stride;
119 vao.bind(draw.node_data.vertex_buffers);
120 context.update_pipeline_data(prim_type, vao, draw.node_data.pipeline_data);
121
122 context.render_graph.add_node(draw);
123 }
124}
125
127{
128 return unwrap(verts_(index));
129}
130
132{
133 return unwrap(inst_(index));
134}
135
137{
138 return unwrap(unwrap(elem));
139}
140
141} // namespace blender::gpu
uint32_t index_start_get() const
void draw_indirect(GPUStorageBuf *indirect_buf, intptr_t offset) override
Definition vk_batch.cc:65
void multi_draw_indirect(GPUStorageBuf *indirect_buf, int count, intptr_t offset, intptr_t stride) override
Definition vk_batch.cc:70
VKVertexBuffer * vertex_buffer_get(int index)
Definition vk_batch.cc:126
VKIndexBuffer * index_buffer_get()
Definition vk_batch.cc:136
VKVertexBuffer * instance_buffer_get(int index)
Definition vk_batch.cc:131
void draw(int vertex_first, int vertex_count, int instance_first, int instance_count) override
Definition vk_batch.cc:21
static VKContext * get()
Definition vk_context.hh:97
VkIndexType vk_index_type() const
void update_bindings(const VKContext &context, VKBatch &batch)
void bind(render_graph::VKVertexBufferBindings &r_vertex_buffer_bindings) const
int count
static Context * unwrap(GPUContext *ctx)
_W64 int intptr_t
Definition stdint.h:118
VKVertexBufferBindings vertex_buffers