2023-08-16 00:20:26 +10:00
|
|
|
/* SPDX-FileCopyrightText: 2022 Blender Authors
|
2023-05-31 16:19:06 +02:00
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
2023-04-17 13:59:27 +02:00
|
|
|
|
|
|
|
|
/** \file
|
|
|
|
|
* \ingroup gpu
|
2023-04-19 08:02:42 +10:00
|
|
|
*/
|
2023-05-03 11:46:30 +02:00
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
|
#include "gpu_storage_buffer_private.hh"
|
|
|
|
|
|
|
|
|
|
#include "mtl_context.hh"
|
|
|
|
|
|
2024-11-01 20:23:18 +01:00
|
|
|
namespace blender::gpu {
|
2023-05-03 11:46:30 +02:00
|
|
|
|
|
|
|
|
class MTLUniformBuf;
|
|
|
|
|
class MTLVertBuf;
|
|
|
|
|
class MTLIndexBuf;
|
2024-11-27 17:37:04 +01:00
|
|
|
class MTLCircularBuffer;
|
2023-05-03 11:46:30 +02:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Implementation of Storage Buffers using Metal.
|
|
|
|
|
*/
|
|
|
|
|
class MTLStorageBuf : public StorageBuf {
|
2024-11-27 17:37:04 +01:00
|
|
|
friend MTLCircularBuffer;
|
|
|
|
|
|
2023-05-03 11:46:30 +02:00
|
|
|
private:
|
|
|
|
|
/** Allocation Handle or indirect wrapped instance.
|
|
|
|
|
* MTLStorageBuf can wrap a MTLVertBuf, MTLIndexBuf or MTLUniformBuf for binding as a writeable
|
|
|
|
|
* resource. */
|
|
|
|
|
enum {
|
|
|
|
|
MTL_STORAGE_BUF_TYPE_DEFAULT = 0,
|
|
|
|
|
MTL_STORAGE_BUF_TYPE_UNIFORMBUF = 1,
|
|
|
|
|
MTL_STORAGE_BUF_TYPE_VERTBUF = 2,
|
|
|
|
|
MTL_STORAGE_BUF_TYPE_INDEXBUF = 3,
|
2023-12-11 23:00:20 +01:00
|
|
|
MTL_STORAGE_BUF_TYPE_TEXTURE = 4,
|
2023-05-03 11:46:30 +02:00
|
|
|
} storage_source_ = MTL_STORAGE_BUF_TYPE_DEFAULT;
|
|
|
|
|
|
|
|
|
|
union {
|
2023-05-05 09:25:45 +10:00
|
|
|
/** Own allocation. */
|
2023-05-03 11:46:30 +02:00
|
|
|
gpu::MTLBuffer *metal_buffer_;
|
|
|
|
|
/* Wrapped type. */
|
|
|
|
|
MTLUniformBuf *uniform_buffer_;
|
|
|
|
|
MTLVertBuf *vertex_buffer_;
|
|
|
|
|
MTLIndexBuf *index_buffer_;
|
2023-12-11 23:00:20 +01:00
|
|
|
gpu::MTLTexture *texture_;
|
2023-05-03 11:46:30 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Whether buffer has contents, if false, no GPU buffer will
|
|
|
|
|
* have yet been allocated. */
|
|
|
|
|
bool has_data_ = false;
|
|
|
|
|
/** Bind-state tracking. */
|
|
|
|
|
int bind_slot_ = -1;
|
|
|
|
|
MTLContext *bound_ctx_ = nullptr;
|
|
|
|
|
|
|
|
|
|
/** Usage type. */
|
|
|
|
|
GPUUsageType usage_;
|
|
|
|
|
|
2023-10-20 17:04:36 +02:00
|
|
|
/* Synchronization event for host reads. */
|
|
|
|
|
id<MTLSharedEvent> gpu_write_fence_ = nil;
|
|
|
|
|
uint64_t host_read_signal_value_ = 0;
|
|
|
|
|
|
2023-05-03 11:46:30 +02:00
|
|
|
public:
|
|
|
|
|
MTLStorageBuf(size_t size, GPUUsageType usage, const char *name);
|
2024-11-01 20:23:18 +01:00
|
|
|
~MTLStorageBuf() override;
|
2023-05-03 11:46:30 +02:00
|
|
|
|
|
|
|
|
MTLStorageBuf(MTLUniformBuf *uniform_buf, size_t size);
|
2024-11-01 20:23:18 +01:00
|
|
|
MTLStorageBuf(MTLVertBuf *vert_buf, size_t size);
|
|
|
|
|
MTLStorageBuf(MTLIndexBuf *index_buf, size_t size);
|
2023-12-11 23:00:20 +01:00
|
|
|
MTLStorageBuf(MTLTexture *texture, size_t size);
|
2023-05-03 11:46:30 +02:00
|
|
|
|
2024-11-27 17:37:04 +01:00
|
|
|
/* Only used internally to create a bindable buffer for #Immediate. */
|
|
|
|
|
MTLStorageBuf(size_t size);
|
|
|
|
|
|
2023-05-03 11:46:30 +02:00
|
|
|
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;
|
2023-10-20 17:04:36 +02:00
|
|
|
void async_flush_to_host() override;
|
2024-04-04 11:26:00 +11:00
|
|
|
void sync_as_indirect_buffer() override{/* No-Op. */};
|
2023-05-03 11:46:30 +02:00
|
|
|
|
|
|
|
|
void init();
|
|
|
|
|
|
|
|
|
|
id<MTLBuffer> get_metal_buffer();
|
2023-05-25 08:50:14 +02:00
|
|
|
size_t get_size();
|
2023-05-03 11:46:30 +02:00
|
|
|
const char *get_name()
|
|
|
|
|
{
|
|
|
|
|
return name_;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
MEM_CXX_CLASS_ALLOC_FUNCS("MTLStorageBuf");
|
|
|
|
|
};
|
|
|
|
|
|
2024-11-01 20:23:18 +01:00
|
|
|
} // namespace blender::gpu
|