Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Workaround OS X video driver bug #24983074 #3719

Merged

Conversation

Sonicadvance1
Copy link
Contributor

OS X's shader compiler has a bug with interface blocks where interface block members don't properly inherit the layout qualifier from the interface
block.
Work around this limitation by explicitly stating the layout qualifier on both the interface block and every single member inside of that block.

This should fix issue #9361

Review on Reviewable

@Sonicadvance1
Copy link
Contributor Author

Haven't tested this on an actual Apple product because I don't own one.

@jackoalan
Copy link
Contributor

Just out of curiosity, which GPUs have been tested to fail? The compiler varies depending on the vendor architecture.

@Sonicadvance1
Copy link
Contributor Author

Any GPU supporting geometry shaders

@RisingFog
Copy link
Member

Tested and no longer receiving errors with 8x SSAA enabled.

@delroth delroth added this to the Dolphin Release 5.0 milestone Mar 8, 2016
@kemenaran
Copy link
Contributor

Just tested on a Mac with Intel Iris Graphics. SSAA now runs fine, but it breaks MSAA.

#version 400

#define SAMPLER_BINDING(x)

#define float2 vec2
#define float3 vec3
#define float4 vec4
#define uint2 uvec2
#define uint3 uvec3
#define uint4 uvec4
#define int2 ivec2
#define int3 ivec3
#define int4 ivec4
#define frac fract
#define lerp mix
struct Light {
    int4 color;
    float4 cosatt;
    float4 distatt;
    float4 pos;
    float4 dir;
};
layout(std140) uniform VSBlock {
    float4 cpnmtx[6];
    float4 cproj[4];
    int4 cmtrl[4];
    Light clights[8];
    float4 ctexmtx[24];
    float4 ctrmtx[64];
    float4 cnmtx[32];
    float4 cpostmtx[64];
    float4 cpixelcenter;
};
struct VS_OUTPUT {
     float4 pos;
     float4 colors_0;
     float4 colors_1;
     float3 tex0;
     float4 clipPos;
};
in float4 rawpos; // ATTR0,
in float4 color0; // ATTR5,
in float2 tex0; // ATTR8,
// The interface block qualifier is duplicated to its member due to Apple OS X bug 24983074
out VertexData {
    centroid out out float4 pos;
    centroid out out float4 colors_0;
    centroid out out float4 colors_1;
    centroid out out float3 tex0;
    centroid out out float4 clipPos;
} vs;
void main()
{
VS_OUTPUT o;
float4 pos = float4(dot(cpnmtx[0], rawpos), dot(cpnmtx[1], rawpos), dot(cpnmtx[2], rawpos), 1.0);
float3 _norm0 = float3(0.0, 0.0, 0.0);
o.pos = float4(dot(cproj[0], pos), dot(cproj[1], pos), dot(cproj[2], pos), dot(cproj[3], pos));
int4 lacc;
float3 ldir, h, cosAttn, distAttn;
float dist, dist2, attn;
{
int4 mat = int4(round(color0 * 255.0));
lacc = int4(255, 255, 255, 255);
lacc.w = 255;
lacc = clamp(lacc, 0, 255);
o.colors_0 = float4((mat * (lacc + (lacc >> 7))) >> 8) / 255.0;
}
o.colors_1 = o.colors_0;
float4 coord = float4(0.0, 0.0, 1.0, 1.0);
{
coord = float4(0.0, 0.0, 1.0, 1.0);
coord = float4(tex0.x, tex0.y, 1.0, 1.0);
o.tex0.xyz = float3(dot(coord, ctexmtx[0]), dot(coord, ctexmtx[1]), 1);
float4 P0 = cpostmtx[61];
float4 P1 = cpostmtx[62];
float4 P2 = cpostmtx[63];
o.tex0.xyz = float3(dot(P0.xyz, o.tex0.xyz) + P0.w, dot(P1.xyz, o.tex0.xyz) + P1.w, dot(P2.xyz, o.tex0.xyz) + P2.w);
}
o.clipPos = o.pos;
o.pos.z = o.pos.z * -2.0 - o.pos.w;
o.pos.xy = o.pos.xy - o.pos.w * cpixelcenter.xy;
    vs.pos = o.pos;
    vs.colors_0 = o.colors_0;
    vs.colors_1 = o.colors_1;
    vs.tex0 = o.tex0;
    vs.clipPos = o.clipPos;
gl_Position = o.pos;
}
ERROR: 0:61: Duplicate qualifier 'out'
ERROR: 0:97: Use of undeclared identifier 'vs'
ERROR: 0:98: Use of undeclared identifier 'vs'
ERROR: 0:99: Use of undeclared identifier 'vs'
ERROR: 0:100: Use of undeclared identifier 'vs'
ERROR: 0:101: Use of undeclared identifier 'vs'

OS X's shader compiler has a bug with interface blocks where interface block members don't properly inherit the layout qualifier from the interface
block.
Work around this limitation by explicitly stating the layout qualifier on both the interface block and every single member inside of that block.
@Sonicadvance1
Copy link
Contributor Author

Fixed the issue with MSAA in the latest push.

@kemenaran
Copy link
Contributor

Tested again on a Mac with Intel Iris Graphics : both MSAA and SSAA works 👍

@RisingFog
Copy link
Member

@dolphin-emu-bot rebuild

@delroth delroth merged commit ae4cb12 into dolphin-emu:master Mar 26, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
5 participants