Skip to content

Commit 2d77eb8

Browse files
committed
ImGui still mad but progress
1 parent 0c78a87 commit 2d77eb8

File tree

9 files changed

+93
-32
lines changed

9 files changed

+93
-32
lines changed

core/rend/metal/metal_buffer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2024 flyinghead
2+
Copyright 2024 flyinghead
33
44
This file is part of Flycast.
55

core/rend/metal/metal_buffer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2024 flyinghead
2+
Copyright 2024 flyinghead
33
44
This file is part of Flycast.
55

core/rend/metal/metal_context.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ bool MetalContext::init() {
4848
return false;
4949
}
5050

51+
layer->setDevice(device);
52+
queue = device->newCommandQueue();
53+
commandBuffer = queue->commandBuffer();
54+
5155
NOTICE_LOG(RENDERER, "Created Metal view.");
5256

5357
imguiDriver = std::unique_ptr<ImGuiDriver>(new MetalDriver());

core/rend/metal/metal_context.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ class MetalContext : public GraphicsContext
3232
void term() override;
3333

3434
MTL::Device* GetDevice() const { return device; }
35+
CA::MetalLayer* GetLayer() const { return layer; }
36+
MTL::CommandQueue* GetQueue() const { return queue; }
37+
MTL::CommandBuffer *commandBuffer = nullptr;
3538
void resize() override;
3639
void Present();
3740

@@ -54,6 +57,7 @@ class MetalContext : public GraphicsContext
5457
static MetalContext* Instance() { return contextInstance; }
5558
private:
5659
MTL::Device* device = MTL::CreateSystemDefaultDevice();
60+
MTL::CommandQueue *queue = nullptr;
5761
CA::MetalLayer* layer;
5862
static MetalContext* contextInstance;
5963
};

core/rend/metal/metal_driver.h

Lines changed: 54 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,57 @@
2222
#include "metal_context.h"
2323
#include <unordered_map>
2424

25+
#include "metal_texture.h"
26+
2527
class MetalDriver final : public ImGuiDriver {
2628
public:
29+
MetalDriver() {
30+
ImGui_ImplMetal_Init(MetalContext::Instance()->GetDevice());
31+
}
32+
2733
void reset() override
2834
{
2935
ImGuiDriver::reset();
3036
ImGui_ImplMetal_Shutdown();
3137
}
3238

3339
void newFrame() override {
40+
MetalContext *context = MetalContext::Instance();
41+
drawable = context->GetLayer()->nextDrawable();
42+
43+
MTL::RenderPassDescriptor *descriptor = MTL::RenderPassDescriptor::alloc()->init();
44+
45+
descriptor->setDefaultRasterSampleCount(1);
46+
47+
auto color = descriptor->colorAttachments()->object(0);
48+
color->setClearColor(MTL::ClearColor(0.f, 0.f, 0.f, 1.f));
49+
color->setTexture(drawable->texture());
50+
color->setLoadAction(MTL::LoadActionClear);
51+
color->setStoreAction(MTL::StoreActionStore);
52+
53+
commandEncoder = context->commandBuffer->renderCommandEncoder(descriptor);
54+
55+
ImGui_ImplMetal_NewFrame(descriptor);
3456

57+
// descriptor->release();
3558
}
3659

3760
void renderDrawData(ImDrawData *drawData, bool gui_open) override {
61+
MetalContext *context = MetalContext::Instance();
62+
MTL::CommandBuffer *buffer = context->commandBuffer;
63+
64+
ImGui_ImplMetal_RenderDrawData(drawData, buffer, commandEncoder);
65+
66+
commandEncoder->endEncoding();
67+
buffer->presentDrawable(drawable);
68+
buffer->commit();
69+
70+
buffer->release();
71+
commandEncoder->release();
72+
commandEncoder = nullptr;
73+
74+
context->commandBuffer = context->GetQueue()->commandBuffer();
75+
3876
if (gui_open)
3977
frameRendered = true;
4078
}
@@ -49,36 +87,38 @@ class MetalDriver final : public ImGuiDriver {
4987
auto it = textures.find(name);
5088
if (it != textures.end())
5189
return &it->second.texture;
52-
else
53-
return ImTextureID{};
90+
91+
return ImTextureID{};
5492
}
5593

5694
ImTextureID updateTexture(const std::string &name, const u8 *data, int width, int height, bool nearestSampling) override {
57-
Texture& texture = textures[name];
58-
texture.texture->setPurgeableState(MTL::PurgeableStateEmpty);
95+
Texture texture(std::make_unique<MetalTexture>());
96+
texture.texture->tex_type = TextureType::_8888;
97+
texture.texture->UploadToGPU(width, height, data, false);
5998

60-
MTL::TextureDescriptor *desc = MTL::TextureDescriptor::alloc()->init();
61-
desc->setWidth(width);
62-
desc->setHeight(height);
99+
ImTextureID textureID = texture.texture->texture;
63100

64-
MTL::Region region = MTL::Region { 0, 0, static_cast<NS::UInteger>(width), static_cast<NS::UInteger>(height) };
65-
texture.texture = MetalContext::Instance()->GetDevice()->newTexture(desc);
66-
texture.texture->replaceRegion(region, 0, data, width * 4);
101+
textures[name] = std::move(texture);
67102

68-
return texture.texture;
103+
return textureID;
69104
}
70105

71106
void deleteTexture(const std::string &name) override {
72107
auto it = textures.find(name);
73-
it->second.texture->setPurgeableState(MTL::PurgeableStateEmpty);
108+
it->second.texture->texture->setPurgeableState(MTL::PurgeableStateEmpty);
74109
textures.erase(name);
75110
}
76111

77112
private:
78113
struct Texture {
79-
MTL::Texture *texture;
114+
Texture() = default;
115+
Texture(std::unique_ptr<MetalTexture>&& texture) : texture(std::move(texture)) {}
116+
117+
std::unique_ptr<MetalTexture> texture;
80118
};
81119

82120
bool frameRendered = false;
121+
MTL::RenderCommandEncoder *commandEncoder;
122+
CA::MetalDrawable *drawable;
83123
std::unordered_map<std::string, Texture> textures;
84-
};
124+
};

core/rend/metal/metal_renderer.cpp

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,6 @@ bool MetalRenderer::Init()
3636
shaders = MetalShaders();
3737
samplers = MetalSamplers();
3838

39-
queue = MetalContext::Instance()->GetDevice()->newCommandQueue();
40-
commandBuffer = queue->commandBuffer();
41-
4239
frameRendered = false;
4340

4441
return true;
@@ -75,11 +72,18 @@ bool MetalRenderer::Render() {
7572
}
7673

7774
Draw(fogTexture.get(), paletteTexture.get());
78-
if (config::EmulateFramebuffer || pvrrc.isRTT)
79-
// delay ending the render pass in case of multi render
80-
EndRenderPass();
75+
// if (config::EmulateFramebuffer || pvrrc.isRTT)
76+
// // delay ending the render pass in case of multi render
77+
// EndRenderPass();
8178

82-
return !pvrrc.isRTT;
79+
return true;
80+
}
81+
82+
void MetalRenderer::EndRenderPass() {
83+
if (!renderPassStarted)
84+
return;
85+
86+
frameRendered = true;
8387
}
8488

8589
void MetalRenderer::RenderFramebuffer(const FramebufferInfo &info) {
@@ -350,8 +354,9 @@ bool MetalRenderer::Draw(const MetalTexture *fogTexture, const MetalTexture *pal
350354

351355
currentScissor = MTL::ScissorRect {};
352356

357+
MTL::CommandBuffer *buffer = MetalContext::Instance()->commandBuffer;
353358
MTL::RenderPassDescriptor *descriptor = MTL::RenderPassDescriptor::alloc()->init();
354-
MTL::RenderCommandEncoder *encoder = commandBuffer->renderCommandEncoder(descriptor);
359+
MTL::RenderCommandEncoder *encoder = buffer->renderCommandEncoder(descriptor);
355360

356361
// Upload vertex and index buffers
357362
VertexShaderUniforms vtxUniforms;
@@ -385,6 +390,16 @@ bool MetalRenderer::Draw(const MetalTexture *fogTexture, const MetalTexture *pal
385390
}
386391
}
387392

393+
encoder->endEncoding();
394+
buffer->presentDrawable(MetalContext::Instance()->GetLayer()->nextDrawable());
395+
buffer->commit();
396+
397+
buffer->release();
398+
encoder->release();
399+
400+
DEBUG_LOG(RENDERER, "Render command buffer released");
401+
402+
MetalContext::Instance()->commandBuffer = MetalContext::Instance()->GetQueue()->commandBuffer();
388403
return !pvrrc.isRTT;
389404
}
390405

core/rend/metal/metal_renderer.h

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,7 @@ class MetalRenderer final : public Renderer
4343
void DrawList(MTL::RenderCommandEncoder *encoder, u32 listType, bool sortTriangles, const std::vector<PolyParam>& polys, u32 first, u32 last);
4444
void DrawModVols(MTL::RenderCommandEncoder *encoder, int first, int count);
4545
void UploadMainBuffer(const VertexShaderUniforms& vertexUniforms, const FragmentShaderUniforms& fragmentUniforms);
46-
47-
virtual void EndRenderPass() {
48-
renderPassStarted = false;
49-
}
46+
void EndRenderPass();
5047

5148
protected:
5249
TileClipping SetTileClip(MTL::RenderCommandEncoder *encoder, u32 val, MTL::ScissorRect& clipRect);
@@ -121,8 +118,6 @@ class MetalRenderer final : public Renderer
121118
u64 lightsOffset = 0;
122119
} offsets;
123120

124-
MTL::CommandQueue *queue = nullptr;
125-
MTL::CommandBuffer *commandBuffer = nullptr;
126121
bool renderPassStarted = false;
127122

128123
MTL::ScissorRect baseScissor {};

core/rend/metal/metal_texture.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2024 flyinghead
2+
Copyright 2024 flyinghead
33
44
This file is part of Flycast.
55
@@ -63,6 +63,8 @@ void MetalTexture::UploadToGPU(int width, int height, const u8 *temp_tex_buffer,
6363
desc->setHeight(height);
6464
desc->setPixelFormat(format);
6565
desc->setMipmapLevelCount(mipmapLevels);
66+
desc->setStorageMode(MTL::StorageModeShared);
67+
desc->setUsage(MTL::TextureUsageUnknown);
6668

6769
auto device = MetalContext::Instance()->GetDevice();
6870

@@ -77,6 +79,7 @@ bool MetalTexture::Delete()
7779
{
7880
texture->setPurgeableState(MTL::PurgeableStateEmpty);
7981
texture->release();
82+
texture = nullptr;
8083

8184
return true;
8285
}

core/rend/metal/metal_texture.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2024 flyinghead
2+
Copyright 2024 flyinghead
33
44
This file is part of Flycast.
55

0 commit comments

Comments
 (0)