Browse Source

Merge pull request #4041 from ReinUsesLisp/arb-decomp

gl_arb_decompiler: Implement an assembly shader decompiler
nce_cpp
bunnei 6 years ago
committed by GitHub
parent
commit
7c767d7dbf
  1. 2
      CMakeModules/GenerateSCMRev.cmake
  2. 2
      src/common/CMakeLists.txt
  3. 2
      src/video_core/CMakeLists.txt
  4. 2074
      src/video_core/renderer_opengl/gl_arb_decompiler.cpp
  5. 29
      src/video_core/renderer_opengl/gl_arb_decompiler.h
  6. 1
      src/video_core/renderer_opengl/gl_device.cpp
  7. 5
      src/video_core/renderer_opengl/gl_device.h
  8. 4
      src/video_core/renderer_opengl/gl_shader_cache.cpp
  9. 3
      src/yuzu/configuration/configure_graphics_advanced.cpp

2
CMakeModules/GenerateSCMRev.cmake

@ -51,6 +51,8 @@ endif()
# The variable SRC_DIR must be passed into the script (since it uses the current build directory for all values of CMAKE_*_DIR) # The variable SRC_DIR must be passed into the script (since it uses the current build directory for all values of CMAKE_*_DIR)
set(VIDEO_CORE "${SRC_DIR}/src/video_core") set(VIDEO_CORE "${SRC_DIR}/src/video_core")
set(HASH_FILES set(HASH_FILES
"${VIDEO_CORE}/renderer_opengl/gl_arb_decompiler.cpp"
"${VIDEO_CORE}/renderer_opengl/gl_arb_decompiler.h"
"${VIDEO_CORE}/renderer_opengl/gl_shader_cache.cpp" "${VIDEO_CORE}/renderer_opengl/gl_shader_cache.cpp"
"${VIDEO_CORE}/renderer_opengl/gl_shader_cache.h" "${VIDEO_CORE}/renderer_opengl/gl_shader_cache.h"
"${VIDEO_CORE}/renderer_opengl/gl_shader_decompiler.cpp" "${VIDEO_CORE}/renderer_opengl/gl_shader_decompiler.cpp"

2
src/common/CMakeLists.txt

@ -32,6 +32,8 @@ add_custom_command(OUTPUT scm_rev.cpp
DEPENDS DEPENDS
# WARNING! It was too much work to try and make a common location for this list, # WARNING! It was too much work to try and make a common location for this list,
# so if you need to change it, please update CMakeModules/GenerateSCMRev.cmake as well # so if you need to change it, please update CMakeModules/GenerateSCMRev.cmake as well
"${VIDEO_CORE}/renderer_opengl/gl_arb_decompiler.cpp"
"${VIDEO_CORE}/renderer_opengl/gl_arb_decompiler.h"
"${VIDEO_CORE}/renderer_opengl/gl_shader_cache.cpp" "${VIDEO_CORE}/renderer_opengl/gl_shader_cache.cpp"
"${VIDEO_CORE}/renderer_opengl/gl_shader_cache.h" "${VIDEO_CORE}/renderer_opengl/gl_shader_cache.h"
"${VIDEO_CORE}/renderer_opengl/gl_shader_decompiler.cpp" "${VIDEO_CORE}/renderer_opengl/gl_shader_decompiler.cpp"

2
src/video_core/CMakeLists.txt

@ -52,6 +52,8 @@ add_library(video_core STATIC
rasterizer_interface.h rasterizer_interface.h
renderer_base.cpp renderer_base.cpp
renderer_base.h renderer_base.h
renderer_opengl/gl_arb_decompiler.cpp
renderer_opengl/gl_arb_decompiler.h
renderer_opengl/gl_buffer_cache.cpp renderer_opengl/gl_buffer_cache.cpp
renderer_opengl/gl_buffer_cache.h renderer_opengl/gl_buffer_cache.h
renderer_opengl/gl_device.cpp renderer_opengl/gl_device.cpp

2074
src/video_core/renderer_opengl/gl_arb_decompiler.cpp
File diff suppressed because it is too large
View File

29
src/video_core/renderer_opengl/gl_arb_decompiler.h

@ -0,0 +1,29 @@
// Copyright 2020 yuzu Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#pragma once
#include <string>
#include <string_view>
#include "common/common_types.h"
namespace Tegra::Engines {
enum class ShaderType : u32;
}
namespace VideoCommon::Shader {
class ShaderIR;
class Registry;
} // namespace VideoCommon::Shader
namespace OpenGL {
class Device;
std::string DecompileAssemblyShader(const Device& device, const VideoCommon::Shader::ShaderIR& ir,
const VideoCommon::Shader::Registry& registry,
Tegra::Engines::ShaderType stage, std::string_view identifier);
} // namespace OpenGL

1
src/video_core/renderer_opengl/gl_device.cpp

@ -213,6 +213,7 @@ Device::Device()
has_component_indexing_bug = is_amd; has_component_indexing_bug = is_amd;
has_precise_bug = TestPreciseBug(); has_precise_bug = TestPreciseBug();
has_fast_buffer_sub_data = is_nvidia && !disable_fast_buffer_sub_data; has_fast_buffer_sub_data = is_nvidia && !disable_fast_buffer_sub_data;
has_nv_viewport_array2 = GLAD_GL_NV_viewport_array2;
use_assembly_shaders = Settings::values.use_assembly_shaders && GLAD_GL_NV_gpu_program5 && use_assembly_shaders = Settings::values.use_assembly_shaders && GLAD_GL_NV_gpu_program5 &&
GLAD_GL_NV_compute_program5 && GLAD_GL_NV_transform_feedback && GLAD_GL_NV_compute_program5 && GLAD_GL_NV_transform_feedback &&
GLAD_GL_NV_transform_feedback2; GLAD_GL_NV_transform_feedback2;

5
src/video_core/renderer_opengl/gl_device.h

@ -88,6 +88,10 @@ public:
return has_fast_buffer_sub_data; return has_fast_buffer_sub_data;
} }
bool HasNvViewportArray2() const {
return has_nv_viewport_array2;
}
bool UseAssemblyShaders() const { bool UseAssemblyShaders() const {
return use_assembly_shaders; return use_assembly_shaders;
} }
@ -111,6 +115,7 @@ private:
bool has_component_indexing_bug{}; bool has_component_indexing_bug{};
bool has_precise_bug{}; bool has_precise_bug{};
bool has_fast_buffer_sub_data{}; bool has_fast_buffer_sub_data{};
bool has_nv_viewport_array2{};
bool use_assembly_shaders{}; bool use_assembly_shaders{};
}; };

4
src/video_core/renderer_opengl/gl_shader_cache.cpp

@ -20,6 +20,7 @@
#include "video_core/engines/maxwell_3d.h" #include "video_core/engines/maxwell_3d.h"
#include "video_core/engines/shader_type.h" #include "video_core/engines/shader_type.h"
#include "video_core/memory_manager.h" #include "video_core/memory_manager.h"
#include "video_core/renderer_opengl/gl_arb_decompiler.h"
#include "video_core/renderer_opengl/gl_rasterizer.h" #include "video_core/renderer_opengl/gl_rasterizer.h"
#include "video_core/renderer_opengl/gl_shader_cache.h" #include "video_core/renderer_opengl/gl_shader_cache.h"
#include "video_core/renderer_opengl/gl_shader_decompiler.h" #include "video_core/renderer_opengl/gl_shader_decompiler.h"
@ -148,7 +149,8 @@ ProgramSharedPtr BuildShader(const Device& device, ShaderType shader_type, u64 u
auto program = std::make_shared<ProgramHandle>(); auto program = std::make_shared<ProgramHandle>();
if (device.UseAssemblyShaders()) { if (device.UseAssemblyShaders()) {
const std::string arb = "Not implemented";
const std::string arb =
DecompileAssemblyShader(device, ir, registry, shader_type, shader_id);
GLuint& arb_prog = program->assembly_program.handle; GLuint& arb_prog = program->assembly_program.handle;

3
src/yuzu/configuration/configure_graphics_advanced.cpp

@ -12,9 +12,6 @@ ConfigureGraphicsAdvanced::ConfigureGraphicsAdvanced(QWidget* parent)
ui->setupUi(this); ui->setupUi(this);
// TODO: Remove this after assembly shaders are fully integrated
ui->use_assembly_shaders->setVisible(false);
SetConfiguration(); SetConfiguration();
} }

Loading…
Cancel
Save