aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/renderer_opengl
AgeCommit message (Collapse)Author
2020-06-25Merge pull request #4151 from ReinUsesLisp/gl-invalidationsRodrigo Locatti
gl_shader_cache: Avoid use after move for program size
2020-06-25gl_device: Fix IsASTCSupportedDavid Marcec
Other targets were never actually checked
2020-06-24buffer_cache: Use buffer methods instead of cache virtual methodsReinUsesLisp
2020-06-24gl_stream_buffer: Use InvalidateBufferData instead unmap and mapReinUsesLisp
Making the stream buffer resident increases GPU usage significantly on some games. This seems to be addressed invalidating the stream buffer with InvalidateBufferData instead of using a Unmap + Map (with invalidation flags).
2020-06-24gl_rasterizer: Use NV_vertex_buffer_unified_memory for vertex buffer robustnessReinUsesLisp
Switch games are allowed to bind less data than what they use in a vertex buffer, the expected behavior here is that these values are read as zero. At the moment of writing this only D3D12, OpenGL and NVN through NV_vertex_buffer_unified_memory support vertex buffer with a size limit. In theory this could be emulated on Vulkan creating a new VkBuffer for each (handle, offset, length) tuple and binding the expected data to it. This is likely going to be slow and memory expensive when used on the vertex buffer and we have to do it on all draws because we can't know without analyzing indices when a game is going to read vertex data out of bounds. This is not a problem on OpenGL's BufferAddressRangeNV because it takes a length parameter, unlike Vulkan's CmdBindVertexBuffers that only takes buffers and offsets (the length is implicit in VkBuffer). It isn't a problem on D3D12 either, because D3D12_VERTEX_BUFFER_VIEW on IASetVertexBuffers takes SizeInBytes as a parameter (although I am not familiar with robustness on D3D12). Currently this only implements buffer ranges for vertex buffers, although indices can also be affected. A KHR_robustness profile is not created, but Nvidia's driver reads out of bound vertex data as zero anyway, this might have to be changed in the future. - Fixes SMO random triangles when capturing an enemy, getting hit, or looking at the environment on certain maps.
2020-06-24gl_buffer_cache: Mark buffers as residentReinUsesLisp
Make stream buffer and cached buffers as resident and query their address. This allows us to use GPU addresses for several proprietary Nvidia extensions.
2020-06-24gl_device: Expose NV_vertex_buffer_unified_memory except on TuringReinUsesLisp
Expose NV_vertex_buffer_unified_memory when the driver supports it. This commit adds a function the determine if a GL_RENDERER is a Turing GPU. This is required because on Turing GPUs Nvidia's driver crashes when the buffer is marked as resident or on DeleteBuffers. Without a synchronous debug output (single threaded driver), it's likely that the driver will crash in the first blocking call.
2020-06-24gl_stream_buffer: Always use a non-coherent bufferReinUsesLisp
2020-06-24gl_stream_buffer: Always use persistent memory mapsReinUsesLisp
yuzu no longer supports platforms without persistent maps.
2020-06-24Merge pull request #4129 from Morph1984/texture-shadow-lod-workaroundRodrigo Locatti
gl_shader_decompiler: Workaround textureLod when GL_EXT_texture_shadow_lod is not available
2020-06-23gl_shader_cache: Avoid use after move for program sizeReinUsesLisp
All programs had a size of zero due to this bug, skipping invalidations. While we are at it, remove some unused forward declarations.
2020-06-20gl_shader_decompiler: Enable GL_EXT_texture_shadow_lod if availableMorph
Enable GL_EXT_texture_shadow_lod if available. If this extension is not available, such as on Intel/AMD proprietary drivers, use textureGrad as a workaround.
2020-06-20gl_device: Check for GL_EXT_texture_shadow_lodMorph
2020-06-19gl_arb_decompiler: Avoid several string copiesLioncash
Variables that are marked as const cannot have the move constructor invoked when returning from a function (the move constructor requires a non-const variable so it can "steal" the resources from it.
2020-06-18maxwell_to_gl: Miscellaneous changesMorph
maxwell_to_gl: Log unimplemented features under UNIMPLEMENTED_MSG instead of LOG_ERROR to bring into parity with maxwell_to_vk maxwell_to_gl: Deduplicate logging in VertexType(), merging them into one. maxwell_to_gl: Return GL_NEAREST instead of GL_LINEAR if an unknown texture filter mode is encountered. maxwell_to_gl: Log the mipmap filter mode if an unknown value is passed in. maxwell_to_gl: Reorder filtering modes to start with None, then Nearest, then Linear.
2020-06-18Merge pull request #4092 from Morph1984/image-bindingsRodrigo Locatti
gl_device: Reserve 4 image bindings for fragment stage
2020-06-16Merge pull request #4041 from ReinUsesLisp/arb-decompbunnei
gl_arb_decompiler: Implement an assembly shader decompiler
2020-06-16gl_device: Reserve at least 4 image bindings for fragment stageMorph
Due to the limitation of GL_MAX_IMAGE_UNITS being low (8) on Intel's and Nvidia's proprietary drivers, we have to reserve an appropriate amount of image bindings for each of the stages. So far games have been observed to use 4 image bindings on the fragment stage (Kirby Star Allies) and 1 on the vertex stage (TWD series). No games thus far in my limited testing used more than 4 images concurrently and across all currently active programs. This fixes shader compilation errors on Kirby Star Allies on OpenGL (GLSL/GLASM)
2020-06-15Merge pull request #4066 from ReinUsesLisp/shared-ptr-bufRodrigo Locatti
buffer_cache: Avoid passing references of shared pointers and misc style changes
2020-06-14Merge pull request #4064 from ReinUsesLisp/invalidate-buffersbunnei
gl_rasterizer: Mark vertex buffers as dirty after buffer cache invalidation
2020-06-13Merge pull request #4049 from ReinUsesLisp/separate-samplersbunnei
shader/texture: Join separate image and sampler pairs offline
2020-06-12Merge pull request #3986 from ReinUsesLisp/shader-cachebunnei
shader_cache: Implement a generic runtime shader cache
2020-06-11gl_arb_decompiler: Implement FSwizzleAddReinUsesLisp
2020-06-11gl_arb_decompiler: Implement an assembly shader decompilerReinUsesLisp
Emit code compatible with NV_gpu_program5. This should emit code compatible with Fermi, but it wasn't tested on that architecture. Pascal has some issues not present on Turing GPUs.
2020-06-09Merge pull request #4027 from ReinUsesLisp/3d-slicesbunnei
texture_cache: Implement rendering to 3D textures
2020-06-09buffer_cache: Avoid passing references of shared pointers and misc style changesReinUsesLisp
Instead of using as template argument a shared pointer, use the underlying type and manage shared pointers explicitly. This can make removing shared pointers from the cache more easy. While we are at it, make some misc style changes and general improvements (like insert_or_assign instead of operator[] + operator=).
2020-06-08gl_rasterizer: Mark vertex buffers as dirty after buffer cache invalidationReinUsesLisp
Vertex buffers bindings become invalid after the stream buffer is invalidated. We were originally doing this, but it got lost at some point. - Fixes Animal Crossing: New Horizons, but it affects everything.
2020-06-08Merge pull request #4040 from ReinUsesLisp/nv-transform-feedbackbunnei
gl_rasterizer: Use NV_transform_feedback for XFB on assembly shaders
2020-06-08Merge pull request #4052 from ReinUsesLisp/debug-outputbunnei
renderer_opengl: Only enable DEBUG_OUTPUT when graphics debugging is enabled
2020-06-08texture_cache: Handle 3D texture blits with one layerReinUsesLisp
2020-06-08texture_cache: Implement rendering to 3D texturesReinUsesLisp
This allows rendering to 3D textures with more than one slice. Applications are allowed to render to more than one slice of a texture using gl_Layer from a VTG shader. This also requires reworking how 3D texture collisions are handled, for now, this commit allows rendering to slices but not to miplevels. When a render target attempts to write to a mipmap, we fallback to the previous implementation (copying or flushing as needed). - Fixes color correction 3D textures on UE4 games (rainbow effects). - Allows Xenoblade games to render to 3D textures directly.
2020-06-07rasterizer_cache: Remove files and includesReinUsesLisp
The rasterizer cache is no longer used. Each cache has its own generic implementation optimized for the cached data.
2020-06-07vk_pipeline_cache: Use generic shader cacheReinUsesLisp
Trivial port the generic shader cache to Vulkan.
2020-06-07gl_shader_cache: Use generic shader cacheReinUsesLisp
Trivially port the generic shader cache to OpenGL.
2020-06-06gl_device: Black list NVIDIA 443.24 for fast buffer uploadsReinUsesLisp
Skip fast buffer uploads on Nvidia 443.24 Vulkan beta driver on OpenGL. This driver throws the following error when calling BufferSubData or BufferData on buffers that are candidates for fast constant buffer uploads. This is the equivalens to push constants on Vulkan, except that they can access the full buffer. The error: Unknown internal debug message. The NVIDIA OpenGL driver has encountered an out of memory error. This application might behave inconsistently and fail. If this error persists on future drivers, we might have to look deeper into this issue. For now, we can black list it and log it as a temporary solution.
2020-06-05renderer_opengl: Only enable DEBUG_OUTPUT when graphics debugging is enabledReinUsesLisp
Avoids logging when it's not relevant. This can potentially reduce driver's internal thread overhead.
2020-06-05shader/texture: Join separate image and sampler pairs offlineReinUsesLisp
Games using D3D idioms can join images and samplers when a shader executes, instead of baking them into a combined sampler image. This is also possible on Vulkan. One approach to this solution would be to use separate samplers on Vulkan and leave this unimplemented on OpenGL, but we can't do this because there's no consistent way of determining which constant buffer holds a sampler and which one an image. We could in theory find the first bit and if it's in the TIC area, it's an image; but this falls apart when an image or sampler handle use an index of zero. The used approach is to track for a LOP.OR operation (this is done at an IR level, not at an ISA level), track again the constant buffers used as source and store this pair. Then, outside of shader execution, join the sample and image pair with a bitwise or operation. This approach won't work on games that truly use separate samplers in a meaningful way. For example, pooling textures in a 2D array and determining at runtime what sampler to use. This invalidates OpenGL's disk shader cache :) - Used mostly by D3D ports to Switch
2020-06-04Merge pull request #4031 from Morph1984/fix-gs-outputsbunnei
gl_shader_decompiler: Fix geometry shader outputs on Intel drivers
2020-06-03gl_rasterizer: Use NV_transform_feedback for XFB on assembly shadersReinUsesLisp
NV_transform_feedback, NV_transform_feedback2 and ARB_transform_feedback3 with NV_transform_feedback interactions allows implementing transform feedbacks as dynamic state. Maxwell implements transform feedbacks as dynamic state, so using these extensions with TransformFeedbackStreamAttribsNV allows us to properly emulate transform feedbacks without having to recompile shaders when the state changes.
2020-06-02Merge pull request #4014 from ReinUsesLisp/astc-nvidiabunnei
gl_device: Avoid devices with CAVEAT_SUPPORT on ASTC
2020-06-02Merge pull request #4006 from ReinUsesLisp/squash-ubosbunnei
glsl: Squash constant buffers into a single SSBO when we hit the limit
2020-06-01gl_shader_decompiler: Declare gl_Layer and gl_ViewportIndex within ↵Morph
gl_PerVertex for vertex and tessellation shaders
2020-06-01gl_shader_decompiler: Fix geometry shader outputs for Intel driversMorph
On Intel's proprietary drivers, gl_Layer and gl_ViewportIndex are not allowed members of gl_PerVertex block, causing the shader to fail to compile. Fix this by declaring these variables outside of gl_PerVertex.
2020-06-01Merge pull request #3996 from ReinUsesLisp/front-facesbunnei
fixed_pipeline_state,gl_rasterizer: Swap negative viewport checks for front faces
2020-05-31gl_device: Avoid devices with CAVEAT_SUPPORT on ASTCReinUsesLisp
This avoids using Nvidia's ASTC decoder on OpenGL. The last time it was profiled, it was slower than yuzu's decoder. While we are at it, fix a bug in the texture cache when native ASTC is not supported.
2020-05-31glsl: Squash constant buffers into a single SSBO when we hit the limitReinUsesLisp
Avoids compilation errors at the cost of shader build times and runtime performance when a game hits the limit of uniform buffers we can use.
2020-05-31Merge pull request #3958 from FernandoS27/gl-debugbunnei
OpenGL: Enable Debug Context and Synchronous debugging when graphics debugging is enabled
2020-05-31gl_device: Enable compute shaders for Intel proprietary driversMorph
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.
2020-05-30Merge pull request #3982 from ReinUsesLisp/membar-ctsbunnei
shader/other: Implement MEMBAR.CTS
2020-05-28Merge pull request #3991 from ReinUsesLisp/depth-samplingbunnei
texture_cache: Implement depth stencil texture swizzles