Changeset View
Changeset View
Standalone View
Standalone View
source/blender/gpu/metal/mtl_context.mm
| Show All 29 Lines | |||||
| #include <string> | #include <string> | ||||
| using namespace blender; | using namespace blender; | ||||
| using namespace blender::gpu; | using namespace blender::gpu; | ||||
| namespace blender::gpu { | namespace blender::gpu { | ||||
| /* Global memory manager. */ | /* Global memory manager. */ | ||||
| MTLBufferPool MTLContext::global_memory_manager; | std::mutex MTLContext::global_memory_manager_reflock; | ||||
| int MTLContext::global_memory_manager_refcount = 0; | |||||
| MTLBufferPool *MTLContext::global_memory_manager = nullptr; | |||||
| /* Swap-chain and latency management. */ | /* Swap-chain and latency management. */ | ||||
| std::atomic<int> MTLContext::max_drawables_in_flight = 0; | std::atomic<int> MTLContext::max_drawables_in_flight = 0; | ||||
| std::atomic<int64_t> MTLContext::avg_drawable_latency_us = 0; | std::atomic<int64_t> MTLContext::avg_drawable_latency_us = 0; | ||||
| int64_t MTLContext::frame_latency[MTL_FRAME_AVERAGE_COUNT] = {0}; | int64_t MTLContext::frame_latency[MTL_FRAME_AVERAGE_COUNT] = {0}; | ||||
| /* -------------------------------------------------------------------- */ | /* -------------------------------------------------------------------- */ | ||||
| /** \name GHOST Context interaction. | /** \name GHOST Context interaction. | ||||
| ▲ Show 20 Lines • Show All 155 Lines • ▼ Show 20 Lines | MTLContext::MTLContext(void *ghost_window, void *ghost_context) | ||||
| MTLBackend::capabilities_init(this); | MTLBackend::capabilities_init(this); | ||||
| /* Initialize Metal modules. */ | /* Initialize Metal modules. */ | ||||
| this->memory_manager.init(); | this->memory_manager.init(); | ||||
| this->state_manager = new MTLStateManager(this); | this->state_manager = new MTLStateManager(this); | ||||
| this->imm = new MTLImmediate(this); | this->imm = new MTLImmediate(this); | ||||
| /* Ensure global memory manager is initialized. */ | /* Ensure global memory manager is initialized. */ | ||||
| MTLContext::global_memory_manager.init(this->device); | MTLContext::global_memory_manager_acquire_ref(); | ||||
| MTLContext::get_global_memory_manager()->init(this->device); | |||||
| /* Initialize texture read/update structures. */ | /* Initialize texture read/update structures. */ | ||||
| this->get_texture_utils().init(); | this->get_texture_utils().init(); | ||||
| /* Bound Samplers struct. */ | /* Bound Samplers struct. */ | ||||
| for (int i = 0; i < MTL_MAX_TEXTURE_SLOTS; i++) { | for (int i = 0; i < MTL_MAX_TEXTURE_SLOTS; i++) { | ||||
| samplers_.mtl_sampler[i] = nil; | samplers_.mtl_sampler[i] = nil; | ||||
| samplers_.mtl_sampler_flags[i] = DEFAULT_SAMPLER_STATE; | samplers_.mtl_sampler_flags[i] = DEFAULT_SAMPLER_STATE; | ||||
| Show All 15 Lines | if (MTLBackend::get()->is_inside_render_boundary()) { | ||||
| this->finish(); | this->finish(); | ||||
| /* End frame. */ | /* End frame. */ | ||||
| if (this->get_inside_frame()) { | if (this->get_inside_frame()) { | ||||
| this->end_frame(); | this->end_frame(); | ||||
| } | } | ||||
| } | } | ||||
| /* Release context textures. */ | |||||
| if (default_fbo_gputexture_) { | |||||
| GPU_texture_free(wrap(static_cast<Texture *>(default_fbo_gputexture_))); | |||||
| default_fbo_gputexture_ = nullptr; | |||||
| } | |||||
| if (default_fbo_mtltexture_) { | |||||
| [default_fbo_mtltexture_ release]; | |||||
| default_fbo_mtltexture_ = nil; | |||||
| } | |||||
| /* Release Memory Manager */ | /* Release Memory Manager */ | ||||
| this->get_scratchbuffer_manager().free(); | this->get_scratchbuffer_manager().free(); | ||||
| /* Release update/blit shaders. */ | /* Release update/blit shaders. */ | ||||
| this->get_texture_utils().cleanup(); | this->get_texture_utils().cleanup(); | ||||
| /* Detach resource references */ | /* Detach resource references */ | ||||
| GPU_texture_unbind_all(); | GPU_texture_unbind_all(); | ||||
| Show All 28 Lines | MTLContext::~MTLContext() | ||||
| /* Free null buffers. */ | /* Free null buffers. */ | ||||
| if (null_buffer_) { | if (null_buffer_) { | ||||
| [null_buffer_ release]; | [null_buffer_ release]; | ||||
| } | } | ||||
| if (null_attribute_buffer_) { | if (null_attribute_buffer_) { | ||||
| [null_attribute_buffer_ release]; | [null_attribute_buffer_ release]; | ||||
| } | } | ||||
| /* Release memory manager reference. */ | |||||
| MTLContext::global_memory_manager_release_ref(); | |||||
| /* Free Metal objects. */ | /* Free Metal objects. */ | ||||
| if (this->queue) { | if (this->queue) { | ||||
| [this->queue release]; | [this->queue release]; | ||||
| } | } | ||||
| if (this->device) { | if (this->device) { | ||||
| [this->device release]; | [this->device release]; | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 992 Lines • ▼ Show 20 Lines | #endif | ||||
| int size = [argument_encoder encodedLength]; | int size = [argument_encoder encodedLength]; | ||||
| int alignment = max_uu([argument_encoder alignment], 256); | int alignment = max_uu([argument_encoder alignment], 256); | ||||
| int size_align_delta = (size % alignment); | int size_align_delta = (size % alignment); | ||||
| int aligned_alloc_size = ((alignment > 1) && (size_align_delta > 0)) ? | int aligned_alloc_size = ((alignment > 1) && (size_align_delta > 0)) ? | ||||
| size + (alignment - (size % alignment)) : | size + (alignment - (size % alignment)) : | ||||
| size; | size; | ||||
| /* Allocate buffer to store encoded sampler arguments. */ | /* Allocate buffer to store encoded sampler arguments. */ | ||||
| encoder_buffer = MTLContext::get_global_memory_manager().allocate(aligned_alloc_size, | encoder_buffer = MTLContext::get_global_memory_manager()->allocate(aligned_alloc_size, | ||||
| true); | true); | ||||
| BLI_assert(encoder_buffer); | BLI_assert(encoder_buffer); | ||||
| BLI_assert(encoder_buffer->get_metal_buffer()); | BLI_assert(encoder_buffer->get_metal_buffer()); | ||||
| [argument_encoder setArgumentBuffer:encoder_buffer->get_metal_buffer() offset:0]; | [argument_encoder setArgumentBuffer:encoder_buffer->get_metal_buffer() offset:0]; | ||||
| [argument_encoder | [argument_encoder | ||||
| setSamplerStates:this->samplers_.mtl_sampler | setSamplerStates:this->samplers_.mtl_sampler | ||||
| withRange:NSMakeRange(0, shader_interface->get_max_texture_index() + 1)]; | withRange:NSMakeRange(0, shader_interface->get_max_texture_index() + 1)]; | ||||
| encoder_buffer->flush(); | encoder_buffer->flush(); | ||||
| ▲ Show 20 Lines • Show All 378 Lines • ▼ Show 20 Lines | void present(MTLRenderPassDescriptor *blit_descriptor, | ||||
| [enc endEncoding]; | [enc endEncoding]; | ||||
| /* Present drawable. */ | /* Present drawable. */ | ||||
| BLI_assert(drawable); | BLI_assert(drawable); | ||||
| [cmdbuf presentDrawable:drawable]; | [cmdbuf presentDrawable:drawable]; | ||||
| /* Ensure freed buffers have usage tracked against active CommandBuffer submissions. */ | /* Ensure freed buffers have usage tracked against active CommandBuffer submissions. */ | ||||
| MTLSafeFreeList *cmd_free_buffer_list = | MTLSafeFreeList *cmd_free_buffer_list = | ||||
| MTLContext::get_global_memory_manager().get_current_safe_list(); | MTLContext::get_global_memory_manager()->get_current_safe_list(); | ||||
| BLI_assert(cmd_free_buffer_list); | BLI_assert(cmd_free_buffer_list); | ||||
| id<MTLCommandBuffer> cmd_buffer_ref = cmdbuf; | id<MTLCommandBuffer> cmd_buffer_ref = cmdbuf; | ||||
| [cmd_buffer_ref retain]; | [cmd_buffer_ref retain]; | ||||
| /* Increment drawables in flight limiter. */ | /* Increment drawables in flight limiter. */ | ||||
| MTLContext::max_drawables_in_flight++; | MTLContext::max_drawables_in_flight++; | ||||
| std::chrono::time_point submission_time = std::chrono::high_resolution_clock::now(); | std::chrono::time_point submission_time = std::chrono::high_resolution_clock::now(); | ||||
| ▲ Show 20 Lines • Show All 74 Lines • Show Last 20 Lines | |||||