Vulkan: IndexBuffer as Subrange #107871
|
@ -66,6 +66,8 @@ class VKBuffer {
|
||||||
*
|
*
|
||||||
* VKImmediate mode uses a single VKBuffer with multiple vertex layouts. Those layouts are send to
|
* VKImmediate mode uses a single VKBuffer with multiple vertex layouts. Those layouts are send to
|
||||||
* the command buffer containing an offset.
|
* the command buffer containing an offset.
|
||||||
|
*
|
||||||
|
* VKIndexBuffer uses this when it is a subrange of another buffer.
|
||||||
*/
|
*/
|
||||||
struct VKBufferWithOffset {
|
struct VKBufferWithOffset {
|
||||||
VKBuffer &buffer;
|
VKBuffer &buffer;
|
||||||
|
|
|
@ -116,12 +116,12 @@ void VKCommandBuffer::bind(const uint32_t binding,
|
||||||
vkCmdBindVertexBuffers(vk_command_buffer_, binding, 1, &vk_vertex_buffer, &offset);
|
vkCmdBindVertexBuffers(vk_command_buffer_, binding, 1, &vk_vertex_buffer, &offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VKCommandBuffer::bind(const VKIndexBuffer &index_buffer, VkIndexType index_type)
|
void VKCommandBuffer::bind(const VKBufferWithOffset &index_buffer, VkIndexType index_type)
|
||||||
{
|
{
|
||||||
validate_framebuffer_exists();
|
validate_framebuffer_exists();
|
||||||
ensure_active_framebuffer();
|
ensure_active_framebuffer();
|
||||||
VkBuffer vk_buffer = index_buffer.vk_handle();
|
vkCmdBindIndexBuffer(
|
||||||
vkCmdBindIndexBuffer(vk_command_buffer_, vk_buffer, 0, index_type);
|
vk_command_buffer_, index_buffer.buffer.vk_handle(), index_buffer.offset, index_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VKCommandBuffer::begin_render_pass(const VKFrameBuffer &framebuffer)
|
void VKCommandBuffer::begin_render_pass(const VKFrameBuffer &framebuffer)
|
||||||
|
|
|
@ -144,7 +144,8 @@ class VKCommandBuffer : NonCopyable, NonMovable {
|
||||||
/* Bind the given buffer as a vertex buffer. */
|
/* Bind the given buffer as a vertex buffer. */
|
||||||
void bind(const uint32_t binding, const VKBufferWithOffset &vertex_buffer);
|
void bind(const uint32_t binding, const VKBufferWithOffset &vertex_buffer);
|
||||||
void bind(const uint32_t binding, const VkBuffer &vk_vertex_buffer, const VkDeviceSize offset);
|
void bind(const uint32_t binding, const VkBuffer &vk_vertex_buffer, const VkDeviceSize offset);
|
||||||
void bind(const VKIndexBuffer &index_buffer, VkIndexType index_type);
|
/* Bind the given buffer as an index buffer. */
|
||||||
|
void bind(const VKBufferWithOffset &index_buffer, VkIndexType index_type);
|
||||||
|
|
||||||
void begin_render_pass(const VKFrameBuffer &framebuffer);
|
void begin_render_pass(const VKFrameBuffer &framebuffer);
|
||||||
void end_render_pass(const VKFrameBuffer &framebuffer);
|
void end_render_pass(const VKFrameBuffer &framebuffer);
|
||||||
|
|
|
@ -97,4 +97,6 @@ template<typename T> VkObjectType to_vk_object_type(T /*vk_obj*/)
|
||||||
return VK_OBJECT_TYPE_UNKNOWN;
|
return VK_OBJECT_TYPE_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define NOT_YET_IMPLEMENTED printf("%s not implemented yet\n", __func__);
|
||||||
|
|
||||||
} // namespace blender::gpu
|
} // namespace blender::gpu
|
||||||
|
|
|
@ -35,7 +35,7 @@ void VKIndexBuffer::upload_data()
|
||||||
|
|
||||||
void VKIndexBuffer::bind(VKContext &context)
|
void VKIndexBuffer::bind(VKContext &context)
|
||||||
{
|
{
|
||||||
context.command_buffer_get().bind(*this, to_vk_index_type(index_type_));
|
context.command_buffer_get().bind(buffer_with_offset(), to_vk_index_type(index_type_));
|
||||||
}
|
}
|
||||||
|
|
||||||
void VKIndexBuffer::bind_as_ssbo(uint binding)
|
void VKIndexBuffer::bind_as_ssbo(uint binding)
|
||||||
|
@ -61,9 +61,15 @@ void VKIndexBuffer::read(uint32_t *data) const
|
||||||
buffer_.read(data);
|
buffer_.read(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VKIndexBuffer::update_sub(uint /*start*/, uint /*len*/, const void * /*data*/) {}
|
void VKIndexBuffer::update_sub(uint /*start*/, uint /*len*/, const void * /*data*/)
|
||||||
|
{
|
||||||
|
NOT_YET_IMPLEMENTED
|
||||||
|
}
|
||||||
|
|
||||||
void VKIndexBuffer::strip_restart_indices() {}
|
void VKIndexBuffer::strip_restart_indices()
|
||||||
|
{
|
||||||
|
NOT_YET_IMPLEMENTED
|
||||||
|
}
|
||||||
|
|
||||||
void VKIndexBuffer::allocate()
|
void VKIndexBuffer::allocate()
|
||||||
{
|
{
|
||||||
|
@ -75,4 +81,16 @@ void VKIndexBuffer::allocate()
|
||||||
debug::object_label(buffer_.vk_handle(), "IndexBuffer");
|
debug::object_label(buffer_.vk_handle(), "IndexBuffer");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VKBufferWithOffset VKIndexBuffer::buffer_with_offset()
|
||||||
|
{
|
||||||
|
VKIndexBuffer *src = unwrap(src_);
|
||||||
|
VKBufferWithOffset result{is_subrange_ ? src->buffer_ : buffer_, index_start_};
|
||||||
|
|
||||||
|
BLI_assert_msg(is_subrange_ || result.offset == 0,
|
||||||
|
"According to design index_start should always be zero when index buffer isn't "
|
||||||
|
"a subrange");
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace blender::gpu
|
} // namespace blender::gpu
|
||||||
|
|
|
@ -35,6 +35,7 @@ class VKIndexBuffer : public IndexBuf {
|
||||||
void strip_restart_indices() override;
|
void strip_restart_indices() override;
|
||||||
void allocate();
|
void allocate();
|
||||||
void ensure_updated();
|
void ensure_updated();
|
||||||
|
VKBufferWithOffset buffer_with_offset();
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline VKIndexBuffer *unwrap(IndexBuf *index_buffer)
|
static inline VKIndexBuffer *unwrap(IndexBuf *index_buffer)
|
||||||
|
|
Loading…
Reference in New Issue