diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index fe5460255e..d3892b4d68 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -1000,6 +1000,7 @@ void GLGSRender::load_program(u32 vertex_base, u32 vertex_count) fill_user_clip_data(buf + 64); *(reinterpret_cast(buf + 128)) = rsx::method_registers.transform_branch_bits(); *(reinterpret_cast(buf + 132)) = vertex_base; + *(reinterpret_cast(buf + 136)) = rsx::method_registers.point_size(); fill_vertex_layout_state(m_vertex_layout, vertex_count, reinterpret_cast(buf + 144)); if (m_transform_constants_dirty) diff --git a/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp b/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp index 46019ccfdd..67f5ab6cd2 100644 --- a/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLVertexProgram.cpp @@ -38,6 +38,7 @@ void GLVertexDecompilerThread::insertHeader(std::stringstream &OS) OS << " vec4 user_clip_factor[2];\n"; OS << " uint transform_branch_bits;\n"; OS << " uint vertex_base_index;\n"; + OS << " float point_size;\n"; OS << " ivec4 input_attributes[16];\n"; OS << "};\n\n"; } @@ -294,6 +295,7 @@ void GLVertexDecompilerThread::insertMainEnd(std::stringstream & OS) if (m_parr.HasParam(PF_PARAM_NONE, "vec4", "dst_reg2")) OS << " front_spec_color = dst_reg2;\n"; + OS << " gl_PointSize = point_size;\n"; OS << " gl_Position = gl_Position * scale_offset_mat;\n"; //Since our clip_space is symetrical [-1, 1] we map it to linear space using the eqn: diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 2abf0e4e5d..def2fe3e21 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -2289,6 +2289,7 @@ void VKGSRender::load_program(u32 vertex_count, u32 vertex_base) fill_user_clip_data(buf + 64); *(reinterpret_cast(buf + 128)) = rsx::method_registers.transform_branch_bits(); *(reinterpret_cast(buf + 132)) = vertex_base; + *(reinterpret_cast(buf + 136)) = rsx::method_registers.point_size(); fill_vertex_layout_state(m_vertex_layout, vertex_count, reinterpret_cast(buf + 144)); //Vertex constants diff --git a/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp b/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp index 96f37517dc..bfc357297b 100644 --- a/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp @@ -36,6 +36,7 @@ void VKVertexDecompilerThread::insertHeader(std::stringstream &OS) OS << " vec4 user_clip_factor[2];\n"; OS << " uint transform_branch_bits;\n"; OS << " uint vertex_base_index;\n"; + OS << " float point_size;\n"; OS << " ivec4 input_attributes[16];\n"; OS << "};\n"; @@ -309,6 +310,7 @@ void VKVertexDecompilerThread::insertMainEnd(std::stringstream & OS) if (m_parr.HasParam(PF_PARAM_NONE, "vec4", "dst_reg2")) OS << " front_spec_color = dst_reg2;\n"; + OS << " gl_PointSize = point_size;\n"; OS << " gl_Position = gl_Position * scale_offset_mat;\n"; OS << "}\n"; } diff --git a/rpcs3/Emu/RSX/rsx_decode.h b/rpcs3/Emu/RSX/rsx_decode.h index 88146b3ef8..b646b3e957 100644 --- a/rpcs3/Emu/RSX/rsx_decode.h +++ b/rpcs3/Emu/RSX/rsx_decode.h @@ -3379,6 +3379,31 @@ struct registers_decoder } }; +template<> +struct registers_decoder +{ + struct decoded_type + { + private: + union + { + u32 raw_data; + } m_data; + public: + decoded_type(u32 raw_value) { m_data.raw_data = raw_value; } + + f32 point_size() const + { + return (f32&)m_data.raw_data; + } + }; + + static std::string dump(decoded_type &&decoded_values) + { + return "Point size: " + std::to_string(decoded_values.point_size()); + } +}; + template<> struct registers_decoder { diff --git a/rpcs3/Emu/RSX/rsx_methods.h b/rpcs3/Emu/RSX/rsx_methods.h index 640ea6a66f..768a6d4956 100644 --- a/rpcs3/Emu/RSX/rsx_methods.h +++ b/rpcs3/Emu/RSX/rsx_methods.h @@ -677,6 +677,11 @@ namespace rsx return decode().line_width(); } + f32 point_size() const + { + return decode().point_size(); + } + u8 alpha_ref() const { return decode().alpha_ref();