Commit graph

153 commits

Author SHA1 Message Date
Jozufozu
afdab92010 Merge branch '1.20/last-frame-visibility' into 1.20/dev
# Conflicts:
#	common/src/backend/java/dev/engine_room/flywheel/backend/compile/IndirectPrograms.java
#	common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/BufferBindings.java
#	common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/DepthPyramid.java
#	common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectBuffers.java
#	common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectCullingGroup.java
#	common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDraw.java
#	common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDrawManager.java
#	common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectInstancer.java
#	common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/ObjectStorage.java
#	common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FrameUniforms.java
#	common/src/backend/resources/assets/flywheel/flywheel/internal/common.frag
#	common/src/backend/resources/assets/flywheel/flywheel/internal/common.vert
#	common/src/backend/resources/assets/flywheel/flywheel/internal/indirect/buffer_bindings.glsl
#	common/src/backend/resources/assets/flywheel/flywheel/internal/indirect/cull.glsl
#	common/src/backend/resources/assets/flywheel/flywheel/internal/indirect/downsample.glsl
#	common/src/backend/resources/assets/flywheel/flywheel/internal/indirect/downsample_first.glsl
#	common/src/backend/resources/assets/flywheel/flywheel/internal/indirect/downsample_second.glsl
#	common/src/backend/resources/assets/flywheel/flywheel/internal/indirect/main.vert
2024-10-18 12:09:05 -07:00
Jozufozu
40577420d5 In the right direction
- Use vanilla light directions for diffuse lighting
- Copy mc's glsl code for it, but assume directions are normalized
- Add command/config to toggle use of light directions vs chunk accurate
  diffuse
- Always use shade in getItemMaterial
- Do not reload resource packs when updating light smoothness config,
  we don't need to anymore with lazy compilation
2024-09-29 11:52:35 -07:00
Jozufozu
22b5676e47 Quick thinking
- Decide not to render entities directly in the renderEntity method
- Prevents allocating large lists every frame to filter entities from
  the client level
2024-09-28 23:37:49 -07:00
Jozufozu
0a01b82647 Glimpse of glint
- Add pick glint material and system time uniform
- Move _FlwCullData to beginning of uniform block to ensure alignment
- Add helper to convert item rendertype into flywheel material
2024-09-28 23:27:28 -07:00
Jozufozu
bd0aadf9d9 Streamlined pipelines
- Make UberShaderComponent#build NotNull
- Move index update and key creation logic to PipelineCompiler
- Always update index when a resource location is requested to fix
  MaterialEncoder misses
- Indices trigger pipeline compiler deletion when updated
2024-09-28 22:05:38 -07:00
Jozufozu
ef05f7d3fd Errors galore
- Make everything in the compiler chain's results not null
- Throw errors immediately when encountered
- Log error messages when falling back
- Do not eagerly grab utility programs in IndirectDrawManager so we can
  actually catch errors and fall back
- Remove CompilerStats
2024-09-28 16:00:23 -07:00
Jozufozu
11ce4ac185 Dynamic ubering
- Remove fog shader registry
- Remove Registry and RegistryImpl
- Make shader indices mutable
- Track fog uber component in a static field in PipelineCompiler
- When a new fog source is added, delete the pipeline compilation
  harness and recreate the fog uber component
- Inline SourceLoader
2024-09-28 15:30:10 -07:00
Jozufozu
bce657804a Source of all pain
- Strip out almost all source registries
- Fog will be dealt with in a follow-up commit
- Remove most static #init methods
- Remove old ubershader indices from shaders
2024-09-28 14:48:22 -07:00
Jozufozu
48fdcdb751 DeDelleetete
- Process instancer deletions in parallel
- Give DrawManagers a frame plan
2024-09-28 14:26:15 -07:00
Jozufozu
7bd59f7b14 Not pointing
- Fix occasional npe in PlayerUniforms
- Mark accessor method as Nullable
2024-09-23 11:16:45 -07:00
Jozufozu
36b0ad4cf9 To bug or not to bug
- Disable the debug stuff in the frag shader with compile flags
- Also disable discard and conservative depth with CutoutShaders.OFF
2024-09-22 15:51:37 -07:00
Jozufozu
897c350f41 Uberstate ready
- Fix material state sorting/equality functions
2024-09-22 13:13:38 -07:00
Jozufozu
ff73e78e21 Visions of visibility
- Add visible/skipDraw getter/setter to InstanceTree
- Minecart finally gets to resolve its TODO!
2024-09-22 13:04:51 -07:00
Jozufozu
ee0f799f60 More statefuler
- Hidden state now tracks the Instance object to keep the handle small
- Make the recreate supplier an explicit record to allow comparisons
- Add setVisible method to Instance
2024-09-22 12:56:49 -07:00
Jozufozu
c5d9abab5f Tasteful stateful handles
- Use state machine interface in InstanceHandleImpl
- 3 states: deleted, visible, hidden
- Visible is directly implemented by AbstractInstancer
- Hidden stores the instancer supplier to recreate an instancer
2024-09-22 12:28:35 -07:00
Jozufozu
6a6d98c0a7 Fewber
- Do not uberize material or cutout shaders
- Add debug log for shader compilations/program links
2024-09-21 15:10:27 -07:00
Jozufozu
27e5b609af Reject eagerness return to lazy
- Eagerly load ALL shaders in ShaderSources, resolving imports there
- Compile and cache programs on-demand
- Move gl state try blocks to EngineImpl
- EngineImpl catches shader exceptions and triggers a fallback
2024-09-21 13:41:55 -07:00
Jozufozu
cb58f6075e Crumbling grumbling
- Fix crumbling on indirect
- Directly use the baseInstance as instance index without indirection
- #define base instance and draw id variables to simplify usage
- Fix null pointer looking up culling group
- Add method to map an instancer's local instance index to a global
  index in the page file
2024-09-21 12:00:09 -07:00
Jozufozu
b7b7cca992 Happy as a clamp
- Fix instances vanishing close to the edge of your screen
2024-09-20 20:07:38 -07:00
Jozufozu
40cfc08025 Mul-ing things over
- Add missing multiply functions to TransformedInstance
2024-09-20 19:28:27 -07:00
Jozufozu
90e088aedc Creation is change
- Indirect instancers mark pages as changed when instances are added
2024-09-20 19:14:50 -07:00
PepperCode1
5b6463b8f1 Regularly scheduled maintenance
- Remove ModelHolder and ModelCache
- Remove lib/util.FlwUtil
- Remove lib/util.Pair and replace usages with com.mojang.datafixers.util.Pair
- Remove lib/util.Unit and replace usages with net.minecraft.util.Unit
- Make ResourceReloadHolder and ResourceReloadCache final and move to util
- Clean up code in backend/glsl
- Move LightSmoothnessArgument to impl
2024-09-19 20:24:58 -07:00
PepperCode1
62a0954381 Home alone
- Remove LoweringVisitor
- Move functionality of four main static methods in LoweringVisitor to new ModelTrees class
  - Return ModelTree directly
  - Accept Material instead of TextureAtlasSprite for efficiency, so visuals don't need to look up the sprite to get the ModelTree
- Use ResourceReloadCache for MeshTree.CACHE
2024-09-19 11:40:41 -07:00
Jozufozu
5a75fe972f First try
- Implement instance hiding by deleting/stealing
- Work around instancer persistence by storing a recreation supplier in
  the instance handle
- Rework instancer ctors to just take an InstancerKey
- Parameterize InstanceHandle by I extends Instance so the steal method
  and the supplier can be safely assigned
2024-09-18 23:43:23 -07:00
Jozufozu
e1b594ac47 Ctrl + Alt + N
- IndirectInstancer#uploadInstances: 46% of render thread to 26%
- Inline #enqueueCopy to avoid allocating LongConsumers
- Do not even bother to track individual changed indices, instead rely
  on just the changedPage set
2024-09-15 21:29:00 -07:00
Jozufozu
c658b2bfe3 Pop! Goes the storage
- Trigger an upload when an allocation is deleted
2024-09-15 16:50:02 -07:00
Jozufozu
9f938e0673 A slap on the wrist
- Add restrict qualifier to images in downsample shaders
- Early out when there are no changed pages in
  IndirectInstancer#uploadInstances
2024-09-15 16:37:12 -07:00
Jozufozu
d342ae740c Get shulked
- Convert ShulkerBoxVisual to use InstanceTree
- Add "pruning" helper visitors
- Remove ModelPartConverter
- Remove TextureMapper and related code from VertexWriter
2024-09-15 15:29:09 -07:00
Jozufozu
31b3507d62 One big happy family
- Add ModelTree
- Add LoweringVisitor to traverse a MeshTree and emit ModelTree nodes
  and Models
- Provide some default visitor creation methods
- Abstract ModelCache -> ResourceReloadCache
- Abstract ModelHolder -> ResourceReloadHolder
- Add ModelTreeCache to hide lookup cost if it gets extreme
2024-09-15 14:49:33 -07:00
PepperCode1
904933e22e Treeify bells and minecarts
- Use InstanceTrees in BellVisual and MinecartVisual
- Use JOML Matrix4fStack instead of PoseStack
- Directly transform Matrix4f instead of using PoseStack to compute initial pose
2024-09-15 13:27:08 -07:00
Jozufozu
ed727e7a1b Things are changing
- Track if the transforms for an InstanceTree have changed
- Pass a boolean down the tree and || it with our changed flag to force
  updates
- Expose the force flag to visuals so they can hint to us if their root
  transforms never change
- Add 2 wrapper methods to make the distinction more clear
2024-09-15 00:28:10 -07:00
Jozufozu
5299571540 A little encapsulation goes a long way
- Encapsulate instancerProvider and renderOrigin in AbstractVisual
- Saves 8 bytes per visual
2024-09-14 22:46:06 -07:00
PepperCode1
b24e87262b Stackless
- Store a pose matrix in each InstanceTree, equivalent to its instance's pose matrix if the instance exists
- Directly transform the current InstanceTree's pose matrix instead of transforming a PoseStack and copying its matrix to the instance, eliminating the need to push and pop stack entries
- Remove InstanceTree.rotation
- Add more InstanceTree methods to allow full inspection of children
2024-09-14 22:37:48 -07:00
Jozufozu
41e0aa6bba Strike a pose
- Rename TransformedInstance -> PosedInstance
- Add TransformedInstance, which does not have a normal matrix
- Use mat3(transpose(inverse(i.pose))) in the vertex shader, but for
  most cases that will be overkill
2024-09-14 21:46:49 -07:00
Jozufozu
6f2b8fd3fb Shiver me timbers
- Use arrrays in the trees
- MeshTree tracks parallel arrays of children and keys
- InstanceTree tracks which mesh tree it came from for lookup purposes
- Remove walker object
- Make RecyclingPoseStack use add/removeLast instead of push/pop
2024-09-14 19:38:55 -07:00
Jozufozu
5ffddeb221 Walk this way
- Update instances using a walker object created at the top level
2024-09-14 17:46:54 -07:00
Jozufozu
ed35c5a429 Reduce and reuse
- Create subclass to recycle PoseStack.Pose objects
- Add mixin/liblink to access a PoseStack's inner deque
2024-09-14 16:50:02 -07:00
PepperCode1
295ebc7573 Treefactors
- Add MeshTree and InstanceTree
- Deprecate ModelPartConverter for removal
- Refactor ChestVisual to use InstanceTree
- Combine double chest light in ChestVisual
2024-09-14 15:00:27 -07:00
Jozufozu
ddb0450105 Rapid descent
- Implement single (but actually 2) pass downsampling
2024-09-14 14:12:14 -07:00
Jozufozu
a527af513f Harvesting
- Cherry-pick misc cleanups from last-frame-visibility
- Smarter multibind logic
- Make offsets in IndirectBuffers dependent on BufferBindings
- Organize buffer bindings based on where they're used to allow each
  pass to bind exactly which buffers it needs
- Use DSA for the depth pyramid
- Pass the map of util programs to IndirectPrograms rather than
  unpacking them individually
- Actually delete all the indirect utils
2024-09-14 14:04:50 -07:00
Jozufozu
f009cb846c Near stability
- Fix near plane rejection logic
- Fix lod clamp
2024-09-14 12:55:05 -07:00
Jozufozu
6c1fbf610d The depths of the rabbit hole
- Fix mip levels being half the size they should be
- Use the next lowest po2 from the main render target size for mip 0
- Map from dst texel to src texel rather than naively multiply by 2
- Clamp the estimated mip level in the cull shader
- Use texel fetches in the cull shader (not sure if necessary?)
2024-09-14 12:55:04 -07:00
Jozufozu
01a7936a05 Joining the occult
- Implement hi-z occlusion culling
- Generate depth pyramid just before issuing cull dispatches
- Currently use raw texel fetches but this may be causing loss
- Add _flw_cullData to frame uniforms
2024-09-14 12:55:03 -07:00
Jozufozu
81cb2340e7 The hardest problem
- Rename most InstancePager terminology
- Rename MODEL_INDEX buffer stuffs
2024-09-14 12:55:03 -07:00
Jozufozu
b5680a0fd6 On-call paging
- Only update the page table when an allocation is resized
- Only upload the page table after it's uploaded
- Combine various setters for InstancePager.Allocation and
  IndirectInstancer
- Free pages when an allocation is deleted
2024-09-14 12:55:02 -07:00
Jozufozu
637f0538fc Growing pains
- Fix bit logic on the GPU
- Manually manage the size of the storage and pageTable buffers
- Make object2Page and page2Object static
- Fix instance writing loop
- Fix page table always having full pages
- Fix allocations not shrinking
2024-09-14 12:55:01 -07:00
Jozufozu
0af1127745 Paging Dr. Instancer
- Goal: avoid needing to re-upload everything when instance count for
  one instancer changes
- Solution: store instances in pages of 32
- Allocate pages in a GPU arena
- Store one uint per page to indicate which model the instances in the
  page belong to, and how many instances are actually stored in the page
- Instancers eagerly allocate and free pages as their instance count
  changes
- Instancers will not necessarily store instances contiguously anymore,
  but that's okay because any given cull workgroup will only reference a
  single page
- Culling threads *will* write instances contiguously however, and so we
  still need to keep track of a base instance per instancer, and the
  target buffer logic does not change
2024-09-14 12:55:01 -07:00
Jozufozu
ba3d84b5ae Seeing blue
- Optimize read visibility by having each invocation read a 2x2 area and
  coalescing atomicOrs when all 4 texels are equal
- Also use the fancy remap function for better texture cache locality
2024-09-13 22:40:10 -07:00
Jozufozu
0151364b8a Clear for debugging
- Nsight explodes with the scatter shader resetting the indirect
  dispatch buffer
- Instead, issue a clear buffer and buffer update barrier
2024-09-13 22:40:10 -07:00
Jozufozu
861009ed11 Rapid descent
- Implement single (but actually 2) pass downsampling
2024-09-13 22:40:09 -07:00