22#include <Cocoa/Cocoa.h>
23#include <Metal/Metal.h>
24#include <QuartzCore/QuartzCore.h>
27@class MTLCommandQueue;
28@class MTLRenderPipelineState;
63 return (
uint64_t)string_hasher(this->input_data_type + this->output_data_type +
64 std::to_string((this->component_count_input << 9) |
65 (this->component_count_output << 5) |
66 (this->is_clear ? 1 : 0)));
121 return uint64_t(string_hasher(this->input_data_type + this->output_data_type +
122 std::to_string((this->component_count_input << 8) +
123 this->component_count_output +
124 (this->depth_format_mode << 28))));
148 return (this->state == other.
state);
153 uint integer_representation = 0;
154 integer_representation |= this->state.
filtering;
155 integer_representation |= this->state.
extend_x << 8;
156 integer_representation |= this->state.
extend_yz << 12;
157 integer_representation |= this->state.
custom_type << 16;
158 integer_representation |= this->state.
type << 24;
159 return integer_representation;
164 uint64_t integer_representation = 0;
165 integer_representation |= this->state.
filtering;
166 integer_representation |= this->state.
extend_x << 8;
167 integer_representation |= this->state.
extend_yz << 12;
168 integer_representation |= this->state.
custom_type << 16;
169 integer_representation |= this->state.
type << 24;
170 return integer_representation;
185 MTL_TEXTURE_MODE_DEFAULT,
186 MTL_TEXTURE_MODE_EXTERNAL,
187 MTL_TEXTURE_MODE_VBO,
188 MTL_TEXTURE_MODE_TEXTURE_VIEW
194 bool is_baked_ =
false;
195 MTLTextureDescriptor *texture_descriptor_ =
nullptr;
196 id<MTLTexture> texture_ = nil;
199 size_t aligned_w_ = 0;
210 int tex_buffer_metadata_[4];
213 GPUFrameBuffer *blit_fb_ =
nullptr;
214 uint blit_fb_slice_ = 0;
215 uint blit_fb_mip_ = 0;
218 id<MTLTexture> texture_no_srgb_ = nil;
233 const GPUTexture *source_texture_ =
nullptr;
235 enum TextureViewDirtyState {
236 TEXTURE_VIEW_NOT_DIRTY = 0,
237 TEXTURE_VIEW_SWIZZLE_DIRTY = (1 << 0),
238 TEXTURE_VIEW_MIP_DIRTY = (1 << 1)
240 id<MTLTexture> mip_swizzle_view_ = nil;
241 char tex_swizzle_mask_[4];
242 MTLTextureSwizzleChannels mtl_swizzle_mask_;
243 bool mip_range_dirty_ =
false;
245 bool texture_view_stencil_ =
false;
246 int mip_texture_base_level_ = 0;
247 int mip_texture_max_level_ = 1000;
248 int mip_texture_base_layer_ = 0;
249 int texture_view_dirty_flags_ = TEXTURE_VIEW_NOT_DIRTY;
252 int mtl_max_mips_ = 1;
253 bool has_generated_mips_ =
false;
259 MTLVertBuf *vert_buffer_;
260 id<MTLBuffer> vert_buffer_mtl_;
272 id<MTLTexture> metal_texture);
276 int mip,
int offset[3],
int extent[3],
eGPUDataFormat type,
const void *
data)
override;
280 GPUPixelBuffer *pixbuf)
override;
285 void swizzle_set(
const char swizzle_mask[4])
override;
301 return (mtl_swizzle_mask_.red != MTLTextureSwizzleRed ||
302 mtl_swizzle_mask_.green != MTLTextureSwizzleGreen ||
303 mtl_swizzle_mask_.blue != MTLTextureSwizzleBlue ||
304 mtl_swizzle_mask_.alpha != MTLTextureSwizzleAlpha);
309 if (resource_mode_ == MTL_TEXTURE_MODE_VBO) {
310 return vert_buffer_mtl_;
319 return tex_buffer_metadata_;
328 bool use_stencil)
override;
332 void mtl_texture_init();
336 void prepare_internal();
343 void ensure_mipmaps(
int miplvl);
346 void add_subresource(
uint level);
348 void read_internal(
int mip,
356 int num_output_components,
357 size_t debug_data_size,
359 void bake_mip_swizzle_view();
361 id<MTLTexture> get_metal_handle();
362 id<MTLTexture> get_metal_handle_base();
363 id<MTLTexture> get_non_srgb_handle();
365 void blit(id<MTLBlitCommandEncoder> blit_encoder,
390 GPUFrameBuffer *get_blit_framebuffer(
int dst_slice,
uint dst_mip);
420 struct TextureUpdateParams {
424 uint unpack_row_length;
427 id<MTLComputePipelineState> texture_update_1d_get_kernel(
429 id<MTLComputePipelineState> texture_update_1d_array_get_kernel(
431 id<MTLComputePipelineState> texture_update_2d_get_kernel(
433 id<MTLComputePipelineState> texture_update_2d_array_get_kernel(
435 id<MTLComputePipelineState> texture_update_3d_get_kernel(
438 id<MTLComputePipelineState> mtl_texture_update_impl(
441 &specialization_cache,
451 void update_sub_depth_2d(
455 struct TextureReadParams {
461 id<MTLComputePipelineState> texture_read_1d_get_kernel(
463 id<MTLComputePipelineState> texture_read_1d_array_get_kernel(
465 id<MTLComputePipelineState> texture_read_2d_get_kernel(
467 id<MTLComputePipelineState> texture_read_2d_array_get_kernel(
469 id<MTLComputePipelineState> texture_read_3d_get_kernel(
472 id<MTLComputePipelineState> mtl_texture_read_impl(
475 &specialization_cache,
479 GPUShader *fullscreen_blit_sh_get();
481 MEM_CXX_CLASS_ALLOC_FUNCS(
"MTLTexture")
486 id<MTLBuffer> buffer_ = nil;
492 void *
map()
override;
493 void unmap()
override;
499 MEM_CXX_CLASS_ALLOC_FUNCS(
"MTLPixelBuffer")
565 return MTLTextureType1D;
567 return MTLTextureType2D;
569 return MTLTextureType3D;
571 return MTLTextureTypeCube;
573 return MTLTextureTypeTextureBuffer;
575 return MTLTextureType1DArray;
577 return MTLTextureType2DArray;
579 return MTLTextureTypeCubeArray;
583 return MTLTextureType2D;
591 case MTLPixelFormatRGBA8Unorm_sRGB:
592 case MTLPixelFormatBGRA8Unorm_sRGB:
593 case MTLPixelFormatDepth16Unorm:
594 case MTLPixelFormatDepth32Float:
595 case MTLPixelFormatDepth32Float_Stencil8:
596 case MTLPixelFormatBGR10A2Unorm:
597 case MTLPixelFormatDepth24Unorm_Stencil8:
610 case MTLPixelFormatRGBA8Unorm_sRGB:
611 return MTLPixelFormatRGBA8Unorm;
612 case MTLPixelFormatBGRA8Unorm_sRGB:
613 return MTLPixelFormatBGRA8Unorm;
614 case MTLPixelFormatDepth16Unorm:
615 return MTLPixelFormatR16Unorm;
616 case MTLPixelFormatDepth32Float:
617 return MTLPixelFormatR32Float;
618 case MTLPixelFormatDepth32Float_Stencil8:
622 return MTLPixelFormatInvalid;
623 case MTLPixelFormatBGR10A2Unorm:
627 return MTLPixelFormatInvalid;
628 case MTLPixelFormatDepth24Unorm_Stencil8:
632 return MTLPixelFormatInvalid;
641 MTLTextureUsage mtl_usage = MTLTextureUsageUnknown;
643 return MTLTextureUsageUnknown;
648 mtl_usage = mtl_usage | MTLTextureUsageShaderRead;
651 mtl_usage = mtl_usage | MTLTextureUsageShaderWrite;
654 mtl_usage = mtl_usage | MTLTextureUsageRenderTarget;
657 mtl_usage = mtl_usage | MTLTextureUsagePixelFormatView;
659#if defined(MAC_OS_VERSION_14_0)
660 if (@available(macOS 14.0, *)) {
662 mtl_usage = mtl_usage | MTLTextureUsageShaderAtomic;
672 if (mtl_usage == MTLTextureUsageUnknown) {
675 if (mtl_usage & MTLTextureUsageShaderRead) {
678 if (mtl_usage & MTLTextureUsageShaderWrite) {
681 if (mtl_usage & MTLTextureUsageRenderTarget) {
684 if (mtl_usage & MTLTextureUsagePixelFormatView) {
#define BLI_assert_unreachable()
@ GPU_DATA_2_10_10_10_REV
@ GPU_TEXTURE_USAGE_SHADER_READ
@ GPU_TEXTURE_USAGE_SHADER_WRITE
@ GPU_TEXTURE_USAGE_HOST_READ
@ GPU_TEXTURE_USAGE_ATTACHMENT
@ GPU_TEXTURE_USAGE_GENERAL
@ GPU_TEXTURE_USAGE_ATOMIC
@ GPU_TEXTURE_USAGE_FORMAT_VIEW
Read Guarded memory(de)allocation.
BMesh const char void * data
unsigned long long int uint64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
void reset()
clear internal cached data and reset random seed
GPUPixelBufferNativeHandle get_native_handle() override
id< MTLBuffer > get_metal_buffer()
size_t get_size() override
MTLPixelBuffer(size_t size)
bool has_custom_swizzle()
friend class MTLFrameBuffer
void copy_to(Texture *dst) override
friend class MTLStateManager
void update_sub(int mip, int offset[3], int extent[3], eGPUDataFormat type, const void *data) override
MTLTexture(const char *name)
void clear(eGPUDataFormat format, const void *data) override
friend class MTLStorageBuf
MTLStorageBuf * get_storagebuf()
void mip_range_set(int min, int max) override
const int * get_texture_metadata_ptr() const
void generate_mipmap() override
bool init_internal() override
void swizzle_set(const char swizzle_mask[4]) override
id< MTLBuffer > get_vertex_buffer() const
uint gl_bindcode_get() const override
char name_[DEBUG_NAME_LEN]
Texture(const char *name)
@ MTL_DEPTH_UPDATE_MODE_INT32
@ MTL_DEPTH_UPDATE_MODE_INT24
@ MTL_DEPTH_UPDATE_MODE_FLOAT
size_t get_mtl_format_bytesize(MTLPixelFormat tex_format)
MTLPixelFormat gpu_texture_format_to_metal(eGPUTextureFormat tex_format)
static const int MTL_MAX_FBO_ATTACHED
std::string tex_data_format_to_msl_type_str(eGPUDataFormat type)
bool mtl_format_is_writable(MTLPixelFormat format)
std::string tex_data_format_to_msl_texture_template_type(eGPUDataFormat type)
MTLPixelFormat mtl_format_get_writeable_view_format(MTLPixelFormat format)
int get_mtl_format_num_components(MTLPixelFormat tex_format)
static const int MTL_MAX_MIPMAP_COUNT
const MTLSamplerState DEFAULT_SAMPLER_STATE
MTLTextureUsage mtl_usage_from_gpu(eGPUTextureUsage usage)
MTLTextureType to_metal_type(eGPUTextureType type)
bool mtl_format_supports_blending(MTLPixelFormat format)
eGPUTextureUsage gpu_usage_from_mtl(MTLTextureUsage mtl_usage)
DepthTextureUpdateMode data_mode
bool operator==(const DepthTextureUpdateRoutineSpecialisation &other) const
GPUSamplerCustomType custom_type
GPUSamplerExtendMode extend_yz
static constexpr GPUSamplerState default_sampler()
GPUSamplerFiltering filtering
GPUSamplerExtendMode extend_x
std::string output_data_type
std::string input_data_type
int component_count_input
int component_count_output
bool operator==(const TextureReadRoutineSpecialisation &other) const
int component_count_output
int component_count_input
std::string input_data_type
std::string output_data_type
bool operator==(const TextureUpdateRoutineSpecialisation &other) const
bool operator==(const MTLSamplerState &other) const