From 4cc3430073e8ca8183f006ba4fe2ee1fe98502c6 Mon Sep 17 00:00:00 2001 From: ManDude <7569514+ManDude@users.noreply.github.com> Date: Mon, 24 Apr 2023 00:21:12 +0100 Subject: [PATCH] fix some decomp types and get rid of in-game frame time perception (#2535) --- decompiler/config/jak2/all-types.gc | 8 ++++---- .../opengl_renderer/CollideMeshRenderer.cpp | 16 ++-------------- goal_src/jak2/engine/draw/drawable.gc | 10 +++++++--- goal_src/jak2/engine/entity/entity.gc | 7 +------ goal_src/jak2/engine/game/effect-control.gc | 4 ++-- goal_src/jak2/engine/game/main.gc | 4 ++-- goal_src/jak2/engine/gfx/hw/display-h.gc | 8 ++++---- goal_src/jak2/engine/gfx/texture/texture.gc | 2 +- .../reference/jak2/engine/draw/drawable_REF.gc | 6 +++--- .../reference/jak2/engine/entity/entity_REF.gc | 7 +------ .../jak2/engine/game/effect-control_REF.gc | 4 ++-- .../reference/jak2/engine/game/main_REF.gc | 4 ++-- .../jak2/engine/gfx/hw/display-h_REF.gc | 8 ++++---- 13 files changed, 35 insertions(+), 53 deletions(-) diff --git a/decompiler/config/jak2/all-types.gc b/decompiler/config/jak2/all-types.gc index d2ffd2f2b..1de478e56 100644 --- a/decompiler/config/jak2/all-types.gc +++ b/decompiler/config/jak2/all-types.gc @@ -4433,8 +4433,8 @@ (global-buf dma-buffer :offset 40) (bucket-group (inline-array dma-bucket) :offset 44) (profile-array profile-array :inline :offset-assert 48) - (start-time time-frame :offset-assert 56) - (run-time time-frame :offset-assert 64) ;; int64 + (start-time int64 :offset-assert 56) + (run-time int64 :offset-assert 64) ) (:methods (new (symbol type) _type_ 0) @@ -4466,8 +4466,8 @@ (total-game-clock clock :offset 88) (time-factor float :offset-assert 92) (dog-ratio float :offset-assert 96) - (vblank-start-time time-frame 2 :offset-assert 104) - (total-run-time time-frame :offset-assert 120) + (vblank-start-time int64 2 :offset-assert 104) + (total-run-time int64 :offset-assert 120) (run-half-speed basic :offset-assert 128) (dog-count float :offset-assert 132) (vu1-enable-user vu1-renderer-mask :offset-assert 136) diff --git a/game/graphics/opengl_renderer/CollideMeshRenderer.cpp b/game/graphics/opengl_renderer/CollideMeshRenderer.cpp index 4e5b30b2a..9ad6eac36 100644 --- a/game/graphics/opengl_renderer/CollideMeshRenderer.cpp +++ b/game/graphics/opengl_renderer/CollideMeshRenderer.cpp @@ -115,20 +115,8 @@ void CollideMeshRenderer::render(SharedRenderState* render_state, ScopedProfiler settings.planes[i] = render_state->camera_planes[i]; } auto shader = render_state->shaders[ShaderId::COLLISION].id(); - // Get a free binding point - GLuint bind_loc = 0; - GLint bind_max; - glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &bind_max); - for (int i = 0; i < bind_max; i++) { - GLint params; - glGetIntegeri_v(GL_UNIFORM_BUFFER_BINDING, i, ¶ms); - if (params == 0) { - bind_loc = i; - break; - } - } - glUniformBlockBinding(shader, glGetUniformBlockIndex(shader, "PatColors"), bind_loc); - glBindBufferBase(GL_UNIFORM_BUFFER, bind_loc, m_ubo); + glUniformBlockBinding(shader, glGetUniformBlockIndex(shader, "PatColors"), 0); + glBindBufferBase(GL_UNIFORM_BUFFER, 0, m_ubo); glUniformMatrix4fv(glGetUniformLocation(shader, "camera"), 1, GL_FALSE, settings.math_camera.data()); glUniform4f(glGetUniformLocation(shader, "hvdf_offset"), settings.hvdf_offset[0], diff --git a/goal_src/jak2/engine/draw/drawable.gc b/goal_src/jak2/engine/draw/drawable.gc index b10f9af30..670d9f471 100644 --- a/goal_src/jak2/engine/draw/drawable.gc +++ b/goal_src/jak2/engine/draw/drawable.gc @@ -1859,7 +1859,11 @@ ;; the "lag ratio" of the frame that was just drawn. (last-dog (fmax 1.0 (fmin 4.0 (-> *display* dog-ratio)))) ) - (set! (-> arg0 frames just-rendered-frame run-time) (the-as time-frame (the int frame-duration))) + ;; store the amount of ticks that the frame took. + ;; PC PORT NOTE : the originaly game reads this field in places to check if frames are taking too long and avoid doing potentially laggy things. + ;; those numbers are hardcoded for 60fps, they would be a pain to adjust, and the effects in the pc port are negligible. + ;; so, we just pretend frames rendered in planck time. + (set! (-> arg0 frames just-rendered-frame run-time) (#if PC_PORT 0 (the int frame-duration))) ;; next, we'll compute this "lag" ratio (will become dog-ratio of the next frame). ;; higher numbers = game running slower = bigger timesteps @@ -1986,10 +1990,10 @@ ;; measure time again, after waiting/vsyncing. (let ((time-after-vsync (timer1-time))) (+! (-> arg0 total-run-time) - (the-as time-frame (sar (- (shl time-after-vsync 48) (the-as uint just-rendered-frame-start-time)) 48)) + (sar (- (shl time-after-vsync 48) (the-as uint just-rendered-frame-start-time)) 48) ) ;; and use this as the start time for the frame we're about to render. - (set! (-> arg0 frames frame-to-render start-time) (the-as time-frame time-after-vsync)) + (set! (-> arg0 frames frame-to-render start-time) (the-as int time-after-vsync)) ) ;; while nothing is drawing, update GS/video/magic stuff. ;; (set-graphics-mode) diff --git a/goal_src/jak2/engine/entity/entity.gc b/goal_src/jak2/engine/entity/entity.gc index 642748d26..3ddeda127 100644 --- a/goal_src/jak2/engine/entity/entity.gc +++ b/goal_src/jak2/engine/entity/entity.gc @@ -2111,12 +2111,7 @@ (update-actor-hash) (when (not (paused?)) (let ((s5-1 (-> *display* frames (-> *display* last-screen) run-time))) - (let ((f0-5 (fmax - 327680.0 - (fmin (+ 327680.0 (* 204.8 (the float (- (seconds 23.335) s5-1)))) (-> *ACTOR-bank* birth-dist)) - ) - ) - ) + (let ((f0-5 (fmax 327680.0 (fmin (+ 327680.0 (* 204.8 (the float (- 7000 s5-1)))) (-> *ACTOR-bank* birth-dist))))) (seek! (-> *ACTOR-bank* pause-dist) f0-5 (* 81920.0 (-> pp clock seconds-per-frame))) ) (seekl! (-> *ACTOR-bank* birth-max) (the int (lerp-scale 25.0 2.0 (the float s5-1) 2000.0 7000.0)) 10) diff --git a/goal_src/jak2/engine/game/effect-control.gc b/goal_src/jak2/engine/game/effect-control.gc index 9ce41f8c6..9c0702f4c 100644 --- a/goal_src/jak2/engine/game/effect-control.gc +++ b/goal_src/jak2/engine/game/effect-control.gc @@ -585,10 +585,10 @@ ) (let ((a2-37 (-> *display* frames (-> *display* last-screen) run-time))) (cond - ((< (seconds 30) a2-37) + ((< 9000 a2-37) (set! a1-51 (* a1-51 4)) ) - ((< (seconds 23.335) a2-37) + ((< 7000 a2-37) (set! a1-51 (* a1-51 2)) ) ) diff --git a/goal_src/jak2/engine/game/main.gc b/goal_src/jak2/engine/game/main.gc index a14ea9cce..8a3e7a07b 100644 --- a/goal_src/jak2/engine/game/main.gc +++ b/goal_src/jak2/engine/game/main.gc @@ -1736,8 +1736,8 @@ ; ) (suspend) (set! (-> *setting-control* user-default bg-a) 0.0) - (set! (-> gp-1 frames 0 start-time) (the-as time-frame (timer-count (the-as timer-bank #x10000800)))) - (set! (-> gp-1 frames 1 start-time) (the-as time-frame (timer-count (the-as timer-bank #x10000800)))) + (set! (-> gp-1 frames 0 start-time) (the-as int (timer-count (the-as timer-bank #x10000800)))) + (set! (-> gp-1 frames 1 start-time) (the-as int (timer-count (the-as timer-bank #x10000800)))) (set! (-> gp-1 dog-ratio) 1.0) (while *run* (display-loop-main gp-1) diff --git a/goal_src/jak2/engine/gfx/hw/display-h.gc b/goal_src/jak2/engine/gfx/hw/display-h.gc index 64ac03b56..d5d83391c 100644 --- a/goal_src/jak2/engine/gfx/hw/display-h.gc +++ b/goal_src/jak2/engine/gfx/hw/display-h.gc @@ -27,8 +27,8 @@ At any point in time, there are 3 frames in progress: (global-buf dma-buffer :offset 40) (bucket-group (inline-array dma-bucket) :offset 44) (profile-array profile-array :inline :offset-assert 48) - (start-time time-frame :offset-assert 56) - (run-time time-frame :offset-assert 64) + (start-time int64 :offset-assert 56) + (run-time int64 :offset-assert 64) ) :method-count-assert 9 :size-assert #x48 @@ -77,8 +77,8 @@ At any point in time, there are 3 frames in progress: (total-game-clock clock :offset 88) (time-factor float :offset-assert 92) (dog-ratio float :offset-assert 96) - (vblank-start-time time-frame 2 :offset-assert 104) - (total-run-time time-frame :offset-assert 120) + (vblank-start-time int64 2 :offset-assert 104) + (total-run-time int64 :offset-assert 120) (run-half-speed basic :offset-assert 128) (dog-count float :offset-assert 132) (vu1-enable-user vu1-renderer-mask :offset-assert 136) diff --git a/goal_src/jak2/engine/gfx/texture/texture.gc b/goal_src/jak2/engine/gfx/texture/texture.gc index 7b2519052..2a5966f61 100644 --- a/goal_src/jak2/engine/gfx/texture/texture.gc +++ b/goal_src/jak2/engine/gfx/texture/texture.gc @@ -389,7 +389,7 @@ additionally, some texture pages have a chunk system that allows more specific c ;; internally, the texture-pool has a bump allocator for vram. This assigns vram to various boot textures/segments -;; at boot time and isn't used at run-time. VRAM is often resued for multiple textures in a single frame, +;; at boot time and isn't used at runtime. VRAM is often resued for multiple textures in a single frame, ;; and the common segment does more complicated management at runtime. (defmethod allocate-vram-words! texture-pool ((obj texture-pool) (num-words int)) diff --git a/test/decompiler/reference/jak2/engine/draw/drawable_REF.gc b/test/decompiler/reference/jak2/engine/draw/drawable_REF.gc index a15a21bb0..5f927d91c 100644 --- a/test/decompiler/reference/jak2/engine/draw/drawable_REF.gc +++ b/test/decompiler/reference/jak2/engine/draw/drawable_REF.gc @@ -2114,7 +2114,7 @@ (let ((vysnc-progress (/ (the float (sar (- current-time (the-as uint prev-vblank-time-2)) 48)) ticks-per-frame-f)) (last-dog (fmax 1.0 (fmin 4.0 (-> *display* dog-ratio)))) ) - (set! (-> arg0 frames just-rendered-frame run-time) (the-as time-frame (the int frame-duration))) + (set! (-> arg0 frames just-rendered-frame run-time) (the int frame-duration)) (set! frame-time-ratio (cond ((-> arg0 run-half-speed) @@ -2191,9 +2191,9 @@ ) (let ((time-after-vsync (timer-count (the-as timer-bank #x10000800)))) (+! (-> arg0 total-run-time) - (the-as time-frame (sar (- (shl time-after-vsync 48) (the-as uint just-rendered-frame-start-time)) 48)) + (sar (- (shl time-after-vsync 48) (the-as uint just-rendered-frame-start-time)) 48) ) - (set! (-> arg0 frames frame-to-render start-time) (the-as time-frame time-after-vsync)) + (set! (-> arg0 frames frame-to-render start-time) (the-as int time-after-vsync)) ) (set-graphics-mode) (let ((next-dma-buf (-> arg0 frames frame-to-render calc-buf))) diff --git a/test/decompiler/reference/jak2/engine/entity/entity_REF.gc b/test/decompiler/reference/jak2/engine/entity/entity_REF.gc index 92a6d9cff..ddedb54f4 100644 --- a/test/decompiler/reference/jak2/engine/entity/entity_REF.gc +++ b/test/decompiler/reference/jak2/engine/entity/entity_REF.gc @@ -2346,12 +2346,7 @@ (update-actor-hash) (when (not (paused?)) (let ((s5-1 (-> *display* frames (-> *display* last-screen) run-time))) - (let ((f0-5 (fmax - 327680.0 - (fmin (+ 327680.0 (* 204.8 (the float (- (seconds 23.335) s5-1)))) (-> *ACTOR-bank* birth-dist)) - ) - ) - ) + (let ((f0-5 (fmax 327680.0 (fmin (+ 327680.0 (* 204.8 (the float (- 7000 s5-1)))) (-> *ACTOR-bank* birth-dist))))) (seek! (-> *ACTOR-bank* pause-dist) f0-5 (* 81920.0 (-> pp clock seconds-per-frame))) ) (seekl! (-> *ACTOR-bank* birth-max) (the int (lerp-scale 25.0 2.0 (the float s5-1) 2000.0 7000.0)) 10) diff --git a/test/decompiler/reference/jak2/engine/game/effect-control_REF.gc b/test/decompiler/reference/jak2/engine/game/effect-control_REF.gc index a2cf8ae65..325835b1c 100644 --- a/test/decompiler/reference/jak2/engine/game/effect-control_REF.gc +++ b/test/decompiler/reference/jak2/engine/game/effect-control_REF.gc @@ -590,10 +590,10 @@ ) (let ((a2-37 (-> *display* frames (-> *display* last-screen) run-time))) (cond - ((< (seconds 30) a2-37) + ((< 9000 a2-37) (set! a1-51 (* a1-51 4)) ) - ((< (seconds 23.335) a2-37) + ((< 7000 a2-37) (set! a1-51 (* a1-51 2)) ) ) diff --git a/test/decompiler/reference/jak2/engine/game/main_REF.gc b/test/decompiler/reference/jak2/engine/game/main_REF.gc index 9c9ad61bb..5a44b0d72 100644 --- a/test/decompiler/reference/jak2/engine/game/main_REF.gc +++ b/test/decompiler/reference/jak2/engine/game/main_REF.gc @@ -1793,8 +1793,8 @@ ) (suspend) (set! (-> *setting-control* user-default bg-a) 0.0) - (set! (-> gp-1 frames 0 start-time) (the-as time-frame (timer-count (the-as timer-bank #x10000800)))) - (set! (-> gp-1 frames 1 start-time) (the-as time-frame (timer-count (the-as timer-bank #x10000800)))) + (set! (-> gp-1 frames 0 start-time) (the-as int (timer-count (the-as timer-bank #x10000800)))) + (set! (-> gp-1 frames 1 start-time) (the-as int (timer-count (the-as timer-bank #x10000800)))) (set! (-> gp-1 dog-ratio) 1.0) (while *run* (display-loop-main gp-1) diff --git a/test/decompiler/reference/jak2/engine/gfx/hw/display-h_REF.gc b/test/decompiler/reference/jak2/engine/gfx/hw/display-h_REF.gc index 1e753cb57..403cc09c1 100644 --- a/test/decompiler/reference/jak2/engine/gfx/hw/display-h_REF.gc +++ b/test/decompiler/reference/jak2/engine/gfx/hw/display-h_REF.gc @@ -10,8 +10,8 @@ (global-buf dma-buffer :offset 40) (bucket-group (inline-array dma-bucket) :offset 44) (profile-array profile-array :inline :offset-assert 48) - (start-time time-frame :offset-assert 56) - (run-time time-frame :offset-assert 64) + (start-time int64 :offset-assert 56) + (run-time int64 :offset-assert 64) ) :method-count-assert 9 :size-assert #x48 @@ -78,8 +78,8 @@ (total-game-clock clock :offset 88) (time-factor float :offset-assert 92) (dog-ratio float :offset-assert 96) - (vblank-start-time time-frame 2 :offset-assert 104) - (total-run-time time-frame :offset-assert 120) + (vblank-start-time int64 2 :offset-assert 104) + (total-run-time int64 :offset-assert 120) (run-half-speed basic :offset-assert 128) (dog-count float :offset-assert 132) (vu1-enable-user vu1-renderer-mask :offset-assert 136)