1
0
Fork 0
mirror of https://github.com/bjornbytes/lovr.git synced 2024-07-04 13:33:34 +00:00
Commit graph

136 commits

Author SHA1 Message Date
bjorn 9a276e5f9a Tally fixups;
- rm :getTallyData, it's totally lame, just do a readback
  - rm gpu_tally_get_data too, webgpu doesn't support it anyway
- Clamp tally copy count so it doesn't overflow buffer
- Tally buffer offset's gotta be a multiple of 4
- Return nil instead of 2 values when tally buffer isn't set
- Copy correct number of tallies (multiply by view count instead of max
  view count)
- Skip occlusion queries entirely if no tally buffer was set
2023-10-02 10:20:52 -07:00
bjorn f66ac0820c Fix Android probably; 2023-09-20 21:17:24 -07:00
bjorn 479983fede gpu: surface improvements;
Restores ability to open window after initializing graphics module.

Surface is created lazily instead of being required upfront.

Use native platorm handles instead of GLFW's callbacks.

Some minor reorganization around core/gpu present API and xr transitions.

Linux links against libxcb/libX11/libX11-xcb for XGetXCBConnection.
2023-09-20 21:17:24 -07:00
bjorn f318c68796 Buffers can be cleared to values other than zero; 2023-09-18 23:05:27 -07:00
bjorn dabbd449a8 Format support considers both linear/srgb encodings; 2023-07-10 19:21:11 -07:00
bjorn 22202af27f Revert "gpu: prefer rgb10a2 for window swapchains;"
This reverts commit b7a00c82d1.

I think srgb-encoded rgb10a2 swapchains require manual gamma correction
in shaders (?!), which we aren't quite ready for yet because shaders don't
know the "color space" of their canvas textures.
2023-07-08 15:47:58 -07:00
bjorn b7a00c82d1 gpu: prefer rgb10a2 for window swapchains;
We don't support transparent desktop windows, so losing alpha bits is fine.
2023-07-08 15:02:42 -07:00
bjorn 313fc953cc Pass:append;
Copies draws from one pass onto another one.  Experimental.
2023-06-09 21:34:39 -07:00
bjorn f90cd237ca Add new occlusion query API; 2023-05-03 23:08:45 -07:00
bjorn 28553dda9f core/gpu: skip texture allocator init for unsupported formats;
Should avoid erroneous errors during init for devices that don't support
all the depth formats.
2023-05-03 21:00:41 -07:00
bjorn 452ee5c7c6 Pass rework;
Pass stores draw commands rather than sending them to Vulkan
immediately.

The main motivation is to allow more flexibility in the Lua API.  Passes
are now regular objects, aren't invalidated whenever submit is called,
and can cache their draws across multiple frames.  Draws can also be
internally culled, sorted, and batched.

Some API methods (tallies) are missing, and there are still some bugs to
fix, notably with background color.
2023-05-02 00:06:01 -07:00
bjorn f98306e786 rm transfer passes; rm Tally for now;
- Add Buffer:newReadback
- Add Buffer:getData
- Buffer:getPointer works with permanent buffers
- Buffer:setData works with permanent buffers
- Buffer:clear works with permanent buffers
- Add Texture:newReadback
- Add Texture:getPixels
- Add Texture:setPixels
- Add Texture:clear
- Add Texture:generateMipmaps
- Buffer readbacks can now return tables in addition to Blobs using Readback:getData

Tally is coming back soon with an improved API, it's temporarily removed
since it made the transfer rework a bit easier.

Note that synchronous readbacks (Buffer:getData, Texture:getPixels)
internally call lovr.graphics.submit, so they invalidate existing Pass
objects.  This will be improved soon.
2023-04-29 18:31:03 -07:00
bjorn b402745f6c Update comment; 2023-04-27 19:52:24 -07:00
bjorn b64fdc937f Move mapped buffers from core/gpu into graphics module; 2023-04-27 19:48:12 -07:00
bjorn cb44549205 Fix more prototypes; 2023-04-25 21:45:30 -07:00
bjorn ad4978f692 Fix prototypes; 2023-04-25 21:37:14 -07:00
bjorn 6a030ef4f2 Add shader debug info when t.graphics.debug is set; 2023-04-19 20:49:34 -07:00
bjorn ba0412182b gpu: nickname shaders; 2023-04-05 21:53:39 -07:00
bjorn 086aef1a79 Convert pipeline type bool into enum;
It's a little more readable.
Also batch compute passes for models with multiple skins, since they can
all run at the same time.
2023-03-31 18:44:31 -07:00
bjorn 06c150ce4e Pass:setBlendMode/Pass:setColorWrite take optional target index;
If the target index is missing, the state will apply to all targets.
Fixes undefined behavior when setting color state in a pass with
multiple color attachments.
2023-02-05 15:07:33 -08:00
bjorn 017c2136fd Merge branch 'master' into dev 2023-01-24 18:36:27 -08:00
bjorn 4e01f84070 Depth resolves;
- Allow multisampled render pass to have a single-sample depth attachment
- Add a new depthResolve feature, indicating whether it's supported
- Fix stencil load/save
- Minor changes to render pass caching
- Currently the depth resolve is done using the first sample.  A future
  improvement would be to expose/use the min/max/average resolve modes.
2023-01-22 23:30:57 -08:00
bjorn b24350fb31 gpu: macOS also tries linking to MoltenVK; 2023-01-21 15:27:14 -08:00
bjorn 5bb3f50d77 gpu: enable VK_EXT_swapchain_colorspace when available; 2023-01-20 22:02:32 -08:00
bjorn 14610333ab gpu: reduce tick count to 2;
4 is likely excessive, especially for VR, and increases memory usage and
cache misses.
2023-01-18 17:58:28 -08:00
bjorn 32cc6d52e7 gpu: cleanup;
- Surface stuff in struct;
- Struct for extensions;
2023-01-18 17:57:03 -08:00
bjorn ad76d2c0c6 gpu: Require and use VK_KHR_create_renderpass2;
It's pretty much ubiquitous and is needed for depth resolves.
2023-01-16 16:25:39 -08:00
bjorn b6d8546a6f Merge branch 'master' into dev 2023-01-02 16:46:55 -08:00
bjorn 58c5f0624e Fix for vk portability extension;
- Always enable when supported.
- It's not required to be enabled, even if portability_enumeration is present.
2023-01-01 05:03:05 -08:00
bjorn ae4a75eecd Shift around Vulkan initialization;
Start to make it easier to declare extensions, mark them as required,
and detect whether they're supported at runtime.
2022-12-31 17:42:51 -08:00
bjorn e12563ad25 Merge branch 'master' into dev 2022-12-16 21:21:05 -08:00
bjorn 98b5fcfd20 Improve Vulkan error messages;
Instead of printing the raw Vulkan error printed, a friendly error
message gets printed out with the Vulkan error in parentheses.
2022-12-04 01:58:53 -08:00
bjorn 3553982bad gpu: rm GPU_STAGE_ALL;
It wasn't very useful and probably doesn't do what was intended.
2022-12-03 15:02:55 -08:00
bjorn efc81e4cec Fix some gcc warnings; 2022-12-03 01:20:02 -08:00
bjorn e2c73edabb Clear GPU memory pointer later; 2022-11-27 20:51:11 -08:00
bjorn 72ecd9cb04 Fix issue recycling GPU memory blocks;
When a memory block is used for host-visible memory, its mapped pointer
is tracked with the block.  If that memory is freed and later re-used
for some non-mappable memory, the pointer never gets cleared, and so
code thinks the memory is mappable and tries to use the pointer.
2022-11-27 19:55:27 -08:00
bjorn 0c966ba216 gpu: destroy readback scratchpads properly; 2022-11-21 19:42:13 -08:00
bjorn be3faf8822 Fixes for Vulkan initialization; 2022-11-17 20:32:24 -08:00
bjorn 3879ce926d Improve Vulkan initialization;
- Check for layers before enabling
- Check for instance/device extensions before enabling

Fixes unfriendly errors when running on a system without validation layers
installed.

Uses same table approach as OpenXR code.
2022-11-16 20:21:03 -08:00
bjorn 9783140725 Fix window resize; 2022-11-09 19:05:01 -08:00
bjorn 3775ed1be6 gpu: use distinct allocator/memory for staging buffers;
Fixes easily-encounterable GPU OOM on discrete cards.

Currently when mapping CPU-accessible GPU memory, there are only two
types of memory: write and read.

The "write" allocations try to use the special 256MB pinned memory
region, with the thought that since this memory is usually for vertices,
uniforms, etc. it should be fast.

However, this memory is also used for staging buffers for buffers and
textures, which can easily exceed the 256MB (or 246MB on NV) limit upon
creating a handful of large textures.

To fix this, we're going to separate WRITE mappings into STREAM and
STAGING.  STREAM will act like the old CPU_WRITE mapping type and use
the same memory type.  STAGING will use plain host-visible memory and
avoid hogging the precious 256MB memory region.

STAGING also uses a different allocation strategy.  Instead of creating
a big buffer with a zone for each tick, it's a more traditional linear
allocator that allocates in 4MB chunks and condemns the chunk if it ever
fills up.  This is a better fit for staging buffer lifetimes since there's
usually a bunch of them at startup and then a small/sporadic amount
afterwards.  The buffer doesn't need to double in size, and it doesn't
need to be kept around after the transfers are issued.  The memory
really is single-use and won't roll over from frame to frame like the
other scratchpads.
2022-11-09 19:05:01 -08:00
bjorn b047daa712 gpu: only set portability enumeration flag if extension is enabled;
There's a "portability enumeration" extension and flag you have to set
to get Vulkan to work on macOS.  If you don't set it, Vulkan hides the
MoltenVK runtime since it's not 100% conformant.  The flag was added
unconditionally, but it needs to only be added when the extension is
active.
2022-11-09 17:22:42 -08:00
bjorn c021fc40ef gpu: fix memory type selection;
When a fallback memory type is found, don't skip the check for a perfect
match.
2022-11-06 11:19:33 -08:00
bjorn 64591c02ed gpu: Also try to load libvulkan.so.1;
Some systems don't have libvulkan.so
2022-10-24 22:12:54 -07:00
bjorn 1a12904800 Fix gpu_release; rm morgue flush; increase morgue size;
- When a memory block was freed, any allocators that were using it need
  to null out their memory blocks.  Otherwise it would just keep using
  the freed block.
- The emergency morgue expunge doesn't work.  It would be nice if it
  did, but if the emergency expunge deletes an object that exists in a
  command buffer that's still being recorded, it causes all kinds of
  problems and corrupts the command buffer.  You'd either need to submit
  these command buffers early before deleting the object (this is super
  tricky) or just prevent this entirely, maybe by growing the morgue
  infinitely or throwing an error if it fills up.  Either way, creating
  and releasing textures in a loop without submitting work will
  eventually throw an 'out of memory' error.  None of this is
  satisfactory and I'm not sure how to solve this well yet.
- To compromise, increase the size of the morgue a bit so emergency
  flushes happen slightly less often.
2022-10-20 20:21:55 -07:00
bjorn 0b6fe9c81a Fix off-by-one error in gpu allocator;
Refcount wasn't being initialized to 1.
2022-10-18 22:28:14 -07:00
bjorn 93b465bd1f gpu: Use portability extensions when needed;
This makes newer versions of macOS load Vulkan properly.
2022-10-15 00:45:46 -07:00
bjorn 82dc3cc920 Fix multiview limit;
When multiview is not supported (although technically lovr requires it),
the renderSize limit for array layers was zero, which meant no render
passes would work.  Instead, make sure it's at least 1, which is more
correct.
2022-10-12 10:37:58 -07:00
bjorn 272893fe66 Use correct array length for depth range; 2022-09-28 19:16:55 -07:00
bjorn 68f3610d5e Fix stencil test; 2022-09-12 17:58:29 -07:00