Ver Fonte

VideoCore/Shader: Remove dynamic control flow in (Get)UniformOffset

Yuri Kunde Schlesner há 9 anos atrás
pai
commit
e4e962bc7c
2 ficheiros alterados com 11 adições e 18 exclusões
  1. 8 13
      src/video_core/shader/shader.h
  2. 3 5
      src/video_core/shader/shader_jit_x64.cpp

+ 8 - 13
src/video_core/shader/shader.h

@@ -161,21 +161,16 @@ struct ShaderSetup {
         std::array<Math::Vec4<u8>, 4> i;
     } uniforms;
 
-    static size_t UniformOffset(RegisterType type, unsigned index) {
-        switch (type) {
-        case RegisterType::FloatUniform:
-            return offsetof(ShaderSetup, uniforms.f) + index * sizeof(Math::Vec4<float24>);
-
-        case RegisterType::BoolUniform:
-            return offsetof(ShaderSetup, uniforms.b) + index * sizeof(bool);
+    static size_t GetFloatUniformOffset(unsigned index) {
+        return offsetof(ShaderSetup, uniforms.f) + index * sizeof(Math::Vec4<float24>);
+    }
 
-        case RegisterType::IntUniform:
-            return offsetof(ShaderSetup, uniforms.i) + index * sizeof(Math::Vec4<u8>);
+    static size_t GetBoolUniformOffset(unsigned index) {
+        return offsetof(ShaderSetup, uniforms.b) + index * sizeof(bool);
+    }
 
-        default:
-            UNREACHABLE();
-            return 0;
-        }
+    static size_t GetIntUniformOffset(unsigned index) {
+        return offsetof(ShaderSetup, uniforms.i) + index * sizeof(Math::Vec4<u8>);
     }
 
     std::array<u32, 1024> program_code;

+ 3 - 5
src/video_core/shader/shader_jit_x64.cpp

@@ -185,7 +185,7 @@ void JitShader::Compile_SwizzleSrc(Instruction instr, unsigned src_num, SourceRe
 
     if (src_reg.GetRegisterType() == RegisterType::FloatUniform) {
         src_ptr = SETUP;
-        src_offset = ShaderSetup::UniformOffset(RegisterType::FloatUniform, src_reg.GetIndex());
+        src_offset = ShaderSetup::GetFloatUniformOffset(src_reg.GetIndex());
     } else {
         src_ptr = STATE;
         src_offset = UnitState<false>::InputOffset(src_reg);
@@ -348,8 +348,7 @@ void JitShader::Compile_EvaluateCondition(Instruction instr) {
 }
 
 void JitShader::Compile_UniformCondition(Instruction instr) {
-    size_t offset =
-        ShaderSetup::UniformOffset(RegisterType::BoolUniform, instr.flow_control.bool_uniform_id);
+    size_t offset = ShaderSetup::GetBoolUniformOffset(instr.flow_control.bool_uniform_id);
     cmp(byte[SETUP + offset], 0);
 }
 
@@ -732,8 +731,7 @@ void JitShader::Compile_LOOP(Instruction instr) {
     // This decodes the fields from the integer uniform at index instr.flow_control.int_uniform_id.
     // The Y (LOOPCOUNT_REG) and Z (LOOPINC) component are kept multiplied by 16 (Left shifted by
     // 4 bits) to be used as an offset into the 16-byte vector registers later
-    size_t offset =
-        ShaderSetup::UniformOffset(RegisterType::IntUniform, instr.flow_control.int_uniform_id);
+    size_t offset = ShaderSetup::GetIntUniformOffset(instr.flow_control.int_uniform_id);
     mov(LOOPCOUNT, dword[SETUP + offset]);
     mov(LOOPCOUNT_REG, LOOPCOUNT);
     shr(LOOPCOUNT_REG, 4);