mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-26 07:35:41 +00:00
GPU/OpenGL: Set GLSL version string dynamically
Rather than hardcoding to 3.3.
This commit is contained in:
parent
db0d11c2ff
commit
0bc7333e6e
|
@ -1,11 +1,18 @@
|
||||||
#include "gpu_hw_shadergen.h"
|
#include "gpu_hw_shadergen.h"
|
||||||
|
#include "YBaseLib/Assert.h"
|
||||||
|
#include "YBaseLib/Log.h"
|
||||||
|
#include <cstdio>
|
||||||
#include <glad.h>
|
#include <glad.h>
|
||||||
|
Log_SetChannel(GPU_HW_ShaderGen);
|
||||||
|
|
||||||
GPU_HW_ShaderGen::GPU_HW_ShaderGen(HostDisplay::RenderAPI render_api, u32 resolution_scale, bool true_color,
|
GPU_HW_ShaderGen::GPU_HW_ShaderGen(HostDisplay::RenderAPI render_api, u32 resolution_scale, bool true_color,
|
||||||
bool supports_dual_source_blend)
|
bool supports_dual_source_blend)
|
||||||
: m_render_api(render_api), m_resolution_scale(resolution_scale), m_true_color(true_color),
|
: m_render_api(render_api), m_resolution_scale(resolution_scale), m_true_color(true_color),
|
||||||
m_glsl(render_api != HostDisplay::RenderAPI::D3D11), m_supports_dual_source_blend(supports_dual_source_blend)
|
m_glsl(render_api != HostDisplay::RenderAPI::D3D11), m_glsl_es(render_api == HostDisplay::RenderAPI::OpenGLES),
|
||||||
|
m_supports_dual_source_blend(supports_dual_source_blend)
|
||||||
{
|
{
|
||||||
|
if (m_glsl)
|
||||||
|
SetGLSLVersionString();
|
||||||
}
|
}
|
||||||
|
|
||||||
GPU_HW_ShaderGen::~GPU_HW_ShaderGen() = default;
|
GPU_HW_ShaderGen::~GPU_HW_ShaderGen() = default;
|
||||||
|
@ -15,21 +22,52 @@ static void DefineMacro(std::stringstream& ss, const char* name, bool enabled)
|
||||||
ss << "#define " << name << " " << BoolToUInt32(enabled) << "\n";
|
ss << "#define " << name << " " << BoolToUInt32(enabled) << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GPU_HW_ShaderGen::SetGLSLVersionString()
|
||||||
|
{
|
||||||
|
const char* glsl_version = reinterpret_cast<const char*>(glGetString(GL_SHADING_LANGUAGE_VERSION));
|
||||||
|
Assert(glsl_version != nullptr);
|
||||||
|
|
||||||
|
int major_version = 0, minor_version = 0;
|
||||||
|
if (std::sscanf(glsl_version, "%d.%d", &major_version, &minor_version) != 2)
|
||||||
|
{
|
||||||
|
Log_ErrorPrintf("Invalid GLSL version string: '%s'", glsl_version);
|
||||||
|
m_glsl_version_string = m_glsl_es ? "300" : "130";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cap at GLSL 3.3, we're not using anything newer for now.
|
||||||
|
if (!m_glsl_es && major_version >= 4)
|
||||||
|
{
|
||||||
|
major_version = 3;
|
||||||
|
minor_version = 30;
|
||||||
|
}
|
||||||
|
else if (m_glsl_es && (major_version > 3 || minor_version > 20))
|
||||||
|
{
|
||||||
|
major_version = 3;
|
||||||
|
minor_version = 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_glsl_version_string = "#version ";
|
||||||
|
m_glsl_version_string += std::to_string(major_version);
|
||||||
|
m_glsl_version_string += std::to_string(minor_version);
|
||||||
|
if (!m_glsl_es && major_version >= 3 && minor_version >= 3)
|
||||||
|
m_glsl_version_string += " core";
|
||||||
|
else if (m_glsl_es)
|
||||||
|
m_glsl_version_string += " es";
|
||||||
|
}
|
||||||
|
|
||||||
void GPU_HW_ShaderGen::WriteHeader(std::stringstream& ss)
|
void GPU_HW_ShaderGen::WriteHeader(std::stringstream& ss)
|
||||||
{
|
{
|
||||||
|
if (m_render_api == HostDisplay::RenderAPI::OpenGL || m_render_api == HostDisplay::RenderAPI::OpenGLES)
|
||||||
|
ss << m_glsl_version_string << "\n\n";
|
||||||
|
|
||||||
if (m_render_api == HostDisplay::RenderAPI::OpenGL)
|
if (m_render_api == HostDisplay::RenderAPI::OpenGL)
|
||||||
{
|
{
|
||||||
ss << "#version 330 core\n\n";
|
|
||||||
ss << "#define API_OPENGL 1\n";
|
ss << "#define API_OPENGL 1\n";
|
||||||
}
|
}
|
||||||
else if (m_render_api == HostDisplay::RenderAPI::OpenGLES)
|
else if (m_render_api == HostDisplay::RenderAPI::OpenGLES)
|
||||||
{
|
{
|
||||||
if (GLAD_GL_ES_VERSION_3_2)
|
ss << "#define API_OPENGL_ES 1\n";
|
||||||
ss << "#version 320 es\n\n";
|
|
||||||
else if (GLAD_GL_ES_VERSION_3_1)
|
|
||||||
ss << "#version 310 es\n\n";
|
|
||||||
else
|
|
||||||
ss << "#version 300 es\n\n";
|
|
||||||
|
|
||||||
ss << "precision highp float;\n";
|
ss << "precision highp float;\n";
|
||||||
ss << "precision highp int;\n";
|
ss << "precision highp int;\n";
|
||||||
|
@ -39,8 +77,6 @@ void GPU_HW_ShaderGen::WriteHeader(std::stringstream& ss)
|
||||||
ss << "precision highp usamplerBuffer;\n";
|
ss << "precision highp usamplerBuffer;\n";
|
||||||
|
|
||||||
ss << "\n";
|
ss << "\n";
|
||||||
ss << "#define API_OPENGL 1\n";
|
|
||||||
ss << "#define API_OPENGL_ES 1\n";
|
|
||||||
}
|
}
|
||||||
else if (m_render_api == HostDisplay::RenderAPI::D3D11)
|
else if (m_render_api == HostDisplay::RenderAPI::D3D11)
|
||||||
{
|
{
|
||||||
|
|
|
@ -29,7 +29,10 @@ public:
|
||||||
bool m_glsl_es;
|
bool m_glsl_es;
|
||||||
bool m_supports_dual_source_blend;
|
bool m_supports_dual_source_blend;
|
||||||
|
|
||||||
|
std::string m_glsl_version_string;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void SetGLSLVersionString();
|
||||||
void WriteHeader(std::stringstream& ss);
|
void WriteHeader(std::stringstream& ss);
|
||||||
void DeclareUniformBuffer(std::stringstream& ss, const std::initializer_list<const char*>& members);
|
void DeclareUniformBuffer(std::stringstream& ss, const std::initializer_list<const char*>& members);
|
||||||
void DeclareTexture(std::stringstream& ss, const char* name, u32 index);
|
void DeclareTexture(std::stringstream& ss, const char* name, u32 index);
|
||||||
|
|
Loading…
Reference in a new issue