@@ -8,14 +8,15 @@
#include <memory>
#include <string>

#include <fmt/format.h>

#include "Common/Align.h"
#include "Common/Assert.h"
#include "Common/CommonTypes.h"
#include "Common/FileUtil.h"
#include "Common/GL/GLContext.h"
#include "Common/Logging/Log.h"
#include "Common/MsgHandler.h"
#include "Common/StringUtil.h"
#include "Common/Version.h"

#include "Core/ConfigManager.h"
@@ -108,9 +109,9 @@ void SHADER::SetProgramVariables()
for (int a = 0; a < 8; ++a)
{
// Still need to get sampler locations since we aren't binding them statically in the shaders
int loc = glGetUniformLocation(glprogid, StringFromFormat("samp[%d]", a).c_str());
int loc = glGetUniformLocation(glprogid, fmt::format("samp[{}]", a).c_str());
if (loc < 0)
loc = glGetUniformLocation(glprogid, StringFromFormat("samp%d", a).c_str());
loc = glGetUniformLocation(glprogid, fmt::format("samp{}", a).c_str());
if (loc >= 0)
glUniform1i(loc, a);
}
@@ -146,8 +147,9 @@ void SHADER::SetProgramBindings(bool is_compute)

for (int i = 0; i < 8; i++)
{
std::string attrib_name = StringFromFormat("rawtex%d", i);
glBindAttribLocation(glprogid, SHADER_TEXTURE0_ATTRIB + i, attrib_name.c_str());
// Per documentation: OpenGL copies the name string when glBindAttribLocation is called, so an
// application may free its copy of the name string immediately after the function returns.
glBindAttribLocation(glprogid, SHADER_TEXTURE0_ATTRIB + i, fmt::format("rawtex{}", i).c_str());
}
}

@@ -727,35 +729,35 @@ void ProgramShaderCache::CreateHeader()
)";
}

s_glsl_header = StringFromFormat(
"%s\n"
"%s\n" // ubo
"%s\n" // early-z
"%s\n" // 420pack
"%s\n" // msaa
"%s\n" // Input/output/sampler binding
"%s\n" // Varying location
"%s\n" // storage buffer
"%s\n" // shader5
"%s\n" // SSAA
"%s\n" // Geometry point size
"%s\n" // AEP
"%s\n" // texture buffer
"%s\n" // ES texture buffer
"%s\n" // ES dual source blend
"%s\n" // shader image load store
"%s\n" // shader framebuffer fetch
"%s\n" // shader thread shuffle
"%s\n" // derivative control
"%s\n" // query levels
s_glsl_header = fmt::format(
"{}\n"
"{}\n" // ubo
"{}\n" // early-z
"{}\n" // 420pack
"{}\n" // msaa
"{}\n" // Input/output/sampler binding
"{}\n" // Varying location
"{}\n" // storage buffer
"{}\n" // shader5
"{}\n" // SSAA
"{}\n" // Geometry point size
"{}\n" // AEP
"{}\n" // texture buffer
"{}\n" // ES texture buffer
"{}\n" // ES dual source blend
"{}\n" // shader image load store
"{}\n" // shader framebuffer fetch
"{}\n" // shader thread shuffle
"{}\n" // derivative control
"{}\n" // query levels

// Precision defines for GLSL ES
"%s\n"
"%s\n"
"%s\n"
"%s\n"
"%s\n"
"%s\n"
"{}\n"
"{}\n"
"{}\n"
"{}\n"
"{}\n"
"{}\n"

// Silly differences
"#define API_OPENGL 1\n"
@@ -772,8 +774,8 @@ void ProgramShaderCache::CreateHeader()
"#define lerp mix\n"

,
GetGLSLVersionString().c_str(),
v < Glsl140 ? "#extension GL_ARB_uniform_buffer_object : enable" : "", earlyz_string.c_str(),
GetGLSLVersionString(), v < Glsl140 ? "#extension GL_ARB_uniform_buffer_object : enable" : "",
earlyz_string,
(g_ActiveConfig.backend_info.bSupportsBindingLayout && v < GlslEs310) ?
"#extension GL_ARB_shading_language_420pack : enable" :
"",
@@ -811,12 +813,12 @@ void ProgramShaderCache::CreateHeader()
v < Glsl400 && g_ActiveConfig.backend_info.bSupportsSSAA ?
"#extension GL_ARB_sample_shading : enable" :
"",
SupportedESPointSize.c_str(),
SupportedESPointSize,
g_ogl_config.bSupportsAEP ? "#extension GL_ANDROID_extension_pack_es31a : enable" : "",
v < Glsl140 && g_ActiveConfig.backend_info.bSupportsPaletteConversion ?
"#extension GL_ARB_texture_buffer_object : enable" :
"",
SupportedESTextureBuffer.c_str(),
SupportedESTextureBuffer,
is_glsles && g_ActiveConfig.backend_info.bSupportsDualSourceBlend ?
"#extension GL_EXT_blend_func_extended : enable" :
""
@@ -826,7 +828,7 @@ void ProgramShaderCache::CreateHeader()
((!is_glsles && v < Glsl430) || (is_glsles && v < GlslEs310)) ?
"#extension GL_ARB_shader_image_load_store : enable" :
"",
framebuffer_fetch_string.c_str(), shader_shuffle_string.c_str(),
framebuffer_fetch_string, shader_shuffle_string,
g_ActiveConfig.backend_info.bSupportsCoarseDerivatives ?
"#extension GL_ARB_derivative_control : enable" :
"",
@@ -205,17 +205,10 @@ const char* VkResultToString(VkResult res)
}

void LogVulkanResult(Common::Log::LogLevel level, const char* func_name, VkResult res,
const char* msg, ...)
const char* msg)
{
std::va_list ap;
va_start(ap, msg);
std::string real_msg = StringFromFormatV(msg, ap);
va_end(ap);

real_msg = fmt::format("({}) {} ({}: {})", func_name, real_msg, static_cast<int>(res),
VkResultToString(res));

GENERIC_LOG_FMT(Common::Log::LogType::VIDEO, level, "{}", real_msg);
GENERIC_LOG_FMT(Common::Log::LogType::VIDEO, level, "({}) {} ({}: {})", func_name, msg,
static_cast<int>(res), VkResultToString(res));
}

} // namespace Vulkan
@@ -48,9 +48,9 @@ void UnloadVulkanLibrary();

const char* VkResultToString(VkResult res);
void LogVulkanResult(Common::Log::LogLevel level, const char* func_name, VkResult res,
const char* msg, ...);
const char* msg);

#define LOG_VULKAN_ERROR(res, ...) \
LogVulkanResult(Common::Log::LogLevel::LERROR, __func__, res __VA_OPT__(, ) __VA_ARGS__)
#define LOG_VULKAN_ERROR(res, msg) \
LogVulkanResult(Common::Log::LogLevel::LERROR, __func__, res, msg)

} // namespace Vulkan
@@ -5,6 +5,8 @@
#include <utility>
#include <vector>

#include <fmt/format.h>

#include "Common/CommonTypes.h"
#include "Common/FileUtil.h"
#include "Common/StringUtil.h"
@@ -64,16 +66,16 @@ static std::string CodeToHeader(const std::vector<u16>& code, const std::string&
header.append("#define NUM_UCODES 1\n\n");
std::string filename_without_extension;
SplitPath(filename, nullptr, &filename_without_extension, nullptr);
header.append(StringFromFormat("const char* UCODE_NAMES[NUM_UCODES] = {\"%s\"};\n\n",
filename_without_extension.c_str()));
header.append(fmt::format("const char* UCODE_NAMES[NUM_UCODES] = {{\"{}\"}};\n\n",
filename_without_extension));
header.append("const unsigned short dsp_code[NUM_UCODES][0x1000] = {\n");

header.append("\t{\n\t\t");
for (u32 j = 0; j < code_padded.size(); j++)
{
if (j && ((j & 15) == 0))
header.append("\n\t\t");
header.append(StringFromFormat("0x%04x, ", code_padded[j]));
header.append(fmt::format("{:#06x}, ", code_padded[j]));
}
header.append("\n\t},\n");

@@ -98,14 +100,14 @@ static std::string CodesToHeader(const std::vector<std::vector<u16>>& codes,

std::string header;
header.reserve(reserve_size * 4);
header.append(StringFromFormat("#define NUM_UCODES %zu\n\n", codes.size()));
header.append(fmt::format("#define NUM_UCODES {}\n\n", codes.size()));
header.append("const char* UCODE_NAMES[NUM_UCODES] = {\n");
for (const std::string& in_filename : filenames)
{
std::string filename;
if (!SplitPath(in_filename, nullptr, &filename, nullptr))
filename = in_filename;
header.append(StringFromFormat("\t\"%s\",\n", filename.c_str()));
header.append(fmt::format("\t\"{}\",\n", filename));
}
header.append("};\n\n");
header.append("const unsigned short dsp_code[NUM_UCODES][0x1000] = {\n");
@@ -120,7 +122,7 @@ static std::string CodesToHeader(const std::vector<std::vector<u16>>& codes,
{
if (j && ((j & 15) == 0))
header.append("\n\t\t");
header.append(StringFromFormat("0x%04x, ", codes_padded[i][j]));
header.append(fmt::format("{:#06x}, ", codes_padded[i][j]));
}
header.append("\n\t},\n");
}
@@ -152,7 +154,7 @@ static void PrintResults(const std::string& input_name, const std::string& outpu
std::string results("Start:\n");
for (int initial_reg = 0; initial_reg < 32; initial_reg++)
{
results.append(StringFromFormat("%02x %04x ", initial_reg, reg_vector.at(initial_reg)));
results.append(fmt::format("{:02x} {:04x} ", initial_reg, reg_vector.at(initial_reg)));
if ((initial_reg + 1) % 8 == 0)
results.append("\n");
}
@@ -166,9 +168,9 @@ static void PrintResults(const std::string& input_name, const std::string& outpu
u16 current_reg;
u16 last_reg;
u32 htemp;
// results.append(StringFromFormat("Step %3d: (CW 0x%04x) UC:%03d\n", step, 0x8fff+step,
// results.append(fmt::format("Step {:3d}: (CW {:#06x}) UC:{:03d}\n", step, 0x8fff+step,
// (step-1)/32));
results.append(StringFromFormat("Step %3d:\n", step));
results.append(fmt::format("Step {:3d}:\n", step));
for (int reg = 0; reg < 32; reg++)
{
if (reg >= 0x0c && reg <= 0x0f)
@@ -210,8 +212,8 @@ static void PrintResults(const std::string& input_name, const std::string& outpu
}
if (last_reg != current_reg)
{
results.append(StringFromFormat("%02x %-7s: %04x %04x\n", reg, DSP::pdregname(reg),
last_reg, current_reg));
results.append(fmt::format("{:02x} {:7s}: {:04x} {:04x}\n", reg, DSP::pdregname(reg),
last_reg, current_reg));
changed = true;
}
}