mirror of
https://github.com/skyline-emu/skyline.git
synced 2024-12-29 15:55:29 +03:00
Check for vertexAttributeInstanceRateZeroDivisor
feature before usage
Check for `vertexAttributeInstanceRateZeroDivisor` in `VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT` when the Maxwell3D register corresponding to the vertex attribute divisor is set to 0. If it isn't then it logs a warning and sets the value anyway which could result in UB since the only alternative is an exception that stops emulation which might not be optimal if the game mostly works fine without this, we will add a user-facing warning when we intentionally allow UB like this in the future.
This commit is contained in:
parent
c3895a8197
commit
841ee9fc15
@ -795,6 +795,8 @@ namespace skyline::gpu::interconnect {
|
|||||||
void SetVertexBufferDivisor(u32 index, u32 divisor) {
|
void SetVertexBufferDivisor(u32 index, u32 divisor) {
|
||||||
if (!gpu.quirks.supportsVertexAttributeDivisor)
|
if (!gpu.quirks.supportsVertexAttributeDivisor)
|
||||||
Logger::Warn("Cannot set vertex attribute divisor without host GPU support");
|
Logger::Warn("Cannot set vertex attribute divisor without host GPU support");
|
||||||
|
else if (divisor == 0 && !gpu.quirks.supportsVertexAttributeZeroDivisor)
|
||||||
|
Logger::Warn("Cannot set vertex attribute divisor to zero without host GPU support");
|
||||||
vertexBindingDivisors[index].divisor = divisor;
|
vertexBindingDivisors[index].divisor = divisor;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -39,11 +39,12 @@ namespace skyline {
|
|||||||
}
|
}
|
||||||
|
|
||||||
FEAT_SET(vk::PhysicalDeviceFeatures2, features.logicOp, supportsLogicOp)
|
FEAT_SET(vk::PhysicalDeviceFeatures2, features.logicOp, supportsLogicOp)
|
||||||
|
FEAT_SET(vk::PhysicalDeviceVertexAttributeDivisorFeaturesEXT, vertexAttributeInstanceRateZeroDivisor, supportsVertexAttributeZeroDivisor)
|
||||||
|
|
||||||
#undef FEAT_SET
|
#undef FEAT_SET
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string QuirkManager::Summary() {
|
std::string QuirkManager::Summary() {
|
||||||
return fmt::format("\n* Supports Last Provoking Vertex: {}\n* Supports Logical Operations: {}\n* Supports Vertex Attribute Divisor: {}", supportsLastProvokingVertex, supportsLogicOp, supportsVertexAttributeDivisor);
|
return fmt::format("\n* Supports Last Provoking Vertex: {}\n* Supports Logical Operations: {}\n* Supports Vertex Attribute Divisor: {}\n* Supports Vertex Attribute Zero Divisor: {}", supportsLastProvokingVertex, supportsLogicOp, supportsVertexAttributeDivisor, supportsVertexAttributeZeroDivisor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,7 @@ namespace skyline {
|
|||||||
bool supportsLastProvokingVertex{}; //!< If the device supports setting the last vertex as the provoking vertex (with VK_EXT_provoking_vertex)
|
bool supportsLastProvokingVertex{}; //!< If the device supports setting the last vertex as the provoking vertex (with VK_EXT_provoking_vertex)
|
||||||
bool supportsLogicOp{}; //!< If the device supports framebuffer logical operations during blending
|
bool supportsLogicOp{}; //!< If the device supports framebuffer logical operations during blending
|
||||||
bool supportsVertexAttributeDivisor{}; //!< If the device supports a divisor for instance-rate vertex attributes (with VK_EXT_vertex_attribute_divisor)
|
bool supportsVertexAttributeDivisor{}; //!< If the device supports a divisor for instance-rate vertex attributes (with VK_EXT_vertex_attribute_divisor)
|
||||||
|
bool supportsVertexAttributeZeroDivisor{}; //!< If the device supports a zero divisor for instance-rate vertex attributes (with VK_EXT_vertex_attribute_divisor)
|
||||||
|
|
||||||
QuirkManager() = default;
|
QuirkManager() = default;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user