Преглед на файлове

Merge pull request #1157 from lioncash/vec

 gl_shader_gen: Use a std::vector to represent program code instead of std::array
bunnei преди 8 години
родител
ревизия
c7f2fb2151
променени са 2 файла, в които са добавени 16 реда и са изтрити 11 реда
  1. 1 1
      src/video_core/renderer_opengl/gl_rasterizer.cpp
  2. 15 10
      src/video_core/renderer_opengl/gl_shader_gen.h

+ 1 - 1
src/video_core/renderer_opengl/gl_rasterizer.cpp

@@ -181,7 +181,7 @@ static GLShader::ProgramCode GetShaderProgramCode(Maxwell::ShaderProgram program
     auto& gpu = Core::System::GetInstance().GPU().Maxwell3D();
     auto& gpu = Core::System::GetInstance().GPU().Maxwell3D();
 
 
     // Fetch program code from memory
     // Fetch program code from memory
-    GLShader::ProgramCode program_code;
+    GLShader::ProgramCode program_code(GLShader::MAX_PROGRAM_CODE_LENGTH);
     auto& shader_config = gpu.regs.shader_config[static_cast<size_t>(program)];
     auto& shader_config = gpu.regs.shader_config[static_cast<size_t>(program)];
     const u64 gpu_address{gpu.regs.code_address.CodeAddress() + shader_config.offset};
     const u64 gpu_address{gpu.regs.code_address.CodeAddress() + shader_config.offset};
     const boost::optional<VAddr> cpu_address{gpu.memory_manager.GpuToCpuAddress(gpu_address)};
     const boost::optional<VAddr> cpu_address{gpu.memory_manager.GpuToCpuAddress(gpu_address)};

+ 15 - 10
src/video_core/renderer_opengl/gl_shader_gen.h

@@ -9,14 +9,14 @@
 #include <type_traits>
 #include <type_traits>
 #include <utility>
 #include <utility>
 #include <vector>
 #include <vector>
+#include <boost/functional/hash.hpp>
 #include "common/common_types.h"
 #include "common/common_types.h"
 #include "common/hash.h"
 #include "common/hash.h"
 
 
 namespace OpenGL::GLShader {
 namespace OpenGL::GLShader {
 
 
 constexpr size_t MAX_PROGRAM_CODE_LENGTH{0x1000};
 constexpr size_t MAX_PROGRAM_CODE_LENGTH{0x1000};
-
-using ProgramCode = std::array<u64, MAX_PROGRAM_CODE_LENGTH>;
+using ProgramCode = std::vector<u64>;
 
 
 class ConstBufferEntry {
 class ConstBufferEntry {
     using Maxwell = Tegra::Engines::Maxwell3D::Regs;
     using Maxwell = Tegra::Engines::Maxwell3D::Regs;
@@ -115,8 +115,8 @@ struct ShaderEntries {
 using ProgramResult = std::pair<std::string, ShaderEntries>;
 using ProgramResult = std::pair<std::string, ShaderEntries>;
 
 
 struct ShaderSetup {
 struct ShaderSetup {
-    ShaderSetup(const ProgramCode& program_code) {
-        program.code = program_code;
+    explicit ShaderSetup(ProgramCode program_code) {
+        program.code = std::move(program_code);
     }
     }
 
 
     struct {
     struct {
@@ -135,8 +135,8 @@ struct ShaderSetup {
     }
     }
 
 
     /// Used in scenarios where we have a dual vertex shaders
     /// Used in scenarios where we have a dual vertex shaders
-    void SetProgramB(const ProgramCode& program_b) {
-        program.code_b = program_b;
+    void SetProgramB(ProgramCode program_b) {
+        program.code_b = std::move(program_b);
         has_program_b = true;
         has_program_b = true;
     }
     }
 
 
@@ -146,13 +146,18 @@ struct ShaderSetup {
 
 
 private:
 private:
     u64 GetNewHash() const {
     u64 GetNewHash() const {
+        size_t hash = 0;
+
+        const u64 hash_a = Common::ComputeHash64(program.code.data(), program.code.size());
+        boost::hash_combine(hash, hash_a);
+
         if (has_program_b) {
         if (has_program_b) {
             // Compute hash over dual shader programs
             // Compute hash over dual shader programs
-            return Common::ComputeHash64(&program, sizeof(program));
-        } else {
-            // Compute hash over a single shader program
-            return Common::ComputeHash64(&program.code, program.code.size());
+            const u64 hash_b = Common::ComputeHash64(program.code_b.data(), program.code_b.size());
+            boost::hash_combine(hash, hash_b);
         }
         }
+
+        return hash;
     }
     }
 
 
     u64 program_code_hash{};
     u64 program_code_hash{};