mirror of https://github.com/PCSX2/pcsx2.git
GS: Add option to disable texture barriers/geometry shaders
This commit is contained in:
parent
57ea137982
commit
bb75c78c1a
|
@ -389,7 +389,13 @@ layout(set = 1, binding = 0) uniform sampler2D Texture;
|
||||||
layout(set = 1, binding = 1) uniform sampler2D Palette;
|
layout(set = 1, binding = 1) uniform sampler2D Palette;
|
||||||
|
|
||||||
#if PS_FEEDBACK_LOOP_IS_NEEDED
|
#if PS_FEEDBACK_LOOP_IS_NEEDED
|
||||||
layout(input_attachment_index = 0, set = 2, binding = 0) uniform subpassInput RtSampler;
|
#ifndef DISABLE_TEXTURE_BARRIER
|
||||||
|
layout(input_attachment_index = 0, set = 2, binding = 0) uniform subpassInput RtSampler;
|
||||||
|
vec4 sample_from_rt() { return subpassLoad(RtSampler); }
|
||||||
|
#else
|
||||||
|
layout(set = 2, binding = 0) uniform texture2D RtSampler;
|
||||||
|
vec4 sample_from_rt() { return texelFetch(RtSampler, ivec2(gl_FragCoord.xy), 0); }
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if PS_DATE > 0
|
#if PS_DATE > 0
|
||||||
|
@ -399,7 +405,7 @@ layout(set = 2, binding = 1) uniform texture2D PrimMinTexture;
|
||||||
vec4 sample_c(vec2 uv)
|
vec4 sample_c(vec2 uv)
|
||||||
{
|
{
|
||||||
#if PS_TEX_IS_FB
|
#if PS_TEX_IS_FB
|
||||||
return subpassLoad(RtSampler);
|
return sample_from_rt();
|
||||||
#else
|
#else
|
||||||
#if PS_POINT_SAMPLER
|
#if PS_POINT_SAMPLER
|
||||||
// Weird issue with ATI/AMD cards,
|
// Weird issue with ATI/AMD cards,
|
||||||
|
@ -549,7 +555,7 @@ mat4 sample_4p(vec4 u)
|
||||||
int fetch_raw_depth(ivec2 xy)
|
int fetch_raw_depth(ivec2 xy)
|
||||||
{
|
{
|
||||||
#if PS_TEX_IS_FB
|
#if PS_TEX_IS_FB
|
||||||
vec4 col = subpassLoad(RtSampler);
|
vec4 col = sample_from_rt();
|
||||||
#else
|
#else
|
||||||
vec4 col = texelFetch(Texture, xy, 0);
|
vec4 col = texelFetch(Texture, xy, 0);
|
||||||
#endif
|
#endif
|
||||||
|
@ -559,7 +565,7 @@ int fetch_raw_depth(ivec2 xy)
|
||||||
vec4 fetch_raw_color(ivec2 xy)
|
vec4 fetch_raw_color(ivec2 xy)
|
||||||
{
|
{
|
||||||
#if PS_TEX_IS_FB
|
#if PS_TEX_IS_FB
|
||||||
return subpassLoad(RtSampler);
|
return sample_from_rt();
|
||||||
#else
|
#else
|
||||||
return texelFetch(Texture, xy, 0);
|
return texelFetch(Texture, xy, 0);
|
||||||
#endif
|
#endif
|
||||||
|
@ -935,7 +941,7 @@ vec4 ps_color()
|
||||||
void ps_fbmask(inout vec4 C)
|
void ps_fbmask(inout vec4 C)
|
||||||
{
|
{
|
||||||
#if PS_FBMASK
|
#if PS_FBMASK
|
||||||
vec4 RT = trunc(subpassLoad(RtSampler) * 255.0f + 0.1f);
|
vec4 RT = trunc(sample_from_rt() * 255.0f + 0.1f);
|
||||||
C = vec4((uvec4(C) & ~FbMask) | (uvec4(RT) & FbMask));
|
C = vec4((uvec4(C) & ~FbMask) | (uvec4(RT) & FbMask));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -995,7 +1001,7 @@ void ps_blend(inout vec4 Color, float As)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if PS_FEEDBACK_LOOP_IS_NEEDED
|
#if PS_FEEDBACK_LOOP_IS_NEEDED
|
||||||
vec4 RT = trunc(subpassLoad(RtSampler) * 255.0f + 0.1f);
|
vec4 RT = trunc(sample_from_rt() * 255.0f + 0.1f);
|
||||||
#else
|
#else
|
||||||
// Not used, but we define it to make the selection below simpler.
|
// Not used, but we define it to make the selection below simpler.
|
||||||
vec4 RT = vec4(0.0f);
|
vec4 RT = vec4(0.0f);
|
||||||
|
@ -1095,9 +1101,9 @@ void main()
|
||||||
|
|
||||||
#if PS_WRITE_RG == 1
|
#if PS_WRITE_RG == 1
|
||||||
// Pseudo 16 bits access.
|
// Pseudo 16 bits access.
|
||||||
float rt_a = subpassLoad(RtSampler).g;
|
float rt_a = sample_from_rt().g;
|
||||||
#else
|
#else
|
||||||
float rt_a = subpassLoad(RtSampler).a;
|
float rt_a = sample_from_rt().a;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (PS_DATE & 3) == 1
|
#if (PS_DATE & 3) == 1
|
||||||
|
|
|
@ -179,6 +179,8 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsDialog* dialog, QWidget*
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.useBlitSwapChain, "EmuCore/GS", "UseBlitSwapChain", false);
|
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.useBlitSwapChain, "EmuCore/GS", "UseBlitSwapChain", false);
|
||||||
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.useDebugDevice, "EmuCore/GS", "UseDebugDevice", false);
|
SettingWidgetBinder::BindWidgetToBoolSetting(sif, m_ui.useDebugDevice, "EmuCore/GS", "UseDebugDevice", false);
|
||||||
|
SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.overrideTextureBarriers, "EmuCore/GS", "OverrideTextureBarriers", -1, -1);
|
||||||
|
SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.overrideGeometryShader, "EmuCore/GS", "OverrideGeometryShaders", -1, -1);
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
// SW Settings
|
// SW Settings
|
||||||
|
|
|
@ -963,21 +963,77 @@
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Debug Options</string>
|
<string>Debug Options</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_7">
|
<layout class="QFormLayout" name="formLayout_6">
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QCheckBox" name="useBlitSwapChain">
|
<widget class="QLabel" name="label_19">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Use Blit Swap Chain</string>
|
<string>Override Texture Barriers:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="1">
|
<item row="0" column="1">
|
||||||
<widget class="QCheckBox" name="useDebugDevice">
|
<widget class="QComboBox" name="overrideTextureBarriers">
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Automatic (Default)</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Force Disabled</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Force Enabled</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_30">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Use Debug Device</string>
|
<string>Override Geometry Shader:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QComboBox" name="overrideGeometryShader">
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Automatic (Default)</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Force Disabled</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Force Enabled</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" colspan="2">
|
||||||
|
<layout class="QGridLayout" name="gridLayout_7">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QCheckBox" name="useBlitSwapChain">
|
||||||
|
<property name="text">
|
||||||
|
<string>Use Blit Swap Chain</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QCheckBox" name="useDebugDevice">
|
||||||
|
<property name="text">
|
||||||
|
<string>Use Debug Device</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|
|
@ -521,6 +521,8 @@ struct Pcsx2Config
|
||||||
int UserHacks_TCOffsetX{0};
|
int UserHacks_TCOffsetX{0};
|
||||||
int UserHacks_TCOffsetY{0};
|
int UserHacks_TCOffsetY{0};
|
||||||
TriFiltering UserHacks_TriFilter{TriFiltering::Off};
|
TriFiltering UserHacks_TriFilter{TriFiltering::Off};
|
||||||
|
int OverrideTextureBarriers{-1};
|
||||||
|
int OverrideGeometryShaders{-1};
|
||||||
|
|
||||||
int ShadeBoost_Brightness{50};
|
int ShadeBoost_Brightness{50};
|
||||||
int ShadeBoost_Contrast{50};
|
int ShadeBoost_Contrast{50};
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
#include "imgui_impl_vulkan.h"
|
#include "imgui_impl_vulkan.h"
|
||||||
#include <array>
|
#include <array>
|
||||||
|
|
||||||
static constexpr u32 SHADER_CACHE_VERSION = 1;
|
static constexpr u32 SHADER_CACHE_VERSION = 2;
|
||||||
|
|
||||||
class VulkanHostDisplayTexture : public HostDisplayTexture
|
class VulkanHostDisplayTexture : public HostDisplayTexture
|
||||||
{
|
{
|
||||||
|
|
|
@ -1340,7 +1340,6 @@ void GSApp::Init()
|
||||||
m_default_configuration["OsdShowGSStats"] = "0";
|
m_default_configuration["OsdShowGSStats"] = "0";
|
||||||
m_default_configuration["OsdShowIndicators"] = "1";
|
m_default_configuration["OsdShowIndicators"] = "1";
|
||||||
m_default_configuration["OsdScale"] = "100";
|
m_default_configuration["OsdScale"] = "100";
|
||||||
m_default_configuration["override_geometry_shader"] = "-1";
|
|
||||||
m_default_configuration["override_GL_ARB_copy_image"] = "-1";
|
m_default_configuration["override_GL_ARB_copy_image"] = "-1";
|
||||||
m_default_configuration["override_GL_ARB_clear_texture"] = "-1";
|
m_default_configuration["override_GL_ARB_clear_texture"] = "-1";
|
||||||
m_default_configuration["override_GL_ARB_clip_control"] = "-1";
|
m_default_configuration["override_GL_ARB_clip_control"] = "-1";
|
||||||
|
@ -1351,6 +1350,8 @@ void GSApp::Init()
|
||||||
m_default_configuration["override_GL_ARB_sparse_texture"] = "-1";
|
m_default_configuration["override_GL_ARB_sparse_texture"] = "-1";
|
||||||
m_default_configuration["override_GL_ARB_sparse_texture2"] = "-1";
|
m_default_configuration["override_GL_ARB_sparse_texture2"] = "-1";
|
||||||
m_default_configuration["override_GL_ARB_texture_barrier"] = "-1";
|
m_default_configuration["override_GL_ARB_texture_barrier"] = "-1";
|
||||||
|
m_default_configuration["OverrideTextureBarriers"] = "-1";
|
||||||
|
m_default_configuration["OverrideGeometryShaders"] = "-1";
|
||||||
m_default_configuration["paltex"] = "0";
|
m_default_configuration["paltex"] = "0";
|
||||||
m_default_configuration["png_compression_level"] = std::to_string(Z_BEST_SPEED);
|
m_default_configuration["png_compression_level"] = std::to_string(Z_BEST_SPEED);
|
||||||
m_default_configuration["PointListPalette"] = "0";
|
m_default_configuration["PointListPalette"] = "0";
|
||||||
|
|
|
@ -216,9 +216,10 @@ namespace GLLoader
|
||||||
mesa_driver = !vendor_id_nvidia && !vendor_id_amd;
|
mesa_driver = !vendor_id_nvidia && !vendor_id_amd;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (theApp.GetConfigI("override_geometry_shader") != -1)
|
if (GSConfig.OverrideGeometryShaders != -1)
|
||||||
{
|
{
|
||||||
found_geometry_shader = theApp.GetConfigB("override_geometry_shader");
|
found_geometry_shader = GSConfig.OverrideGeometryShaders != 0 &&
|
||||||
|
(GLAD_GL_VERSION_3_2 || GL_ARB_geometry_shader4 || GSConfig.OverrideGeometryShaders == 1);
|
||||||
GLExtension::Set("GL_ARB_geometry_shader4", found_geometry_shader);
|
GLExtension::Set("GL_ARB_geometry_shader4", found_geometry_shader);
|
||||||
fprintf(stderr, "Overriding geometry shaders detection\n");
|
fprintf(stderr, "Overriding geometry shaders detection\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -217,7 +217,7 @@ bool GSDeviceOGL::Create(HostDisplay* display)
|
||||||
m_features.broken_point_sampler = GLLoader::vendor_id_amd;
|
m_features.broken_point_sampler = GLLoader::vendor_id_amd;
|
||||||
m_features.geometry_shader = GLLoader::found_geometry_shader;
|
m_features.geometry_shader = GLLoader::found_geometry_shader;
|
||||||
m_features.image_load_store = GLLoader::found_GL_ARB_shader_image_load_store && GLLoader::found_GL_ARB_clear_texture;
|
m_features.image_load_store = GLLoader::found_GL_ARB_shader_image_load_store && GLLoader::found_GL_ARB_clear_texture;
|
||||||
m_features.texture_barrier = true;
|
m_features.texture_barrier = GSConfig.OverrideTextureBarriers != 0;
|
||||||
m_features.provoking_vertex_last = true;
|
m_features.provoking_vertex_last = true;
|
||||||
m_features.prefer_new_textures = false;
|
m_features.prefer_new_textures = false;
|
||||||
m_features.dxt_textures = GL_EXT_texture_compression_s3tc;
|
m_features.dxt_textures = GL_EXT_texture_compression_s3tc;
|
||||||
|
|
|
@ -237,19 +237,18 @@ bool GSDeviceVK::CheckFeatures()
|
||||||
const bool isAMD = (vendorID == 0x1002 || vendorID == 0x1022);
|
const bool isAMD = (vendorID == 0x1002 || vendorID == 0x1022);
|
||||||
// const bool isNVIDIA = (vendorID == 0x10DE);
|
// const bool isNVIDIA = (vendorID == 0x10DE);
|
||||||
|
|
||||||
|
m_features.texture_barrier = GSConfig.OverrideTextureBarriers != 0;
|
||||||
m_features.broken_point_sampler = isAMD;
|
m_features.broken_point_sampler = isAMD;
|
||||||
m_features.geometry_shader = features.geometryShader;
|
m_features.geometry_shader = features.geometryShader && GSConfig.OverrideGeometryShaders != 0;
|
||||||
m_features.image_load_store = features.fragmentStoresAndAtomics;
|
m_features.image_load_store = features.fragmentStoresAndAtomics && m_features.texture_barrier;
|
||||||
m_features.texture_barrier = true;
|
|
||||||
m_features.prefer_new_textures = true;
|
m_features.prefer_new_textures = true;
|
||||||
m_features.provoking_vertex_last = g_vulkan_context->GetOptionalExtensions().vk_ext_provoking_vertex;
|
m_features.provoking_vertex_last = g_vulkan_context->GetOptionalExtensions().vk_ext_provoking_vertex;
|
||||||
|
|
||||||
if (!features.dualSrcBlend)
|
if (!features.dualSrcBlend)
|
||||||
{
|
Console.Warning("Vulkan driver is missing dual-source blending. This will have an impact on performance.");
|
||||||
Console.Error("Vulkan driver is missing dual-source blending.");
|
|
||||||
Host::AddOSDMessage(
|
if (!m_features.texture_barrier)
|
||||||
"Dual-source blending is not supported by your driver. This will significantly slow performance.", 30.0f);
|
Console.Warning("Texture buffers are disabled. This may break some graphical effects.");
|
||||||
}
|
|
||||||
|
|
||||||
// whether we can do point/line expand depends on the range of the device
|
// whether we can do point/line expand depends on the range of the device
|
||||||
const float f_upscale = static_cast<float>(GSConfig.UpscaleMultiplier);
|
const float f_upscale = static_cast<float>(GSConfig.UpscaleMultiplier);
|
||||||
|
@ -1036,8 +1035,9 @@ static void AddShaderHeader(std::stringstream& ss)
|
||||||
ss << "#version 460 core\n";
|
ss << "#version 460 core\n";
|
||||||
ss << "#extension GL_EXT_samplerless_texture_functions : require\n";
|
ss << "#extension GL_EXT_samplerless_texture_functions : require\n";
|
||||||
|
|
||||||
if (!g_vulkan_context->GetDeviceFeatures().dualSrcBlend)
|
const GSDevice::FeatureSupport features(g_gs_device->Features());
|
||||||
ss << "#define DISABLE_DUAL_SOURCE 1\n";
|
if (!features.texture_barrier)
|
||||||
|
ss << "#define DISABLE_TEXTURE_BARRIER 1\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
static void AddShaderStageMacro(std::stringstream& ss, bool vs, bool gs, bool fs)
|
static void AddShaderStageMacro(std::stringstream& ss, bool vs, bool gs, bool fs)
|
||||||
|
@ -1170,7 +1170,7 @@ bool GSDeviceVK::CreatePipelineLayouts()
|
||||||
if ((m_tfx_sampler_ds_layout = dslb.Create(dev)) == VK_NULL_HANDLE)
|
if ((m_tfx_sampler_ds_layout = dslb.Create(dev)) == VK_NULL_HANDLE)
|
||||||
return false;
|
return false;
|
||||||
Vulkan::Util::SetObjectName(dev, m_tfx_sampler_ds_layout, "TFX sampler descriptor layout");
|
Vulkan::Util::SetObjectName(dev, m_tfx_sampler_ds_layout, "TFX sampler descriptor layout");
|
||||||
dslb.AddBinding(0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
|
dslb.AddBinding(0, m_features.texture_barrier ? VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT : VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
|
||||||
dslb.AddBinding(1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
|
dslb.AddBinding(1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT);
|
||||||
if ((m_tfx_rt_texture_ds_layout = dslb.Create(dev)) == VK_NULL_HANDLE)
|
if ((m_tfx_rt_texture_ds_layout = dslb.Create(dev)) == VK_NULL_HANDLE)
|
||||||
return false;
|
return false;
|
||||||
|
@ -2412,7 +2412,10 @@ bool GSDeviceVK::ApplyTFXState(bool already_execed)
|
||||||
return ApplyTFXState(true);
|
return ApplyTFXState(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
dsub.AddInputAttachmentDescriptorWrite(ds, 0, m_tfx_textures[NUM_TFX_SAMPLERS]);
|
if (m_features.texture_barrier)
|
||||||
|
dsub.AddInputAttachmentDescriptorWrite(ds, 0, m_tfx_textures[NUM_TFX_SAMPLERS]);
|
||||||
|
else
|
||||||
|
dsub.AddImageDescriptorWrite(ds, 0, m_tfx_textures[NUM_TFX_SAMPLERS]);
|
||||||
dsub.AddImageDescriptorWrite(ds, 1, m_tfx_textures[NUM_TFX_SAMPLERS + 1]);
|
dsub.AddImageDescriptorWrite(ds, 1, m_tfx_textures[NUM_TFX_SAMPLERS + 1]);
|
||||||
dsub.Update(dev);
|
dsub.Update(dev);
|
||||||
|
|
||||||
|
@ -2718,6 +2721,7 @@ void GSDeviceVK::RenderHW(GSHWDrawConfig& config)
|
||||||
|
|
||||||
GSTextureVK* draw_rt = static_cast<GSTextureVK*>(config.rt);
|
GSTextureVK* draw_rt = static_cast<GSTextureVK*>(config.rt);
|
||||||
GSTextureVK* draw_ds = static_cast<GSTextureVK*>(config.ds);
|
GSTextureVK* draw_ds = static_cast<GSTextureVK*>(config.ds);
|
||||||
|
GSTextureVK* draw_rt_clone = nullptr;
|
||||||
GSTextureVK* hdr_rt = nullptr;
|
GSTextureVK* hdr_rt = nullptr;
|
||||||
GSTextureVK* copy_ds = nullptr;
|
GSTextureVK* copy_ds = nullptr;
|
||||||
|
|
||||||
|
@ -2747,8 +2751,29 @@ void GSDeviceVK::RenderHW(GSHWDrawConfig& config)
|
||||||
draw_rt->TransitionToLayout(VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
|
draw_rt->TransitionToLayout(VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// we're not drawing to the RT, so we can use it as a source
|
||||||
|
if (config.require_one_barrier && !m_features.texture_barrier)
|
||||||
|
PSSetShaderResource(2, draw_rt, true);
|
||||||
|
|
||||||
draw_rt = hdr_rt;
|
draw_rt = hdr_rt;
|
||||||
}
|
}
|
||||||
|
else if (config.require_one_barrier && !m_features.texture_barrier)
|
||||||
|
{
|
||||||
|
// requires a copy of the RT
|
||||||
|
draw_rt_clone = static_cast<GSTextureVK*>(CreateTexture(rtsize.x, rtsize.y, false, GSTexture::Format::Color, true));
|
||||||
|
if (draw_rt_clone)
|
||||||
|
{
|
||||||
|
EndRenderPass();
|
||||||
|
|
||||||
|
GL_PUSH("Copy RT to temp texture for fbmask {%d,%d %dx%d}",
|
||||||
|
config.drawarea.left, config.drawarea.top,
|
||||||
|
config.drawarea.width(), config.drawarea.height());
|
||||||
|
|
||||||
|
DoCopyRect(draw_rt, draw_rt_clone, config.drawarea, config.drawarea);
|
||||||
|
draw_rt_clone->TransitionToLayout(VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
|
||||||
|
PSSetShaderResource(2, draw_rt_clone, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (config.tex && config.tex == config.ds)
|
if (config.tex && config.tex == config.ds)
|
||||||
{
|
{
|
||||||
|
@ -2790,7 +2815,10 @@ void GSDeviceVK::RenderHW(GSHWDrawConfig& config)
|
||||||
|
|
||||||
OMSetRenderTargets(draw_rt, draw_ds, config.scissor, pipe.feedback_loop);
|
OMSetRenderTargets(draw_rt, draw_ds, config.scissor, pipe.feedback_loop);
|
||||||
if (pipe.feedback_loop)
|
if (pipe.feedback_loop)
|
||||||
|
{
|
||||||
|
pxAssertMsg(m_features.texture_barrier, "Texture barriers enabled");
|
||||||
PSSetShaderResource(2, draw_rt, false);
|
PSSetShaderResource(2, draw_rt, false);
|
||||||
|
}
|
||||||
|
|
||||||
// Begin render pass if new target or out of the area.
|
// Begin render pass if new target or out of the area.
|
||||||
if (!render_area_okay || !InRenderPass())
|
if (!render_area_okay || !InRenderPass())
|
||||||
|
@ -2866,6 +2894,9 @@ void GSDeviceVK::RenderHW(GSHWDrawConfig& config)
|
||||||
if (copy_ds)
|
if (copy_ds)
|
||||||
Recycle(copy_ds);
|
Recycle(copy_ds);
|
||||||
|
|
||||||
|
if (draw_rt_clone)
|
||||||
|
Recycle(draw_rt_clone);
|
||||||
|
|
||||||
if (date_image)
|
if (date_image)
|
||||||
Recycle(date_image);
|
Recycle(date_image);
|
||||||
|
|
||||||
|
@ -2929,9 +2960,9 @@ void GSDeviceVK::UpdateHWPipelineSelector(GSHWDrawConfig& config)
|
||||||
m_pipeline_selector.rt = config.rt != nullptr;
|
m_pipeline_selector.rt = config.rt != nullptr;
|
||||||
m_pipeline_selector.ds = config.ds != nullptr;
|
m_pipeline_selector.ds = config.ds != nullptr;
|
||||||
m_pipeline_selector.line_width = config.line_expand;
|
m_pipeline_selector.line_width = config.line_expand;
|
||||||
m_pipeline_selector.feedback_loop =
|
m_pipeline_selector.feedback_loop = m_features.texture_barrier &&
|
||||||
config.ps.IsFeedbackLoop() || config.require_one_barrier || config.require_full_barrier ||
|
(config.ps.IsFeedbackLoop() || config.require_one_barrier || config.require_full_barrier ||
|
||||||
config.destination_alpha == GSHWDrawConfig::DestinationAlphaMode::PrimIDTracking;
|
config.destination_alpha == GSHWDrawConfig::DestinationAlphaMode::PrimIDTracking);
|
||||||
|
|
||||||
// enable point size in the vertex shader if we're rendering points regardless of upscaling.
|
// enable point size in the vertex shader if we're rendering points regardless of upscaling.
|
||||||
m_pipeline_selector.vs.point_size |= (config.topology == GSHWDrawConfig::Topology::Point);
|
m_pipeline_selector.vs.point_size |= (config.topology == GSHWDrawConfig::Topology::Point);
|
||||||
|
@ -2960,7 +2991,7 @@ void GSDeviceVK::SendHWDraw(const GSHWDrawConfig& config, GSTextureVK* draw_rt)
|
||||||
DrawIndexedPrimitive(p, config.indices_per_prim);
|
DrawIndexedPrimitive(p, config.indices_per_prim);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (config.require_one_barrier)
|
else if (config.require_one_barrier && m_features.texture_barrier)
|
||||||
{
|
{
|
||||||
ColorBufferBarrier(draw_rt);
|
ColorBufferBarrier(draw_rt);
|
||||||
DrawIndexedPrimitive();
|
DrawIndexedPrimitive();
|
||||||
|
|
|
@ -566,9 +566,10 @@ DebugTab::DebugTab(wxWindow* parent)
|
||||||
tab_box->Add(debug_box.outer, wxSizerFlags().Expand());
|
tab_box->Add(debug_box.outer, wxSizerFlags().Expand());
|
||||||
}
|
}
|
||||||
|
|
||||||
PaddedBoxSizer<wxStaticBoxSizer> ogl_box(wxVERTICAL, this, "OpenGL");
|
PaddedBoxSizer<wxStaticBoxSizer> ogl_box(wxVERTICAL, this, "Overrides");
|
||||||
auto* ogl_grid = new wxFlexGridSizer(2, space, space);
|
auto* ogl_grid = new wxFlexGridSizer(2, space, space);
|
||||||
m_ui.addComboBoxAndLabel(ogl_grid, "Geometry Shader:", "override_geometry_shader", &theApp.m_gs_generic_list, IDC_GEOMETRY_SHADER_OVERRIDE, ogl_hw_prereq);
|
m_ui.addComboBoxAndLabel(ogl_grid, "Texture Barriers:", "OverrideTextureBarriers", &theApp.m_gs_generic_list, -1);
|
||||||
|
m_ui.addComboBoxAndLabel(ogl_grid, "Geometry Shader:", "OverrideGeometryShaders", &theApp.m_gs_generic_list, IDC_GEOMETRY_SHADER_OVERRIDE);
|
||||||
m_ui.addComboBoxAndLabel(ogl_grid, "Image Load Store:", "override_GL_ARB_shader_image_load_store", &theApp.m_gs_generic_list, IDC_IMAGE_LOAD_STORE, ogl_hw_prereq);
|
m_ui.addComboBoxAndLabel(ogl_grid, "Image Load Store:", "override_GL_ARB_shader_image_load_store", &theApp.m_gs_generic_list, IDC_IMAGE_LOAD_STORE, ogl_hw_prereq);
|
||||||
m_ui.addComboBoxAndLabel(ogl_grid, "Sparse Texture:", "override_GL_ARB_sparse_texture", &theApp.m_gs_generic_list, IDC_SPARSE_TEXTURE, ogl_hw_prereq);
|
m_ui.addComboBoxAndLabel(ogl_grid, "Sparse Texture:", "override_GL_ARB_sparse_texture", &theApp.m_gs_generic_list, IDC_SPARSE_TEXTURE, ogl_hw_prereq);
|
||||||
ogl_box->Add(ogl_grid);
|
ogl_box->Add(ogl_grid);
|
||||||
|
|
|
@ -396,6 +396,8 @@ bool Pcsx2Config::GSOptions::OptionsAreEqual(const GSOptions& right) const
|
||||||
OpEqu(UserHacks_TCOffsetX) &&
|
OpEqu(UserHacks_TCOffsetX) &&
|
||||||
OpEqu(UserHacks_TCOffsetY) &&
|
OpEqu(UserHacks_TCOffsetY) &&
|
||||||
OpEqu(UserHacks_TriFilter) &&
|
OpEqu(UserHacks_TriFilter) &&
|
||||||
|
OpEqu(OverrideTextureBarriers) &&
|
||||||
|
OpEqu(OverrideGeometryShaders) &&
|
||||||
|
|
||||||
OpEqu(ShadeBoost_Brightness) &&
|
OpEqu(ShadeBoost_Brightness) &&
|
||||||
OpEqu(ShadeBoost_Contrast) &&
|
OpEqu(ShadeBoost_Contrast) &&
|
||||||
|
@ -419,7 +421,9 @@ bool Pcsx2Config::GSOptions::RestartOptionsAreEqual(const GSOptions& right) cons
|
||||||
OpEqu(UseDebugDevice) &&
|
OpEqu(UseDebugDevice) &&
|
||||||
OpEqu(UseBlitSwapChain) &&
|
OpEqu(UseBlitSwapChain) &&
|
||||||
OpEqu(DisableShaderCache) &&
|
OpEqu(DisableShaderCache) &&
|
||||||
OpEqu(ThreadedPresentation);
|
OpEqu(ThreadedPresentation) &&
|
||||||
|
OpEqu(OverrideTextureBarriers) &&
|
||||||
|
OpEqu(OverrideGeometryShaders);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Pcsx2Config::GSOptions::LoadSave(SettingsWrapper& wrap)
|
void Pcsx2Config::GSOptions::LoadSave(SettingsWrapper& wrap)
|
||||||
|
@ -568,6 +572,8 @@ void Pcsx2Config::GSOptions::ReloadIniSettings()
|
||||||
GSSettingIntEx(UserHacks_TCOffsetX, "UserHacks_TCOffsetX");
|
GSSettingIntEx(UserHacks_TCOffsetX, "UserHacks_TCOffsetX");
|
||||||
GSSettingIntEx(UserHacks_TCOffsetY, "UserHacks_TCOffsetY");
|
GSSettingIntEx(UserHacks_TCOffsetY, "UserHacks_TCOffsetY");
|
||||||
GSSettingIntEnumEx(UserHacks_TriFilter, "UserHacks_TriFilter");
|
GSSettingIntEnumEx(UserHacks_TriFilter, "UserHacks_TriFilter");
|
||||||
|
GSSettingIntEx(OverrideTextureBarriers, "OverrideTextureBarriers");
|
||||||
|
GSSettingIntEx(OverrideGeometryShaders, "OverrideGeometryShaders");
|
||||||
|
|
||||||
GSSettingInt(ShadeBoost_Brightness);
|
GSSettingInt(ShadeBoost_Brightness);
|
||||||
GSSettingInt(ShadeBoost_Contrast);
|
GSSettingInt(ShadeBoost_Contrast);
|
||||||
|
|
Loading…
Reference in New Issue