| Age | Commit message (Collapse) | Author |
|
Optimized Morton
|
|
Before:
ucomiss xmm1, xmm1
jp .L9
pxor xmm2, xmm2
mov edx, 1
ucomiss xmm0, xmm2
setp al
cmovne eax, edx
test al, al
jne .L9
.L3:
movaps xmm0, xmm2
ret
.L9:
ucomiss xmm0, xmm0
jp .L10
pxor xmm2, xmm2
mov edx, 1
ucomiss xmm1, xmm2
setp al
cmovne eax, edx
test al, al
je .L3
After:
movaps xmm2, xmm1
mulss xmm2, xmm0
ucomiss xmm2, xmm2
jnp .L3
ucomiss xmm1, xmm0
jnp .L11
.L3:
movaps xmm0, xmm2
ret
.L11:
pxor xmm2, xmm2
jmp .L3
|
|
|
|
GPU: Add draw for immediate and batch modes
|
|
|
|
Fixed framebuffer warning
|
|
Ternary operator is optimized by the compiler
whereas std::min() is meant to return a value.
I've noticed a 5%-10% emulation speed increase.
|
|
|
|
PICA: implement custom clip plane
|
|
PR #1461 introduced a regression where some games would change configuration
even while in the poorly named "drawing" mode, which broke the heuristic
citra was using to determine when to draw the batch. This change adds
back in a draw call for batching, and also adds in a draw call in
immediate mode each time it adds a triangle.
|
|
PICA: implemented geometry shader
|
|
pica/lighting: only apply Fresnel factor for the last light
|
|
|
|
|
|
SwRasterizer/Lighting: implement bump mapping
|
|
Warnings: Fixed a few missing-return warnings in video_core.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This function is called in clipping, before the pespective divide, and is not used in later rasterization. Thus it doesn't need perspective correction.
|
|
hwtested. Current implementation is the correct behavior
|
|
shader and fragment shader
|
|
|
|
SwRasterizer/Lighting: implement geometric factor
|
|
SwRasterizer/Lighting: implement spot light
|
|
The geometry pipeline manages data transfer between VS, GS and primitive assembler. It has known four modes:
- no GS mode: sends VS output directly to the primitive assembler (what citra currently does)
- GS mode 0: sends VS output to GS input registers, and sends GS output to primitive assembler
- GS mode 1: sends VS output to GS uniform registers, and sends GS output to primitive assembler. It also takes an index from the index buffer at the beginning of each primitive for determine the primitive size.
- GS mode 2: similar to mode 1, but doesn't take the index and uses a fixed primitive size.
hwtest shows that immediate mode also supports GS (at least for mode 0), so the geometry pipeline gets refactored into its own class for supporting both drawing mode.
In the immediate mode, some games don't set the pipeline registers to a valid value until the first attribute input, so a geometry pipeline reset flag is set in `pipeline.vs_default_attributes_setup.index` trigger, and the actual pipeline reconfigure is triggered in the first attribute input.
In the normal drawing mode with index buffer, the vertex cache is a little bit modified to support the geometry pipeline. Instead of OutputVertex, it now holds AttributeBuffer, which is the input to the geometry pipeline. The AttributeBuffer->OutputVertex conversion is done inside the pipeline vertex handler. The actual hardware vertex cache is believed to be implemented in a similar way (because this is the only way that makes sense).
Both geometry pipeline and GS unit rely on states preservation across drawing call, so they are put into the global state. In the future, the other three vertex shader units should be also placed in the global state, and a scheduler should be implemented on top of the four units. Note that the current gs_unit already allows running VS on it in the future.
|
|
|
|
hwtest shows that, although GS always emit a group of three vertices as one primitive, it still respects to the topology type, as if the three vertices are input into the primitive assembler independently and sequentially. It is also shown that the winding flag in SETEMIT only takes effect for Shader topology type, which is believed to be the actual difference between List and Shader (hence removed the TODO). However, only Shader topology type is observed in official games when GS is in use, so the other mode seems to be just unintended usage.
|
|
|
|
|
|
Among four shader units in pica, a special unit can be configured to run both VS and GS program. GSUnitState represents this unit, which extends UnitState (which represents the other three normal units) with extra state for primitive emitting. It uses lots of raw pointers to represent internal structure in order to keep it standard layout type for JIT to access.
This unit doesn't handle triangle winding (inverting) itself; instead, it calls a WindingSetter handler. This will be explained in the following commits
|
|
|
|
|
|
|
|
implicit tuple constructor is a c++17 thing, which is not supported by some not-so-old libraries. Play safe for now
|
|
All the register meanings are derived from ctrulib (3dbrew is outdated for most of them)
|
|
Implement fragment lighting in the sw renderer (take 2)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
gl_rasterizer: use texture buffer for proctex LUT
|
|
gl_rasterizer_cache: fix using_depth_fb
|
|
|