mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-21 05:09:34 -06:00
PixelShaderGen: Clamp texture layer when using manual texture sampling with stereoscopic 3D
Otherwise, texelFetch() will use an out-of-bounds layer for game textures (that have 1 layer; EFB copies have 2 layers in stereoscopic 3D mode), which is undefined behavior (often resulting in a black image). The fast texture sampling path uses texture(), which always clamps (see https://www.khronos.org/opengl/wiki/Array_Texture#Access_in_shaders), so it was unaffected by this difference.
This commit is contained in:
@ -615,6 +615,7 @@ uint WrapCoord(int coord, uint wrap, int size) {{
|
||||
int3 size = textureSize(tex, 0);
|
||||
int size_s = size.x;
|
||||
int size_t = size.y;
|
||||
int num_layers = size.z;
|
||||
)");
|
||||
if (g_ActiveConfig.backend_info.bSupportsTextureQueryLevels)
|
||||
{
|
||||
@ -633,6 +634,8 @@ uint WrapCoord(int coord, uint wrap, int size) {{
|
||||
// Rescale uv to account for the new texture size
|
||||
uv.x = (uv.x * size_s) / native_size_s;
|
||||
uv.y = (uv.y * size_t) / native_size_t;
|
||||
// Clamp layer as well (texture() automatically clamps, but texelFetch() doesn't)
|
||||
layer = clamp(layer, 0, num_layers - 1);
|
||||
)");
|
||||
}
|
||||
else
|
||||
|
Reference in New Issue
Block a user