summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/OGL/TextureCache.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoBackends/OGL/TextureCache.cpp')
-rw-r--r--Source/Core/VideoBackends/OGL/TextureCache.cpp111
1 files changed, 56 insertions, 55 deletions
diff --git a/Source/Core/VideoBackends/OGL/TextureCache.cpp b/Source/Core/VideoBackends/OGL/TextureCache.cpp
index b4f16266ee..924f3d428c 100644
--- a/Source/Core/VideoBackends/OGL/TextureCache.cpp
+++ b/Source/Core/VideoBackends/OGL/TextureCache.cpp
@@ -9,6 +9,7 @@
#include <memory>
#include <vector>
+#include "Common/Assert.h"
#include "Common/GL/GLInterfaceBase.h"
#include "Common/MsgHandler.h"
#include "Common/StringUtil.h"
@@ -32,12 +33,18 @@ namespace OGL
{
static u32 s_ColorCbufid;
static u32 s_DepthCbufid;
-static SHADER s_palette_pixel_shader[3];
+
+struct PaletteShader
+{
+ SHADER shader;
+ GLuint buffer_offset_uniform;
+ GLuint multiplier_uniform;
+ GLuint copy_position_uniform;
+};
+
+static PaletteShader s_palette_shader[3];
static std::unique_ptr<StreamBuffer> s_palette_stream_buffer;
-static GLuint s_palette_resolv_texture;
-static GLuint s_palette_buffer_offset_uniform[3];
-static GLuint s_palette_multiplier_uniform[3];
-static GLuint s_palette_copy_position_uniform[3];
+static GLuint s_palette_resolv_texture = 0;
struct TextureDecodingProgramInfo
{
@@ -64,12 +71,12 @@ std::unique_ptr<AbstractTexture> TextureCache::CreateTexture(const TextureConfig
return std::make_unique<OGLTexture>(config);
}
-void TextureCache::CopyEFB(u8* dst, const EFBCopyFormat& format, u32 native_width,
+void TextureCache::CopyEFB(u8* dst, const EFBCopyParams& params, u32 native_width,
u32 bytes_per_row, u32 num_blocks_y, u32 memory_stride,
- bool is_depth_copy, const EFBRectangle& src_rect, bool scale_by_half)
+ const EFBRectangle& src_rect, bool scale_by_half)
{
- TextureConverter::EncodeToRamFromTexture(dst, format, native_width, bytes_per_row, num_blocks_y,
- memory_stride, is_depth_copy, src_rect, scale_by_half);
+ TextureConverter::EncodeToRamFromTexture(dst, params, native_width, bytes_per_row, num_blocks_y,
+ memory_stride, src_rect, scale_by_half);
}
TextureCache::TextureCache()
@@ -126,6 +133,23 @@ GLuint TextureCache::GetColorCopyPositionUniform() const
return m_colorCopyPositionUniform;
}
+static bool CompilePaletteShader(TLUTFormat tlutfmt, const std::string& vcode,
+ const std::string& pcode, const std::string& gcode)
+{
+ _assert_(IsValidTLUTFormat(tlutfmt));
+ PaletteShader& shader = s_palette_shader[static_cast<int>(tlutfmt)];
+
+ if (!ProgramShaderCache::CompileShader(shader.shader, vcode, pcode, gcode))
+ return false;
+
+ shader.buffer_offset_uniform =
+ glGetUniformLocation(shader.shader.glprogid, "texture_buffer_offset");
+ shader.multiplier_uniform = glGetUniformLocation(shader.shader.glprogid, "multiplier");
+ shader.copy_position_uniform = glGetUniformLocation(shader.shader.glprogid, "copy_position");
+
+ return true;
+}
+
bool TextureCache::CompileShaders()
{
constexpr const char* color_copy_program = "SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n"
@@ -315,44 +339,17 @@ bool TextureCache::CompileShaders()
if (g_ActiveConfig.backend_info.bSupportsPaletteConversion)
{
- if (!ProgramShaderCache::CompileShader(
- s_palette_pixel_shader[GX_TL_IA8], StringFromFormat(vertex_program, prefix, prefix),
- "#define DECODE DecodePixel_IA8" + palette_shader, geo_program))
- {
+ if (!CompilePaletteShader(TLUTFormat::IA8, StringFromFormat(vertex_program, prefix, prefix),
+ "#define DECODE DecodePixel_IA8" + palette_shader, geo_program))
return false;
- }
- s_palette_buffer_offset_uniform[GX_TL_IA8] =
- glGetUniformLocation(s_palette_pixel_shader[GX_TL_IA8].glprogid, "texture_buffer_offset");
- s_palette_multiplier_uniform[GX_TL_IA8] =
- glGetUniformLocation(s_palette_pixel_shader[GX_TL_IA8].glprogid, "multiplier");
- s_palette_copy_position_uniform[GX_TL_IA8] =
- glGetUniformLocation(s_palette_pixel_shader[GX_TL_IA8].glprogid, "copy_position");
-
- if (!ProgramShaderCache::CompileShader(
- s_palette_pixel_shader[GX_TL_RGB565], StringFromFormat(vertex_program, prefix, prefix),
- "#define DECODE DecodePixel_RGB565" + palette_shader, geo_program))
- {
+
+ if (!CompilePaletteShader(TLUTFormat::RGB565, StringFromFormat(vertex_program, prefix, prefix),
+ "#define DECODE DecodePixel_RGB565" + palette_shader, geo_program))
return false;
- }
- s_palette_buffer_offset_uniform[GX_TL_RGB565] = glGetUniformLocation(
- s_palette_pixel_shader[GX_TL_RGB565].glprogid, "texture_buffer_offset");
- s_palette_multiplier_uniform[GX_TL_RGB565] =
- glGetUniformLocation(s_palette_pixel_shader[GX_TL_RGB565].glprogid, "multiplier");
- s_palette_copy_position_uniform[GX_TL_RGB565] =
- glGetUniformLocation(s_palette_pixel_shader[GX_TL_RGB565].glprogid, "copy_position");
-
- if (!ProgramShaderCache::CompileShader(
- s_palette_pixel_shader[GX_TL_RGB5A3], StringFromFormat(vertex_program, prefix, prefix),
- "#define DECODE DecodePixel_RGB5A3" + palette_shader, geo_program))
- {
+
+ if (!CompilePaletteShader(TLUTFormat::RGB5A3, StringFromFormat(vertex_program, prefix, prefix),
+ "#define DECODE DecodePixel_RGB5A3" + palette_shader, geo_program))
return false;
- }
- s_palette_buffer_offset_uniform[GX_TL_RGB5A3] = glGetUniformLocation(
- s_palette_pixel_shader[GX_TL_RGB5A3].glprogid, "texture_buffer_offset");
- s_palette_multiplier_uniform[GX_TL_RGB5A3] =
- glGetUniformLocation(s_palette_pixel_shader[GX_TL_RGB5A3].glprogid, "multiplier");
- s_palette_copy_position_uniform[GX_TL_RGB5A3] =
- glGetUniformLocation(s_palette_pixel_shader[GX_TL_RGB5A3].glprogid, "copy_position");
}
return true;
@@ -364,16 +361,19 @@ void TextureCache::DeleteShaders()
m_depthMatrixProgram.Destroy();
if (g_ActiveConfig.backend_info.bSupportsPaletteConversion)
- for (auto& shader : s_palette_pixel_shader)
- shader.Destroy();
+ for (auto& shader : s_palette_shader)
+ shader.shader.Destroy();
}
-void TextureCache::ConvertTexture(TCacheEntry* destination, TCacheEntry* source, void* palette,
- TlutFormat format)
+void TextureCache::ConvertTexture(TCacheEntry* destination, TCacheEntry* source,
+ const void* palette, TLUTFormat tlutfmt)
{
if (!g_ActiveConfig.backend_info.bSupportsPaletteConversion)
return;
+ _assert_(IsValidTLUTFormat(tlutfmt));
+ const PaletteShader& palette_shader = s_palette_shader[static_cast<int>(tlutfmt)];
+
g_renderer->ResetAPIState();
OGLTexture* source_texture = static_cast<OGLTexture*>(source->texture.get());
@@ -385,16 +385,17 @@ void TextureCache::ConvertTexture(TCacheEntry* destination, TCacheEntry* source,
FramebufferManager::SetFramebuffer(destination_texture->GetFramebuffer());
glViewport(0, 0, destination->GetWidth(), destination->GetHeight());
- s_palette_pixel_shader[format].Bind();
+ palette_shader.shader.Bind();
// C14 textures are currently unsupported
- int size = (source->format & 0xf) == GX_TF_I4 ? 32 : 512;
+ int size = source->format == TextureFormat::I4 ? 32 : 512;
auto buffer = s_palette_stream_buffer->Map(size);
memcpy(buffer.first, palette, size);
s_palette_stream_buffer->Unmap(size);
- glUniform1i(s_palette_buffer_offset_uniform[format], buffer.second / 2);
- glUniform1f(s_palette_multiplier_uniform[format], (source->format & 0xf) == 0 ? 15.0f : 255.0f);
- glUniform4f(s_palette_copy_position_uniform[format], 0.0f, 0.0f,
+ glUniform1i(palette_shader.buffer_offset_uniform, buffer.second / 2);
+ glUniform1f(palette_shader.multiplier_uniform,
+ source->format == TextureFormat::I4 ? 15.0f : 255.0f);
+ glUniform4f(palette_shader.copy_position_uniform, 0.0f, 0.0f,
static_cast<float>(source->GetWidth()), static_cast<float>(source->GetHeight()));
glActiveTexture(GL_TEXTURE10);
@@ -441,7 +442,7 @@ void DestroyTextureDecodingResources()
s_texture_decoding_program_info.clear();
}
-bool TextureCache::SupportsGPUTextureDecode(TextureFormat format, TlutFormat palette_format)
+bool TextureCache::SupportsGPUTextureDecode(TextureFormat format, TLUTFormat palette_format)
{
auto key = std::make_pair(static_cast<u32>(format), static_cast<u32>(palette_format));
auto iter = s_texture_decoding_program_info.find(key);
@@ -483,7 +484,7 @@ bool TextureCache::SupportsGPUTextureDecode(TextureFormat format, TlutFormat pal
void TextureCache::DecodeTextureOnGPU(TCacheEntry* entry, u32 dst_level, const u8* data,
size_t data_size, TextureFormat format, u32 width, u32 height,
u32 aligned_width, u32 aligned_height, u32 row_stride,
- const u8* palette, TlutFormat palette_format)
+ const u8* palette, TLUTFormat palette_format)
{
auto key = std::make_pair(static_cast<u32>(format), static_cast<u32>(palette_format));
auto iter = s_texture_decoding_program_info.find(key);