Explorar o código

gl_shader_cache,glasm: Conditionally use typeless image reads extension

ReinUsesLisp %!s(int64=5) %!d(string=hai) anos
pai
achega
c31521512f

+ 4 - 2
src/shader_recompiler/backend/glasm/emit_glasm.cpp

@@ -271,8 +271,7 @@ void SetupOptions(const IR::Program& program, const Profile& profile,
               "OPTION NV_shader_storage_buffer;"
               "OPTION NV_shader_storage_buffer;"
               "OPTION NV_gpu_program_fp64;"
               "OPTION NV_gpu_program_fp64;"
               "OPTION NV_bindless_texture;"
               "OPTION NV_bindless_texture;"
-              "OPTION ARB_derivative_control;"
-              "OPTION EXT_shader_image_load_formatted;";
+              "OPTION ARB_derivative_control;";
     if (info.uses_int64_bit_atomics) {
     if (info.uses_int64_bit_atomics) {
         header += "OPTION NV_shader_atomic_int64;";
         header += "OPTION NV_shader_atomic_int64;";
     }
     }
@@ -297,6 +296,9 @@ void SetupOptions(const IR::Program& program, const Profile& profile,
             header += "OPTION NV_viewport_array2;";
             header += "OPTION NV_viewport_array2;";
         }
         }
     }
     }
+    if (info.uses_typeless_image_reads && profile.support_typeless_image_loads) {
+        header += "OPTION EXT_shader_image_load_formatted;";
+    }
     if (stage == Stage::Fragment && runtime_info.force_early_z != 0) {
     if (stage == Stage::Fragment && runtime_info.force_early_z != 0) {
         header += "OPTION NV_early_fragment_tests;";
         header += "OPTION NV_early_fragment_tests;";
     }
     }

+ 37 - 37
src/video_core/renderer_opengl/gl_shader_cache.cpp

@@ -36,42 +36,6 @@
 
 
 namespace OpenGL {
 namespace OpenGL {
 namespace {
 namespace {
-// FIXME: Move this somewhere else
-const Shader::Profile profile{
-    .supported_spirv = 0x00010000,
-
-    .unified_descriptor_binding = false,
-    .support_descriptor_aliasing = false,
-    .support_int8 = false,
-    .support_int16 = false,
-    .support_vertex_instance_id = true,
-    .support_float_controls = false,
-    .support_separate_denorm_behavior = false,
-    .support_separate_rounding_mode = false,
-    .support_fp16_denorm_preserve = false,
-    .support_fp32_denorm_preserve = false,
-    .support_fp16_denorm_flush = false,
-    .support_fp32_denorm_flush = false,
-    .support_fp16_signed_zero_nan_preserve = false,
-    .support_fp32_signed_zero_nan_preserve = false,
-    .support_fp64_signed_zero_nan_preserve = false,
-    .support_explicit_workgroup_layout = false,
-    .support_vote = true,
-    .support_viewport_index_layer_non_geometry = true,
-    .support_viewport_mask = true,
-    .support_typeless_image_loads = true,
-    .support_demote_to_helper_invocation = false,
-    .support_int64_atomics = false,
-
-    .warp_size_potentially_larger_than_guest = true,
-    .lower_left_origin_mode = true,
-
-    .has_broken_spirv_clamp = true,
-    .has_broken_unsigned_image_offsets = true,
-    .has_broken_signed_operations = true,
-    .ignore_nan_fp_comparisons = true,
-};
-
 using Shader::Backend::GLASM::EmitGLASM;
 using Shader::Backend::GLASM::EmitGLASM;
 using Shader::Backend::SPIRV::EmitSPIRV;
 using Shader::Backend::SPIRV::EmitSPIRV;
 using Shader::Maxwell::TranslateProgram;
 using Shader::Maxwell::TranslateProgram;
@@ -279,7 +243,43 @@ ShaderCache::ShaderCache(RasterizerOpenGL& rasterizer_, Core::Frontend::EmuWindo
     : VideoCommon::ShaderCache{rasterizer_, gpu_memory_, maxwell3d_, kepler_compute_},
     : VideoCommon::ShaderCache{rasterizer_, gpu_memory_, maxwell3d_, kepler_compute_},
       emu_window{emu_window_}, device{device_}, texture_cache{texture_cache_},
       emu_window{emu_window_}, device{device_}, texture_cache{texture_cache_},
       buffer_cache{buffer_cache_}, program_manager{program_manager_}, state_tracker{
       buffer_cache{buffer_cache_}, program_manager{program_manager_}, state_tracker{
-                                                                          state_tracker_} {}
+                                                                          state_tracker_} {
+    profile = Shader::Profile{
+        .supported_spirv = 0x00010000,
+
+        .unified_descriptor_binding = false,
+        .support_descriptor_aliasing = false,
+        .support_int8 = false,
+        .support_int16 = false,
+        .support_vertex_instance_id = true,
+        .support_float_controls = false,
+        .support_separate_denorm_behavior = false,
+        .support_separate_rounding_mode = false,
+        .support_fp16_denorm_preserve = false,
+        .support_fp32_denorm_preserve = false,
+        .support_fp16_denorm_flush = false,
+        .support_fp32_denorm_flush = false,
+        .support_fp16_signed_zero_nan_preserve = false,
+        .support_fp32_signed_zero_nan_preserve = false,
+        .support_fp64_signed_zero_nan_preserve = false,
+        .support_explicit_workgroup_layout = false,
+        .support_vote = true,
+        .support_viewport_index_layer_non_geometry =
+            device.HasNvViewportArray2() || device.HasVertexViewportLayer(),
+        .support_viewport_mask = true,
+        .support_typeless_image_loads = device.HasImageLoadFormatted(),
+        .support_demote_to_helper_invocation = false,
+        .support_int64_atomics = false,
+
+        .warp_size_potentially_larger_than_guest = true,
+        .lower_left_origin_mode = true,
+
+        .has_broken_spirv_clamp = true,
+        .has_broken_unsigned_image_offsets = true,
+        .has_broken_signed_operations = true,
+        .ignore_nan_fp_comparisons = true,
+    };
+}
 
 
 ShaderCache::~ShaderCache() = default;
 ShaderCache::~ShaderCache() = default;
 
 

+ 2 - 0
src/video_core/renderer_opengl/gl_shader_cache.h

@@ -86,6 +86,8 @@ private:
     ShaderPools main_pools;
     ShaderPools main_pools;
     std::unordered_map<GraphicsProgramKey, std::unique_ptr<GraphicsProgram>> graphics_cache;
     std::unordered_map<GraphicsProgramKey, std::unique_ptr<GraphicsProgram>> graphics_cache;
     std::unordered_map<ComputeProgramKey, std::unique_ptr<ComputeProgram>> compute_cache;
     std::unordered_map<ComputeProgramKey, std::unique_ptr<ComputeProgram>> compute_cache;
+
+    Shader::Profile profile;
 };
 };
 
 
 } // namespace OpenGL
 } // namespace OpenGL