summaryrefslogtreecommitdiff
path: root/src/video_core (follow)
Commit message (Collapse)AuthorAgeFilesLines
* Merge pull request #3998 from ReinUsesLisp/init-3dGravatar bunnei2020-06-011-0/+4
|\ | | | | maxwell_3d: Initialize more registers to their expected value
| * maxwell_3d: Initialize line widthsGravatar ReinUsesLisp2020-05-271-0/+2
| | | | | | | | Initialize line widths to avoid setting a line width of zero.
| * maxwell_3d: Initialize polygon modesGravatar ReinUsesLisp2020-05-271-0/+2
| | | | | | | | | | NVN expects this to be initialized as Fill, otherwise games that never bind a rasterizer state will log an invalid polygon mode.
* | Merge pull request #4005 from ReinUsesLisp/g24r8Gravatar Rodrigo Locatti2020-06-011-1/+2
|\ \ | | | | | | format_lookup_table: Implement G24S8 format as S8Z24
| * | format_lookup_table: Implement G24S8 format as S8Z24Gravatar ReinUsesLisp2020-05-281-1/+2
| | |
* | | Merge pull request #3996 from ReinUsesLisp/front-facesGravatar bunnei2020-06-012-7/+21
|\ \ \ | | | | | | | | fixed_pipeline_state,gl_rasterizer: Swap negative viewport checks for front faces
| * | | gl_rasterizer: Port front face flip check from VulkanGravatar ReinUsesLisp2020-05-261-5/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | While Vulkan was assuming we had no negative viewports, OpenGL code was assuming we had them. Port the old code from Vulkan to OpenGL, checking if the first viewport is negative before flipping faces. This is not a complete implementation since we only check for the first viewport to be negative. That said, unless a game is using Vulkan, OpenGL and NVN games should be fine here, and we can always compare with our Vulkan backend to see if there's a difference.
| * | | fixed_pipeline_state: Remove unnecessary check for front faces flipGravatar ReinUsesLisp2020-05-261-2/+1
| | | | | | | | | | | | | | | | | | | | | | | | The check to flip faces when viewports are negative were a left over from the old OpenGL code. This is not required on Vulkan where we have negative viewports.
* | | | Merge pull request #3930 from ReinUsesLisp/animal-bordersGravatar bunnei2020-05-314-17/+26
|\ \ \ \ | | | | | | | | | | vk_rasterizer: Implement constant attributes
| * | | | vk_rasterizer: Implement constant attributesGravatar ReinUsesLisp2020-05-134-13/+26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Constant attributes (in OpenGL known disabled attributes) are not supported on Vulkan, even with extensions. To emulate this behavior we return zero on reads from disabled vertex attributes in shader code. This has no caching cost because attribute formats are not dynamic state on Vulkan and we have to store it in the pipeline cache anyway. - Fixes Animal Crossing: New Horizons terrain borders
| * | | | vk_rasterizer: Remove buffer check in attribute selectionGravatar ReinUsesLisp2020-05-131-4/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This was a left over from OpenGL when disabled buffers where not properly emulated. We no longer have to assert this as it is checked in vertex buffer initialization.
* | | | | Merge pull request #3958 from FernandoS27/gl-debugGravatar bunnei2020-05-311-0/+3
|\ \ \ \ \ | | | | | | | | | | | | OpenGL: Enable Debug Context and Synchronous debugging when graphics debugging is enabled
| * | | | | OpenGL: Enable Debug Context and Synchronous debugging when graphics ↵Gravatar Fernando Sahmkow2020-05-171-0/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | debugging is enabled. This commit aims to help easing debugging of driver crashes without having to modify existing code.
* | | | | | Merge pull request #3999 from ReinUsesLisp/opt-tex-cacheGravatar bunnei2020-05-311-24/+29
|\ \ \ \ \ \ | | | | | | | | | | | | | | texture_cache: Optimize GetSurfacesInRegion
| * | | | | | texture_cache: Use unordered_map::find instead of operator[] on hot codeGravatar ReinUsesLisp2020-05-271-15/+19
| | | | | | |
| * | | | | | texture_cache: Use small vector for surface vectorsGravatar ReinUsesLisp2020-05-271-9/+10
| | |_|_|_|/ | |/| | | | | | | | | | | | | | | | | | | | | | This avoids most heap allocations when collecting surfaces into a vector.
* | | | | | gl_device: Enable compute shaders for Intel proprietary driversGravatar Morph2020-05-313-13/+0
| | | | | | | | | | | | | | | | | | | | | | | | Previously we were disabling compute shaders on Intel's proprietary driver due to broken compute. This has been fixed in the latest Intel drivers. Re-enable compute for Intel proprietary drivers and remove the check for broken compute.
* | | | | | Merge pull request #3982 from ReinUsesLisp/membar-ctsGravatar bunnei2020-05-304-9/+27
|\ \ \ \ \ \ | | | | | | | | | | | | | | shader/other: Implement MEMBAR.CTS
| * | | | | | shader/other: Implement MEMBAR.CTSGravatar ReinUsesLisp2020-05-274-9/+27
| |/ / / / / | | | | | | | | | | | | | | | | | | | | | | | | This silences an assertion we were hitting and uses workgroup memory barriers when the game requests it.
* | | | | | Add xbyak externalGravatar David Marcec2020-05-301-1/+1
| | | | | |
* | | | | | Merge pull request #4007 from ReinUsesLisp/reduce-logsGravatar bunnei2020-05-291-6/+7
|\ \ \ \ \ \ | | | | | | | | | | | | | | maxwell_3d: Reduce severity of logs that can be spammed
| * | | | | | maxwell_3d: Reduce severity of logs that can be spammedGravatar ReinUsesLisp2020-05-281-6/+7
| | |_|_|_|/ | |/| | | | | | | | | | | | | | | | | | | | | | These logs were killing performance on some games when they were spammed. Reduce them to Debug severity.
* | | | | | Merge pull request #3991 from ReinUsesLisp/depth-samplingGravatar bunnei2020-05-285-68/+83
|\ \ \ \ \ \ | |/ / / / / |/| | | | | texture_cache: Implement depth stencil texture swizzles
| * | | | | texture_cache: Fix layered null surfacesGravatar ReinUsesLisp2020-05-261-1/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Null texture cubes were not considered arrays, causing issues on Vulkan and OpenGL when creating views.
| * | | | | gl_texture_cache: Implement small texture view cache for swizzlesGravatar ReinUsesLisp2020-05-263-37/+44
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This fixes cases where the texture swizzle was applied twice on the same draw to a texture bound to two different slots.
| * | | | | texture_cache: Implement depth stencil texture swizzlesGravatar ReinUsesLisp2020-05-263-36/+42
| | |_|_|/ | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Stop ignoring image swizzles on depth and stencil images. This doesn't fix a known issue on Xenoblade Chronicles 2 where an OpenGL texture changes swizzles twice before being used. A proper fix would be having a small texture view cache for this like we do on Vulkan.
* | | | | Merge pull request #3993 from ReinUsesLisp/fix-zlaGravatar bunnei2020-05-281-0/+4
|\ \ \ \ \ | | | | | | | | | | | | gl_shader_manager: Unbind GLSL program when binding a host pipeline
| * | | | | gl_shader_manager: Unbind GLSL program when binding a host pipelineGravatar ReinUsesLisp2020-05-261-0/+4
| |/ / / / | | | | | | | | | | | | | | | Fixes regression in Link's Awakening caused by 420cc13248350ef5c2d19e0b961cb4185cd16a8a
* | | | | Merge pull request #3961 from Morph1984/bgra8_srgbGravatar bunnei2020-05-272-2/+3
|\ \ \ \ \ | |_|/ / / |/| | | | maxwell_to_vk: Add format B8G8R8A8_SRGB and add Attachable capability for B8G8R8A8_UNORM
| * | | | maxwell_to_vk: Add format B8G8R8A8_SRGBGravatar Morph2020-05-182-2/+3
| | |/ / | |/| | | | | | | | | | | | | | Add format B8G8R8A8_SRGB and add Attachable capability for B8G8R8A8_UNORM Used by Bravely Default II
* | | | Merge pull request #3981 from ReinUsesLisp/barGravatar bunnei2020-05-264-0/+33
|\ \ \ \ | | | | | | | | | | shader/other: Implement BAR.SYNC 0x0
| * | | | shader/other: Implement BAR.SYNC 0x0Gravatar ReinUsesLisp2020-05-214-0/+33
| |/ / / | | | | | | | | | | | | | | | | Trivially implement this particular case of BAR. Unless games use OpenCL or CUDA barriers, we shouldn't hit any other case here.
* | | | Merge pull request #3980 from ReinUsesLisp/red-opGravatar bunnei2020-05-261-2/+1
|\ \ \ \ | |_|/ / |/| | | shader/memory: Implement non-addition operations in RED
| * | | shader/memory: Implement non-addition operations in REDGravatar ReinUsesLisp2020-05-211-2/+1
| |/ / | | | | | | | | | Trivially implement these instructions. They are used in Astral Chain.
* | | Merge pull request #3978 from ReinUsesLisp/write-rzGravatar bunnei2020-05-252-4/+7
|\ \ \ | | | | | | | | shader_decompiler: Visit source nodes even when they assign to RZ
| * | | shader_decompiler: Visit source nodes even when they assign to RZGravatar ReinUsesLisp2020-05-212-2/+6
| | | | | | | | | | | | | | | | | | | | | | | | Some operations like atomicMin were ignored because they returned were being stored to RZ. This operations have a side effect and it was being ignored.
| * | | vk_shader_decompiler: Don't assert for void returnsGravatar ReinUsesLisp2020-05-211-2/+1
| |/ / | | | | | | | | | | | | Atomic instructions can be used without returning anything and this is valid code. Remove the assert.
* | | Merge pull request #3905 from FernandoS27/vulkan-fixGravatar bunnei2020-05-244-7/+62
|\ \ \ | | | | | | | | Correct a series of crashes and intructions on Async GPU and Vulkan Pipeline
| * | | RasterizerCache: Correct documentation.Gravatar Fernando Sahmkow2020-05-091-2/+2
| | | |
| * | | VkPipelineCache: Use a null shader on invalid address.Gravatar Fernando Sahmkow2020-05-091-2/+1
| | | |
| * | | VideoCore: Use SyncGuestMemory mechanism for Shader/Pipeline Cache invalidation.Gravatar Fernando Sahmkow2020-05-093-5/+61
| | | |
* | | | Merge pull request #3964 from ReinUsesLisp/arb-integrationGravatar bunnei2020-05-2412-109/+339
|\ \ \ \ | | | | | | | | | | renderer_opengl: Add assembly program code paths
| * | | | renderer_opengl: Add assembly program code pathsGravatar ReinUsesLisp2020-05-1912-109/+339
| | |/ / | |/| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add code required to use OpenGL assembly programs based on NV_gpu_program5. Decompilation for ARB programs is intended to be added in a follow up commit. This does **not** include ARB decompilation and it's not in an usable state. The intention behind assembly programs is to reduce shader stutter significantly on drivers supporting NV_gpu_program5 (and other required extensions). Currently only Nvidia's proprietary driver supports these extensions. Add a UI option hidden for now to avoid people enabling this option accidentally. This code path has some limitations that OpenGL compatibility doesn't have: - NV_shader_storage_buffer_object is limited to 16 entries for a single OpenGL context state (I don't know if this is an intended limitation, an specification issue or I am missing something). Currently causes issues on The Legend of Zelda: Link's Awakening. - NV_parameter_buffer_object can't bind buffers using an offset different to zero. The used workaround is to copy to a temporary buffer (this doesn't happen often so it's not an issue). On the other hand, it has the following advantages: - Shaders build a lot faster. - We have control over how floating point rounding is done over individual instructions (SPIR-V on Vulkan can't do this). - Operations on shared memory can be unsigned and signed. - Transform feedbacks are dynamic state (not yet implemented). - Parameter buffers (uniform buffers) are per stage, matching NVN and hardware's behavior. - The API to bind and create assembly programs makes sense, unlike ARB_separate_shader_objects.
* | | | Merge pull request #3979 from ReinUsesLisp/thread-groupGravatar bunnei2020-05-244-0/+72
|\ \ \ \ | | | | | | | | | | shader/other: Implement thread comparisons (NV_shader_thread_group)
| * | | | shader/other: Implement thread comparisons (NV_shader_thread_group)Gravatar ReinUsesLisp2020-05-214-0/+72
| |/ / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Hardware S2R special registers match gl_Thread*MaskNV. We can trivially implement these using Nvidia's extension on OpenGL or naively stubbing them with the ARB instructions to match. This might cause issues if the host device warp size doesn't match Nvidia's. That said, this is unlikely on proper shaders. Refer to the attached url for more documentation about these flags. https://www.khronos.org/registry/OpenGL/extensions/NV/NV_shader_thread_group.txt
* | | | buffer_cache: Remove unused boost headersGravatar ReinUsesLisp2020-05-211-2/+0
| | | |
* | | | map_interval: Add interval allocator and drop hackGravatar ReinUsesLisp2020-05-214-3/+79
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Drop the std::list hack to allocate memory indefinitely. Instead use a custom allocator that keeps references valid until destruction. This allocates fixed chunks of memory and puts pointers in a free list. When an allocation is no longer used put it back to the free list, this doesn't heap allocate because std::vector doesn't change the capacity. If the free list is empty, allocate a new chunk.
* | | | buffer_cache: Use boost::container::small_vector for maps in rangeGravatar ReinUsesLisp2020-05-211-13/+15
| | | | | | | | | | | | | | | | | | | | | | | | Most overlaps in the buffer cache only contain one mapped address. We can avoid close to all heap allocations once the buffer cache is warmed up by using a small_vector with a stack size of one.
* | | | buffer_cache: Use boost::intrusive::set for cachingGravatar ReinUsesLisp2020-05-216-30/+48
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Instead of using boost::icl::interval_map for caching, use boost::intrusive::set. interval_map is intended as a container where the keys can overlap with one another; we don't need this for caching buffers and a std::set-like data structure that allows us to search with lower_bound is enough.
* | | | buffer_cache: Remove shared pointersGravatar ReinUsesLisp2020-05-212-70/+72
| | | | | | | | | | | | | | | | | | | | Removing shared pointers is a first step to be able to use intrusive objects and keep allocations close to one another in memory.