Permalink
Browse files

GL: minor fixes (#2105)

* Minor fixes

* temporary disable 2-sided lighting

* Disable user clip planes until they are properly handled
  • Loading branch information...
1 parent 6e07e07 commit bb66b972517761044e8401c1c0871c15ec08b749 @raven02 raven02 committed on GitHub Aug 27, 2016
Showing with 31 additions and 143 deletions.
  1. +0 −33 rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp
  2. +27 −67 rpcs3/Emu/RSX/GL/GLGSRender.cpp
  3. +4 −43 rpcs3/Emu/RSX/GL/GLVertexProgram.cpp
@@ -46,32 +46,13 @@ void GLFragmentDecompilerThread::insertIntputs(std::stringstream & OS)
{
for (const ParamItem& PI : PT.items)
{
- if (m_prog.front_back_color_enabled)
- {
- if (PI.name == "diff_color" && m_prog.back_color_diffuse_output)
- OS << "in vec4 back_diff_color;" << std::endl;
-
- if (PI.name == "spec_color" && m_prog.back_color_specular_output)
- OS << "in vec4 back_spec_color;" << std::endl;
- }
-
//Rename fogc to fog_c to differentiate the input register from the variable
if (PI.name == "fogc")
OS << "in vec4 fog_c;" << std::endl;
OS << "in " << PT.type << " " << PI.name << ";" << std::endl;
}
}
-
- if (m_prog.front_back_color_enabled)
- {
- if (m_prog.front_color_diffuse_output)
- OS << "in vec4 front_diff_color;" << std::endl;
-
- if (m_prog.front_color_specular_output)
- OS << "in vec4 front_spec_color;" << std::endl;
- }
-
}
void GLFragmentDecompilerThread::insertOutputs(std::stringstream & OS)
@@ -207,20 +188,6 @@ void GLFragmentDecompilerThread::insertMainStart(std::stringstream & OS)
{
for (const ParamItem& PI : PT.items)
{
- if (m_prog.front_back_color_enabled)
- {
- if (PI.name == "spec_color" && m_prog.back_color_specular_output)
- {
- OS << " vec4 spec_color = gl_FrontFacing ? front_spec_color : spec_color;\n";
- continue;
- }
- if (PI.name == "diff_color" && m_prog.back_color_diffuse_output)
- {
- OS << " vec4 diff_color = gl_FrontFacing ? front_diff_color : diff_color;\n";
- continue;
- }
- }
-
if (PI.name == "fogc")
{
insert_fog_declaration(OS, m_prog.fog_equation);
@@ -600,40 +600,6 @@ bool GLGSRender::do_method(u32 cmd, u32 arg)
return true;
}
-struct alignas(4) glsl_scale_buffer
-{
- float viewport_matrix[4][4];
- float window_matrix[4][4];
- float normalize_matrix[4][4];
-};
-
-struct alignas(4) glsl_vertex_constants_buffer
-{
- float vc[468][4];
-};
-
-struct alignas(4) glsl_fragment_constants_buffer
-{
- float fc[2048][4];
-};
-
-struct alignas(4) glsl_fragment_state_buffer
-{
- float fog_param0;
- float fog_param1;
- uint alpha_test;
- float alpha_ref;
-};
-
-static void fill_fragment_state_buffer(glsl_fragment_state_buffer *buffer)
-{
- const float fog_params[2] = { rsx::method_registers.fog_params_0(), rsx::method_registers.fog_params_1() };
- std::memcpy(&buffer->fog_param0, fog_params, sizeof(float) * 2);
-
- buffer->alpha_test = rsx::method_registers.alpha_test_enabled();
- buffer->alpha_ref = rsx::method_registers.alpha_ref() / 255.f;
-}
-
bool GLGSRender::load_program()
{
RSXVertexProgram vertex_program = get_current_vertex_program();
@@ -644,59 +610,53 @@ bool GLGSRender::load_program()
u32 fragment_constants_size = m_prog_buffer.get_fragment_constants_buffer_size(fragment_program);
fragment_constants_size = std::max(32U, fragment_constants_size);
- u32 max_buffer_sz =
- align(sizeof(glsl_scale_buffer), m_uniform_buffer_offset_align) +
- align(sizeof(glsl_vertex_constants_buffer), m_uniform_buffer_offset_align) +
- align(fragment_constants_size, m_uniform_buffer_offset_align) +
- align(sizeof(glsl_fragment_state_buffer), m_uniform_buffer_offset_align);
-
+ u32 max_buffer_sz = 512 + 8192 + align(fragment_constants_size, m_uniform_buffer_offset_align);
+ m_uniform_ring_buffer.reserve_and_map(max_buffer_sz);
+ u8 *buf;
u32 scale_offset_offset;
u32 vertex_constants_offset;
u32 fragment_constants_offset;
- u32 fragment_state_offset;
-
- m_uniform_ring_buffer.reserve_and_map(max_buffer_sz);
// Scale offset
- {
- auto mapping = m_uniform_ring_buffer.alloc_from_reserve(sizeof(glsl_scale_buffer), m_uniform_buffer_offset_align);
- fill_scale_offset_data((glsl_scale_buffer *)mapping.first, false);
- scale_offset_offset = mapping.second;
- }
-
- // Fragment state
- {
- auto mapping = m_uniform_ring_buffer.alloc_from_reserve(sizeof(glsl_fragment_state_buffer), m_uniform_buffer_offset_align);
- fill_fragment_state_buffer((glsl_fragment_state_buffer *)mapping.first);
- fragment_state_offset = mapping.second;
- }
+ auto mapping = m_uniform_ring_buffer.alloc_from_reserve(512);
+ buf = static_cast<u8*>(mapping.first);
+ scale_offset_offset = mapping.second;
+ fill_scale_offset_data(buf, false);
+
+ // Fragment state
+ u32 is_alpha_tested = rsx::method_registers.alpha_test_enabled();
+ float alpha_ref = rsx::method_registers.alpha_ref() / 255.f;
+ f32 fog0 = rsx::method_registers.fog_params_0();
+ f32 fog1 = rsx::method_registers.fog_params_1();
+ memcpy(buf + 16 * sizeof(float), &fog0, sizeof(float));
+ memcpy(buf + 17 * sizeof(float), &fog1, sizeof(float));
+ memcpy(buf + 18 * sizeof(float), &is_alpha_tested, sizeof(u32));
+ memcpy(buf + 19 * sizeof(float), &alpha_ref, sizeof(float));
// Vertex constants
- {
- auto mapping = m_uniform_ring_buffer.alloc_from_reserve(sizeof(glsl_vertex_constants_buffer), m_uniform_buffer_offset_align);
- fill_vertex_program_constants_data(mapping.first);
- vertex_constants_offset = mapping.second;
- }
+ mapping = m_uniform_ring_buffer.alloc_from_reserve(8192);
+ buf = static_cast<u8*>(mapping.first);
+ vertex_constants_offset = mapping.second;
+ fill_vertex_program_constants_data(buf);
// Fragment constants
if (fragment_constants_size)
{
- auto mapping = m_uniform_ring_buffer.alloc_from_reserve(fragment_constants_size, m_uniform_buffer_offset_align);
- u8 *buf = static_cast<u8*>(mapping.first);
- m_prog_buffer.fill_fragment_constants_buffer({ reinterpret_cast<float*>(buf), gsl::narrow<int>(fragment_constants_size) }, fragment_program);
+ mapping = m_uniform_ring_buffer.alloc_from_reserve(fragment_constants_size);
+ buf = static_cast<u8*>(mapping.first);
fragment_constants_offset = mapping.second;
+ m_prog_buffer.fill_fragment_constants_buffer({ reinterpret_cast<float*>(buf), gsl::narrow<int>(fragment_constants_size) }, fragment_program);
}
m_uniform_ring_buffer.unmap();
- m_uniform_ring_buffer.bind_range(0, scale_offset_offset, sizeof(glsl_scale_buffer));
- m_uniform_ring_buffer.bind_range(1, vertex_constants_offset, sizeof(glsl_vertex_constants_buffer));
+ m_uniform_ring_buffer.bind_range(0, scale_offset_offset, 512);
+ m_uniform_ring_buffer.bind_range(1, vertex_constants_offset, 8192);
if (fragment_constants_size)
{
m_uniform_ring_buffer.bind_range(2, fragment_constants_offset, fragment_constants_size);
}
- m_uniform_ring_buffer.bind_range(3, fragment_state_offset, sizeof(glsl_fragment_state_buffer));
return true;
}
@@ -846,4 +806,4 @@ bool GLGSRender::on_access_violation(u32 address, bool is_writing)
{
if (is_writing) return m_gl_texture_cache.mark_as_dirty(address);
return false;
-}
+}
@@ -114,9 +114,10 @@ static const reg_info reg_table[] =
{ "gl_ClipDistance[1]", false, "dst_reg5", ".z", false },
{ "gl_ClipDistance[2]", false, "dst_reg5", ".w", false },
{ "gl_PointSize", false, "dst_reg6", ".x", false },
- { "gl_ClipDistance[3]", false, "dst_reg6", ".y", false },
- { "gl_ClipDistance[4]", false, "dst_reg6", ".z", false },
- { "gl_ClipDistance[5]", false, "dst_reg6", ".w", false },
+ //Disable user clip planes until they are properly handled
+ //{ "gl_ClipDistance[3]", false, "dst_reg6", ".y", false },
+ //{ "gl_ClipDistance[4]", false, "dst_reg6", ".z", false },
+ //{ "gl_ClipDistance[5]", false, "dst_reg6", ".w", false },
{ "tc0", true, "dst_reg7", "", false },
{ "tc1", true, "dst_reg8", "", false },
{ "tc2", true, "dst_reg9", "", false },
@@ -225,53 +226,15 @@ GLVertexProgram::GLVertexProgram()
GLVertexProgram::~GLVertexProgram()
{
- //if (m_decompiler_thread)
- //{
- // Wait();
- // if (m_decompiler_thread->IsAlive())
- // {
- // m_decompiler_thread->Stop();
- // }
-
- // delete m_decompiler_thread;
- // m_decompiler_thread = nullptr;
- //}
-
Delete();
}
-//void GLVertexProgram::Wait()
-//{
-// if (m_decompiler_thread && m_decompiler_thread->IsAlive())
-// {
-// m_decompiler_thread->Join();
-// }
-//}
-
void GLVertexProgram::Decompile(const RSXVertexProgram& prog)
{
GLVertexDecompilerThread decompiler(prog, shader, parr);
decompiler.Task();
}
-//void GLVertexProgram::DecompileAsync(RSXVertexProgram& prog)
-//{
-// if (m_decompiler_thread)
-// {
-// Wait();
-// if (m_decompiler_thread->IsAlive())
-// {
-// m_decompiler_thread->Stop();
-// }
-//
-// delete m_decompiler_thread;
-// m_decompiler_thread = nullptr;
-// }
-//
-// m_decompiler_thread = new GLVertexDecompilerThread(prog.data, shader, parr);
-// m_decompiler_thread->Start();
-//}
-
void GLVertexProgram::Compile()
{
if (id)
@@ -305,8 +268,6 @@ void GLVertexProgram::Compile()
LOG_NOTICE(RSX, "%s", shader.c_str());
Emu.Pause();
}
- //else LOG_WARNING(RSX, "Vertex shader compiled successfully!");
-
}
void GLVertexProgram::Delete()

0 comments on commit bb66b97

Please sign in to comment.