miroir de https://git.suyu.dev/suyu/suyu.git
69 lignes
1.8 KiB
C++
69 lignes
1.8 KiB
C++
// SPDX-FileCopyrightText: Copyright 2024 suyu Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#include "video_core/renderer_metal/mtl_command_recorder.h"
|
|
#include "video_core/renderer_metal/mtl_device.h"
|
|
|
|
#include <iostream>
|
|
|
|
namespace Metal {
|
|
|
|
CommandRecorder::CommandRecorder(const Device& device_) : device(device_) {}
|
|
|
|
CommandRecorder::~CommandRecorder() = default;
|
|
|
|
void CommandRecorder::BeginRenderPass(MTL::RenderPassDescriptor* render_pass_descriptor) {
|
|
RequireCommandBuffer();
|
|
EndEncoding();
|
|
encoder = command_buffer->renderCommandEncoder(render_pass_descriptor);
|
|
encoder_type = EncoderType::Render;
|
|
}
|
|
|
|
void CommandRecorder::RequireComputeEncoder() {
|
|
RequireCommandBuffer();
|
|
if (!encoder || encoder_type != EncoderType::Compute) {
|
|
EndEncoding();
|
|
encoder = command_buffer->computeCommandEncoder();
|
|
encoder_type = EncoderType::Compute;
|
|
}
|
|
}
|
|
|
|
void CommandRecorder::RequireBlitEncoder() {
|
|
RequireCommandBuffer();
|
|
if (!encoder || encoder_type != EncoderType::Blit) {
|
|
EndEncoding();
|
|
encoder = command_buffer->blitCommandEncoder();
|
|
encoder_type = EncoderType::Blit;
|
|
}
|
|
}
|
|
|
|
void CommandRecorder::EndEncoding() {
|
|
if (encoder) {
|
|
encoder->endEncoding();
|
|
//[encoder release];
|
|
encoder = nil;
|
|
}
|
|
}
|
|
|
|
void CommandRecorder::Present(CA::MetalDrawable* drawable) {
|
|
EndEncoding();
|
|
command_buffer->presentDrawable(drawable);
|
|
}
|
|
|
|
void CommandRecorder::Submit() {
|
|
if (command_buffer) {
|
|
EndEncoding();
|
|
command_buffer->commit();
|
|
//[command_buffer release];
|
|
command_buffer = nil;
|
|
}
|
|
}
|
|
|
|
void CommandRecorder::RequireCommandBuffer() {
|
|
if (!command_buffer) {
|
|
command_buffer = device.GetCommandQueue()->commandBuffer();
|
|
}
|
|
}
|
|
|
|
} // namespace Metal
|