video_core: Enable support_descriptor_aliasing on Turnip, disable storage atomic otherwise.
This commit is contained in:
parent
e5bdb7011b
commit
ca4bf3844e
|
@ -69,6 +69,11 @@ Id StorageAtomicU32(EmitContext& ctx, const IR::Value& binding, const IR::Value&
|
||||||
Id StorageAtomicU64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset, Id value,
|
Id StorageAtomicU64(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset, Id value,
|
||||||
Id (Sirit::Module::*atomic_func)(Id, Id, Id, Id, Id),
|
Id (Sirit::Module::*atomic_func)(Id, Id, Id, Id, Id),
|
||||||
Id (Sirit::Module::*non_atomic_func)(Id, Id, Id)) {
|
Id (Sirit::Module::*non_atomic_func)(Id, Id, Id)) {
|
||||||
|
if (!ctx.profile.support_descriptor_aliasing) {
|
||||||
|
LOG_WARNING(Shader_SPIRV, "Descriptor aliasing not supported, this cannot be atomic.");
|
||||||
|
return ctx.ConstantNull(ctx.U64);
|
||||||
|
}
|
||||||
|
|
||||||
if (ctx.profile.support_int64_atomics) {
|
if (ctx.profile.support_int64_atomics) {
|
||||||
const Id pointer{StoragePointer(ctx, ctx.storage_types.U64, &StorageDefinitions::U64,
|
const Id pointer{StoragePointer(ctx, ctx.storage_types.U64, &StorageDefinitions::U64,
|
||||||
binding, offset, sizeof(u64))};
|
binding, offset, sizeof(u64))};
|
||||||
|
@ -86,6 +91,11 @@ Id StorageAtomicU64(EmitContext& ctx, const IR::Value& binding, const IR::Value&
|
||||||
|
|
||||||
Id StorageAtomicU32x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset, Id value,
|
Id StorageAtomicU32x2(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset, Id value,
|
||||||
Id (Sirit::Module::*non_atomic_func)(Id, Id, Id)) {
|
Id (Sirit::Module::*non_atomic_func)(Id, Id, Id)) {
|
||||||
|
if (!ctx.profile.support_descriptor_aliasing) {
|
||||||
|
LOG_WARNING(Shader_SPIRV, "Descriptor aliasing not supported, this cannot be atomic.");
|
||||||
|
return ctx.ConstantNull(ctx.U32[2]);
|
||||||
|
}
|
||||||
|
|
||||||
LOG_WARNING(Shader_SPIRV, "Int64 atomics not supported, fallback to non-atomic");
|
LOG_WARNING(Shader_SPIRV, "Int64 atomics not supported, fallback to non-atomic");
|
||||||
const Id pointer{StoragePointer(ctx, ctx.storage_types.U32x2, &StorageDefinitions::U32x2,
|
const Id pointer{StoragePointer(ctx, ctx.storage_types.U32x2, &StorageDefinitions::U32x2,
|
||||||
binding, offset, sizeof(u32[2]))};
|
binding, offset, sizeof(u32[2]))};
|
||||||
|
|
|
@ -298,11 +298,7 @@ PipelineCache::PipelineCache(RasterizerVulkan& rasterizer_, const Device& device
|
||||||
profile = Shader::Profile{
|
profile = Shader::Profile{
|
||||||
.supported_spirv = device.SupportedSpirvVersion(),
|
.supported_spirv = device.SupportedSpirvVersion(),
|
||||||
.unified_descriptor_binding = true,
|
.unified_descriptor_binding = true,
|
||||||
#ifdef ANDROID
|
.support_descriptor_aliasing = device.IsDescriptorAliasingSupported(),
|
||||||
.support_descriptor_aliasing = false,
|
|
||||||
#else
|
|
||||||
.support_descriptor_aliasing = true,
|
|
||||||
#endif
|
|
||||||
.support_int8 = device.IsInt8Supported(),
|
.support_int8 = device.IsInt8Supported(),
|
||||||
.support_int16 = device.IsShaderInt16Supported(),
|
.support_int16 = device.IsShaderInt16Supported(),
|
||||||
.support_int64 = device.IsShaderInt64Supported(),
|
.support_int64 = device.IsShaderInt64Supported(),
|
||||||
|
|
|
@ -295,6 +295,11 @@ public:
|
||||||
return features.features.textureCompressionASTC_LDR;
|
return features.features.textureCompressionASTC_LDR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns true if descriptor aliasing is natively supported.
|
||||||
|
bool IsDescriptorAliasingSupported() const {
|
||||||
|
return GetDriverID() != VK_DRIVER_ID_QUALCOMM_PROPRIETARY;
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns true if the device supports float16 natively.
|
/// Returns true if the device supports float16 natively.
|
||||||
bool IsFloat16Supported() const {
|
bool IsFloat16Supported() const {
|
||||||
return features.shader_float16_int8.shaderFloat16;
|
return features.shader_float16_int8.shaderFloat16;
|
||||||
|
|
Reference in New Issue