summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Tony Wasserka2014-12-13 21:20:47 +0100
committerGravatar Tony Wasserka2014-12-20 18:06:55 +0100
commitaff808b2fdfd9605179a13eb55b72d68a7cdd8c2 (patch)
tree83e896f6e90c5b13a12d1b879ea3c79a7dbb5a55 /src
parentPica/VertexShader: Add support for MOVA, CMP and IFC. (diff)
downloadyuzu-aff808b2fdfd9605179a13eb55b72d68a7cdd8c2.tar.gz
yuzu-aff808b2fdfd9605179a13eb55b72d68a7cdd8c2.tar.xz
yuzu-aff808b2fdfd9605179a13eb55b72d68a7cdd8c2.zip
Pica: Add support for boolean uniforms.
Diffstat (limited to 'src')
-rw-r--r--src/video_core/command_processor.cpp6
-rw-r--r--src/video_core/pica.h8
-rw-r--r--src/video_core/vertex_shader.cpp8
-rw-r--r--src/video_core/vertex_shader.h1
4 files changed, 21 insertions, 2 deletions
diff --git a/src/video_core/command_processor.cpp b/src/video_core/command_processor.cpp
index 4f82694fd..9b8ecf8e3 100644
--- a/src/video_core/command_processor.cpp
+++ b/src/video_core/command_processor.cpp
@@ -162,6 +162,12 @@ static inline void WritePicaReg(u32 id, u32 value, u32 mask) {
162 break; 162 break;
163 } 163 }
164 164
165 case PICA_REG_INDEX(vs_bool_uniforms):
166 for (unsigned i = 0; i < 16; ++i)
167 VertexShader::GetBoolUniform(i) = (registers.vs_bool_uniforms.Value() & (1 << i));
168
169 break;
170
165 case PICA_REG_INDEX_WORKAROUND(vs_uniform_setup.set_value[0], 0x2c1): 171 case PICA_REG_INDEX_WORKAROUND(vs_uniform_setup.set_value[0], 0x2c1):
166 case PICA_REG_INDEX_WORKAROUND(vs_uniform_setup.set_value[1], 0x2c2): 172 case PICA_REG_INDEX_WORKAROUND(vs_uniform_setup.set_value[1], 0x2c2):
167 case PICA_REG_INDEX_WORKAROUND(vs_uniform_setup.set_value[2], 0x2c3): 173 case PICA_REG_INDEX_WORKAROUND(vs_uniform_setup.set_value[2], 0x2c3):
diff --git a/src/video_core/pica.h b/src/video_core/pica.h
index 87a9e7913..06552a3ef 100644
--- a/src/video_core/pica.h
+++ b/src/video_core/pica.h
@@ -492,7 +492,11 @@ struct Regs {
492 492
493 BitField<8, 2, TriangleTopology> triangle_topology; 493 BitField<8, 2, TriangleTopology> triangle_topology;
494 494
495 INSERT_PADDING_WORDS(0x5b); 495 INSERT_PADDING_WORDS(0x51);
496
497 BitField<0, 16, u32> vs_bool_uniforms;
498
499 INSERT_PADDING_WORDS(0x9);
496 500
497 // Offset to shader program entry point (in words) 501 // Offset to shader program entry point (in words)
498 BitField<0, 16, u32> vs_main_offset; 502 BitField<0, 16, u32> vs_main_offset;
@@ -620,6 +624,7 @@ struct Regs {
620 ADD_FIELD(trigger_draw); 624 ADD_FIELD(trigger_draw);
621 ADD_FIELD(trigger_draw_indexed); 625 ADD_FIELD(trigger_draw_indexed);
622 ADD_FIELD(triangle_topology); 626 ADD_FIELD(triangle_topology);
627 ADD_FIELD(vs_bool_uniforms);
623 ADD_FIELD(vs_main_offset); 628 ADD_FIELD(vs_main_offset);
624 ADD_FIELD(vs_input_register_map); 629 ADD_FIELD(vs_input_register_map);
625 ADD_FIELD(vs_uniform_setup); 630 ADD_FIELD(vs_uniform_setup);
@@ -690,6 +695,7 @@ ASSERT_REG_POSITION(num_vertices, 0x228);
690ASSERT_REG_POSITION(trigger_draw, 0x22e); 695ASSERT_REG_POSITION(trigger_draw, 0x22e);
691ASSERT_REG_POSITION(trigger_draw_indexed, 0x22f); 696ASSERT_REG_POSITION(trigger_draw_indexed, 0x22f);
692ASSERT_REG_POSITION(triangle_topology, 0x25e); 697ASSERT_REG_POSITION(triangle_topology, 0x25e);
698ASSERT_REG_POSITION(vs_bool_uniforms, 0x2b0);
693ASSERT_REG_POSITION(vs_main_offset, 0x2ba); 699ASSERT_REG_POSITION(vs_main_offset, 0x2ba);
694ASSERT_REG_POSITION(vs_input_register_map, 0x2bb); 700ASSERT_REG_POSITION(vs_input_register_map, 0x2bb);
695ASSERT_REG_POSITION(vs_uniform_setup, 0x2c0); 701ASSERT_REG_POSITION(vs_uniform_setup, 0x2c0);
diff --git a/src/video_core/vertex_shader.cpp b/src/video_core/vertex_shader.cpp
index 5d9203c86..fbec1bcc8 100644
--- a/src/video_core/vertex_shader.cpp
+++ b/src/video_core/vertex_shader.cpp
@@ -26,8 +26,9 @@ namespace VertexShader {
26 26
27static struct { 27static struct {
28 Math::Vec4<float24> f[96]; 28 Math::Vec4<float24> f[96];
29} shader_uniforms;
30 29
30 std::array<bool,16> b;
31} shader_uniforms;
31 32
32// TODO: Not sure where the shader binary and swizzle patterns are supposed to be loaded to! 33// TODO: Not sure where the shader binary and swizzle patterns are supposed to be loaded to!
33// For now, we just keep these local arrays around. 34// For now, we just keep these local arrays around.
@@ -49,6 +50,11 @@ Math::Vec4<float24>& GetFloatUniform(u32 index)
49 return shader_uniforms.f[index]; 50 return shader_uniforms.f[index];
50} 51}
51 52
53bool& GetBoolUniform(u32 index)
54{
55 return shader_uniforms.b[index];
56}
57
52const std::array<u32, 1024>& GetShaderBinary() 58const std::array<u32, 1024>& GetShaderBinary()
53{ 59{
54 return shader_memory; 60 return shader_memory;
diff --git a/src/video_core/vertex_shader.h b/src/video_core/vertex_shader.h
index be01b24d7..047dde046 100644
--- a/src/video_core/vertex_shader.h
+++ b/src/video_core/vertex_shader.h
@@ -72,6 +72,7 @@ void SubmitSwizzleDataChange(u32 addr, u32 value);
72OutputVertex RunShader(const InputVertex& input, int num_attributes); 72OutputVertex RunShader(const InputVertex& input, int num_attributes);
73 73
74Math::Vec4<float24>& GetFloatUniform(u32 index); 74Math::Vec4<float24>& GetFloatUniform(u32 index);
75bool& GetBoolUniform(u32 index);
75 76
76const std::array<u32, 1024>& GetShaderBinary(); 77const std::array<u32, 1024>& GetShaderBinary();
77const std::array<u32, 1024>& GetSwizzlePatterns(); 78const std::array<u32, 1024>& GetSwizzlePatterns();