Commit Graph

767 Commits

Author SHA1 Message Date
Jozufozu
506f2d5158 Unionized threads
- Allow the user to configure the number of worker threads
- Allow the user to disable parallelism entirely without a jvm flag
- Move thread count logic into FlwTaskExecutor and make
  ParallelTaskExecutor simply take a thread count as a parameter
2024-03-31 16:59:53 -07:00
Jozufozu
d5c5b998bc Cache deposits
- Make the scatter shader more cache friendly by doing one copy per
  workgroup and making copies up to 64 uints long
2024-03-31 16:08:12 -07:00
PepperCode1
2ee3944ca6 GLSL to the max
- Always compile with highest supported GLSL version
- Allow indirect shaders to compile with as low as GLSL 420
- Fix GL extension checks for indirect
- Explicitly initialize GlCompat as early as possible to avoid invalid
initialization off render thread
2024-03-31 15:53:23 -07:00
Jozufozu
08476b5779 Delicious words
- Check against totalAvailable in StagingBuffer#reserveForCopy
- Fixes garbage being rendered after uploading large amounts of data
2024-03-31 15:10:56 -07:00
Jozufozu
dfca589c5b Boundless changes
- Fix exception thrown uploading indirect instances when an instance was
  added in the same frame that the tail instance was deleted. We'd leave
  behind some set changed bits out of bounds of the instance list, and
  try to access those indices later
- Add out of bounds guards within forEachSetSpan, though I don't think
  they're actually necessary
- Add AtomicBitset#set and #clear range methods
- Update all changed bits at once when deleting instances rather than
  doing it in the loop
- Start iterating from the first set bit rather than 0 to save
  potentially thousands of iterations
- Smarter model index uploading
2024-03-31 12:56:01 -07:00
Jozufozu
395f4b1dfc Based crumbling
- Fix crumbling on instancing engine by passing a baseInstance uniform
2024-03-29 17:40:49 -07:00
Jozufozu
227d753e73 High noon
- Draw! meshes in contractual order on instancing engine
- Rename DrawSet -> InstancedRenderStage and consolidate associated code
  inside the class
- Re-use GroupKey between engines
- Sort instanced draws based on material and mesh index in model
- Make doCrumblingSort abstract on the instancer class and re-use it
  between engines
2024-03-29 16:33:06 -07:00
Jozufozu
96eb5ea47c Less omissions in mesh emission
- Cannibalize shade separated vertex consumer to function as the mesh
  emitter for baked model buffering
- Create one MeshEmitter per chunk RenderType to allow more coherency
  during multi block buffering
- MeshEmitters own BufferBuilders, and the buffering functions call
  #begin on the mesh emitters directly
- Each time the emitter sees a quad with a different shade flag than the
  previous run of quads, it emits a mesh and begins again
- Finally, the buffering functions call #end on the mesh emitters to
  emit trailing meshes and clear transient state
- Add diffuse debug mode
- Order indirect draws by mesh index first
- Remove non-shade separated option from buffering utilities because it
  allows you to opt in to incorrect behaviour
- Remove TessellatedModel
- Document mesh ordering contract in Model
2024-03-26 12:06:20 -07:00
Jozufozu
183ea1f0f8 Get reset visual
- Remove Visual#shouldReset and associated logic
- Instead, delete and add visuals when the level renderer is notified
  of a block state change (that has a block entity)
- This does remove some control from BEVs, but it greatly simplifies the
  API and API contract
2024-03-25 12:45:53 -05:00
Jozufozu
f0cbce0ae4 24w13oneSectionAtATime
- Hook into ClientChunkCache#onLightUpdate for light updates to be
  compatible with both vanilla and starlight at once
- Bump embeddium/occulus versions
- Move embedding uniform names to static finals and fix culling program
  complaining about missing uniform names
- Light minecart visuals on init
2024-03-25 11:26:36 -05:00
Jozufozu
5775eb863f Single file
- Upload instancers and model indices in separate loops in an
  IndirectCullingGroup
- Reset changed bitset and update last* in separate method
- Don't need to upload instances anymore if the model index changes
2024-03-24 15:30:22 -05:00
Jozufozu
ff7130c71c We need to go deeper
- Compose transformations of embeddings
- Make EmbeddedEnvironment abstract and move light stuffs into
  TopLevelEmbeddedEnvironment
- Add NestedEmbeddedEnvironment that only handles matrices, and tracks
  a parent EmbeddedEnvironment
- AbstractEmbeddedEnvironment handles most of the deletion/update logic,
  and also creates further NestedEmbeddedEnvironments
- EnvironmentStorage now only tracks environments and does not creat
  them.
2024-03-24 15:05:19 -05:00
PepperCode1
277597d6bf The uintification
- Store packed instances in a uint[] in indirect
  - Split the object buffer into an instance buffer and a model index
buffer
  - Rename StructInstanceComponent to SsboInstanceComponent
  - Expand abstraction in InstanceAssemblerComponent to allow both types
of instance assemblers to reuse per-element unpacking generation
- Separate FlwInstance struct generation into separate component,
InstanceStructComponent
  - Also inline LayoutInterpreter into this class
- Move necessary internal definitions for components from api_impl to
common components_header shaders
- Use the same api_impl shader between pipelines
2024-03-24 12:36:48 -07:00
Jozufozu
84515316a7 Smart lighting
- Do not delete light volume memory when invalidated. Keep the block
  around, and then use it again later when we collect more light
- Do not allocate fresh memory blocks when growing a light volume. Turns
  out self-blitting is perfectly fine since we always start from the
  volume's origin
- Inline BoxSet back into light volume. The precise tracking it did is
  no longer relevant now that the embedding api has been simplified
- Light volumes now directly
2024-03-22 13:42:47 -05:00
Jozufozu
cfe6f3901b Like a game of telephone
- Fix overlay via casting
- Saw cortex doing this in nvidium, and it seems obvious in hindsight
2024-03-08 16:06:24 -08:00
Jozufozu
e7a112d773 Embeddebug
- Simplify light invalidation api/impl
  - There are 2 use cases for invalidating collected light:
    - The embedding visual receives a light update
    - The embedding visual moves
  - In either case, it's in the visual's best interest to re-collect any
    light it might need, rather than relying on the impl to copy
    potentially outdated light.
  - Do not sample the light volume if no light is collected
- Improve debug modes
  - Calculate colors in the fragment shader to reflect any per-fragment
    material/embedding alterations to the vertex output
  - Fix light volume debug mode spewing rainbow seizure garbage
  - Add light color debug mode
2024-03-08 13:01:58 -08:00
Jozufozu
2b39b13744 Reset off offsets
- Fix frame uniforms reserving too much space
- Fix level uniforms reserving too little space
- Actually move flw_constantAmbientLight to level uniforms
2024-03-08 12:55:07 -08:00
Cyan
04e66cad59 Add More Uniforms (#231)
Squashed commit history:

* Add basic view.h matrices

* Add last values

* Add clean matrices

* Finish adding most view.h things to frame.glsl

* Document cameraIn- uniforms

* Add options uniform

* Begin on player uniforms

* Add more player uniforms

* Add level uniforms

* Fix uniform bindings

* Update options

* Fix offset alignments

* Add new uniforms to cull shader

* Fix simple things

* Make alpha 1 if team exists but does not have a color

* Fix mixin method names

* Provide all uniforms to cull shaders

* Move constant ambient light uniform to level group

* Level uniforms gets context from context

* Remove `clean` matrices for now
2024-03-05 16:42:51 -08:00
Jozufozu
8c5c89921d Collector's edition
- Track exactly what blocks are contained in a light volume via BoxSet
- Fix segfault when a volume is expanded
- Shrink the volume when enough data is discarded
  - I think the texture management is broken for this case
2024-03-03 21:36:59 -08:00
Jozufozu
e4df896710 Protect the environment
- Environment/Embedding ownership is complicated, reference counting to
  the rescue!
  - VisualEmbeddings are acquired on construction and deleted manually
  - Instancers acquire/delete their environments
  - EmbeddedEnvironment now has three (3) delete methods
- Add EnvironmentStorage to create, track, update, and delete
  environments
- Remove InstancingEngine/IndirectEngine and move shared logic to
  EngineImpl
  - There's probably more that can be done to make DrawManager cleaner
    now
2024-03-03 14:53:07 -08:00
Jozufozu
b90b80c8b0 Turn it up to 11
- Consolidate context shaders into the common shaders, guarded by ifdefs
- Make ContextShaders into an enum
- Cache shaders by name instead of SourceComponents so the defines for
  contexts actually get compiled
- Move all embedding stuff into backend.embed
- Cannibalize GPULightVolume into an api better suited for environments
- Separate light storage from 3d texture management
- Add #delete to Environment
- Add light volume debug mode
2024-03-03 13:14:41 -08:00
Jozufozu
5d142d2f13 Thought I'd need this
- Consolidate common logic from transfer list and scatter list into
  MemoryBuffer
2024-03-03 12:29:25 -08:00
PepperCode1
64aa8d4242 The end of issues with big endianness
- Fix unpacking of some layout elements (only for instancing)
  - All byte backed and short backed elements (incorrect assumption that
system is little endian)
  - All signed byte and signed short elements (missing sign extension)
  - Matrices with byte backed and short backed reprs in some cases
(incorrect assumption that matrix rows are 4 byte aligned)
  - IntegerRepr.INT scalar (invalid implicit cast)
  - FloatRepr.NORMALIZED_INT scalar (missing cast to signed int)
  - IntegerRepr.INT vector (invalid implicit cast)
  - FloatRepr.NORMALIZED_INT vector (missing cast to signed int)
  - FloatRepr.NORMALIZED_SHORT vector (incorrect divisor)
- Add explicit casts from uint to float since some drivers have a bug
where uint over float division is invalid
- Lower GLSL requirement of instancing from 420 to 330
- Fix lib instance writers assuming little endian when writing overlay
and light
- Move overlay clamping to vertex input shader and clamp to 15 instead
of 10
- Create abstract InstanceAssemblerComponent class
- Change return type of SourceComponent.name() to String and improve
implementations
2024-03-03 11:16:38 -08:00
PepperCode1
115aad3d40 Multi-improvements
- Make lib instance shaders multiply color value instead of overriding
it
- Improve MultiBlockModelBuilder
  - Accept an Iterable<BlockPos> instead of a
Collection<StructureBlockInfo> and assume all block state data is
already contained within the render world
  - Accept a Function instead of a Map as the model data lookup
  - Allow enabling fluid rendering (all rendered fluids are currently
unshaded)
- Refactor VirtualEmptyBlockGetter
  - Move elementary implementations into abstract VirtualBlockGetter
class
  - Extract virtual LevelLightEngine into separate VirtualLightEngine
class with ability to lookup light values per pos
  - Turn VirtualEmptyBlockGetter into a class and make all methods final
to ensure instances of this class are actually empty even if subclassed
- Make BakedModelBufferer class package private
- Remove unused VertexTransformations class
- Remove Experimental annotation from
VisualizationContext.createEmbedding
2024-02-29 16:25:20 -08:00
PepperCode1
c3307630b2 A different type of translation
- Display actual backend instead of preferred backend when checking
backend
- Remove engine message and use standard messages that display backend
ID
- Simplify command code
- Replace all literal components with translatable components
- Pass 1 instead of 0 for partialTick on tick
- Extract base AtomicReferenceCounted and ReferenceCounted abstract
classes
- Double buffer capacity instead of adding constant on resize in
VertexWriter
- Move Samplers class from backend.engine to backend
2024-02-28 21:41:16 -08:00
Jozufozu
c931e84b65 More simpler
- Remove Plan#simplify and associated tests
- Neat idea but ineffective in practice
- Should reduce the user burden of implementing plans
2024-02-28 21:23:47 -08:00
Jozufozu
bd70b89621 Backend into a corner
- Make VisualizationContext, InstancerProvider, VisualEmbedding all
  BackendImplemented
- Add Engine#createVisualizationContext
- Remove Engine#instancer and variants
- VisualEmbeddings are created by backends, and data will be pushed into
  them by visuals.
- VisualEmbedding extends VisualizationContext
- The implementation of VisualEmbedding also implements Environment
- Environment is an internal replacement for Context
- Instancers are keyed by Environments
- Default environment is a noop essentially
2024-02-26 18:41:55 -08:00
Jozufozu
4d216b6672 A sample of what's to come
- Clean up texture binder stuff that's no longer needed
- Move all sampler binding to program link time
- Centralize sampler bindings/names to Samplers
- Move diffuse, light, and overlay textures into the api
- Add builder for context shader
- Fix generated_indirect -> generated_instancing
2024-02-26 15:38:11 -08:00
Jozufozu
2c3b4c54ca Stay inline
- Inline all unnecessary context stuff
- Move ContextShaders into backend.compile
- Instancers are parameterized by a nullable VisualEmbedding
  - I don't like this, but the code currently compiles, so I want a
    checkpoint before I try my next idea
2024-02-26 14:50:58 -08:00
Jozufozu
e55d506511 Sanstexts
- Add EmbeddedLevel to api
- Move all context api/lib stuffs into backend
- Move context shaders into internal
- Inline Shader and TextureSource interfaces
- Move matrix bounding sphere transform into util
- Add uniforms to cull shader to allow it to work with embedded levels
- Engine has 2 instancer methods, one that accepts an EmbeddedLevel and
  one without the parameter
- Change VisualizationContext#withContext to #embed
- Remove crumbling stuff from Contexts
2024-02-25 15:42:20 -08:00
Jozufozu
94ae32b9a7 Burning a house to kill a spider
- Fix garbage indices on instancing engine
- glDrawElements* wants indices as a byte offset, we were giving it
  a word offset
- Rename BufferedMesh -> PooledMesh
- PooledMesh no longer stores things it can fetch from the inner mesh
- Use one vao for all drawcalls in instancing engine
- PooledMesh issues *BaseVertex calls
- Move crumbling logic into InstancedDrawManager
- Move programs acquisition into InstancedDrawManager
- Move owned gl objects into InstancedDrawManager
2024-02-25 12:40:39 -08:00
Jozufozu
dd998058a3 Many to many
- Models now return a list of ConfiguredMeshes, i.e. mesh-material pairs
- BufferedMeshes now poll the index pool as needed
- Inline BufferedMesh#write
2024-02-24 17:25:01 -06:00
Jozufozu
d6abe89828 Finally room to breathe
- Expand packed overlay_light attribute into components
- Make light a short backed vec2
- Divide light input by 256 directly instead of discarding lower bits
- Remove debug overlay enum, instead only use OVERRIDE
- Add overlay debug mode
2024-02-22 14:33:57 -06:00
Jozufozu
a504aa1862 Hot links
- Do not specify layout qualifier for vertex attributes
- Bind attribute locations before linking programs
- Delete gl programs when linking fails
2024-02-22 14:02:16 -06:00
Jozufozu
c6ed7c4132 Textures your buffer
- Use texture buffers instead of instanced arrays
- Fixes issues with instance layouts using int elements
- Fixes attribute binding hardware limitations
- Create one texture for the entire instancing engine and bind each
  instancer's vbo when it's time to draw
- Generate glsl to fetch FlwInstances from a usamplerBuffer according to
  the instance layout
- Use RGBA32UI to get the most data from each texel fetch
- Align instance stride to 16 to avoid complexity in unpacking
2024-02-22 13:46:11 -06:00
Jozufozu
17130e22ea Underlay
- Clamp overlay from 0 to 10 rather than 3 to 10 to fix everything
  appearing washed out
- Fix normalized short backed float vectors being unpacked incorrectly
- Set overlay in shadow instance component to fix shadows appearing red
  - Indicative of the ivec issue being present for divisor 0 vertex
    attributes
2024-02-22 12:31:29 -06:00
Jozufozu
1dee5db9a1 Debugging broken overlay/lighting
- Break instance overlay/light back into 2 layout elements
- Write light directly as an int
- Make light a short backed float element
- Clamp overlay coords in common.frag to avoid explosions
- Explosions: integer vertex attributes sometimes blow up to massive
  sizes, greater than Short.MAX_VALUE which should not be possible.
- Reorganize some texture/uniform binding code
2024-02-21 12:37:46 -06:00
Jozufozu
aac12754cc Buffer buffers
- Do not map buffers
- Strip down GlBuffer, so it only contains upload methods
- Remove buffer mapping and copy wrappers
- Add subdata wrapper
2024-02-21 09:29:27 -06:00
Jozufozu
c61feb1c14 Cool and normal
- Reimplement normal debug mode
- Add debug mode for instance ID and light coordinates
- Pass an id into _flw_main
- Allow specifying how the debug color is applied, not sure if I want
  to keep it though
- Do not store the debug mode in config
2024-02-21 09:29:23 -06:00
Jozufozu
c4dcebb203 Pool party!
- Move index buffer logic into IndexPool class, should let us avoid
  unnecessary uploads and make it easier to manage
2024-02-20 11:09:39 -06:00
Jozufozu
aa46f6ceb1 A mesh unbound
- Clear a mesh's set of bound vaos when it's uploaded
- Fixes visual glitches on instancing when removing instances
2024-02-20 10:46:30 -06:00
Jozufozu
068692b4b9 Finding some common ground
- Make MeshPool common between instancing and indirect
- Remove empty instancers and delete meshes on indirect
- Inline IndirectModel into IndirectInstancer since it was basically
  just a thin wrapper
- Share one meshpool between all culling groups
- Always upload draw commands because the mesh may have moved
- No longer need to set the base instance in the apply shader
2024-02-19 16:51:11 -06:00
Jozufozu
e9eb468de9 Eviction notice
- For instancing, remove empty instancers and delete meshes
- Specify in InstancerProvider's contract that instancers should not be
  kept around, but reusing them within one frame in guaranteed to be
  safe
- Do all instancer updates in flush, and remove unnecessary checks that
  would be made later in the frame
- Remove isEmpty from Mesh
- Remove staging buffer param from indirect mesh pool
2024-02-19 10:53:52 -06:00
Jozufozu
456b8b66fe Unbuffers your data
- Fix null check in BakedModelBufferer
2024-02-18 17:05:17 -06:00
Jozufozu
db696f5975 No hacks here no sir
- Add VisualizationContext#withContext to formalize the way contexts are
  "pushed"
- Also push a render origin so contexts have better control over
  visuals' positions
- Make InstancerProvider NonExtendable
2024-02-18 15:27:41 -06:00
Jozufozu
55a88a89bd Revert "Apply directly to the engine!"
This reverts commit f3a88c25d5.
2024-02-18 14:05:24 -06:00
Jozufozu
53c732c3f6 Internalize
- Make *Programs#setInstance package private
2024-02-18 12:06:50 -06:00
Jozufozu
31f4ffe354 Spring cleaning
- Move PlanStorage to lib as PlanMap and add documentation
- Remove FastPlanStorage in favor of ForEachPlan
- Move plan distribution next to other distribution methods
- Rename PlanUtil -> Distribute
2024-02-18 12:03:07 -06:00
Jozufozu
e5a0e35141 Apply directly to the engine!
- Move Engine#intancer to DirectInstancerProvider interface
- InstancerProvider allows access to the DirectInstancerProvider it's
  wrapping. This is to allow mods to change the context or RenderStage
  if they need
- Mark new methods and interfaces as experimental
- Should we mark them for removal in version 2?
- Remove NonExtendable from some context interfaces
2024-02-17 11:36:43 -07:00
Jozufozu
dcecc9672d Plans all the way down
- Remove PlannedVisual
- Dynamic/Tickable visuals create plans
- Add Simple*Visual to lib to replace the old api interfaces
- Better dynamic plan storage, no need to optimize on every change
- Special case the Simple*Visuals in Storage as to not lose performance
- Needs better documentation
- Add RunnablePlan
2024-02-16 21:17:17 -08:00