Skip to content

Commit bb66b97

Browse files
author
raven02
authored
GL: minor fixes (RPCS3#2105)
* Minor fixes * temporary disable 2-sided lighting * Disable user clip planes until they are properly handled
1 parent 6e07e07 commit bb66b97

File tree

3 files changed

+31
-143
lines changed

3 files changed

+31
-143
lines changed

rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp

-33
Original file line numberDiff line numberDiff line change
@@ -46,32 +46,13 @@ void GLFragmentDecompilerThread::insertIntputs(std::stringstream & OS)
4646
{
4747
for (const ParamItem& PI : PT.items)
4848
{
49-
if (m_prog.front_back_color_enabled)
50-
{
51-
if (PI.name == "diff_color" && m_prog.back_color_diffuse_output)
52-
OS << "in vec4 back_diff_color;" << std::endl;
53-
54-
if (PI.name == "spec_color" && m_prog.back_color_specular_output)
55-
OS << "in vec4 back_spec_color;" << std::endl;
56-
}
57-
5849
//Rename fogc to fog_c to differentiate the input register from the variable
5950
if (PI.name == "fogc")
6051
OS << "in vec4 fog_c;" << std::endl;
6152

6253
OS << "in " << PT.type << " " << PI.name << ";" << std::endl;
6354
}
6455
}
65-
66-
if (m_prog.front_back_color_enabled)
67-
{
68-
if (m_prog.front_color_diffuse_output)
69-
OS << "in vec4 front_diff_color;" << std::endl;
70-
71-
if (m_prog.front_color_specular_output)
72-
OS << "in vec4 front_spec_color;" << std::endl;
73-
}
74-
7556
}
7657

7758
void GLFragmentDecompilerThread::insertOutputs(std::stringstream & OS)
@@ -207,20 +188,6 @@ void GLFragmentDecompilerThread::insertMainStart(std::stringstream & OS)
207188
{
208189
for (const ParamItem& PI : PT.items)
209190
{
210-
if (m_prog.front_back_color_enabled)
211-
{
212-
if (PI.name == "spec_color" && m_prog.back_color_specular_output)
213-
{
214-
OS << " vec4 spec_color = gl_FrontFacing ? front_spec_color : spec_color;\n";
215-
continue;
216-
}
217-
if (PI.name == "diff_color" && m_prog.back_color_diffuse_output)
218-
{
219-
OS << " vec4 diff_color = gl_FrontFacing ? front_diff_color : diff_color;\n";
220-
continue;
221-
}
222-
}
223-
224191
if (PI.name == "fogc")
225192
{
226193
insert_fog_declaration(OS, m_prog.fog_equation);

rpcs3/Emu/RSX/GL/GLGSRender.cpp

+27-67
Original file line numberDiff line numberDiff line change
@@ -600,40 +600,6 @@ bool GLGSRender::do_method(u32 cmd, u32 arg)
600600
return true;
601601
}
602602

603-
struct alignas(4) glsl_scale_buffer
604-
{
605-
float viewport_matrix[4][4];
606-
float window_matrix[4][4];
607-
float normalize_matrix[4][4];
608-
};
609-
610-
struct alignas(4) glsl_vertex_constants_buffer
611-
{
612-
float vc[468][4];
613-
};
614-
615-
struct alignas(4) glsl_fragment_constants_buffer
616-
{
617-
float fc[2048][4];
618-
};
619-
620-
struct alignas(4) glsl_fragment_state_buffer
621-
{
622-
float fog_param0;
623-
float fog_param1;
624-
uint alpha_test;
625-
float alpha_ref;
626-
};
627-
628-
static void fill_fragment_state_buffer(glsl_fragment_state_buffer *buffer)
629-
{
630-
const float fog_params[2] = { rsx::method_registers.fog_params_0(), rsx::method_registers.fog_params_1() };
631-
std::memcpy(&buffer->fog_param0, fog_params, sizeof(float) * 2);
632-
633-
buffer->alpha_test = rsx::method_registers.alpha_test_enabled();
634-
buffer->alpha_ref = rsx::method_registers.alpha_ref() / 255.f;
635-
}
636-
637603
bool GLGSRender::load_program()
638604
{
639605
RSXVertexProgram vertex_program = get_current_vertex_program();
@@ -644,59 +610,53 @@ bool GLGSRender::load_program()
644610

645611
u32 fragment_constants_size = m_prog_buffer.get_fragment_constants_buffer_size(fragment_program);
646612
fragment_constants_size = std::max(32U, fragment_constants_size);
647-
u32 max_buffer_sz =
648-
align(sizeof(glsl_scale_buffer), m_uniform_buffer_offset_align) +
649-
align(sizeof(glsl_vertex_constants_buffer), m_uniform_buffer_offset_align) +
650-
align(fragment_constants_size, m_uniform_buffer_offset_align) +
651-
align(sizeof(glsl_fragment_state_buffer), m_uniform_buffer_offset_align);
652-
613+
u32 max_buffer_sz = 512 + 8192 + align(fragment_constants_size, m_uniform_buffer_offset_align);
614+
m_uniform_ring_buffer.reserve_and_map(max_buffer_sz);
653615

616+
u8 *buf;
654617
u32 scale_offset_offset;
655618
u32 vertex_constants_offset;
656619
u32 fragment_constants_offset;
657-
u32 fragment_state_offset;
658-
659-
m_uniform_ring_buffer.reserve_and_map(max_buffer_sz);
660620

661621
// Scale offset
662-
{
663-
auto mapping = m_uniform_ring_buffer.alloc_from_reserve(sizeof(glsl_scale_buffer), m_uniform_buffer_offset_align);
664-
fill_scale_offset_data((glsl_scale_buffer *)mapping.first, false);
665-
scale_offset_offset = mapping.second;
666-
}
667-
668-
// Fragment state
669-
{
670-
auto mapping = m_uniform_ring_buffer.alloc_from_reserve(sizeof(glsl_fragment_state_buffer), m_uniform_buffer_offset_align);
671-
fill_fragment_state_buffer((glsl_fragment_state_buffer *)mapping.first);
672-
fragment_state_offset = mapping.second;
673-
}
622+
auto mapping = m_uniform_ring_buffer.alloc_from_reserve(512);
623+
buf = static_cast<u8*>(mapping.first);
624+
scale_offset_offset = mapping.second;
625+
fill_scale_offset_data(buf, false);
626+
627+
// Fragment state
628+
u32 is_alpha_tested = rsx::method_registers.alpha_test_enabled();
629+
float alpha_ref = rsx::method_registers.alpha_ref() / 255.f;
630+
f32 fog0 = rsx::method_registers.fog_params_0();
631+
f32 fog1 = rsx::method_registers.fog_params_1();
632+
memcpy(buf + 16 * sizeof(float), &fog0, sizeof(float));
633+
memcpy(buf + 17 * sizeof(float), &fog1, sizeof(float));
634+
memcpy(buf + 18 * sizeof(float), &is_alpha_tested, sizeof(u32));
635+
memcpy(buf + 19 * sizeof(float), &alpha_ref, sizeof(float));
674636

675637
// Vertex constants
676-
{
677-
auto mapping = m_uniform_ring_buffer.alloc_from_reserve(sizeof(glsl_vertex_constants_buffer), m_uniform_buffer_offset_align);
678-
fill_vertex_program_constants_data(mapping.first);
679-
vertex_constants_offset = mapping.second;
680-
}
638+
mapping = m_uniform_ring_buffer.alloc_from_reserve(8192);
639+
buf = static_cast<u8*>(mapping.first);
640+
vertex_constants_offset = mapping.second;
641+
fill_vertex_program_constants_data(buf);
681642

682643
// Fragment constants
683644
if (fragment_constants_size)
684645
{
685-
auto mapping = m_uniform_ring_buffer.alloc_from_reserve(fragment_constants_size, m_uniform_buffer_offset_align);
686-
u8 *buf = static_cast<u8*>(mapping.first);
687-
m_prog_buffer.fill_fragment_constants_buffer({ reinterpret_cast<float*>(buf), gsl::narrow<int>(fragment_constants_size) }, fragment_program);
646+
mapping = m_uniform_ring_buffer.alloc_from_reserve(fragment_constants_size);
647+
buf = static_cast<u8*>(mapping.first);
688648
fragment_constants_offset = mapping.second;
649+
m_prog_buffer.fill_fragment_constants_buffer({ reinterpret_cast<float*>(buf), gsl::narrow<int>(fragment_constants_size) }, fragment_program);
689650
}
690651

691652
m_uniform_ring_buffer.unmap();
692653

693-
m_uniform_ring_buffer.bind_range(0, scale_offset_offset, sizeof(glsl_scale_buffer));
694-
m_uniform_ring_buffer.bind_range(1, vertex_constants_offset, sizeof(glsl_vertex_constants_buffer));
654+
m_uniform_ring_buffer.bind_range(0, scale_offset_offset, 512);
655+
m_uniform_ring_buffer.bind_range(1, vertex_constants_offset, 8192);
695656
if (fragment_constants_size)
696657
{
697658
m_uniform_ring_buffer.bind_range(2, fragment_constants_offset, fragment_constants_size);
698659
}
699-
m_uniform_ring_buffer.bind_range(3, fragment_state_offset, sizeof(glsl_fragment_state_buffer));
700660

701661
return true;
702662
}
@@ -846,4 +806,4 @@ bool GLGSRender::on_access_violation(u32 address, bool is_writing)
846806
{
847807
if (is_writing) return m_gl_texture_cache.mark_as_dirty(address);
848808
return false;
849-
}
809+
}

rpcs3/Emu/RSX/GL/GLVertexProgram.cpp

+4-43
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,10 @@ static const reg_info reg_table[] =
114114
{ "gl_ClipDistance[1]", false, "dst_reg5", ".z", false },
115115
{ "gl_ClipDistance[2]", false, "dst_reg5", ".w", false },
116116
{ "gl_PointSize", false, "dst_reg6", ".x", false },
117-
{ "gl_ClipDistance[3]", false, "dst_reg6", ".y", false },
118-
{ "gl_ClipDistance[4]", false, "dst_reg6", ".z", false },
119-
{ "gl_ClipDistance[5]", false, "dst_reg6", ".w", false },
117+
//Disable user clip planes until they are properly handled
118+
//{ "gl_ClipDistance[3]", false, "dst_reg6", ".y", false },
119+
//{ "gl_ClipDistance[4]", false, "dst_reg6", ".z", false },
120+
//{ "gl_ClipDistance[5]", false, "dst_reg6", ".w", false },
120121
{ "tc0", true, "dst_reg7", "", false },
121122
{ "tc1", true, "dst_reg8", "", false },
122123
{ "tc2", true, "dst_reg9", "", false },
@@ -225,53 +226,15 @@ GLVertexProgram::GLVertexProgram()
225226

226227
GLVertexProgram::~GLVertexProgram()
227228
{
228-
//if (m_decompiler_thread)
229-
//{
230-
// Wait();
231-
// if (m_decompiler_thread->IsAlive())
232-
// {
233-
// m_decompiler_thread->Stop();
234-
// }
235-
236-
// delete m_decompiler_thread;
237-
// m_decompiler_thread = nullptr;
238-
//}
239-
240229
Delete();
241230
}
242231

243-
//void GLVertexProgram::Wait()
244-
//{
245-
// if (m_decompiler_thread && m_decompiler_thread->IsAlive())
246-
// {
247-
// m_decompiler_thread->Join();
248-
// }
249-
//}
250-
251232
void GLVertexProgram::Decompile(const RSXVertexProgram& prog)
252233
{
253234
GLVertexDecompilerThread decompiler(prog, shader, parr);
254235
decompiler.Task();
255236
}
256237

257-
//void GLVertexProgram::DecompileAsync(RSXVertexProgram& prog)
258-
//{
259-
// if (m_decompiler_thread)
260-
// {
261-
// Wait();
262-
// if (m_decompiler_thread->IsAlive())
263-
// {
264-
// m_decompiler_thread->Stop();
265-
// }
266-
//
267-
// delete m_decompiler_thread;
268-
// m_decompiler_thread = nullptr;
269-
// }
270-
//
271-
// m_decompiler_thread = new GLVertexDecompilerThread(prog.data, shader, parr);
272-
// m_decompiler_thread->Start();
273-
//}
274-
275238
void GLVertexProgram::Compile()
276239
{
277240
if (id)
@@ -305,8 +268,6 @@ void GLVertexProgram::Compile()
305268
LOG_NOTICE(RSX, "%s", shader.c_str());
306269
Emu.Pause();
307270
}
308-
//else LOG_WARNING(RSX, "Vertex shader compiled successfully!");
309-
310271
}
311272

312273
void GLVertexProgram::Delete()

0 commit comments

Comments
 (0)