gl_texture_cache: Create base images with sRGB
This breaks accelerated decoders trying to imageStore into images with sRGB. The decoders are currently disabled so this won't cause issues at runtime.
This commit is contained in:
parent
7265e80c12
commit
3a49c1a691
|
@ -61,7 +61,6 @@ struct FormatTuple {
|
||||||
GLenum internal_format;
|
GLenum internal_format;
|
||||||
GLenum format = GL_NONE;
|
GLenum format = GL_NONE;
|
||||||
GLenum type = GL_NONE;
|
GLenum type = GL_NONE;
|
||||||
GLenum store_format = internal_format;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr std::array<FormatTuple, MaxPixelFormat> FORMAT_TABLE = {{
|
constexpr std::array<FormatTuple, MaxPixelFormat> FORMAT_TABLE = {{
|
||||||
|
@ -114,7 +113,7 @@ constexpr std::array<FormatTuple, MaxPixelFormat> FORMAT_TABLE = {{
|
||||||
{GL_RG16I, GL_RG_INTEGER, GL_SHORT}, // R16G16_SINT
|
{GL_RG16I, GL_RG_INTEGER, GL_SHORT}, // R16G16_SINT
|
||||||
{GL_RG16_SNORM, GL_RG, GL_SHORT}, // R16G16_SNORM
|
{GL_RG16_SNORM, GL_RG, GL_SHORT}, // R16G16_SNORM
|
||||||
{GL_RGB32F, GL_RGB, GL_FLOAT}, // R32G32B32_FLOAT
|
{GL_RGB32F, GL_RGB, GL_FLOAT}, // R32G32B32_FLOAT
|
||||||
{GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, GL_RGBA8}, // A8B8G8R8_SRGB
|
{GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV}, // A8B8G8R8_SRGB
|
||||||
{GL_RG8, GL_RG, GL_UNSIGNED_BYTE}, // R8G8_UNORM
|
{GL_RG8, GL_RG, GL_UNSIGNED_BYTE}, // R8G8_UNORM
|
||||||
{GL_RG8_SNORM, GL_RG, GL_BYTE}, // R8G8_SNORM
|
{GL_RG8_SNORM, GL_RG, GL_BYTE}, // R8G8_SNORM
|
||||||
{GL_RG8I, GL_RG_INTEGER, GL_BYTE}, // R8G8_SINT
|
{GL_RG8I, GL_RG_INTEGER, GL_BYTE}, // R8G8_SINT
|
||||||
|
@ -126,7 +125,7 @@ constexpr std::array<FormatTuple, MaxPixelFormat> FORMAT_TABLE = {{
|
||||||
{GL_COMPRESSED_RGBA_ASTC_8x8_KHR}, // ASTC_2D_8X8_UNORM
|
{GL_COMPRESSED_RGBA_ASTC_8x8_KHR}, // ASTC_2D_8X8_UNORM
|
||||||
{GL_COMPRESSED_RGBA_ASTC_8x5_KHR}, // ASTC_2D_8X5_UNORM
|
{GL_COMPRESSED_RGBA_ASTC_8x5_KHR}, // ASTC_2D_8X5_UNORM
|
||||||
{GL_COMPRESSED_RGBA_ASTC_5x4_KHR}, // ASTC_2D_5X4_UNORM
|
{GL_COMPRESSED_RGBA_ASTC_5x4_KHR}, // ASTC_2D_5X4_UNORM
|
||||||
{GL_SRGB8_ALPHA8, GL_BGRA, GL_UNSIGNED_BYTE, GL_RGBA8}, // B8G8R8A8_UNORM
|
{GL_SRGB8_ALPHA8, GL_BGRA, GL_UNSIGNED_BYTE}, // B8G8R8A8_UNORM
|
||||||
{GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT}, // BC1_RGBA_SRGB
|
{GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT}, // BC1_RGBA_SRGB
|
||||||
{GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT}, // BC2_SRGB
|
{GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT}, // BC2_SRGB
|
||||||
{GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}, // BC3_SRGB
|
{GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}, // BC3_SRGB
|
||||||
|
@ -651,13 +650,11 @@ Image::Image(TextureCacheRuntime& runtime, const VideoCommon::ImageInfo& info_,
|
||||||
if (IsConverted(runtime.device, info.format, info.type)) {
|
if (IsConverted(runtime.device, info.format, info.type)) {
|
||||||
flags |= ImageFlagBits::Converted;
|
flags |= ImageFlagBits::Converted;
|
||||||
gl_internal_format = IsPixelFormatSRGB(info.format) ? GL_SRGB8_ALPHA8 : GL_RGBA8;
|
gl_internal_format = IsPixelFormatSRGB(info.format) ? GL_SRGB8_ALPHA8 : GL_RGBA8;
|
||||||
gl_store_format = GL_RGBA8;
|
|
||||||
gl_format = GL_RGBA;
|
gl_format = GL_RGBA;
|
||||||
gl_type = GL_UNSIGNED_INT_8_8_8_8_REV;
|
gl_type = GL_UNSIGNED_INT_8_8_8_8_REV;
|
||||||
} else {
|
} else {
|
||||||
const auto& tuple = GetFormatTuple(info.format);
|
const auto& tuple = GetFormatTuple(info.format);
|
||||||
gl_internal_format = tuple.internal_format;
|
gl_internal_format = tuple.internal_format;
|
||||||
gl_store_format = tuple.store_format;
|
|
||||||
gl_format = tuple.format;
|
gl_format = tuple.format;
|
||||||
gl_type = tuple.type;
|
gl_type = tuple.type;
|
||||||
}
|
}
|
||||||
|
@ -677,23 +674,23 @@ Image::Image(TextureCacheRuntime& runtime, const VideoCommon::ImageInfo& info_,
|
||||||
}
|
}
|
||||||
switch (target) {
|
switch (target) {
|
||||||
case GL_TEXTURE_1D_ARRAY:
|
case GL_TEXTURE_1D_ARRAY:
|
||||||
glTextureStorage2D(handle, num_levels, gl_store_format, width, num_layers);
|
glTextureStorage2D(handle, num_levels, gl_internal_format, width, num_layers);
|
||||||
break;
|
break;
|
||||||
case GL_TEXTURE_2D_ARRAY:
|
case GL_TEXTURE_2D_ARRAY:
|
||||||
glTextureStorage3D(handle, num_levels, gl_store_format, width, height, num_layers);
|
glTextureStorage3D(handle, num_levels, gl_internal_format, width, height, num_layers);
|
||||||
break;
|
break;
|
||||||
case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: {
|
case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: {
|
||||||
// TODO: Where should 'fixedsamplelocations' come from?
|
// TODO: Where should 'fixedsamplelocations' come from?
|
||||||
const auto [samples_x, samples_y] = SamplesLog2(info.num_samples);
|
const auto [samples_x, samples_y] = SamplesLog2(info.num_samples);
|
||||||
glTextureStorage3DMultisample(handle, num_samples, gl_store_format, width >> samples_x,
|
glTextureStorage3DMultisample(handle, num_samples, gl_internal_format, width >> samples_x,
|
||||||
height >> samples_y, num_layers, GL_FALSE);
|
height >> samples_y, num_layers, GL_FALSE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GL_TEXTURE_RECTANGLE:
|
case GL_TEXTURE_RECTANGLE:
|
||||||
glTextureStorage2D(handle, num_levels, gl_store_format, width, height);
|
glTextureStorage2D(handle, num_levels, gl_internal_format, width, height);
|
||||||
break;
|
break;
|
||||||
case GL_TEXTURE_3D:
|
case GL_TEXTURE_3D:
|
||||||
glTextureStorage3D(handle, num_levels, gl_store_format, width, height, depth);
|
glTextureStorage3D(handle, num_levels, gl_internal_format, width, height, depth);
|
||||||
break;
|
break;
|
||||||
case GL_TEXTURE_BUFFER:
|
case GL_TEXTURE_BUFFER:
|
||||||
buffer.Create();
|
buffer.Create();
|
||||||
|
|
|
@ -96,6 +96,10 @@ public:
|
||||||
|
|
||||||
FormatProperties FormatInfo(VideoCommon::ImageType type, GLenum internal_format) const;
|
FormatProperties FormatInfo(VideoCommon::ImageType type, GLenum internal_format) const;
|
||||||
|
|
||||||
|
bool HasBrokenTextureViewFormats() const noexcept {
|
||||||
|
return has_broken_texture_view_formats;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct StagingBuffers {
|
struct StagingBuffers {
|
||||||
explicit StagingBuffers(GLenum storage_flags_, GLenum map_flags_);
|
explicit StagingBuffers(GLenum storage_flags_, GLenum map_flags_);
|
||||||
|
@ -120,6 +124,7 @@ private:
|
||||||
UtilShaders util_shaders;
|
UtilShaders util_shaders;
|
||||||
|
|
||||||
std::array<std::unordered_map<GLenum, FormatProperties>, 3> format_properties;
|
std::array<std::unordered_map<GLenum, FormatProperties>, 3> format_properties;
|
||||||
|
bool has_broken_texture_view_formats = false;
|
||||||
|
|
||||||
StagingBuffers upload_buffers{GL_MAP_WRITE_BIT, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT};
|
StagingBuffers upload_buffers{GL_MAP_WRITE_BIT, GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT};
|
||||||
StagingBuffers download_buffers{GL_MAP_READ_BIT, GL_MAP_READ_BIT};
|
StagingBuffers download_buffers{GL_MAP_READ_BIT, GL_MAP_READ_BIT};
|
||||||
|
@ -165,7 +170,6 @@ private:
|
||||||
OGLTextureView store_view;
|
OGLTextureView store_view;
|
||||||
OGLBuffer buffer;
|
OGLBuffer buffer;
|
||||||
GLenum gl_internal_format = GL_NONE;
|
GLenum gl_internal_format = GL_NONE;
|
||||||
GLenum gl_store_format = GL_NONE;
|
|
||||||
GLenum gl_format = GL_NONE;
|
GLenum gl_format = GL_NONE;
|
||||||
GLenum gl_type = GL_NONE;
|
GLenum gl_type = GL_NONE;
|
||||||
};
|
};
|
||||||
|
|
Reference in New Issue