From e3b23822fda988bd6bb78bee031a45cdd334cee8 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 5 Dec 2022 01:33:02 +0300 Subject: [PATCH] rsx: Pass on shader flags to the cache --- rpcs3/Emu/RSX/GL/GLGSRender.cpp | 3 ++- rpcs3/Emu/RSX/Program/RSXVertexProgram.h | 1 + rpcs3/Emu/RSX/RSXThread.cpp | 7 +++++++ rpcs3/Emu/RSX/RSXThread.h | 19 ++++++++++--------- rpcs3/Emu/RSX/VK/VKGSRender.cpp | 5 ++++- rpcs3/Emu/RSX/gcm_enums.h | 11 +++++++---- rpcs3/Emu/RSX/rsx_cache.h | 17 +++++++++++------ 7 files changed, 42 insertions(+), 21 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index e1a26c3f66..1477321ea6 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -15,7 +15,7 @@ u64 GLGSRender::get_cycles() GLGSRender::GLGSRender(utils::serial* ar) noexcept : GSRender(ar) { - m_shaders_cache = std::make_unique(m_prog_buffer, "opengl", "v1.93"); + m_shaders_cache = std::make_unique(m_prog_buffer, "opengl", "v1.94"); if (g_cfg.video.disable_vertex_cache || g_cfg.video.multithreaded_rsx) m_vertex_cache = std::make_unique(); @@ -25,6 +25,7 @@ GLGSRender::GLGSRender(utils::serial* ar) noexcept : GSRender(ar) backend_config.supports_hw_a2c = false; backend_config.supports_hw_a2one = false; backend_config.supports_multidraw = true; + backend_config.supports_normalized_barycentrics = true; } extern CellGcmContextData current_context; diff --git a/rpcs3/Emu/RSX/Program/RSXVertexProgram.h b/rpcs3/Emu/RSX/Program/RSXVertexProgram.h index 561ae5e97b..6a25906e35 100644 --- a/rpcs3/Emu/RSX/Program/RSXVertexProgram.h +++ b/rpcs3/Emu/RSX/Program/RSXVertexProgram.h @@ -223,6 +223,7 @@ struct RSXVertexProgram { std::vector data; rsx::vertex_program_texture_state texture_state; + u32 ctrl; u32 output_mask; u32 base_address; u32 entry; diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index b19c4cbddf..ebf795192b 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -607,6 +607,13 @@ namespace rsx } } + if (!backend_config.supports_normalized_barycentrics) + { + // TODO + // Store a global flag to track raster mode between polygon and non-polygon + // Check if flag changed. If state is the same, ignore. + } + in_begin_end = true; } diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index b0859a3028..06244ad834 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -452,15 +452,16 @@ namespace rsx struct backend_configuration { - bool supports_multidraw; // Draw call batching - bool supports_hw_a2c; // Alpha to coverage - bool supports_hw_renormalization; // Should be true on NV hardware which matches PS3 texture renormalization behaviour - bool supports_hw_msaa; // MSAA support - bool supports_hw_a2one; // Alpha to one - bool supports_hw_conditional_render; // Conditional render - bool supports_passthrough_dma; // DMA passthrough - bool supports_asynchronous_compute; // Async compute - bool supports_host_gpu_labels; // Advanced host synchronization + bool supports_multidraw; // Draw call batching + bool supports_hw_a2c; // Alpha to coverage + bool supports_hw_renormalization; // Should be true on NV hardware which matches PS3 texture renormalization behaviour + bool supports_hw_msaa; // MSAA support + bool supports_hw_a2one; // Alpha to one + bool supports_hw_conditional_render; // Conditional render + bool supports_passthrough_dma; // DMA passthrough + bool supports_asynchronous_compute; // Async compute + bool supports_host_gpu_labels; // Advanced host synchronization + bool supports_normalized_barycentrics; // Basically all GPUs except NVIDIA have properly normalized barycentrics }; struct sampled_image_descriptor_base; diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index e832cabb05..b495b66c09 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -510,7 +510,7 @@ VKGSRender::VKGSRender(utils::serial* ar) noexcept : GSRender(ar) else m_vertex_cache = std::make_unique(); - m_shaders_cache = std::make_unique(*m_prog_buffer, "vulkan", "v1.93"); + m_shaders_cache = std::make_unique(*m_prog_buffer, "vulkan", "v1.94"); for (u32 i = 0; i < m_swapchain->get_swap_image_count(); ++i) { @@ -539,6 +539,9 @@ VKGSRender::VKGSRender(utils::serial* ar) noexcept : GSRender(ar) backend_config.supports_multidraw = true; + // NVIDIA has broken barycentric interpolation + backend_config.supports_normalized_barycentrics = (vk::get_driver_vendor() != vk::driver_vendor::NVIDIA); + // NOTE: We do not actually need multiple sample support for A2C to work // This is here for visual consistency - will be removed when AA problems due to mipmaps are fixed if (g_cfg.video.antialiasing_level != msaa_level::none) diff --git a/rpcs3/Emu/RSX/gcm_enums.h b/rpcs3/Emu/RSX/gcm_enums.h index bb80505668..dfdb342ece 100644 --- a/rpcs3/Emu/RSX/gcm_enums.h +++ b/rpcs3/Emu/RSX/gcm_enums.h @@ -773,12 +773,15 @@ enum CELL_GCM_SHADER_CONTROL_DEPTH_EXPORT = 0xe, ///< shader program exports the depth of the shaded fragment CELL_GCM_SHADER_CONTROL_32_BITS_EXPORTS = 0x40, ///< shader program exports 32 bits registers values (instead of 16 bits ones) - //Other known flags + // Other known flags RSX_SHADER_CONTROL_USED_REGS_MASK = 0xf, RSX_SHADER_CONTROL_USED_TEMP_REGS_MASK = 0xff << 24, - RSX_SHADER_CONTROL_USES_KIL = 0x80, //program uses KIL op - RSX_SHADER_CONTROL_UNKNOWN0 = 0x400, //seemingly always set - RSX_SHADER_CONTROL_UNKNOWN1 = 0x8000 //seemingly set when srgb packer is used?? + RSX_SHADER_CONTROL_USES_KIL = 0x80, // program uses KIL op + RSX_SHADER_CONTROL_UNKNOWN0 = 0x400, // seemingly always set + RSX_SHADER_CONTROL_UNKNOWN1 = 0x8000, // seemingly set when srgb packer is used?? + + // Custom + RSX_SHADER_CONTROL_POLYGON_RASTER = 0x10000 // Rasterizing triangles and not lines or points }; // GCM Reports diff --git a/rpcs3/Emu/RSX/rsx_cache.h b/rpcs3/Emu/RSX/rsx_cache.h index e074b31dbf..7ebb4110e7 100644 --- a/rpcs3/Emu/RSX/rsx_cache.h +++ b/rpcs3/Emu/RSX/rsx_cache.h @@ -28,8 +28,10 @@ namespace rsx u64 fragment_program_hash; u64 pipeline_storage_hash; - u32 vp_ctrl; + u32 vp_ctrl0; + u32 vp_ctrl1; u32 vp_texture_dimensions; + u32 vp_reserved_0; u64 vp_instruction_mask[9]; u32 vp_base_address; @@ -37,8 +39,8 @@ namespace rsx u16 vp_jump_table[32]; u16 vp_multisampled_textures; - u16 vp_reserved_0; - u32 vp_reserved_1; + u16 vp_reserved_1; + u32 vp_reserved_2; u32 fp_ctrl; u32 fp_texture_dimensions; @@ -305,7 +307,8 @@ namespace rsx } u64 state_hash = 0; - state_hash ^= rpcs3::hash_base(data.vp_ctrl); + state_hash ^= rpcs3::hash_base(data.vp_ctrl0); + state_hash ^= rpcs3::hash_base(data.vp_ctrl1); state_hash ^= rpcs3::hash_base(data.fp_ctrl); state_hash ^= rpcs3::hash_base(data.vp_texture_dimensions); state_hash ^= rpcs3::hash_base(data.fp_texture_dimensions); @@ -362,7 +365,8 @@ namespace rsx fp = load_fp_raw(data.fragment_program_hash); pipeline = data.pipeline_properties; - vp.output_mask = data.vp_ctrl; + vp.ctrl = data.vp_ctrl0; + vp.output_mask = data.vp_ctrl1; vp.texture_state.texture_dimensions = data.vp_texture_dimensions; vp.texture_state.multisampled_textures = data.vp_multisampled_textures; vp.base_address = data.vp_base_address; @@ -401,7 +405,8 @@ namespace rsx data_block.fragment_program_hash = m_storage.get_hash(fp); data_block.pipeline_storage_hash = m_storage.get_hash(pipeline); - data_block.vp_ctrl = vp.output_mask; + data_block.vp_ctrl0 = vp.ctrl; + data_block.vp_ctrl1 = vp.output_mask; data_block.vp_texture_dimensions = vp.texture_state.texture_dimensions; data_block.vp_multisampled_textures = vp.texture_state.multisampled_textures; data_block.vp_base_address = vp.base_address;