Eevee: MacOS/ATI doesn't work. #106786

Closed
Jeroen Bakker wants to merge 6 commits from Jeroen-Bakker:eevee-legacy-macos-ati into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
5 changed files with 174 additions and 112 deletions

View File

@ -24,50 +24,64 @@ typedef struct CommonUniformBlock CommonUniformBlock;
# define DO_SPLIT_CLOSURE_EVAL 1
#endif
/* NOTE: Due to compatibility issues between legacy Intel drivers that doesn't unroll macros
* as expected we added an underscore before the attribute name to make a distinction between the
* macro name and the variable it needs to access. This fails on MacOS/ATI resulting in failing to
* render Eevee on those devices. Issue happens both on Metal and OpenGL backend.
*
* This is a quick fix to support both issues until we have a better solution or that Eevee is
* replaced.
*/
#if (defined(OS_MAC) && defined(GPU_ATI))
# define BLOCK_ATTR(name) name
#else
# define BLOCK_ATTR(name) _##name
#endif
struct CommonUniformBlock {
mat4 _pastViewProjectionMatrix;
vec4 _hizUvScale; /* To correct mip level texel misalignment */
mat4 BLOCK_ATTR(pastViewProjectionMatrix);
vec4 BLOCK_ATTR(hizUvScale); /* To correct mip level texel misalignment */
/* Ambient Occlusion */
vec4 _aoParameters[2];
vec4 BLOCK_ATTR(aoParameters)[2];
/* Volumetric */
ivec4 _volTexSize;
vec4 _volDepthParameters; /* Parameters to the volume Z equation */
vec4 _volInvTexSize;
vec4 _volJitter;
vec4 _volCoordScale; /* To convert volume uvs to screen uvs */
float _volHistoryAlpha;
float _volShadowSteps;
bool _volUseLights;
bool _volUseSoftShadows;
ivec4 BLOCK_ATTR(volTexSize);
vec4 BLOCK_ATTR(volDepthParameters); /* Parameters to the volume Z equation */
vec4 BLOCK_ATTR(volInvTexSize);
vec4 BLOCK_ATTR(volJitter);
vec4 BLOCK_ATTR(volCoordScale); /* To convert volume uvs to screen uvs */
float BLOCK_ATTR(volHistoryAlpha);
float BLOCK_ATTR(volShadowSteps);
bool BLOCK_ATTR(volUseLights);
bool BLOCK_ATTR(volUseSoftShadows);
/* Screen Space Reflections */
vec4 _ssrParameters;
float _ssrBorderFac;
float _ssrMaxRoughness;
float _ssrFireflyFac;
float _ssrBrdfBias;
bool _ssrToggle;
bool _ssrefractToggle;
vec4 BLOCK_ATTR(ssrParameters);
float BLOCK_ATTR(ssrBorderFac);
float BLOCK_ATTR(ssrMaxRoughness);
float BLOCK_ATTR(ssrFireflyFac);
float BLOCK_ATTR(ssrBrdfBias);
bool BLOCK_ATTR(ssrToggle);
bool BLOCK_ATTR(ssrefractToggle);
/* SubSurface Scattering */
float _sssJitterThreshold;
bool _sssToggle;
float BLOCK_ATTR(sssJitterThreshold);
bool BLOCK_ATTR(sssToggle);
/* Specular */
bool _specToggle;
bool BLOCK_ATTR(specToggle);
/* Lights */
int _laNumLight;
int BLOCK_ATTR(laNumLight);
/* Probes */
int _prbNumPlanar;
int _prbNumRenderCube;
int _prbNumRenderGrid;
int _prbIrradianceVisSize;
float _prbIrradianceSmooth;
float _prbLodCubeMax;
int BLOCK_ATTR(prbNumPlanar);
int BLOCK_ATTR(prbNumRenderCube);
int BLOCK_ATTR(prbNumRenderGrid);
int BLOCK_ATTR(prbIrradianceVisSize);
float BLOCK_ATTR(prbIrradianceSmooth);
float BLOCK_ATTR(prbLodCubeMax);
/* Misc */
int _rayType;
float _rayDepth;
float _alphaHashOffset;
float _alphaHashScale;
vec4 _cameraUvScaleBias;
vec4 _planarClipPlane;
int BLOCK_ATTR(rayType);
float BLOCK_ATTR(rayDepth);
float BLOCK_ATTR(alphaHashOffset);
float BLOCK_ATTR(alphaHashScale);
vec4 BLOCK_ATTR(cameraUvScaleBias);
vec4 BLOCK_ATTR(planarClipPlane);
};
BLI_STATIC_ASSERT_ALIGN(CommonUniformBlock, 16)
@ -102,17 +116,17 @@ struct GridData {
BLI_STATIC_ASSERT_ALIGN(GridData, 16)
struct ProbeBlock {
CubeData _probes_data[MAX_PROBE];
CubeData BLOCK_ATTR(probes_data)[MAX_PROBE];
};
BLI_STATIC_ASSERT_ALIGN(ProbeBlock, 16)
struct GridBlock {
GridData _grids_data[MAX_GRID];
GridData BLOCK_ATTR(grids_data)[MAX_GRID];
};
BLI_STATIC_ASSERT_ALIGN(GridBlock, 16)
struct PlanarBlock {
PlanarData _planars_data[MAX_PLANAR];
PlanarData BLOCK_ATTR(planars_data)[MAX_PLANAR];
};
BLI_STATIC_ASSERT_ALIGN(PlanarBlock, 16)
@ -141,9 +155,9 @@ struct ShadowCascadeData {
BLI_STATIC_ASSERT_ALIGN(ShadowCascadeData, 16)
struct ShadowBlock {
ShadowData _shadows_data[MAX_SHADOW];
ShadowCubeData _shadows_cube_data[MAX_SHADOW_CUBE];
ShadowCascadeData _shadows_cascade_data[MAX_SHADOW_CASCADE];
ShadowData BLOCK_ATTR(shadows_data)[MAX_SHADOW];
ShadowCubeData BLOCK_ATTR(shadows_cube_data)[MAX_SHADOW_CUBE];
ShadowCascadeData BLOCK_ATTR(shadows_cascade_data)[MAX_SHADOW_CASCADE];
};
BLI_STATIC_ASSERT_ALIGN(ShadowBlock, 16)
@ -159,20 +173,20 @@ struct LightData {
BLI_STATIC_ASSERT_ALIGN(LightData, 16)
struct LightBlock {
LightData _lights_data[MAX_LIGHT];
LightData BLOCK_ATTR(lights_data)[MAX_LIGHT];
};
BLI_STATIC_ASSERT_ALIGN(LightBlock, 16)
struct RenderpassBlock {
bool _renderPassDiffuse;
bool _renderPassDiffuseLight;
bool _renderPassGlossy;
bool _renderPassGlossyLight;
bool _renderPassEmit;
bool _renderPassSSSColor;
bool _renderPassEnvironment;
bool _renderPassAOV;
uint _renderPassAOVActive;
bool BLOCK_ATTR(renderPassDiffuse);
bool BLOCK_ATTR(renderPassDiffuseLight);
bool BLOCK_ATTR(renderPassGlossy);
bool BLOCK_ATTR(renderPassGlossyLight);
bool BLOCK_ATTR(renderPassEmit);
bool BLOCK_ATTR(renderPassSSSColor);
bool BLOCK_ATTR(renderPassEnvironment);
bool BLOCK_ATTR(renderPassAOV);
uint BLOCK_ATTR(renderPassAOVActive);
};
BLI_STATIC_ASSERT_ALIGN(RenderpassBlock, 16)
@ -194,75 +208,75 @@ BLI_STATIC_ASSERT_ALIGN(SSSProfileBlock, 16)
# if defined(USE_GPU_SHADER_CREATE_INFO)
/* Keep compatibility_with old global scope syntax. */
# define pastViewProjectionMatrix common_block._pastViewProjectionMatrix
# define hizUvScale common_block._hizUvScale
# define aoParameters common_block._aoParameters
# define volTexSize common_block._volTexSize
# define volDepthParameters common_block._volDepthParameters
# define volInvTexSize common_block._volInvTexSize
# define volJitter common_block._volJitter
# define volCoordScale common_block._volCoordScale
# define volHistoryAlpha common_block._volHistoryAlpha
# define volShadowSteps common_block._volShadowSteps
# define volUseLights common_block._volUseLights
# define volUseSoftShadows common_block._volUseSoftShadows
# define ssrParameters common_block._ssrParameters
# define ssrBorderFac common_block._ssrBorderFac
# define ssrMaxRoughness common_block._ssrMaxRoughness
# define ssrFireflyFac common_block._ssrFireflyFac
# define ssrBrdfBias common_block._ssrBrdfBias
# define ssrToggle common_block._ssrToggle
# define ssrefractToggle common_block._ssrefractToggle
# define sssJitterThreshold common_block._sssJitterThreshold
# define sssToggle common_block._sssToggle
# define specToggle common_block._specToggle
# define laNumLight common_block._laNumLight
# define prbNumPlanar common_block._prbNumPlanar
# define prbNumRenderCube common_block._prbNumRenderCube
# define prbNumRenderGrid common_block._prbNumRenderGrid
# define prbIrradianceVisSize common_block._prbIrradianceVisSize
# define prbIrradianceSmooth common_block._prbIrradianceSmooth
# define prbLodCubeMax common_block._prbLodCubeMax
# define rayType common_block._rayType
# define rayDepth common_block._rayDepth
# define alphaHashOffset common_block._alphaHashOffset
# define alphaHashScale common_block._alphaHashScale
# define cameraUvScaleBias common_block._cameraUvScaleBias
# define planarClipPlane common_block._planarClipPlane
# define pastViewProjectionMatrix common_block.BLOCK_ATTR(pastViewProjectionMatrix)
# define hizUvScale common_block.BLOCK_ATTR(hizUvScale)
# define aoParameters common_block.BLOCK_ATTR(aoParameters)
# define volTexSize common_block.BLOCK_ATTR(volTexSize)
# define volDepthParameters common_block.BLOCK_ATTR(volDepthParameters)
# define volInvTexSize common_block.BLOCK_ATTR(volInvTexSize)
# define volJitter common_block.BLOCK_ATTR(volJitter)
# define volCoordScale common_block.BLOCK_ATTR(volCoordScale)
# define volHistoryAlpha common_block.BLOCK_ATTR(volHistoryAlpha)
# define volShadowSteps common_block.BLOCK_ATTR(volShadowSteps)
# define volUseLights common_block.BLOCK_ATTR(volUseLights)
# define volUseSoftShadows common_block.BLOCK_ATTR(volUseSoftShadows)
# define ssrParameters common_block.BLOCK_ATTR(ssrParameters)
# define ssrBorderFac common_block.BLOCK_ATTR(ssrBorderFac)
# define ssrMaxRoughness common_block.BLOCK_ATTR(ssrMaxRoughness)
# define ssrFireflyFac common_block.BLOCK_ATTR(ssrFireflyFac)
# define ssrBrdfBias common_block.BLOCK_ATTR(ssrBrdfBias)
# define ssrToggle common_block.BLOCK_ATTR(ssrToggle)
# define ssrefractToggle common_block.BLOCK_ATTR(ssrefractToggle)
# define sssJitterThreshold common_block.BLOCK_ATTR(sssJitterThreshold)
# define sssToggle common_block.BLOCK_ATTR(sssToggle)
# define specToggle common_block.BLOCK_ATTR(specToggle)
# define laNumLight common_block.BLOCK_ATTR(laNumLight)
# define prbNumPlanar common_block.BLOCK_ATTR(prbNumPlanar)
# define prbNumRenderCube common_block.BLOCK_ATTR(prbNumRenderCube)
# define prbNumRenderGrid common_block.BLOCK_ATTR(prbNumRenderGrid)
# define prbIrradianceVisSize common_block.BLOCK_ATTR(prbIrradianceVisSize)
# define prbIrradianceSmooth common_block.BLOCK_ATTR(prbIrradianceSmooth)
# define prbLodCubeMax common_block.BLOCK_ATTR(prbLodCubeMax)
# define rayType common_block.BLOCK_ATTR(rayType)
# define rayDepth common_block.BLOCK_ATTR(rayDepth)
# define alphaHashOffset common_block.BLOCK_ATTR(alphaHashOffset)
# define alphaHashScale common_block.BLOCK_ATTR(alphaHashScale)
# define cameraUvScaleBias common_block.BLOCK_ATTR(cameraUvScaleBias)
# define planarClipPlane common_block.BLOCK_ATTR(planarClipPlane)
/* ProbeBlock */
# define probes_data probe_block._probes_data
# define probes_data probe_block.BLOCK_ATTR(probes_data)
/* GridBlock */
# define grids_data grid_block._grids_data
# define grids_data grid_block.BLOCK_ATTR(grids_data)
/* PlanarBlock */
# define planars_data planar_block._planars_data
# define planars_data planar_block.BLOCK_ATTR(planars_data)
/* ShadowBlock */
# define shadows_data shadow_block._shadows_data
# define shadows_cube_data shadow_block._shadows_cube_data
# define shadows_cascade_data shadow_block._shadows_cascade_data
# define shadows_data shadow_block.BLOCK_ATTR(shadows_data)
# define shadows_cube_data shadow_block.BLOCK_ATTR(shadows_cube_data)
# define shadows_cascade_data shadow_block.BLOCK_ATTR(shadows_cascade_data)
/* LightBlock */
# define lights_data light_block._lights_data
# define lights_data light_block.BLOCK_ATTR(lights_data)
/* RenderpassBlock */
# define renderPassDiffuse renderpass_block._renderPassDiffuse
# define renderPassDiffuseLight renderpass_block._renderPassDiffuseLight
# define renderPassGlossy renderpass_block._renderPassGlossy
# define renderPassGlossyLight renderpass_block._renderPassGlossyLight
# define renderPassEmit renderpass_block._renderPassEmit
# define renderPassSSSColor renderpass_block._renderPassSSSColor
# define renderPassEnvironment renderpass_block._renderPassEnvironment
# define renderPassAOV renderpass_block._renderPassAOV
# define renderPassAOVActive renderpass_block._renderPassAOVActive
# define renderPassDiffuse renderpass_block.BLOCK_ATTR(renderPassDiffuse)
# define renderPassDiffuseLight renderpass_block.BLOCK_ATTR(renderPassDiffuseLight)
# define renderPassGlossy renderpass_block.BLOCK_ATTR(renderPassGlossy)
# define renderPassGlossyLight renderpass_block.BLOCK_ATTR(renderPassGlossyLight)
# define renderPassEmit renderpass_block.BLOCK_ATTR(renderPassEmit)
# define renderPassSSSColor renderpass_block.BLOCK_ATTR(renderPassSSSColor)
# define renderPassEnvironment renderpass_block.BLOCK_ATTR(renderPassEnvironment)
# define renderPassAOV renderpass_block.BLOCK_ATTR(renderPassAOV)
# define renderPassAOVActive renderpass_block.BLOCK_ATTR(renderPassAOVActive)
/* SSSProfileBlock */
# define sss_kernel sssProfile._sss_kernel
# define radii_max_radius sssProfile._radii_max_radius
# define avg_inv_radius sssProfile._avg_inv_radius
# define sss_samples sssProfile._sss_samples
# define sss_kernel sssProfile.BLOCK_ATTR(sss_kernel)
Jeroen-Bakker marked this conversation as resolved Outdated

Why is this one left unchanged?

Why is this one left unchanged?
# define radii_max_radius sssProfile.BLOCK_ATTR(radii_max_radius)
# define avg_inv_radius sssProfile.BLOCK_ATTR(avg_inv_radius)
# define sss_samples sssProfile.BLOCK_ATTR(sss_samples)
# endif /* USE_GPU_SHADER_CREATE_INFO */

View File

@ -432,6 +432,13 @@ static void detect_workarounds()
GCaps.clear_viewport_workaround = true;
}
/* Windows with Legacy Intel iGPUs don't support resource aliasing. MacOS/ATI requires resource
* aliasing. Enable this work around for MacOS/ATI as be default we don't want to use resource
* aliasing. */
if (GPU_type_matches(GPU_DEVICE_ATI, GPU_OS_MAC, GPU_DRIVER_ANY)) {
GLContext::resource_aliasing_workaround = true;
}
/* Metal-related Workarounds. */
/* Minimum Per-Vertex stride is 1 byte for OpenGL. */
@ -480,6 +487,7 @@ bool GLContext::vertex_attrib_binding_support = false;
bool GLContext::debug_layer_workaround = false;
bool GLContext::unused_fb_slot_workaround = false;
bool GLContext::generate_mipmap_workaround = false;
bool GLContext::resource_aliasing_workaround = false;
float GLContext::derivative_signs[2] = {1.0f, 1.0f};
void GLBackend::capabilities_init()

View File

@ -73,6 +73,7 @@ class GLContext : public Context {
static bool unused_fb_slot_workaround;
static bool generate_mipmap_workaround;
static float derivative_signs[2];
static bool resource_aliasing_workaround;
/** VBO for missing vertex attrib binding. Avoid undefined behavior on some implementation. */
GLuint default_attr_vbo_;

View File

@ -388,6 +388,8 @@ static void print_resource(std::ostream &os,
int64_t array_offset;
StringRef name_no_array;
const std::string resource_name_prefix = GLContext::resource_aliasing_workaround ? "" : "_";
const std::string attribute_name_prefix = GLContext::resource_aliasing_workaround ? "_" : "";
switch (res.bind_type) {
case ShaderCreateInfo::Resource::BindType::SAMPLER:
@ -405,17 +407,43 @@ static void print_resource(std::ostream &os,
array_offset = res.uniformbuf.name.find_first_of("[");
name_no_array = (array_offset == -1) ? res.uniformbuf.name :
StringRef(res.uniformbuf.name.c_str(), array_offset);
os << "uniform _" << name_no_array << " { " << res.uniformbuf.type_name << " "
<< res.uniformbuf.name << "; };\n";
os << "uniform " << resource_name_prefix << name_no_array << " { "
<< res.uniformbuf.type_name << " " << attribute_name_prefix << res.uniformbuf.name
<< "; };\n";
break;
case ShaderCreateInfo::Resource::BindType::STORAGE_BUFFER:
array_offset = res.storagebuf.name.find_first_of("[");
name_no_array = (array_offset == -1) ? res.storagebuf.name :
StringRef(res.storagebuf.name.c_str(), array_offset);
print_qualifier(os, res.storagebuf.qualifiers);
os << "buffer _";
os << name_no_array << " { " << res.storagebuf.type_name << " " << res.storagebuf.name
<< "; };\n";
os << "buffer " << resource_name_prefix;
os << name_no_array << " { " << res.storagebuf.type_name << " " << attribute_name_prefix
<< res.storagebuf.name << "; };\n";
break;
}
}
/* AMD on MacOS requires resource aliasing. Other platforms can work without. Resource
* aliasing doesn't work on legacy Windows/Intel platforms. */
static void print_resource_alias(std::ostream &os, const ShaderCreateInfo::Resource &res)
{
int64_t array_offset;
StringRef name_no_array;
switch (res.bind_type) {
case ShaderCreateInfo::Resource::BindType::UNIFORM_BUFFER:
array_offset = res.uniformbuf.name.find_first_of("[");
name_no_array = (array_offset == -1) ? res.uniformbuf.name :
StringRef(res.uniformbuf.name.c_str(), array_offset);
os << "#define " << name_no_array << " (_" << name_no_array << ")\n";
break;
case ShaderCreateInfo::Resource::BindType::STORAGE_BUFFER:
array_offset = res.storagebuf.name.find_first_of("[");
name_no_array = (array_offset == -1) ? res.storagebuf.name :
StringRef(res.storagebuf.name.c_str(), array_offset);
os << "#define " << name_no_array << " (_" << name_no_array << ")\n";
break;
default:
break;
}
}
@ -452,10 +480,20 @@ std::string GLShader::resources_declare(const ShaderCreateInfo &info) const
for (const ShaderCreateInfo::Resource &res : info.pass_resources_) {
print_resource(ss, res, info.auto_resource_location_);
}
if (GLContext::resource_aliasing_workaround) {
for (const ShaderCreateInfo::Resource &res : info.pass_resources_) {
print_resource_alias(ss, res);
}
}
ss << "\n/* Batch Resources. */\n";
for (const ShaderCreateInfo::Resource &res : info.batch_resources_) {
print_resource(ss, res, info.auto_resource_location_);
}
if (GLContext::resource_aliasing_workaround) {
for (const ShaderCreateInfo::Resource &res : info.batch_resources_) {
print_resource_alias(ss, res);
}
}
ss << "\n/* Push Constants. */\n";
for (const ShaderCreateInfo::PushConst &uniform : info.push_constants_) {
ss << "uniform " << to_string(uniform.type) << " " << uniform.name;

View File

@ -469,7 +469,8 @@ GLShaderInterface::GLShaderInterface(GLuint program, const shader::ShaderCreateI
if (res.bind_type == ShaderCreateInfo::Resource::BindType::UNIFORM_BUFFER) {
copy_input_name(input, res.uniformbuf.name, name_buffer_, name_buffer_offset);
if (true || !GLContext::explicit_location_support) {
std::string prefixed_name = "_" + res.uniformbuf.name;
const std::string name_prefix = GLContext::resource_aliasing_workaround ? "" : "_";
const std::string prefixed_name = name_prefix + res.uniformbuf.name;
input->location = glGetUniformBlockIndex(program, prefixed_name.c_str());
glUniformBlockBinding(program, input->location, res.slot);
}