forked from suyu/suyu
Merge pull request #12083 from liamwhite/viewport
renderer_vulkan: ignore viewport stores on non-supporting drivers
This commit is contained in:
commit
12fba361bd
5 changed files with 11 additions and 1 deletions
|
@ -407,7 +407,7 @@ void SetupCapabilities(const Profile& profile, const Info& info, EmitContext& ct
|
||||||
}
|
}
|
||||||
ctx.AddCapability(spv::Capability::DemoteToHelperInvocation);
|
ctx.AddCapability(spv::Capability::DemoteToHelperInvocation);
|
||||||
}
|
}
|
||||||
if (info.stores[IR::Attribute::ViewportIndex]) {
|
if (info.stores[IR::Attribute::ViewportIndex] && profile.support_multi_viewport) {
|
||||||
ctx.AddCapability(spv::Capability::MultiViewport);
|
ctx.AddCapability(spv::Capability::MultiViewport);
|
||||||
}
|
}
|
||||||
if (info.stores[IR::Attribute::ViewportMask] && profile.support_viewport_mask) {
|
if (info.stores[IR::Attribute::ViewportMask] && profile.support_viewport_mask) {
|
||||||
|
|
|
@ -84,6 +84,10 @@ std::optional<OutAttr> OutputAttrPointer(EmitContext& ctx, IR::Attribute attr) {
|
||||||
}
|
}
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
case IR::Attribute::ViewportIndex:
|
case IR::Attribute::ViewportIndex:
|
||||||
|
if (!ctx.profile.support_multi_viewport) {
|
||||||
|
LOG_WARNING(Shader, "Ignoring viewport index store on non-supporting driver");
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
if (ctx.profile.support_viewport_index_layer_non_geometry ||
|
if (ctx.profile.support_viewport_index_layer_non_geometry ||
|
||||||
ctx.stage == Shader::Stage::Geometry) {
|
ctx.stage == Shader::Stage::Geometry) {
|
||||||
return OutAttr{ctx.viewport_index, ctx.U32[1]};
|
return OutAttr{ctx.viewport_index, ctx.U32[1]};
|
||||||
|
|
|
@ -43,6 +43,7 @@ struct Profile {
|
||||||
bool support_gl_sparse_textures{};
|
bool support_gl_sparse_textures{};
|
||||||
bool support_gl_derivative_control{};
|
bool support_gl_derivative_control{};
|
||||||
bool support_scaled_attributes{};
|
bool support_scaled_attributes{};
|
||||||
|
bool support_multi_viewport{};
|
||||||
|
|
||||||
bool warp_size_potentially_larger_than_guest{};
|
bool warp_size_potentially_larger_than_guest{};
|
||||||
|
|
||||||
|
|
|
@ -351,6 +351,7 @@ PipelineCache::PipelineCache(RasterizerVulkan& rasterizer_, const Device& device
|
||||||
.support_geometry_shader_passthrough = device.IsNvGeometryShaderPassthroughSupported(),
|
.support_geometry_shader_passthrough = device.IsNvGeometryShaderPassthroughSupported(),
|
||||||
.support_native_ndc = device.IsExtDepthClipControlSupported(),
|
.support_native_ndc = device.IsExtDepthClipControlSupported(),
|
||||||
.support_scaled_attributes = !device.MustEmulateScaledFormats(),
|
.support_scaled_attributes = !device.MustEmulateScaledFormats(),
|
||||||
|
.support_multi_viewport = device.SupportsMultiViewport(),
|
||||||
|
|
||||||
.warp_size_potentially_larger_than_guest = device.IsWarpSizePotentiallyBiggerThanGuest(),
|
.warp_size_potentially_larger_than_guest = device.IsWarpSizePotentiallyBiggerThanGuest(),
|
||||||
|
|
||||||
|
|
|
@ -669,6 +669,10 @@ public:
|
||||||
return supports_conditional_barriers;
|
return supports_conditional_barriers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SupportsMultiViewport() const {
|
||||||
|
return features2.features.multiViewport;
|
||||||
|
}
|
||||||
|
|
||||||
[[nodiscard]] static constexpr bool CheckBrokenCompute(VkDriverId driver_id,
|
[[nodiscard]] static constexpr bool CheckBrokenCompute(VkDriverId driver_id,
|
||||||
u32 driver_version) {
|
u32 driver_version) {
|
||||||
if (driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS) {
|
if (driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS) {
|
||||||
|
|
Loading…
Reference in a new issue