mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-12-10 05:38:49 +00:00
shader_recompiler: Implement guest barycentrics (#3245)
* shader_recompiler: Implement guest barycentrics * Review comments and some cleanup
This commit is contained in:
@@ -137,7 +137,8 @@ GraphicsPipeline::GraphicsPipeline(
|
||||
const vk::PipelineMultisampleStateCreateInfo multisampling = {
|
||||
.rasterizationSamples =
|
||||
LiverpoolToVK::NumSamples(key.num_samples, instance.GetFramebufferSampleCounts()),
|
||||
.sampleShadingEnable = false,
|
||||
.sampleShadingEnable =
|
||||
fs_info.addr_flags.persp_sample_ena || fs_info.addr_flags.linear_sample_ena,
|
||||
};
|
||||
|
||||
const vk::PipelineViewportDepthClipControlCreateInfoEXT clip_control = {
|
||||
|
||||
@@ -273,7 +273,12 @@ bool Instance::CreateDevice() {
|
||||
depth_clip_enable = add_extension(VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME);
|
||||
vertex_input_dynamic_state = add_extension(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME);
|
||||
list_restart = add_extension(VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME);
|
||||
fragment_shader_barycentric = add_extension(VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME);
|
||||
amd_shader_explicit_vertex_parameter =
|
||||
add_extension(VK_AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_EXTENSION_NAME);
|
||||
if (!amd_shader_explicit_vertex_parameter) {
|
||||
fragment_shader_barycentric =
|
||||
add_extension(VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME);
|
||||
}
|
||||
legacy_vertex_attributes = add_extension(VK_EXT_LEGACY_VERTEX_ATTRIBUTES_EXTENSION_NAME);
|
||||
provoking_vertex = add_extension(VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME);
|
||||
shader_stencil_export = add_extension(VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME);
|
||||
|
||||
@@ -145,6 +145,11 @@ public:
|
||||
return fragment_shader_barycentric;
|
||||
}
|
||||
|
||||
/// Returns true when VK_AMD_shader_explicit_vertex_parameter is supported.
|
||||
bool IsAmdShaderExplicitVertexParameterSupported() const {
|
||||
return amd_shader_explicit_vertex_parameter;
|
||||
}
|
||||
|
||||
/// Returns true when VK_EXT_primitive_topology_list_restart is supported.
|
||||
bool IsListRestartSupported() const {
|
||||
return list_restart;
|
||||
@@ -413,6 +418,7 @@ private:
|
||||
u32 queue_family_index{0};
|
||||
bool custom_border_color{};
|
||||
bool fragment_shader_barycentric{};
|
||||
bool amd_shader_explicit_vertex_parameter{};
|
||||
bool depth_clip_control{};
|
||||
bool depth_clip_enable{};
|
||||
bool depth_range_unrestricted{};
|
||||
|
||||
@@ -220,6 +220,12 @@ PipelineCache::PipelineCache(const Instance& instance_, Scheduler& scheduler_,
|
||||
.supports_shared_int64_atomics = instance_.IsSharedInt64AtomicsSupported(),
|
||||
.supports_workgroup_explicit_memory_layout =
|
||||
instance_.IsWorkgroupMemoryExplicitLayoutSupported(),
|
||||
.supports_amd_shader_explicit_vertex_parameter =
|
||||
instance_.IsAmdShaderExplicitVertexParameterSupported(),
|
||||
.supports_fragment_shader_barycentric = instance_.IsFragmentShaderBarycentricSupported(),
|
||||
.has_incomplete_fragment_shader_barycentric =
|
||||
instance_.IsFragmentShaderBarycentricSupported() &&
|
||||
instance.GetDriverID() == vk::DriverId::eMoltenvk,
|
||||
.needs_manual_interpolation = instance.IsFragmentShaderBarycentricSupported() &&
|
||||
instance.GetDriverID() == vk::DriverId::eNvidiaProprietary,
|
||||
.needs_lds_barriers = instance.GetDriverID() == vk::DriverId::eNvidiaProprietary ||
|
||||
|
||||
Reference in New Issue
Block a user