1
0
mirror of https://github.com/RPCS3/rpcs3.git synced 2024-11-22 02:32:36 +01:00

gl: Fall back to renderpass decoder on ATI drivers

This commit is contained in:
kd-11 2022-10-16 14:20:29 +03:00 committed by kd-11
parent fafae1cbb5
commit 6d43fcf8fb
4 changed files with 80 additions and 14 deletions

View File

@ -631,13 +631,17 @@ namespace gl
#include "../Program/GLSLSnippets/CopyBufferToGenericImage.glsl" #include "../Program/GLSLSnippets/CopyBufferToGenericImage.glsl"
; ;
const bool stencil_export_supported = gl::get_driver_caps().ARB_shader_stencil_export_supported; const auto& caps = gl::get_driver_caps();
const bool stencil_export_supported = caps.ARB_shader_stencil_export_supported;
const bool legacy_format_support = caps.subvendor_ATI;
std::pair<std::string_view, std::string> repl_list[] = std::pair<std::string_view, std::string> repl_list[] =
{ {
{ "%set, ", "" }, { "%set, ", "" },
{ "%loc", std::to_string(GL_COMPUTE_BUFFER_SLOT(0)) }, { "%loc", std::to_string(GL_COMPUTE_BUFFER_SLOT(0)) },
{ "%push_block", fmt::format("binding=%d, std140", GL_COMPUTE_BUFFER_SLOT(1)) }, { "%push_block", fmt::format("binding=%d, std140", GL_COMPUTE_BUFFER_SLOT(1)) },
{ "%stencil_export_supported", stencil_export_supported ? "1" : "0" } { "%stencil_export_supported", stencil_export_supported ? "1" : "0" },
{ "%legacy_format_support", legacy_format_support ? "1" : "0" }
}; };
fs_src = fmt::replace_all(fs_src, repl_list); fs_src = fmt::replace_all(fs_src, repl_list);

View File

@ -384,6 +384,7 @@ namespace gl
bool skip_barrier = false; bool skip_barrier = false;
u32 in_offset = static_cast<u32>(reinterpret_cast<u64>(src_offset)); u32 in_offset = static_cast<u32>(reinterpret_cast<u64>(src_offset));
u32 out_offset = in_offset; u32 out_offset = in_offset;
const auto& caps = gl::get_driver_caps();
auto initialize_scratch_mem = [&]() auto initialize_scratch_mem = [&]()
{ {
@ -409,7 +410,6 @@ namespace gl
transfer_buf = &scratch_mem; transfer_buf = &scratch_mem;
}; };
const auto caps = gl::get_driver_caps();
if ((dst->aspect() & image_aspect::stencil) == 0 || caps.ARB_shader_stencil_export_supported) if ((dst->aspect() & image_aspect::stencil) == 0 || caps.ARB_shader_stencil_export_supported)
{ {
// We do not need to use the driver's builtin transport mechanism // We do not need to use the driver's builtin transport mechanism
@ -469,18 +469,24 @@ namespace gl
} }
// If possible, decode using a compute transform to potentially have asynchronous scheduling // If possible, decode using a compute transform to potentially have asynchronous scheduling
bool use_compute_transform = (dst->aspect() == gl::image_aspect::color); bool use_compute_transform = (
switch (dst->get_internal_format()) dst->aspect() == gl::image_aspect::color && // Cannot use image_load_store with depth images
caps.subvendor_ATI == false); // The old AMD/ATI driver does not support image writeonly without format specifier
if (use_compute_transform)
{ {
case texture::internal_format::bgr5a1: switch (dst->get_internal_format())
case texture::internal_format::rgb5a1: {
case texture::internal_format::rgb565: case texture::internal_format::bgr5a1:
case texture::internal_format::rgba4: case texture::internal_format::rgb5a1:
// Packed formats are a problem with image_load_store case texture::internal_format::rgb565:
use_compute_transform = false; case texture::internal_format::rgba4:
break; // Packed formats are a problem with image_load_store
default: use_compute_transform = false;
break; break;
default:
break;
}
} }
if (use_compute_transform) if (use_compute_transform)

View File

@ -32,6 +32,7 @@ namespace gl
bool vendor_MESA = false; // requires CLIENT_STORAGE bit set for streaming buffers bool vendor_MESA = false; // requires CLIENT_STORAGE bit set for streaming buffers
bool subvendor_RADEONSI = false; bool subvendor_RADEONSI = false;
bool subvendor_NOUVEAU = false; bool subvendor_NOUVEAU = false;
bool subvendor_ATI = false;
bool check(const std::string& ext_name, const char* test) bool check(const std::string& ext_name, const char* test)
{ {
@ -230,6 +231,7 @@ namespace gl
else if (vendor_string.find("amd") != umax || vendor_string.find("ati") != umax) else if (vendor_string.find("amd") != umax || vendor_string.find("ati") != umax)
{ {
vendor_AMD = true; vendor_AMD = true;
subvendor_ATI = vendor_string.find("ati") != umax;
} }
#endif #endif

View File

@ -3,12 +3,27 @@ R"(
#extension GL_ARB_shader_stencil_export : enable #extension GL_ARB_shader_stencil_export : enable
#define ENABLE_DEPTH_STENCIL_LOAD %stencil_export_supported #define ENABLE_DEPTH_STENCIL_LOAD %stencil_export_supported
#define LEGACY_FORMAT_SUPPORT %legacy_format_support
#define FMT_GL_DEPTH_COMPONENT16 0x81A5 #define FMT_GL_DEPTH_COMPONENT16 0x81A5
#define FMT_GL_DEPTH_COMPONENT32F 0x8CAC #define FMT_GL_DEPTH_COMPONENT32F 0x8CAC
#define FMT_GL_DEPTH24_STENCIL8 0x88F0 #define FMT_GL_DEPTH24_STENCIL8 0x88F0
#define FMT_GL_DEPTH32F_STENCIL8 0x8CAD #define FMT_GL_DEPTH32F_STENCIL8 0x8CAD
#if LEGACY_FORMAT_SUPPORT
#define FMT_GL_RGBA8 0x8058
#define FMT_GL_BGRA8 0x80E1
#define FMT_GL_R8 0x8229
#define FMT_GL_R16 0x822A
#define FMT_GL_R32F 0x822E
#define FMT_GL_RG8 0x822B
#define FMT_GL_RG8_SNORM 0x8F95
#define FMT_GL_RG16 0x822C
#define FMT_GL_RG16F 0x822F
#define FMT_GL_RGBA16F 0x881A
#define FMT_GL_RGBA32F 0x8814
#endif
#define FMT_GL_RGB565 0x8D62 #define FMT_GL_RGB565 0x8D62
#define FMT_GL_RGB5_A1 0x8057 #define FMT_GL_RGB5_A1 0x8057
#define FMT_GL_BGR5_A1 0x99F0 #define FMT_GL_BGR5_A1 0x99F0
@ -144,6 +159,45 @@ void main()
gl_FragStencilRefARB = int(utmp2.y); gl_FragStencilRefARB = int(utmp2.y);
break; break;
#endif
#if LEGACY_FORMAT_SUPPORT
// Simple color. Provided for compatibility with old drivers.
case FMT_GL_RGBA8:
outColor = readFixed8x4(invocation_id);
break;
case FMT_GL_BGRA8:
outColor = readFixed8x4(invocation_id).bgra;
break;
case FMT_GL_R8:
outColor.r = readFixed8(invocation_id);
break;
case FMT_GL_R16:
outColor.r = readFixed16(invocation_id);
break;
case FMT_GL_R32F:
outColor.r = readFloat32(invocation_id);
break;
case FMT_GL_RG8:
outColor.rg = readFixed8x2(invocation_id);
break;
case FMT_GL_RG8_SNORM:
outColor.rg = readFixed8x2Snorm(invocation_id);
break;
case FMT_GL_RG16:
outColor.rg = readFixed16x2(invocation_id);
break;
case FMT_GL_RG16F:
outColor.rg = readFloat16x2(invocation_id);
break;
case FMT_GL_RGBA16F:
outColor = readFloat16x4(invocation_id);
break;
case FMT_GL_RGBA32F:
outColor = readFloat32x4(invocation_id);
break;
#endif #endif
// Packed color // Packed color