@@ -600,40 +600,6 @@ bool GLGSRender::do_method(u32 cmd, u32 arg)
600
600
return true ;
601
601
}
602
602
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
-
637
603
bool GLGSRender::load_program ()
638
604
{
639
605
RSXVertexProgram vertex_program = get_current_vertex_program ();
@@ -644,59 +610,53 @@ bool GLGSRender::load_program()
644
610
645
611
u32 fragment_constants_size = m_prog_buffer.get_fragment_constants_buffer_size (fragment_program);
646
612
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);
653
615
616
+ u8 *buf;
654
617
u32 scale_offset_offset;
655
618
u32 vertex_constants_offset;
656
619
u32 fragment_constants_offset;
657
- u32 fragment_state_offset;
658
-
659
- m_uniform_ring_buffer.reserve_and_map (max_buffer_sz);
660
620
661
621
// 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 ));
674
636
675
637
// 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);
681
642
682
643
// Fragment constants
683
644
if (fragment_constants_size)
684
645
{
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 );
688
648
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);
689
650
}
690
651
691
652
m_uniform_ring_buffer.unmap ();
692
653
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 );
695
656
if (fragment_constants_size)
696
657
{
697
658
m_uniform_ring_buffer.bind_range (2 , fragment_constants_offset, fragment_constants_size);
698
659
}
699
- m_uniform_ring_buffer.bind_range (3 , fragment_state_offset, sizeof (glsl_fragment_state_buffer));
700
660
701
661
return true ;
702
662
}
@@ -846,4 +806,4 @@ bool GLGSRender::on_access_violation(u32 address, bool is_writing)
846
806
{
847
807
if (is_writing) return m_gl_texture_cache.mark_as_dirty (address);
848
808
return false ;
849
- }
809
+ }
0 commit comments