libultraship
Reimplementations of libultra (N64 SDK) functions for modern hardware
Loading...
Searching...
No Matches
interpreter.h
Go to the documentation of this file.
1#pragma once
2
3#include <stdbool.h>
4#include <stdint.h>
5#include <unordered_map>
6#include <map>
7#include <list>
8#include <cstddef>
9#include <vector>
10#include <stack>
11#include <string>
12#include <string_view>
13#include <memory>
14
15#include "fast/lus_gbi.h"
16#include "fast/types.h"
17#include "fast/ucodehandlers.h"
20
23
24namespace Ship {
25class ResourceManager;
26class ConsoleVariable;
27} // namespace Ship
28
29// TODO figure out why changing these to 640x480 makes the game only render in a quarter of the window
30#define SCREEN_WIDTH 320
31#define SCREEN_HEIGHT 240
32
33#include <stdint.h>
34#include <stdbool.h>
35
36#ifdef __cplusplus
37#include <compare>
38#endif
39
40/*enum {
41 CC_0,
42 CC_TEXEL0,
43 CC_TEXEL1,
44 CC_PRIM,
45 CC_SHADE,
46 CC_ENV,
47 CC_TEXEL0A,
48 CC_LOD
49};*/
50
51enum {
67};
68
69#ifdef __cplusplus
70enum class ShaderOpts {
71 ALPHA,
72 FOG,
74 NOISE,
75 _2CYC,
88 PRISM_SHADER, // 16-bit width
89 MAX
90};
91
92#define SHADER_OPT(opt) ((uint64_t)(1 << static_cast<int>(ShaderOpts::opt)))
93#endif
94
95struct ColorCombinerKey {
96 uint64_t combine_mode;
97 uint64_t options;
98 uint64_t shader_id;
99
100#ifdef __cplusplus
101 auto operator<=>(const ColorCombinerKey&) const = default;
102#endif
103};
104
105#define SHADER_MAX_TEXTURES 6
106#define SHADER_FIRST_TEXTURE 0
107#define SHADER_FIRST_MASK_TEXTURE 2
108#define SHADER_FIRST_REPLACEMENT_TEXTURE 4
109
110struct CCFeatures {
111 int c[2][2][4];
112 bool opt_alpha;
113 bool opt_fog;
114 bool opt_texture_edge;
115 bool opt_noise;
116 bool opt_2cyc;
117 bool opt_alpha_threshold;
118 bool opt_invisible;
119 bool opt_grayscale;
120 bool opt_prim_depth;
121 bool usedTextures[2];
122 bool used_masks[2];
123 bool used_blend[2];
124 bool clamp[2][2];
125 int numInputs;
126 bool do_single[2][2];
127 bool do_multiply[2][2];
128 bool do_mix[2][2];
129 bool color_alpha_same[2];
130 int16_t shader_id;
131};
132
133void gfx_cc_get_features(uint64_t shader_id0, uint64_t shader_id1, struct CCFeatures* cc_features);
134
135union Gfx;
136
137namespace Fast {
138
139class GfxRenderingAPI;
140class GfxWindowBackend;
141class Fast3dWindow;
142
143constexpr size_t MAX_SEGMENT_POINTERS = 16;
144constexpr size_t SHADER_ID_SHIFT = 17;
145constexpr int16_t ShaderIdUnmask(int id) {
146 return (id >> SHADER_ID_SHIFT) & 0xFFFF;
147}
148
150 // This is a dlist stack used to handle dlist calls.
151 std::stack<F3DGfx*> cmd_stack = {};
152 // This is also a dlist stack but a std::vector is used to make it possible
153 // to iterate on the elements.
154 // The purpose of this is to identify an instruction at a poin in time
155 // which would not be possible with just a F3DGfx* because a dlist can be called multiple times
156 // what we do instead is store the call path that leads to the instruction (including branches)
157 std::vector<const F3DGfx*> gfx_path = {};
158 struct CodeDisp {
159 const char* file;
160 int line;
161 };
162 // stack for OpenDisp/CloseDisps
163 std::vector<CodeDisp> disp_stack{};
164
165 void start(F3DGfx* dlist);
166 void stop();
168 void openDisp(const char* file, int line);
169 void closeDisp();
170 const std::vector<CodeDisp>& getDisp() const;
171 void branch(F3DGfx* caller);
172 void call(F3DGfx* caller, F3DGfx* callee);
174};
175
177 int16_t x, y;
178 uint32_t width, height;
179};
180
183 uint32_t width, height;
185};
186
188 const uint8_t* texture_addr;
189 const uint8_t* palette_addrs[2];
190 uint8_t fmt, siz;
192 uint32_t size_bytes;
193
194 bool operator==(const TextureCacheKey&) const noexcept = default;
195
196 struct Hasher {
197 size_t operator()(const TextureCacheKey& key) const noexcept {
198 uintptr_t addr = (uintptr_t)key.texture_addr;
199 return (size_t)(addr ^ (addr >> 5));
200 }
201 };
202};
203
204typedef std::unordered_map<TextureCacheKey, struct TextureCacheValue, TextureCacheKey::Hasher> TextureCacheMap;
205typedef std::pair<const TextureCacheKey, struct TextureCacheValue> TextureCacheNode;
206
208 uint32_t texture_id;
209 uint8_t cms, cmt;
211
212 std::list<struct TextureCacheMapIter>::iterator lru_location;
213};
214
216 TextureCacheMap::iterator it;
217};
218
219struct RGBA {
220 uint8_t r, g, b, a;
221};
222
224 float x, y, z, w;
225 float u, v;
226 struct RGBA color;
227 uint8_t clip_rej;
228};
229
231 uint16_t width, height;
233 std::shared_ptr<Fast::Texture> resource;
235};
236
237#define MAX_LIGHTS 32
238#define MAX_VERTICES 64
239
240struct RSP {
241 float modelview_matrix_stack[11][4][4];
243
244 float MP_matrix[4][4];
245 float P_matrix[4][4];
246
250 float current_lookat_coeffs[2][3]; // lookat_x, lookat_y
251 uint8_t current_num_lights; // includes ambient light
253
256
258
259 struct {
260 // U0.16
261 uint16_t s, t;
263
265};
266
267struct RDP {
268 const uint8_t* palettes[2];
269 // Original DRAM source address of the most recent TLUT load per palette half.
270 // Used in texture cache keys instead of palettes[] (which always points to staging).
271 const uint8_t* palette_dram_addr[2];
272 // CI4 palette staging buffer: N64 TMEM holds up to 16 CI4 palettes (16 entries x 2 bytes each = 32 bytes per
273 // palette). palettes[0] covers indices 0-7 (256 bytes), palettes[1] covers 8-15 (256 bytes). GfxDpLoadTlut copies
274 // TLUT data here at the correct offset so multi-palette CI4 models work.
275 uint8_t palette_staging[2][256];
276 struct {
277 const uint8_t* addr;
278 uint8_t siz;
279 uint32_t width;
280 uint32_t tex_flags;
283 struct {
284 const uint8_t* addr;
286 uint32_t size_bytes;
289 uint32_t tex_flags;
290 struct RawTexMetadata raw_tex_metadata;
291 bool masked;
294 struct {
295 uint8_t fmt;
296 uint8_t siz;
297 uint8_t cms, cmt;
298 uint8_t shifts, shiftt;
299 float uls, ult, lrs, lrt;
300 uint16_t tmem; // 0-511, in 64-bit word units
301 uint32_t line_size_bytes;
302 uint8_t palette;
303 uint8_t tmem_index; // 0 or 1 for offset 0 kB or offset 2 kB, respectively
306
308
310 uint64_t combine_mode;
312
314 uint16_t prim_depth;
315 struct RGBA env_color, prim_color, fog_color, blend_color, fill_color, grayscale_color;
316
317 // Chroma key parameters (G_SETKEYR / G_SETKEYGB)
320 int16_t convert_k[6]; // YUV convert coefficients (G_SETCONVERT) — K0-K5
321
322 struct XYWidthHeight viewport, scissor;
326};
327
339
340extern GfxExecStack g_exec_stack;
341
344 std::list<TextureCacheMapIter> lru;
345 std::vector<uint32_t> free_texture_ids;
346};
347
349 uint64_t shader_id0;
350 uint64_t shader_id1;
352 struct ShaderProgram* prg[16];
353 uint8_t shader_input_mapping[2][7];
354};
355
364
365struct FBInfo {
366 uint32_t orig_width, orig_height; // Original shape
367 uint32_t applied_width, applied_height; // Up-scaled for the viewport
368 uint32_t native_width, native_height; // Max "native" size of the screen, used for up-scaling
369 bool resize; // Scale to match the viewport
370 bool forceFixedAspect; // Preserve aspect ratio even if resize is true
371};
372
374 uint8_t* mask;
376};
377
379 public:
382
383 void Init(GfxWindowBackend* wapi, class GfxRenderingAPI* rapi, const char* game_name, bool start_in_fullscreen,
384 uint32_t width, uint32_t height, uint32_t posX, uint32_t posY,
385 std::shared_ptr<Ship::ConsoleVariable> consoleVariable = nullptr,
386 std::shared_ptr<Ship::ResourceManager> resourceManager = nullptr);
387 void Destroy();
388 void SetGfxDebugger(std::shared_ptr<GfxDebugger> debugger);
389 std::shared_ptr<GfxDebugger> GetGfxDebugger() const;
390 void SetFast3dWindow(std::shared_ptr<Fast3dWindow> window);
391 static std::shared_ptr<Fast3dWindow> GetCurrentWindow();
392 void GetDimensions(uint32_t* width, uint32_t* height, int32_t* posX, int32_t* posY);
396 void Run(Gfx* commands, const std::unordered_map<Mtx*, MtxF>& mtx_replacements);
397 void EndFrame();
402 void SetTargetFps(int fps);
403 void SetMaxFrameLatency(int latency);
404 int CreateFrameBuffer(uint32_t width, uint32_t height, uint32_t native_width, uint32_t native_height,
405 uint8_t resize, bool forceFixedAspect = false);
406 void SetFrameBuffer(int fb, float noiseScale);
407 void CopyFrameBuffer(int fb_dst_id, int fb_src_id, bool copyOnce, bool* hasCopiedPtr);
409 void AdjustPixelDepthCoordinates(float& x, float& y);
410 void GetPixelDepthPrepare(float x, float y);
411 uint16_t GetPixelDepth(float x, float y);
412 void RegisterBlendedTexture(const char* name, uint8_t* mask, uint8_t* replacement);
413 void UnregisterBlendedTexture(const char* name);
414
415 // Register a CPU address as a mirror of a GPU framebuffer texture.
416 // When ImportTexture encounters this address, it uses SelectTextureFb instead
417 // of reading from CPU memory — giving full GPU resolution with no readback.
418 void RegisterFbTexture(const void* cpuAddr, int fbId);
419 void UnregisterFbTexture(const void* cpuAddr);
420
421 void SetNativeDimensions(float width, float height);
422 void SetResolutionMultiplier(float multiplier);
423 void SetMsaaLevel(uint32_t level);
424 void GetCurDimensions(uint32_t* width, uint32_t* height);
425
426 // private: TODO make these private
427 void Flush();
428 ShaderProgram* LookupOrCreateShaderProgram(uint64_t id0, uint64_t id1);
429 ColorCombiner* LookupOrCreateColorCombiner(const ColorCombinerKey& key);
432 bool TextureCacheLookup(int i, const TextureCacheKey& key);
433 void TextureCacheDelete(const uint8_t* origAddr);
434 void ImportTextureRgba16(int tile, bool importReplacement);
435 void ImportTextureRgba32(int tile, bool importReplacement);
436 void ImportTextureIA4(int tile, bool importReplacement);
437 void ImportTextureIA8(int tile, bool importReplacement);
438 void ImportTextureIA16(int tile, bool importReplacement);
439 void ImportTextureI4(int tile, bool importReplacement);
440 void ImportTextureI8(int tile, bool importReplacement);
441 void ImportTextureCi4(int tile, bool importReplacement);
442 void ImportTextureCi8(int tile, bool importReplacement);
443 void ImportTextureRaw(int tile, bool importReplacement);
444 void ImportTextureImg(int tile, bool importReplacement);
445 void ImportTexture(int i, int tile, bool importReplacement);
446 void ImportTextureMask(int i, int tile);
447 void CalculateNormalDir(const F3DLight_t*, float coeffs[3]);
448
449 void GfxSpMatrix(uint8_t params, const int32_t* addr);
450 void GfxSpPopMatrix(uint32_t count);
451 void GfxSpVertex(size_t numVertices, size_t destIndex, const F3DVtx* vertices);
452 void GfxSpModifyVertex(uint16_t vtxIdx, uint8_t where, uint32_t val);
453 void GfxSpTri1(uint8_t vtx1Idx, uint8_t vtx2Idx, uint8_t vtx3Idx, bool isRect);
454 void GfxSpGeometryMode(uint32_t clear, uint32_t set);
455 void GfxSpExtraGeometryMode(uint32_t clear, uint32_t set);
456 void GfxSpMovememF3dex2(uint8_t index, uint8_t offset, const void* data);
457 void GfxSpMovememF3d(uint8_t index, uint8_t offset, const void* data);
458 void GfxSpMovewordF3dex2(uint8_t index, uint16_t offset, uintptr_t data);
459 void GfxSpMovewordF3d(uint8_t index, uint16_t offset, uintptr_t data);
460 void GfxSpTexture(uint16_t sc, uint16_t tc, uint8_t level, uint8_t tile, uint8_t on);
461 void GfxDpSetScissor(uint32_t mode, uint32_t ulx, uint32_t uly, uint32_t lrx, uint32_t lry);
462 void GfxDpSetTextureImage(uint32_t format, uint32_t size, uint32_t width, const char* texPath, uint32_t texFlags,
463 RawTexMetadata rawTexMetdata, const void* addr);
464 void GfxDpSetTile(uint8_t fmt, uint32_t siz, uint32_t line, uint32_t tmem, uint8_t tile, uint32_t palette,
465 uint32_t cmt, uint32_t maskt, uint32_t shiftt, uint32_t cms, uint32_t masks, uint32_t shifts);
466 void GfxDpSetTileSize(uint8_t tile, uint16_t uls, uint16_t ult, uint16_t lrs, uint16_t lrt);
467 void GfxDpLoadTlut(uint8_t tile, uint32_t high_index);
468 void GfxDpLoadBlock(uint8_t tile, uint32_t uls, uint32_t ult, uint32_t lrs, uint32_t dxt);
469 void GfxDpLoadTile(uint8_t tile, uint32_t uls, uint32_t ult, uint32_t lrs, uint32_t lrt);
470 void GfxDpSetCombineMode(uint32_t rgb, uint32_t alpha, uint32_t rgb_cyc2, uint32_t alpha_cyc2);
471 void GfxDpSetGrayscaleColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a);
472 void GfxDpSetEnvColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a);
473 void GfxDpSetPrimColor(uint8_t m, uint8_t r, uint8_t l, uint8_t g, uint8_t b, uint8_t a);
474 void GfxDpSetFogColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a);
475 void GfxDpSetBlendColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a);
476 void GfxDpSetFillColor(uint32_t pickedColor);
477 void GfxDrawRectangle(int32_t ulx, int32_t uly, int32_t lrx, int32_t lry);
478 void GfxDpTextureRectangle(int32_t ulx, int32_t uly, int32_t lrx, int32_t lry, uint8_t tile, int16_t uls,
479 int16_t ult, int16_t dsdx, int16_t dtdy, bool flip);
480 void GfxDpImageRectangle(int32_t tile, int32_t w, int32_t h, int32_t ulx, int32_t uly, int16_t uls, int16_t ult,
481 int32_t lrx, int32_t lry, int16_t lrs, int16_t lrt);
482 void GfxDpFillRectangle(int32_t ulx, int32_t uly, int32_t lrx, int32_t lry);
483 void GfxDpSetZImage(void* zBufAddr);
484 void GfxDpSetColorImage(uint32_t format, uint32_t size, uint32_t width, void* address);
485 void GfxSpSetOtherMode(uint32_t shift, uint32_t num_bits, uint64_t mode);
486 void GfxDpSetOtherMode(uint32_t h, uint32_t l);
487
491
492 void AdjustWidthHeightForScale(uint32_t& width, uint32_t& height, uint32_t nativeWidth,
493 uint32_t nativeHeight) const;
494 float AdjXForAspectRatio(float x) const;
496 void CalcAndSetViewport(const F3DVp_t* viewport);
497
498 void SpReset();
499 void* SegAddr(uintptr_t w1);
500
501 static const char* CCMUXtoStr(uint32_t ccmux);
502 static const char* ACMUXtoStr(uint32_t acmux);
503 static void GenerateCC(ColorCombiner* comb, const ColorCombinerKey& key);
504 static std::string_view GetBaseTexturePath(std::string_view path);
505 static void NormalizeVector(float v[3]);
506 static void TransposedMatrixMul(float res[3], const float a[3], const float b[4][4]);
507 static void MatrixMul(float res[4][4], const float a[4][4], const float b[4][4]);
508
512
514 std::map<ColorCombinerKey, ColorCombiner> mColorCombinerPool; // color_combiner_pool;
515 std::map<ColorCombinerKey, ColorCombiner>::iterator mPrevCombiner = mColorCombinerPool.end();
516 uint8_t* mTexUploadBuffer = nullptr;
517
518 GfxDimensions mGfxCurrentWindowDimensions{}; // gfx_current_window_dimensions;
519 int32_t mCurWindowPosX{};
520 int32_t mCurWindowPosY{};
521 GfxDimensions mCurDimensions{}; // gfx_current_dimensions;
522 GfxDimensions mPrvDimensions{}; // gfx_prev_dimensions;
523 XYWidthHeight mGameWindowViewport{}; // gfx_current_game_window_viewport;
524 XYWidthHeight mNativeDimensions{}; // gfx_native_dimensions;
525 XYWidthHeight mPrevNativeDimensions{}; // gfx_prev_native_dimensions;
526 uintptr_t mGfxFrameBuffer{};
527
528 unsigned int mMsaaLevel = 1;
530 float* mBufVbo; // 3 vertices in a triangle and 32 floats per vtx
531 size_t mBufVboLen{};
535 std::shared_ptr<GfxDebugger> mGfxDebugger;
536 std::shared_ptr<Ship::ResourceManager> mResourceManager;
537 std::shared_ptr<Ship::ConsoleVariable> mConsoleVariable;
538 std::weak_ptr<Fast3dWindow> mFast3dWindow;
539
541
542 bool mFbActive{};
543 bool mRendersToFb{}; // game_renders_to_framebuffer;
544 std::map<int, FBInfo>::iterator mActiveFrameBuffer;
545 std::map<int, FBInfo> mFrameBuffers;
546
547 int mGameFb{}; // game_framebuffer;
548 int mGameFbMsaaResolved{}; // game_framebuffer_msaa_resolved;
549
550 std::set<std::pair<float, float>> mGetPixelDepthPending; // get_pixel_depth_pending;
551 std::unordered_map<std::pair<float, float>, uint16_t, hash_pair_ff> mGetPixelDepthCached; // get_pixel_depth_cached;
552 std::map<std::string, MaskedTextureEntry, std::less<>> mMaskedTextures;
553 std::unordered_map<uintptr_t, int> mFbTextures; // CPU addr -> GPU FB id
554
555 const std::unordered_map<Mtx*, MtxF>* mCurMtxReplacements;
556 bool mMarkerOn; // This was originally a debug feature. Now it seems to control s2dex?
557 std::unordered_map<size_t, const char*> mShaders;
558
559 typedef size_t ShaderId;
560 std::stack<ShaderId> mShaderStack;
564};
565
567void gfx_push_current_dir(char* path);
568int32_t gfx_check_image_signature(const char* imgData);
569const char* gfx_get_shader(int16_t id);
570const char* GfxGetOpcodeName(int8_t opcode);
571
572} // namespace Fast
573
574extern "C" void gfx_texture_cache_clear();
575extern "C" void gfx_shader_cache_clear();
576extern "C" int gfx_create_framebuffer(uint32_t width, uint32_t height, uint32_t native_width, uint32_t native_height,
577 uint8_t resize, bool forceFixedAspect = false);
Definition gfx_rendering_api.h:30
Definition gfx_window_manager_api.h:7
Definition interpreter.h:378
size_t mShadersIndex
Definition interpreter.h:561
void GfxSpMovewordF3d(uint8_t index, uint16_t offset, uintptr_t data)
void GfxDpImageRectangle(int32_t tile, int32_t w, int32_t h, int32_t ulx, int32_t uly, int16_t uls, int16_t ult, int32_t lrx, int32_t lry, int16_t lrs, int16_t lrt)
void GfxDpTextureRectangle(int32_t ulx, int32_t uly, int32_t lrx, int32_t lry, uint8_t tile, int16_t uls, int16_t ult, int16_t dsdx, int16_t dtdy, bool flip)
uintptr_t mGfxFrameBuffer
Definition interpreter.h:526
void GfxDpSetFogColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a)
void ImportTextureRaw(int tile, bool importReplacement)
void GetCurDimensions(uint32_t *width, uint32_t *height)
std::map< int, FBInfo > mFrameBuffers
Definition interpreter.h:545
bool mDroppedFrame
Definition interpreter.h:529
size_t mBufVboNumTris
Definition interpreter.h:532
void GfxSpTri1(uint8_t vtx1Idx, uint8_t vtx2Idx, uint8_t vtx3Idx, bool isRect)
void GfxSpExtraGeometryMode(uint32_t clear, uint32_t set)
std::stack< ShaderId > mShaderStack
Definition interpreter.h:560
void GfxDpSetTile(uint8_t fmt, uint32_t siz, uint32_t line, uint32_t tmem, uint8_t tile, uint32_t palette, uint32_t cmt, uint32_t maskt, uint32_t shiftt, uint32_t cms, uint32_t masks, uint32_t shifts)
void GetDimensions(uint32_t *width, uint32_t *height, int32_t *posX, int32_t *posY)
static void NormalizeVector(float v[3])
void GfxDrawRectangle(int32_t ulx, int32_t uly, int32_t lrx, int32_t lry)
void CalcAndSetViewport(const F3DVp_t *viewport)
void SetTargetFps(int fps)
static const char * ACMUXtoStr(uint32_t acmux)
GfxDimensions mCurDimensions
Definition interpreter.h:521
void Gfxs2dexBg1cyc(F3DuObjBg *bg)
std::shared_ptr< Ship::ResourceManager > mResourceManager
Cached ResourceManager, set in Init().
Definition interpreter.h:536
GfxRenderingAPI * mRapi
Definition interpreter.h:534
void RegisterFbTexture(const void *cpuAddr, int fbId)
void GfxDpSetColorImage(uint32_t format, uint32_t size, uint32_t width, void *address)
GfxRenderingAPI * GetCurrentRenderingAPI()
GfxDimensions mPrvDimensions
Definition interpreter.h:522
bool mFbActive
Definition interpreter.h:542
static std::shared_ptr< Fast3dWindow > GetCurrentWindow()
GfxTextureCache mTextureCache
Definition interpreter.h:513
static void GenerateCC(ColorCombiner *comb, const ColorCombinerKey &key)
void SetGfxDebugger(std::shared_ptr< GfxDebugger > debugger)
RenderingState mRenderingState
Definition interpreter.h:511
void GfxDpSetPrimColor(uint8_t m, uint8_t r, uint8_t l, uint8_t g, uint8_t b, uint8_t a)
void ImportTextureMask(int i, int tile)
bool mRendersToFb
Definition interpreter.h:543
void ImportTextureI4(int tile, bool importReplacement)
std::shared_ptr< Ship::ConsoleVariable > mConsoleVariable
Cached ConsoleVariable, set in Init().
Definition interpreter.h:537
void GfxDpLoadTile(uint8_t tile, uint32_t uls, uint32_t ult, uint32_t lrs, uint32_t lrt)
void GfxDpSetCombineMode(uint32_t rgb, uint32_t alpha, uint32_t rgb_cyc2, uint32_t alpha_cyc2)
void SetNativeDimensions(float width, float height)
void GfxDpSetFillColor(uint32_t pickedColor)
void CalculateNormalDir(const F3DLight_t *, float coeffs[3])
std::weak_ptr< Fast3dWindow > mFast3dWindow
Cached Fast3dWindow, set in OnInit().
Definition interpreter.h:538
void ImportTextureCi8(int tile, bool importReplacement)
XYWidthHeight mGameWindowViewport
Definition interpreter.h:523
void CopyFrameBuffer(int fb_dst_id, int fb_src_id, bool copyOnce, bool *hasCopiedPtr)
size_t ShaderId
Definition interpreter.h:559
void Run(Gfx *commands, const std::unordered_map< Mtx *, MtxF > &mtx_replacements)
static void TransposedMatrixMul(float res[3], const float a[3], const float b[4][4])
void ImportTextureImg(int tile, bool importReplacement)
void ImportTextureCi4(int tile, bool importReplacement)
void GfxSpVertex(size_t numVertices, size_t destIndex, const F3DVtx *vertices)
std::unordered_map< std::pair< float, float >, uint16_t, hash_pair_ff > mGetPixelDepthCached
Definition interpreter.h:551
void Gfxs2dexBgCopy(F3DuObjBg *bg)
void GfxSpMovewordF3dex2(uint8_t index, uint16_t offset, uintptr_t data)
void GfxDpSetEnvColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a)
void GfxSpModifyVertex(uint16_t vtxIdx, uint8_t where, uint32_t val)
int mInterpolationIndex
Definition interpreter.h:562
void GfxSpPopMatrix(uint32_t count)
GfxDimensions mGfxCurrentWindowDimensions
Definition interpreter.h:518
void GfxDpFillRectangle(int32_t ulx, int32_t uly, int32_t lrx, int32_t lry)
ShaderProgram * LookupOrCreateShaderProgram(uint64_t id0, uint64_t id1)
size_t mBufVboLen
Definition interpreter.h:531
int CreateFrameBuffer(uint32_t width, uint32_t height, uint32_t native_width, uint32_t native_height, uint8_t resize, bool forceFixedAspect=false)
GfxWindowBackend * mWapi
Definition interpreter.h:533
void UnregisterFbTexture(const void *cpuAddr)
void Init(GfxWindowBackend *wapi, class GfxRenderingAPI *rapi, const char *game_name, bool start_in_fullscreen, uint32_t width, uint32_t height, uint32_t posX, uint32_t posY, std::shared_ptr< Ship::ConsoleVariable > consoleVariable=nullptr, std::shared_ptr< Ship::ResourceManager > resourceManager=nullptr)
int mInterpolationIndexTarget
Definition interpreter.h:563
void AdjustVIewportOrScissor(XYWidthHeight *area)
bool TextureCacheLookup(int i, const TextureCacheKey &key)
int mGameFbMsaaResolved
Definition interpreter.h:548
void AdjustWidthHeightForScale(uint32_t &width, uint32_t &height, uint32_t nativeWidth, uint32_t nativeHeight) const
void SetFrameBuffer(int fb, float noiseScale)
void ImportTextureI8(int tile, bool importReplacement)
void SetResolutionMultiplier(float multiplier)
void GfxDpSetScissor(uint32_t mode, uint32_t ulx, uint32_t uly, uint32_t lrx, uint32_t lry)
void GfxSpGeometryMode(uint32_t clear, uint32_t set)
void RegisterBlendedTexture(const char *name, uint8_t *mask, uint8_t *replacement)
int32_t mCurWindowPosX
Definition interpreter.h:519
void GfxDpSetGrayscaleColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a)
void GfxDpSetZImage(void *zBufAddr)
void ImportTextureIA4(int tile, bool importReplacement)
void GfxDpSetTileSize(uint8_t tile, uint16_t uls, uint16_t ult, uint16_t lrs, uint16_t lrt)
float AdjXForAspectRatio(float x) const
void GfxSpTexture(uint16_t sc, uint16_t tc, uint8_t level, uint8_t tile, uint8_t on)
bool mMarkerOn
Definition interpreter.h:556
int32_t mCurWindowPosY
Definition interpreter.h:520
bool ViewportMatchesRendererResolution()
std::set< std::pair< float, float > > mGetPixelDepthPending
Definition interpreter.h:550
void TextureCacheClear()
void Gfxs2dexRecyCopy(F3DuObjSprite *spr)
void SetMaxFrameLatency(int latency)
XYWidthHeight mNativeDimensions
Definition interpreter.h:524
void SetMsaaLevel(uint32_t level)
unsigned int mMsaaLevel
Definition interpreter.h:528
XYWidthHeight mPrevNativeDimensions
Definition interpreter.h:525
void ImportTextureRgba32(int tile, bool importReplacement)
static void MatrixMul(float res[4][4], const float a[4][4], const float b[4][4])
static std::string_view GetBaseTexturePath(std::string_view path)
uint16_t GetPixelDepth(float x, float y)
RSP * mRsp
Definition interpreter.h:509
void HandleWindowEvents()
void UnregisterBlendedTexture(const char *name)
void GfxDpLoadTlut(uint8_t tile, uint32_t high_index)
void GfxDpSetBlendColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a)
ColorCombiner * LookupOrCreateColorCombiner(const ColorCombinerKey &key)
const std::unordered_map< Mtx *, MtxF > * mCurMtxReplacements
Definition interpreter.h:555
void * SegAddr(uintptr_t w1)
std::map< ColorCombinerKey, ColorCombiner >::iterator mPrevCombiner
Definition interpreter.h:515
int mGameFb
Definition interpreter.h:547
std::shared_ptr< GfxDebugger > GetGfxDebugger() const
uint8_t * mTexUploadBuffer
Definition interpreter.h:516
std::unordered_map< size_t, const char * > mShaders
Definition interpreter.h:557
void SetFast3dWindow(std::shared_ptr< Fast3dWindow > window)
void GetPixelDepthPrepare(float x, float y)
void ImportTextureRgba16(int tile, bool importReplacement)
std::unordered_map< uintptr_t, int > mFbTextures
Definition interpreter.h:553
std::map< std::string, MaskedTextureEntry, std::less<> > mMaskedTextures
Definition interpreter.h:552
void GfxDpSetTextureImage(uint32_t format, uint32_t size, uint32_t width, const char *texPath, uint32_t texFlags, RawTexMetadata rawTexMetdata, const void *addr)
void ImportTextureIA16(int tile, bool importReplacement)
std::map< int, FBInfo >::iterator mActiveFrameBuffer
Definition interpreter.h:544
void ImportTextureIA8(int tile, bool importReplacement)
void ImportTexture(int i, int tile, bool importReplacement)
void TextureCacheDelete(const uint8_t *origAddr)
std::map< ColorCombinerKey, ColorCombiner > mColorCombinerPool
Definition interpreter.h:514
void AdjustPixelDepthCoordinates(float &x, float &y)
void GfxDpSetOtherMode(uint32_t h, uint32_t l)
void GfxSpMatrix(uint8_t params, const int32_t *addr)
RDP * mRdp
Definition interpreter.h:510
float * mBufVbo
Definition interpreter.h:530
uintptr_t mSegmentPointers[MAX_SEGMENT_POINTERS]
Definition interpreter.h:540
void GfxSpMovememF3dex2(uint8_t index, uint8_t offset, const void *data)
std::shared_ptr< GfxDebugger > mGfxDebugger
Definition interpreter.h:535
void GfxSpSetOtherMode(uint32_t shift, uint32_t num_bits, uint64_t mode)
void GfxSpMovememF3d(uint8_t index, uint8_t offset, const void *data)
void GfxDpLoadBlock(uint8_t tile, uint32_t uls, uint32_t ult, uint32_t lrs, uint32_t dxt)
static const char * CCMUXtoStr(uint32_t ccmux)
#define MAX_VERTICES
Definition interpreter.h:238
void gfx_shader_cache_clear()
void gfx_cc_get_features(uint64_t shader_id0, uint64_t shader_id1, struct CCFeatures *cc_features)
void gfx_texture_cache_clear()
@ SHADER_TEXEL0A
Definition interpreter.h:61
@ SHADER_INPUT_2
Definition interpreter.h:54
@ SHADER_INPUT_1
Definition interpreter.h:53
@ SHADER_TEXEL0
Definition interpreter.h:60
@ SHADER_INPUT_3
Definition interpreter.h:55
@ SHADER_1
Definition interpreter.h:64
@ SHADER_INPUT_5
Definition interpreter.h:57
@ SHADER_INPUT_4
Definition interpreter.h:56
@ SHADER_INPUT_7
Definition interpreter.h:59
@ SHADER_INPUT_6
Definition interpreter.h:58
@ SHADER_COMBINED
Definition interpreter.h:65
@ SHADER_TEXEL1A
Definition interpreter.h:63
@ SHADER_0
Definition interpreter.h:52
@ SHADER_TEXEL1
Definition interpreter.h:62
@ SHADER_NOISE
Definition interpreter.h:66
#define MAX_LIGHTS
Definition interpreter.h:237
int gfx_create_framebuffer(uint32_t width, uint32_t height, uint32_t native_width, uint32_t native_height, uint8_t resize, bool forceFixedAspect=false)
#define SHADER_MAX_TEXTURES
Definition interpreter.h:105
Definition gfx_direct3d_common.h:19
void gfx_set_target_ucode(UcodeHandlers ucode)
const char * gfx_get_shader(int16_t id)
Attribute
Definition interpreter.h:328
@ MTX_LOAD
Definition interpreter.h:330
@ CULL_BACK
Definition interpreter.h:334
@ CULL_BOTH
Definition interpreter.h:335
@ MTX_PROJECTION
Definition interpreter.h:329
@ MV_VIEWPORT
Definition interpreter.h:336
@ MTX_NOPUSH
Definition interpreter.h:332
@ MV_LIGHT
Definition interpreter.h:337
@ MTX_PUSH
Definition interpreter.h:331
@ CULL_FRONT
Definition interpreter.h:333
GfxExecStack g_exec_stack
std::unordered_map< TextureCacheKey, struct TextureCacheValue, TextureCacheKey::Hasher > TextureCacheMap
Definition interpreter.h:204
int32_t gfx_check_image_signature(const char *imgData)
const char * GfxGetOpcodeName(int8_t opcode)
constexpr size_t SHADER_ID_SHIFT
Definition interpreter.h:144
constexpr size_t MAX_SEGMENT_POINTERS
Definition interpreter.h:143
TextureType
Definition Texture.h:11
void gfx_push_current_dir(char *path)
constexpr int16_t ShaderIdUnmask(int id)
Definition interpreter.h:145
std::pair< const TextureCacheKey, struct TextureCacheValue > TextureCacheNode
Definition interpreter.h:205
Core namespace for the libultraship engine framework.
Definition gfx_direct3d_common.h:14
Definition interpreter.h:348
struct ShaderProgram * prg[16]
Definition interpreter.h:352
uint64_t shader_id1
Definition interpreter.h:350
uint8_t shader_input_mapping[2][7]
Definition interpreter.h:353
uint64_t shader_id0
Definition interpreter.h:349
bool usedTextures[2]
Definition interpreter.h:351
Definition lus_gbi.h:1043
Definition lus_gbi.h:957
Definition interpreter.h:365
uint32_t native_height
Definition interpreter.h:368
uint32_t orig_width
Definition interpreter.h:366
uint32_t applied_width
Definition interpreter.h:367
uint32_t native_width
Definition interpreter.h:368
bool forceFixedAspect
Definition interpreter.h:370
bool resize
Definition interpreter.h:369
uint32_t orig_height
Definition interpreter.h:366
uint32_t applied_height
Definition interpreter.h:367
Definition interpreter.h:181
uint32_t height
Definition interpreter.h:183
float aspect_ratio
Definition interpreter.h:184
float internal_mul
Definition interpreter.h:182
uint32_t width
Definition interpreter.h:183
Definition interpreter.h:158
int line
Definition interpreter.h:160
const char * file
Definition interpreter.h:159
Definition interpreter.h:149
std::stack< F3DGfx * > cmd_stack
Definition interpreter.h:151
void start(F3DGfx *dlist)
void openDisp(const char *file, int line)
void call(F3DGfx *caller, F3DGfx *callee)
const std::vector< CodeDisp > & getDisp() const
std::vector< const F3DGfx * > gfx_path
Definition interpreter.h:157
F3DGfx *& currCmd()
std::vector< CodeDisp > disp_stack
Definition interpreter.h:163
void branch(F3DGfx *caller)
Definition interpreter.h:342
std::list< TextureCacheMapIter > lru
Definition interpreter.h:344
std::vector< uint32_t > free_texture_ids
Definition interpreter.h:345
TextureCacheMap map
Definition interpreter.h:343
Definition interpreter.h:223
float x
Definition interpreter.h:224
struct RGBA color
Definition interpreter.h:226
float u
Definition interpreter.h:225
float y
Definition interpreter.h:224
float w
Definition interpreter.h:224
uint8_t clip_rej
Definition interpreter.h:227
float z
Definition interpreter.h:224
float v
Definition interpreter.h:225
Definition interpreter.h:373
uint8_t * mask
Definition interpreter.h:374
uint8_t * replacementData
Definition interpreter.h:375
Definition interpreter.h:267
uint8_t prim_lod_fraction
Definition interpreter.h:313
uint32_t size_bytes
Definition interpreter.h:286
const uint8_t * palette_dram_addr[2]
Definition interpreter.h:271
struct RawTexMetadata raw_tex_metadata
Definition interpreter.h:281
uint8_t fmt
Definition interpreter.h:295
struct Fast::RDP::@8 texture_to_load
struct XYWidthHeight viewport scissor
Definition interpreter.h:322
struct Fast::RDP::@10 texture_tile[8]
uint32_t width
Definition interpreter.h:279
uint8_t siz
Definition interpreter.h:278
uint8_t cms
Definition interpreter.h:297
bool viewport_or_scissor_changed
Definition interpreter.h:323
void * z_buf_address
Definition interpreter.h:324
float lrs
Definition interpreter.h:299
void * color_image_address
Definition interpreter.h:325
struct Fast::RDP::@9 loaded_texture[2]
uint32_t orig_size_bytes
Definition interpreter.h:285
uint8_t shifts
Definition interpreter.h:298
bool grayscale
Definition interpreter.h:311
bool masked
Definition interpreter.h:291
uint16_t tmem
Definition interpreter.h:300
bool textures_changed[2]
Definition interpreter.h:305
uint32_t line_size_bytes
Definition interpreter.h:288
uint8_t first_tile_index
Definition interpreter.h:307
struct RGBA env_color prim_color fog_color blend_color fill_color grayscale_color
Definition interpreter.h:315
int16_t convert_k[6]
Definition interpreter.h:320
uint32_t other_mode_l
Definition interpreter.h:309
uint8_t tmem_index
Definition interpreter.h:303
uint32_t tex_flags
Definition interpreter.h:280
struct RGBA key_center
Definition interpreter.h:318
uint16_t prim_depth
Definition interpreter.h:314
const uint8_t * addr
Definition interpreter.h:277
struct RGBA key_scale
Definition interpreter.h:319
uint64_t combine_mode
Definition interpreter.h:310
uint32_t full_image_line_size_bytes
Definition interpreter.h:287
bool blended
Definition interpreter.h:292
uint8_t palette_staging[2][256]
Definition interpreter.h:275
uint8_t palette
Definition interpreter.h:302
const uint8_t * palettes[2]
Definition interpreter.h:268
uint32_t other_mode_h
Definition interpreter.h:309
Definition interpreter.h:219
uint8_t a
Definition interpreter.h:220
uint8_t g
Definition interpreter.h:220
uint8_t r
Definition interpreter.h:220
uint8_t b
Definition interpreter.h:220
Definition interpreter.h:240
struct Fast::RSP::@7 texture_scaling_factor
float current_lookat_coeffs[2][3]
Definition interpreter.h:250
float current_lights_coeffs[MAX_LIGHTS][3]
Definition interpreter.h:249
uint16_t t
Definition interpreter.h:261
float P_matrix[4][4]
Definition interpreter.h:245
F3DLight_t lookat[2]
Definition interpreter.h:247
F3DLight current_lights[MAX_LIGHTS+1]
Definition interpreter.h:248
int16_t fog_mul
Definition interpreter.h:255
float MP_matrix[4][4]
Definition interpreter.h:244
uint8_t current_num_lights
Definition interpreter.h:251
uint32_t geometry_mode
Definition interpreter.h:254
uint32_t extra_geometry_mode
Definition interpreter.h:257
struct LoadedVertex loaded_vertices[MAX_VERTICES+4]
Definition interpreter.h:264
float modelview_matrix_stack[11][4][4]
Definition interpreter.h:241
uint8_t modelview_matrix_stack_size
Definition interpreter.h:242
uint16_t s
Definition interpreter.h:261
bool lights_changed
Definition interpreter.h:252
int16_t fog_offset
Definition interpreter.h:255
Definition interpreter.h:230
uint16_t height
Definition interpreter.h:231
float h_byte_scale
Definition interpreter.h:232
Fast::TextureType type
Definition interpreter.h:234
uint16_t width
Definition interpreter.h:231
float v_pixel_scale
Definition interpreter.h:232
std::shared_ptr< Fast::Texture > resource
Definition interpreter.h:233
Definition interpreter.h:356
bool alpha_blend
Definition interpreter.h:359
struct XYWidthHeight viewport scissor
Definition interpreter.h:360
bool decal_mode
Definition interpreter.h:358
struct ShaderProgram * mShaderProgram
Definition interpreter.h:361
uint8_t depth_test_and_mask
Definition interpreter.h:357
TextureCacheNode * mTextures[SHADER_MAX_TEXTURES]
Definition interpreter.h:362
OpenGL shader program metadata cached by the Fast3D renderer.
Definition gfx_opengl.h:37
Definition interpreter.h:196
size_t operator()(const TextureCacheKey &key) const noexcept
Definition interpreter.h:197
Definition interpreter.h:187
uint32_t size_bytes
Definition interpreter.h:192
uint8_t palette_index
Definition interpreter.h:191
bool operator==(const TextureCacheKey &) const noexcept=default
const uint8_t * palette_addrs[2]
Definition interpreter.h:189
const uint8_t * texture_addr
Definition interpreter.h:188
uint8_t fmt
Definition interpreter.h:190
uint8_t siz
Definition interpreter.h:190
Definition interpreter.h:215
TextureCacheMap::iterator it
Definition interpreter.h:216
Definition interpreter.h:207
uint8_t cmt
Definition interpreter.h:209
uint32_t texture_id
Definition interpreter.h:208
std::list< structTextureCacheMapIter >::iterator lru_location
Definition interpreter.h:212
uint8_t cms
Definition interpreter.h:209
bool linear_filter
Definition interpreter.h:210
Definition interpreter.h:176
uint32_t width
Definition interpreter.h:178
int16_t y
Definition interpreter.h:177
int16_t x
Definition interpreter.h:177
uint32_t height
Definition interpreter.h:178
Definition gfx_rendering_api.h:20
UcodeHandlers
Definition ucodehandlers.h:3
Definition lus_gbi.h:1171
Definition lus_gbi.h:1072
Definition lus_gbi.h:881
Definition lus_gbi.h:1252
Definition lus_gbi.h:1281