diff --git a/src/video_core/renderer_metal/mtl_buffer_cache.cpp b/src/video_core/renderer_metal/mtl_buffer_cache.cpp index dfde651144..59e872a5df 100644 --- a/src/video_core/renderer_metal/mtl_buffer_cache.cpp +++ b/src/video_core/renderer_metal/mtl_buffer_cache.cpp @@ -81,10 +81,11 @@ void BufferCacheRuntime::Finish() {} void BufferCacheRuntime::CopyBuffer(MTL::Buffer* dst_buffer, MTL::Buffer* src_buffer, std::span copies, bool barrier, bool can_reorder_upload) { - for (const VideoCommon::BufferCopy& copy : copies) { - command_recorder.GetBlitCommandEncoder()->copyFromBuffer( - src_buffer, copy.src_offset, dst_buffer, copy.dst_offset, copy.size); - } + // HACK: needs to be commented out, since it iterrupts render pass + // for (const VideoCommon::BufferCopy& copy : copies) { + // command_recorder.GetBlitCommandEncoder()->copyFromBuffer( + // src_buffer, copy.src_offset, dst_buffer, copy.dst_offset, copy.size); + // } } void BufferCacheRuntime::ClearBuffer(MTL::Buffer* dest_buffer, u32 offset, size_t size, u32 value) { diff --git a/src/video_core/renderer_metal/mtl_command_recorder.cpp b/src/video_core/renderer_metal/mtl_command_recorder.cpp index 73d8df3a14..6f09567138 100644 --- a/src/video_core/renderer_metal/mtl_command_recorder.cpp +++ b/src/video_core/renderer_metal/mtl_command_recorder.cpp @@ -4,18 +4,16 @@ #include "video_core/renderer_metal/mtl_command_recorder.h" #include "video_core/renderer_metal/mtl_device.h" -#include - namespace Metal { CommandRecorder::CommandRecorder(const Device& device_) : device(device_) {} CommandRecorder::~CommandRecorder() = default; -void CommandRecorder::BeginRenderPass(MTL::RenderPassDescriptor* render_pass_descriptor) { +void CommandRecorder::BeginRenderPass(MTL::RenderPassDescriptor* render_pass) { RequireCommandBuffer(); EndEncoding(); - encoder = command_buffer->renderCommandEncoder(render_pass_descriptor); + encoder = command_buffer->renderCommandEncoder(render_pass); encoder_type = EncoderType::Render; } @@ -41,7 +39,7 @@ void CommandRecorder::EndEncoding() { if (encoder) { encoder->endEncoding(); //[encoder release]; - encoder = nil; + encoder = nullptr; } } @@ -55,7 +53,7 @@ void CommandRecorder::Submit() { EndEncoding(); command_buffer->commit(); //[command_buffer release]; - command_buffer = nil; + command_buffer = nullptr; } } diff --git a/src/video_core/renderer_metal/mtl_command_recorder.h b/src/video_core/renderer_metal/mtl_command_recorder.h index 2cb503355e..705874a31a 100644 --- a/src/video_core/renderer_metal/mtl_command_recorder.h +++ b/src/video_core/renderer_metal/mtl_command_recorder.h @@ -17,7 +17,7 @@ public: CommandRecorder(const Device& device_); ~CommandRecorder(); - void BeginRenderPass(MTL::RenderPassDescriptor* render_pass_descriptor); + void BeginRenderPass(MTL::RenderPassDescriptor* render_pass); void CheckIfRenderPassIsActive() { if (!encoder || encoder_type != EncoderType::Render) { diff --git a/src/video_core/renderer_metal/mtl_graphics_pipeline.h b/src/video_core/renderer_metal/mtl_graphics_pipeline.h index d614995fea..ff9548eaee 100644 --- a/src/video_core/renderer_metal/mtl_graphics_pipeline.h +++ b/src/video_core/renderer_metal/mtl_graphics_pipeline.h @@ -103,6 +103,10 @@ public: gpu_memory = gpu_memory_; } + MTL::RenderPipelineState* GetPipelineState() const noexcept { + return pipeline_state; + } + private: template void ConfigureImpl(bool is_indexed); diff --git a/src/video_core/renderer_metal/mtl_pipeline_cache.cpp b/src/video_core/renderer_metal/mtl_pipeline_cache.cpp index 08fe66ce61..f65332b26c 100644 --- a/src/video_core/renderer_metal/mtl_pipeline_cache.cpp +++ b/src/video_core/renderer_metal/mtl_pipeline_cache.cpp @@ -157,6 +157,7 @@ GraphicsPipeline* PipelineCache::CurrentGraphicsPipeline() { return BuiltPipeline(current_pipeline); } } + return CurrentGraphicsPipelineSlowPath(); } @@ -263,7 +264,7 @@ std::unique_ptr PipelineCache::CreateGraphicsPipeline( library->newFunction(NS::String::string("fragmentMain", NS::ASCIIStringEncoding)); // HACK: dummy info - std::array infos; + std::array infos = {nullptr}; infos[0] = new Shader::Info{}; infos[1] = new Shader::Info{}; diff --git a/src/video_core/renderer_metal/mtl_rasterizer.cpp b/src/video_core/renderer_metal/mtl_rasterizer.cpp index c65fb75ed4..29e8ce3f6f 100644 --- a/src/video_core/renderer_metal/mtl_rasterizer.cpp +++ b/src/video_core/renderer_metal/mtl_rasterizer.cpp @@ -41,6 +41,24 @@ RasterizerMetal::RasterizerMetal(Tegra::GPU& gpu_, RasterizerMetal::~RasterizerMetal() = default; void RasterizerMetal::Draw(bool is_indexed, u32 instance_count) { + LOG_DEBUG(Render_Metal, "called"); + + // Bind the current graphics pipeline + GraphicsPipeline* const pipeline{pipeline_cache.CurrentGraphicsPipeline()}; + if (!pipeline) { + return; + } + command_recorder.GetRenderCommandEncoder()->setRenderPipelineState( + pipeline->GetPipelineState()); + + // HACK: test is buffers are being correctly created + buffer_cache.UpdateGraphicsBuffers(is_indexed); + buffer_cache.BindHostGeometryBuffers(is_indexed); + + // HACK: dummy draw call + command_recorder.GetRenderCommandEncoder()->drawPrimitives(MTL::PrimitiveTypeTriangle, + NS::UInteger(0), NS::UInteger(3)); + // TODO: uncomment // command_recorder.CheckIfRenderPassIsActive(); // const auto& draw_state = maxwell3d->draw_manager->GetDrawState(); @@ -62,10 +80,6 @@ void RasterizerMetal::Draw(bool is_indexed, u32 instance_count) { // cmdbuf.Draw(draw_params.num_vertices, draw_params.num_instances, // draw_params.base_vertex, draw_params.base_instance); } - - // HACK: test is buffers are being correctly created - buffer_cache.UpdateGraphicsBuffers(is_indexed); - buffer_cache.BindHostGeometryBuffers(is_indexed); } void RasterizerMetal::DrawTexture() { @@ -246,6 +260,7 @@ void RasterizerMetal::InitializeChannel(Tegra::Control::ChannelState& channel) { CreateChannel(channel); buffer_cache.CreateChannel(channel); texture_cache.CreateChannel(channel); + pipeline_cache.CreateChannel(channel); } void RasterizerMetal::BindChannel(Tegra::Control::ChannelState& channel) { @@ -254,6 +269,7 @@ void RasterizerMetal::BindChannel(Tegra::Control::ChannelState& channel) { BindToChannel(channel.bind_id); buffer_cache.BindToChannel(channel.bind_id); texture_cache.BindToChannel(channel.bind_id); + pipeline_cache.BindToChannel(channel.bind_id); } void RasterizerMetal::ReleaseChannel(s32 channel_id) { @@ -262,6 +278,7 @@ void RasterizerMetal::ReleaseChannel(s32 channel_id) { EraseChannel(channel_id); buffer_cache.EraseChannel(channel_id); texture_cache.EraseChannel(channel_id); + pipeline_cache.EraseChannel(channel_id); } } // namespace Metal