Browse Source
Merge pull request #4041 from ReinUsesLisp/arb-decomp
gl_arb_decompiler: Implement an assembly shader decompiler
pull/15/merge
bunnei
6 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with
2118 additions and
4 deletions
-
CMakeModules/GenerateSCMRev.cmake
-
src/common/CMakeLists.txt
-
src/video_core/CMakeLists.txt
-
src/video_core/renderer_opengl/gl_arb_decompiler.cpp
-
src/video_core/renderer_opengl/gl_arb_decompiler.h
-
src/video_core/renderer_opengl/gl_device.cpp
-
src/video_core/renderer_opengl/gl_device.h
-
src/video_core/renderer_opengl/gl_shader_cache.cpp
-
src/yuzu/configuration/configure_graphics_advanced.cpp
|
|
|
@ -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) |
|
|
|
set(VIDEO_CORE "${SRC_DIR}/src/video_core") |
|
|
|
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.h" |
|
|
|
"${VIDEO_CORE}/renderer_opengl/gl_shader_decompiler.cpp" |
|
|
|
|
|
|
|
@ -32,6 +32,8 @@ add_custom_command(OUTPUT scm_rev.cpp |
|
|
|
DEPENDS |
|
|
|
# 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 |
|
|
|
"${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.h" |
|
|
|
"${VIDEO_CORE}/renderer_opengl/gl_shader_decompiler.cpp" |
|
|
|
|
|
|
|
@ -52,6 +52,8 @@ add_library(video_core STATIC |
|
|
|
rasterizer_interface.h |
|
|
|
renderer_base.cpp |
|
|
|
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.h |
|
|
|
renderer_opengl/gl_device.cpp |
|
|
|
|
|
|
|
@ -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 |
|
|
|
@ -213,6 +213,7 @@ Device::Device() |
|
|
|
has_component_indexing_bug = is_amd; |
|
|
|
has_precise_bug = TestPreciseBug(); |
|
|
|
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 && |
|
|
|
GLAD_GL_NV_compute_program5 && GLAD_GL_NV_transform_feedback && |
|
|
|
GLAD_GL_NV_transform_feedback2; |
|
|
|
|
|
|
|
@ -88,6 +88,10 @@ public: |
|
|
|
return has_fast_buffer_sub_data; |
|
|
|
} |
|
|
|
|
|
|
|
bool HasNvViewportArray2() const { |
|
|
|
return has_nv_viewport_array2; |
|
|
|
} |
|
|
|
|
|
|
|
bool UseAssemblyShaders() const { |
|
|
|
return use_assembly_shaders; |
|
|
|
} |
|
|
|
@ -111,6 +115,7 @@ private: |
|
|
|
bool has_component_indexing_bug{}; |
|
|
|
bool has_precise_bug{}; |
|
|
|
bool has_fast_buffer_sub_data{}; |
|
|
|
bool has_nv_viewport_array2{}; |
|
|
|
bool use_assembly_shaders{}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
@ -20,6 +20,7 @@ |
|
|
|
#include "video_core/engines/maxwell_3d.h"
|
|
|
|
#include "video_core/engines/shader_type.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_shader_cache.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>(); |
|
|
|
|
|
|
|
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; |
|
|
|
|
|
|
|
|
|
|
|
@ -12,9 +12,6 @@ ConfigureGraphicsAdvanced::ConfigureGraphicsAdvanced(QWidget* parent) |
|
|
|
|
|
|
|
ui->setupUi(this); |
|
|
|
|
|
|
|
// TODO: Remove this after assembly shaders are fully integrated
|
|
|
|
ui->use_assembly_shaders->setVisible(false); |
|
|
|
|
|
|
|
SetConfiguration(); |
|
|
|
} |
|
|
|
|
|
|
|
|