Vulkan: Initial VKUniformBuffer. #105129
|
@ -9,6 +9,7 @@
|
||||||
#include "vk_index_buffer.hh"
|
#include "vk_index_buffer.hh"
|
||||||
#include "vk_storage_buffer.hh"
|
#include "vk_storage_buffer.hh"
|
||||||
#include "vk_texture.hh"
|
#include "vk_texture.hh"
|
||||||
|
#include "vk_uniform_buffer.hh"
|
||||||
#include "vk_vertex_buffer.hh"
|
#include "vk_vertex_buffer.hh"
|
||||||
|
|
||||||
#include "BLI_assert.h"
|
#include "BLI_assert.h"
|
||||||
|
@ -46,6 +47,14 @@ void VKDescriptorSet::bind_as_ssbo(VKVertexBuffer &buffer, const Location locati
|
||||||
binding.buffer_size = buffer.size_used_get();
|
binding.buffer_size = buffer.size_used_get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VKDescriptorSet::bind(VKUniformBuffer &buffer, const Location location)
|
||||||
|
{
|
||||||
|
Binding &binding = ensure_location(location);
|
||||||
|
binding.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||||
|
binding.vk_buffer = buffer.vk_handle();
|
||||||
|
binding.buffer_size = buffer.size_in_bytes();
|
||||||
|
}
|
||||||
|
|
||||||
void VKDescriptorSet::bind_as_ssbo(VKIndexBuffer &buffer, const Location location)
|
void VKDescriptorSet::bind_as_ssbo(VKIndexBuffer &buffer, const Location location)
|
||||||
{
|
{
|
||||||
Binding &binding = ensure_location(location);
|
Binding &binding = ensure_location(location);
|
||||||
|
|
|
@ -19,6 +19,7 @@ class VKIndexBuffer;
|
||||||
class VKShaderInterface;
|
class VKShaderInterface;
|
||||||
class VKStorageBuffer;
|
class VKStorageBuffer;
|
||||||
class VKTexture;
|
class VKTexture;
|
||||||
|
class VKUniformBuffer;
|
||||||
class VKVertexBuffer;
|
class VKVertexBuffer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -57,9 +58,6 @@ class VKDescriptorSet : NonCopyable {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Location() = default;
|
Location() = default;
|
||||||
Location(const ShaderInput *shader_input) : binding(shader_input->location)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const Location &other) const
|
bool operator==(const Location &other) const
|
||||||
{
|
{
|
||||||
|
@ -92,7 +90,7 @@ class VKDescriptorSet : NonCopyable {
|
||||||
|
|
||||||
bool is_buffer() const
|
bool is_buffer() const
|
||||||
{
|
{
|
||||||
return ELEM(type, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
|
return ELEM(type, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_image() const
|
bool is_image() const
|
||||||
|
@ -136,6 +134,7 @@ class VKDescriptorSet : NonCopyable {
|
||||||
void bind_as_ssbo(VKVertexBuffer &buffer, Location location);
|
void bind_as_ssbo(VKVertexBuffer &buffer, Location location);
|
||||||
void bind_as_ssbo(VKIndexBuffer &buffer, Location location);
|
void bind_as_ssbo(VKIndexBuffer &buffer, Location location);
|
||||||
void bind(VKStorageBuffer &buffer, Location location);
|
void bind(VKStorageBuffer &buffer, Location location);
|
||||||
|
void bind(VKUniformBuffer &buffer, Location location);
|
||||||
void image_bind(VKTexture &texture, Location location);
|
void image_bind(VKTexture &texture, Location location);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -6,11 +6,22 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "vk_uniform_buffer.hh"
|
#include "vk_uniform_buffer.hh"
|
||||||
|
#include "vk_context.hh"
|
||||||
|
|
||||||
namespace blender::gpu {
|
namespace blender::gpu {
|
||||||
|
|
||||||
void VKUniformBuffer::update(const void * /*data*/)
|
void VKUniformBuffer::update(const void *data)
|
||||||
{
|
{
|
||||||
|
VKContext &context = *VKContext::get();
|
||||||
|
if (!buffer_.is_allocated()) {
|
||||||
|
allocate(context);
|
||||||
|
}
|
||||||
|
buffer_.update(context, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VKUniformBuffer::allocate(VKContext &context)
|
||||||
|
{
|
||||||
|
buffer_.create(context, size_in_bytes_, GPU_USAGE_STATIC, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VKUniformBuffer::clear_to_zero()
|
void VKUniformBuffer::clear_to_zero()
|
||||||
|
|
|
@ -9,9 +9,13 @@
|
||||||
|
|
||||||
#include "gpu_uniform_buffer_private.hh"
|
#include "gpu_uniform_buffer_private.hh"
|
||||||
|
|
||||||
|
#include "vk_buffer.hh"
|
||||||
|
|
||||||
namespace blender::gpu {
|
namespace blender::gpu {
|
||||||
|
|
||||||
class VKUniformBuffer : public UniformBuf {
|
class VKUniformBuffer : public UniformBuf {
|
||||||
|
VKBuffer buffer_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
VKUniformBuffer(int size, const char *name) : UniformBuf(size, name)
|
VKUniformBuffer(int size, const char *name) : UniformBuf(size, name)
|
||||||
{
|
{
|
||||||
|
@ -22,6 +26,19 @@ class VKUniformBuffer : public UniformBuf {
|
||||||
void bind(int slot) override;
|
void bind(int slot) override;
|
||||||
void bind_as_ssbo(int slot) override;
|
void bind_as_ssbo(int slot) override;
|
||||||
void unbind() override;
|
void unbind() override;
|
||||||
|
|
||||||
|
VkBuffer vk_handle() const
|
||||||
|
{
|
||||||
|
return buffer_.vk_handle();
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t size_in_bytes() const
|
||||||
|
{
|
||||||
|
return size_in_bytes_;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void allocate(VKContext &context);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace blender::gpu
|
} // namespace blender::gpu
|
||||||
|
|
Loading…
Reference in New Issue