45 if (vbo_ !=
nullptr) {
57 ssbo_wrapper_ =
nullptr;
74 if (required_size_raw == 0) {
88 bool requires_reallocation = (vbo_ !=
nullptr) && (alloc_size_ != required_size);
94 if (vbo_ !=
nullptr) {
95 if (requires_reallocation || (new_data_ready && contents_in_flight_)) {
105 if (requires_reallocation) {
112 if (vbo_ ==
nullptr) {
120 alloc_size_ = required_size;
121 contents_in_flight_ =
false;
125 if (new_data_ready) {
132 BLI_assert(vbo_->get_size() >= required_size_raw);
135 void *dst_data = vbo_->get_host_ptr();
136 memcpy((uint8_t *)dst_data, this->
data_, required_size_raw);
137 vbo_->flush_range(0, required_size_raw);
149 else if (requires_reallocation) {
162 id<MTLBuffer> copy_new_buffer = vbo_->get_metal_buffer();
168 [enc copyFromBuffer:copy_prev_buffer
170 toBuffer:copy_new_buffer
176 if (copy_new_buffer.storageMode == MTLStorageModeManaged) {
177 [enc synchronizeResource:copy_new_buffer];
194 if (prev_vbo !=
nullptr) {
220 id<MTLBuffer> data_buffer = scratch_allocation.
metal_buffer;
227 id<MTLBuffer> dst_buffer = vbo_->get_metal_buffer();
231 [enc copyFromBuffer:data_buffer
232 sourceOffset:data_buffer_offset
234 destinationOffset:start
238 if (dst_buffer.storageMode == MTLStorageModeManaged) {
239 [enc synchronizeResource:dst_buffer];
251 if (ssbo_wrapper_ ==
nullptr) {
254 ssbo_wrapper_->bind(binding);
264 id<MTLBuffer> buf = this->get_metal_buffer();
265 if (buffer_texture_ !=
nullptr) {
268 if (tex_buf != buf) {
270 buffer_texture_ =
nullptr;
275 if (buffer_texture_ ==
nullptr) {
295 id<MTLBuffer> source_buffer = vbo_->get_metal_buffer();
296 if (source_buffer.storageMode == MTLStorageModeManaged) {
298 [enc synchronizeResource:source_buffer];
305 void *host_ptr = vbo_->get_host_ptr();
306 memcpy(
data, host_ptr, alloc_size_);
320 [enc copyFromBuffer:source_buffer
328 if (dest_buffer.storageMode == MTLStorageModeManaged) {
329 [enc synchronizeResource:dest_buffer];
337 memcpy(
data, host_ptr, alloc_size_);
338 dst_tmp_vbo_->
free();
348 id<MTLBuffer> buffer =
reinterpret_cast<id<MTLBuffer>
>((
void *)handle);
359 contents_in_flight_ =
true;
MINLINE uint ceil_to_multiple_u(uint a, uint b)
#define GPU_TEXTURE_FREE_SAFE(texture)
blender::gpu::Texture * GPU_texture_create_from_vertbuf(const char *name, blender::gpu::VertBuf *vertex_buf)
void GPU_texture_bind(blender::gpu::Texture *texture, int unit)
@ GPU_VERTBUF_DATA_UPLOADED
#define MEM_reallocN(vmemh, len)
unsigned long long int uint64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
gpu::MTLBuffer * allocate(uint64_t size, bool cpu_visible)
void * get_host_ptr() const
void set_label(NSString *str)
id< MTLBuffer > get_metal_buffer() const
id< MTLBlitCommandEncoder > ensure_begin_blit_encoder()
static MTLContext * get()
MTLCommandBufferManager main_command_buffer
MTLScratchBufferManager & get_scratchbuffer_manager()
static MTLBufferPool * get_global_memory_manager()
MTLTemporaryBuffer scratch_buffer_allocate_range_aligned(uint64_t alloc_size, uint alignment)
id< MTLBuffer > get_vertex_buffer() const
void resize_data() override
void wrap_handle(uint64_t handle) override
void bind_as_ssbo(uint binding) override
void upload_data() override
friend class MTLStorageBuf
void update_sub(uint start, uint len, const void *data) override
void read(void *data) const override
void bind_as_texture(uint binding) override
void acquire_data() override
void release_data() override
size_t size_used_get() const
size_t size_alloc_get() const
GPUUsageType get_usage_type() const
float length(VecOp< float, D >) RET
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
MINLINE unsigned long long min_ulul(unsigned long long a, unsigned long long b)
MINLINE unsigned long long max_ulul(unsigned long long a, unsigned long long b)
#define MTL_LOG_DEBUG(info,...)
MTLBufferRange MTLTemporaryBuffer
id< MTLBuffer > metal_buffer