1#include "gfx/nvn/seadDebugFontMgrNvn.h"
2#include "filedevice/seadFileDevice.h"
3#include "filedevice/seadFileDeviceMgr.h"
4#include "gfx/nin/seadGraphicsNvn.h"
5#include "gfx/seadGraphics.h"
6#include "nn/os.h"
7#include "nvn/nvn.h"
8#include "nvn/nvn_FuncPtrInline.h"
9
10namespace sead
11{
12SEAD_SINGLETON_DISPOSER_IMPL(DebugFontMgrJis1Nvn)
13DebugFontMgrJis1Nvn::~DebugFontMgrJis1Nvn() = default;
14
15DebugFontMgrJis1Nvn::DebugFontMgrJis1Nvn() = default;
16
17void DebugFontMgrJis1Nvn::initialize(Heap* heap, const char* shader_path, const char* font_path,
18 const char* table_path, u32 unk)
19{
20 FileDevice::LoadArg load_arg = {};
21 load_arg.heap = heap;
22
23 load_arg.path = table_path;
24 void* table_binary = FileDeviceMgr::instance()->tryLoad(arg&: load_arg);
25
26 load_arg.path = font_path;
27 load_arg.alignment = 0x1000;
28 load_arg.buffer_size_alignment = 0x1000;
29 void* font_binary = FileDeviceMgr::instance()->tryLoad(arg&: load_arg);
30 u32 font_size = load_arg.read_size;
31
32 load_arg.path = shader_path;
33 void* shader_binary = FileDeviceMgr::instance()->tryLoad(arg&: load_arg);
34 u32 shader_size = load_arg.read_size;
35
36 initializeFromBinary(heap, shader_binary, shader_size, font_binary, font_size, table_binary,
37 unk3: unk);
38}
39
40// SMO
41// NON_MATCHING: Stack
42void DebugFontMgrJis1Nvn::initializeFromBinary(Heap* heap, void* shader_binary, u64 shader_size,
43 void* font_binary, u64 font_size,
44 const void* table_binary, u32 unk3)
45{
46 struct ShaderBinaryHeader
47 {
48 u32 offset1;
49 u32 offset2;
50 u32 shaderDataOffset;
51 u32 offset4;
52 };
53
54 mFileData = table_binary;
55 mBuffer1Size = unk3;
56
57 NVNdevice* device = static_cast<GraphicsNvn*>(sead::Graphics::instance())->getNvnDevice();
58
59 nvnProgramInitialize(program: &mNvnProgram, device);
60
61 NVNmemoryPoolBuilder poolBuilder;
62 nvnMemoryPoolBuilderSetDefaults(builder: &poolBuilder);
63 nvnMemoryPoolBuilderSetDevice(builder: &poolBuilder, device);
64 nvnMemoryPoolBuilderSetFlags(builder: &poolBuilder, flags: NVN_MEMORY_POOL_FLAGS_CPU_UNCACHED |
65 NVN_MEMORY_POOL_FLAGS_GPU_CACHED |
66 NVN_MEMORY_POOL_FLAGS_SHADER_CODE);
67
68 size_t paddedShaderSize = (shader_size + 0xFFF) & ~0xFFF;
69
70 nvnMemoryPoolBuilderSetStorage(builder: &poolBuilder, memory: shader_binary, size: paddedShaderSize);
71 nvnMemoryPoolInitialize(pool: &mPool2, builder: &poolBuilder);
72
73 NVNbufferBuilder bufferBuilder;
74 nvnBufferBuilderSetDevice(builder: &bufferBuilder, device);
75 nvnBufferBuilderSetDefaults(builder: &bufferBuilder);
76 nvnBufferBuilderSetStorage(builder: &bufferBuilder, pool: &mPool2, offset: 0, size: paddedShaderSize);
77 nvnBufferInitialize(buffer: &mBuffer1, builder: &bufferBuilder);
78
79 NVNbufferAddress bufferAddress = nvnBufferGetAddress(buffer: &mBuffer1);
80
81 ShaderBinaryHeader* header = reinterpret_cast<ShaderBinaryHeader*>(shader_binary);
82 NVNshaderData data[2]{
83 {.data: bufferAddress + header->shaderDataOffset,
84 .control: reinterpret_cast<void*>(uintptr_t(shader_binary) + ptrdiff_t(header->offset1))},
85 {.data: bufferAddress + header->offset4,
86 .control: reinterpret_cast<void*>(uintptr_t(shader_binary) + ptrdiff_t(header->offset2))}};
87 nvnProgramSetShaders(program: &mNvnProgram, count: sizeof(data) / sizeof(NVNshaderData), stageData: data);
88 static size_t sPaddedBuffer1Size = (size_t(mBuffer1Size + 0x200) + 0xFFF) & ~0xFFF;
89
90 nvnMemoryPoolBuilderSetDefaults(builder: &poolBuilder);
91 nvnMemoryPoolBuilderSetDevice(builder: &poolBuilder, device);
92 nvnMemoryPoolBuilderSetFlags(builder: &poolBuilder, flags: NVN_MEMORY_POOL_FLAGS_CPU_UNCACHED |
93 NVN_MEMORY_POOL_FLAGS_GPU_CACHED);
94 void* storage = new (heap) char[sPaddedBuffer1Size];
95 nvnMemoryPoolBuilderSetStorage(builder: &poolBuilder, memory: storage, size: sPaddedBuffer1Size);
96 nvnMemoryPoolInitialize(pool: &mPool3, builder: &poolBuilder);
97
98 nvnBufferBuilderSetDefaults(builder: &bufferBuilder);
99 nvnBufferBuilderSetDevice(builder: &bufferBuilder, device);
100 nvnBufferBuilderSetStorage(builder: &bufferBuilder, pool: &mPool3, offset: 0, size: mBuffer1Size);
101 nvnBufferInitialize(buffer: &mBuffer2, builder: &bufferBuilder);
102 mBuffer2Map = nvnBufferMap(buffer: &mBuffer2);
103
104 NVNtextureBuilder texBuilder;
105 nvnTextureBuilderSetDefaults(builder: &texBuilder);
106 nvnTextureBuilderSetDevice(builder: &texBuilder, device);
107 nvnTextureBuilderSetTarget(builder: &texBuilder, target: NVN_TEXTURE_TARGET_2D);
108 nvnTextureBuilderSetFormat(builder: &texBuilder, format: NVN_FORMAT_RGTC1_UNORM);
109 nvnTextureBuilderSetSize2D(builder: &texBuilder, width: 1280, height: 1298);
110 nvnTextureBuilderSetPackagedTextureData(
111 builder: &texBuilder, data: reinterpret_cast<void*>(uintptr_t(font_binary) + 0x200));
112
113 nvnMemoryPoolBuilderSetDefaults(builder: &poolBuilder);
114 nvnMemoryPoolBuilderSetDevice(builder: &poolBuilder, device);
115 nvnMemoryPoolBuilderSetFlags(builder: &poolBuilder, flags: NVN_MEMORY_POOL_FLAGS_CPU_NO_ACCESS |
116 NVN_MEMORY_POOL_FLAGS_GPU_CACHED);
117 nvnMemoryPoolBuilderSetStorage(builder: &poolBuilder, memory: font_binary, size: (font_size + 0xFFF) & ~0xFFF);
118 nvnMemoryPoolInitialize(pool: &mPool1, builder: &poolBuilder);
119
120 nvnTextureBuilderSetStorage(builder: &texBuilder, pool: &mPool1, offset: 0x200);
121 nvnTextureInitialize(texture: &mNvnTexture, builder: &texBuilder);
122
123 CriticalSection* criticalSection2 =
124 static_cast<GraphicsNvn*>(sead::Graphics::instance())->getCriticalSection2();
125 criticalSection2->lock();
126 int newTextureId = static_cast<GraphicsNvn*>(sead::Graphics::instance())->getNewTextureId();
127 nvnTexturePoolRegisterTexture(
128 pool: static_cast<GraphicsNvn*>(sead::Graphics::instance())->getTexturePool(), id: newTextureId,
129 texture: &mNvnTexture, view: nullptr);
130 criticalSection2->unlock();
131 mNvnTextureHandle = nvnDeviceGetTextureHandle(
132 device, textureID: newTextureId,
133 samplerID: static_cast<GraphicsNvn*>(sead::Graphics::instance())->getTextureSamplerID());
134}
135
136void DebugFontMgrJis1Nvn::swapUniformBlockBuffer()
137{
138 mUniformBlockBuffer.swap(temp: mUniformBlockBuffer.get_0(), size: mBuffer1Size);
139 _530 = false;
140}
141
142float DebugFontMgrJis1Nvn::getHeight() const
143{
144 return 16.0f;
145}
146float DebugFontMgrJis1Nvn::getWidth() const
147{
148 return 16.0f;
149}
150float DebugFontMgrJis1Nvn::getCharWidth(char16_t c) const
151{
152 return c < 0x7F ? 8.0f : 16.0f;
153}
154u32 DebugFontMgrJis1Nvn::getMaxDrawNum() const
155{
156 return 0x80;
157}
158
159void DebugFontMgrJis1Nvn::begin(DrawContext* ctx) const
160{
161 if (_530)
162 return;
163 nvnCommandBufferBindProgram(cmdBuf: ctx->getCommandBuffer()->ToData()->pNvnCommandBuffer, program: &mNvnProgram,
164 stages: 31);
165}
166void DebugFontMgrJis1Nvn::end(DrawContext*) const {}
167
168// missing print and searchCharIndexFormCharCode_
169
170u32 DebugFontMgrJis1Nvn::getEncoding() const
171{
172 return 2;
173}
174
175SEAD_SINGLETON_DISPOSER_IMPL(DebugFontMgrNvn)
176DebugFontMgrNvn::~DebugFontMgrNvn() = default;
177
178DebugFontMgrNvn::DebugFontMgrNvn() = default;
179
180void DebugFontMgrNvn::initialize(Heap* heap, const char* shader_path, const char* font_path,
181 u32 unk)
182{
183 FileDevice::LoadArg load_arg = {};
184
185 load_arg.path = font_path;
186 load_arg.heap = heap;
187 load_arg.alignment = 0x1000;
188 load_arg.buffer_size_alignment = 0x1000;
189 void* font_binary = FileDeviceMgr::instance()->tryLoad(arg&: load_arg);
190 u32 font_size = load_arg.read_size;
191
192 load_arg.path = shader_path;
193 void* shader_binary = FileDeviceMgr::instance()->tryLoad(arg&: load_arg);
194 u32 shader_size = load_arg.read_size;
195
196 initializeFromBinary(heap, shader_binary, shader_size, font_binary, font_size, unk3: unk);
197}
198
199// missing initializeFromBinary
200
201void DebugFontMgrNvn::swapUniformBlockBuffer()
202{
203 mUniformBlockBuffer.swap(temp: mUniformBlockBuffer.get_0(), size: buffer1Size);
204 _528 = false;
205}
206
207float DebugFontMgrNvn::getHeight() const
208{
209 return 16.0f;
210}
211float DebugFontMgrNvn::getWidth() const
212{
213 return 8.0f;
214}
215float DebugFontMgrNvn::getCharWidth(char16_t) const
216{
217 return 8.0f;
218}
219u32 DebugFontMgrNvn::getMaxDrawNum() const
220{
221 return 0x80;
222}
223
224void DebugFontMgrNvn::begin(DrawContext* ctx) const
225{
226 if (_528)
227 return;
228 nvnCommandBufferBindProgram(cmdBuf: ctx->getCommandBuffer()->ToData()->pNvnCommandBuffer, program: &nvnProgram,
229 stages: NVN_SHADER_STAGE_ALL_GRAPHICS_BITS);
230}
231void DebugFontMgrNvn::end(DrawContext*) const {}
232
233// missing print and searchCharIndexFormCharCode_
234
235u32 DebugFontMgrNvn::getEncoding() const
236{
237 return 2;
238}
239} // namespace sead
240