Billy Laws
7b4da52445
Add a fast binding sync path for when only one cbuf has changed
...
SMO implements instanced draws by repeating the same draw just with a different constant buffer bound. Reduce the cost of this significantly by detecting such cases and instead of processing every descriptor, copy the previous descriptor set and update only the ones affected by the bound constant buffer.
Credits to ripinperiperi for the initial idea and making me aware of how SMO does these draws
2022-11-02 17:46:07 +00:00
Billy Laws
89edd9b303
Reset megabuffer binding for disabled vertex buffers
2022-11-02 17:46:07 +00:00
Billy Laws
6a1615a104
Expose color and depth attachments to Draw
2022-11-02 17:46:07 +00:00
Billy Laws
aae957819e
Simplify BufferView locking by requiring buffer manager be locked
...
Avoids the need to repeat the lookup after locking since recreations are impossible if buffer manager is locked.
2022-11-02 17:46:07 +00:00
Billy Laws
9449b52f36
Reduce minimum megabuffer alignment to 128 bytes
2022-11-02 17:46:07 +00:00
Billy Laws
b3cf9c40ba
Update megabuffer execution/sequence numbers after updating an allocation
2022-11-02 17:46:07 +00:00
Billy Laws
4b2b6fc6e9
Avoid calling SynchronizeGuest when attempting to megabuffer unless necessary
2022-11-02 17:46:07 +00:00
Billy Laws
e5919e84a1
Pipeline state if statment cleanups
2022-11-02 17:46:07 +00:00
Billy Laws
bf536aa168
Sync pipeline descriptors every draw
2022-11-02 17:46:07 +00:00
Billy Laws
9223d7f524
Fix descriptor initialisation order
...
They need to be setup before the pipeline is created to avoid passing in garbage data.
2022-11-02 17:46:07 +00:00
Billy Laws
4652cc5a0a
Avoid parsing descriptors for disabled shader stages
2022-11-02 17:46:07 +00:00
Billy Laws
3456fb39fa
Fix pipeline to shader stage conversion when filling in shader infos
...
The two vertex pipeline stages need to be both treated as a single stage, and all subsequent stages need to be offset by -1
2022-11-02 17:46:07 +00:00
Billy Laws
a9213debc7
Implement constant buffer reading
2022-11-02 17:46:07 +00:00
Billy Laws
afcfe8a7fa
Don't update scissor state >0 unless multiview is supported
2022-11-02 17:46:07 +00:00
Billy Laws
55d77b7eb0
Update user code for new megabuffering
2022-11-02 17:46:07 +00:00
Billy Laws
cc776ae395
Keep track of an 'execution number' in CommandExecutor
...
Allows users to efficiently cache resources that are valid for only one execution without resorting to callbacks.
2022-11-02 17:46:07 +00:00
Billy Laws
99a34df4cc
Avoid trapping frequently synced buffers by using megabuffer copies
...
When a buffer is trapped nearly every frame, the cost of trapping and synchronising its contents starts to quickly add up. By always using the megabuffer when this is the case, since megabuffer copies are done directly from the guest, we skip the need to synchronise/trap the backing.
2022-11-02 17:46:07 +00:00
Billy Laws
a24aec03a6
Rework per-view megabuffering to cache allocs in the buffer itself
...
The original intention was to cache on the user side, but especially with shader constant buffers that's difficult and costly. Instead we can cache on the buffer side, with a page-table like structure to hold variable sized allocations indexed by the aligned view base address. This avoids most redundant copies from repeated use of the same buffer without updates inbetween.
2022-11-02 17:46:07 +00:00
Billy Laws
b810470601
Invalidate HLE macro state on macro updates
2022-11-02 17:46:07 +00:00
Billy Laws
2360ca24da
Implement constant buffer and storage buffer pipeline descriptor types
2022-11-02 17:46:07 +00:00
Billy Laws
25255b01c7
Keep track of more pipeline descriptor information
...
This is needed in order to allow allocating per-draw descriptor arrays without recounting their lengths each time
2022-11-02 17:46:07 +00:00
Billy Laws
ad0275dbef
Expose active pipeline for access by Maxwell3D class
2022-11-02 17:46:07 +00:00
Billy Laws
6e22373b59
Add array support to AllocateUntracked
2022-11-02 17:46:07 +00:00
Billy Laws
388cff3353
Implement simple pipeline transition cache
...
Avoids the need to hash PipelineState when we can guess the pipeline that will be used next. This could very easily be optimised in the future with generational, usage-based caching if necessary.
2022-11-02 17:46:07 +00:00
Billy Laws
302b2fcc3f
Force flush when dirty refresh returns true
2022-11-02 17:46:07 +00:00
Billy Laws
ec4ea5c5d7
Supply dispatcher manually for shader creation
2022-11-02 17:46:07 +00:00
Billy Laws
3404a3abdb
Implement macro HLE for instanced draw macros
...
gm20b performs instanced draws by repeating draw methods for each instance, the code to detect this together with the cost of interpreting macros took up around 6% of GPFIFO time in Metro Kingdom. By detecting these specific macros and performing an instanced draw directly much of that cost can be avoided.
2022-11-02 17:46:07 +00:00
Billy Laws
cf0752f937
Use NCE memory tracking for guest shaders
...
Prevents needing to hash them for every single pipeline state update, without this just hashing shaders takes up a significant amount of time.
2022-11-02 17:46:07 +00:00
Billy Laws
19a75c3f65
Bind all pipeline states to main pipeline dirty state
2022-11-02 17:46:07 +00:00
Billy Laws
a04d8fb5cf
Setup minimal viewport Vulkan pipeline state
2022-11-02 17:46:07 +00:00
Billy Laws
fe51db366b
Mark all dirty resources as dirty initially
2022-11-02 17:46:07 +00:00
Billy Laws
abfa5929f1
Treat vertex buffers with base addr 0 as disabled
2022-11-02 17:46:07 +00:00
Billy Laws
e71ca05f19
Avoid bitfields for signed enum types in PackedPipelineState
2022-11-02 17:46:07 +00:00
Billy Laws
2f2b615780
Add dynamic state support to VK graphics pipeline cache
2022-11-02 17:46:07 +00:00
Billy Laws
ad045058ee
Cleanup some redundant comments and includes in pipeline state
2022-11-02 17:46:07 +00:00
Billy Laws
9b05c9c0c3
Introduce a pipeline manager and partial pipeline object
...
gpu-new will use a monolithic pipeline object for each pipeline to store state, keyed by the PackedPipelineState contents. This allows for a greater level of per-pipeline optimisations and a reduction in the overall number of lookups in a draw compared to the previous system.
2022-11-02 17:46:07 +00:00
Billy Laws
2c1b40c9a8
Add some missed pipeline state members used by Hades
2022-11-02 17:46:07 +00:00
Billy Laws
0c6fa22c6b
Introduce pipeline shader stage state
...
Simple state that generates a hash that can be used in the packed state and spans over the binary for pipeline creation.
2022-11-02 17:46:07 +00:00
Billy Laws
a6bb716123
Move packed pipeline state to a seperate file
2022-11-02 17:46:07 +00:00
Billy Laws
4dcbf5c3a0
Drop the caching aspect of shader manager entirely
...
Caching here was deemed unnecessary since it will be done implicitly by the pipeline cache and creates issues with the legacy attribute conversion pass. It now purely serves as a frontend for Hades.
2022-11-02 17:46:07 +00:00
Billy Laws
e77e4891dc
Tidy up Maxwell 3D regs a bit
2022-11-02 17:46:07 +00:00
Billy Laws
405d26fc22
Introduce Maxwell 3D shader state
...
Simple state holder that hashes the stored shader and reads it into a buffer
2022-11-02 17:46:07 +00:00
Billy Laws
6865f0bdaf
Transition color blend state to packed pipeline state
2022-11-02 17:46:07 +00:00
Billy Laws
7049a521d2
Use Vulkan types directly in PackedPipelineState where possible
2022-11-02 17:46:07 +00:00
Billy Laws
effeb074b6
Move pipeline cache Key to cpp file and rename to PackedPipelineState
...
The new name is more indicative of what the struct contains and how it will be used as more than just a key.
2022-11-02 17:46:07 +00:00
Billy Laws
e1512c91a0
Transition depth stencil state to pipeline cache key
2022-11-02 17:46:07 +00:00
Billy Laws
1f844e2c18
Transition rasterization state to pipeline cache key
2022-11-02 17:46:07 +00:00
Billy Laws
9a6efb091c
Transition tessellation state to pipeline cache key
...
Also adds dirty tracking and removes it from direct state while we're at it. Since we no longer use Vulkan structs directly there's no benefit to it.
2022-11-02 17:46:07 +00:00
Billy Laws
ae5d419586
Transition input assembly state to pipeline cache key
2022-11-02 17:46:07 +00:00
Billy Laws
3f9161fb74
Transition vertex input state to pipeline cache key
...
Also adds dirty tracking and removes it from direct state while we're at it. Since we no longer use Vulkan structs directly there's no benefit to it.
2022-11-02 17:46:07 +00:00