Previous GHOST_ContextVK would create a logical device for each context. Blender uses multiple contexts at the same time and wasn't able to share resources between them as the logical device where different. This patch will create a single logical device and share them between multiple contexts. This allows sharing memory/shaders between contexts and make sure that all memory allocations are freed from the device it was allocated from. Some allocations in Blender are freed when there isn't a context, this was failing in the previous implementation. We didn't noticed it before as we didn't test multiple contexts. This patch also moves device specific data structures from VKContext to VKDevice like the descriptor pools, debug layers etc. Pull Request: https://projects.blender.org/blender/blender/pulls/107606
52 lines
1002 B
C++
52 lines
1002 B
C++
/* SPDX-License-Identifier: GPL-2.0-or-later
|
|
* Copyright 2022 Blender Foundation */
|
|
|
|
/** \file
|
|
* \ingroup gpu
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "GPU_texture.h"
|
|
|
|
#include "gpu_storage_buffer_private.hh"
|
|
#include "gpu_vertex_buffer_private.hh"
|
|
|
|
#include "vk_buffer.hh"
|
|
|
|
namespace blender::gpu {
|
|
class VertBuf;
|
|
|
|
class VKStorageBuffer : public StorageBuf {
|
|
GPUUsageType usage_;
|
|
VKBuffer buffer_;
|
|
|
|
public:
|
|
VKStorageBuffer(int size, GPUUsageType usage, const char *name)
|
|
: StorageBuf(size, name), usage_(usage)
|
|
{
|
|
}
|
|
|
|
void update(const void *data) override;
|
|
void bind(int slot) override;
|
|
void unbind() override;
|
|
void clear(uint32_t clear_value) override;
|
|
void copy_sub(VertBuf *src, uint dst_offset, uint src_offset, uint copy_size) override;
|
|
void read(void *data) override;
|
|
|
|
VkBuffer vk_handle() const
|
|
{
|
|
return buffer_.vk_handle();
|
|
}
|
|
|
|
int64_t size_in_bytes() const
|
|
{
|
|
return buffer_.size_in_bytes();
|
|
}
|
|
|
|
private:
|
|
void allocate();
|
|
};
|
|
|
|
} // namespace blender::gpu
|