Skip to content

Commit

Permalink
Better GLSL version handling. Now specify the latest version supporte…
Browse files Browse the repository at this point in the history
…d by the device.

Correct the version check for our own implementations of packUnorm4x8 etc.
  • Loading branch information
hrydgard committed Nov 16, 2020
1 parent cf092eb commit 29b2f2c
Show file tree
Hide file tree
Showing 8 changed files with 44 additions and 47 deletions.
9 changes: 0 additions & 9 deletions Common/GPU/D3D9/D3D9StateCache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
namespace DX9 {

DirectXState dxstate;
GLExtensions gl_extensions;

LPDIRECT3DDEVICE9 pD3Ddevice = nullptr;
LPDIRECT3DDEVICE9EX pD3DdeviceEx = nullptr;
Expand Down Expand Up @@ -64,14 +63,6 @@ void DirectXState::Restore() {
texAddressV.restore(); count++;
}

void CheckGLExtensions() {
static bool done = false;
if (done)
return;
done = true;
memset(&gl_extensions, 0, sizeof(gl_extensions));
}

} // namespace DX9

#endif // _MSC_VER
33 changes: 21 additions & 12 deletions Common/GPU/OpenGL/GLFeatures.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,19 +77,28 @@ bool GLExtensions::VersionGEThan(int major, int minor, int sub) {
}

int GLExtensions::GLSLVersion() {
// Used for shader translation and core contexts (Apple drives fail without an exact match.)
if (gl_extensions.VersionGEThan(3, 3)) {
return gl_extensions.ver[0] * 100 + gl_extensions.ver[1] * 10;
} else if (gl_extensions.VersionGEThan(3, 2)) {
return 150;
} else if (gl_extensions.VersionGEThan(3, 1)) {
return 140;
} else if (gl_extensions.VersionGEThan(3, 0)) {
return 130;
} else if (gl_extensions.VersionGEThan(2, 1)) {
return 120;
if (gl_extensions.IsGLES) {
if (gl_extensions.GLES3) {
// GLSL version matches ES version.
return gl_extensions.ver[0] * 100 + gl_extensions.ver[1] * 10;
} else {
return 100;
}
} else {
return 110;
// Used for shader translation and core contexts (Apple drives fail without an exact match.)
if (gl_extensions.VersionGEThan(3, 3)) {
return gl_extensions.ver[0] * 100 + gl_extensions.ver[1] * 10;
} else if (gl_extensions.VersionGEThan(3, 2)) {
return 150;
} else if (gl_extensions.VersionGEThan(3, 1)) {
return 140;
} else if (gl_extensions.VersionGEThan(3, 0)) {
return 130;
} else if (gl_extensions.VersionGEThan(2, 1)) {
return 120;
} else {
return 110;
}
}
}

Expand Down
28 changes: 4 additions & 24 deletions Common/GPU/OpenGL/thin3d_gl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -134,25 +134,6 @@ static const unsigned short primToGL[] = {
GL_TRIANGLES,
GL_TRIANGLE_STRIP,
GL_TRIANGLE_FAN,
#if !defined(USING_GLES2) // TODO: Remove when we have better headers

This comment has been minimized.

Copy link
@unknownbrackets

unknownbrackets Dec 5, 2020

Collaborator

Hm, did you mean to remove all of this? This isn't the same length as Primitive anymore.

-[Unknown]

This comment has been minimized.

Copy link
@hrydgard

hrydgard Dec 5, 2020

Author Owner

We never use any of this stuff and I have no plans to, so yeah. Although yes, should also get rid of extra entries in other corresponding enums and arrays of course...

GL_PATCHES,
GL_LINES_ADJACENCY,
GL_LINE_STRIP_ADJACENCY,
GL_TRIANGLES_ADJACENCY,
GL_TRIANGLE_STRIP_ADJACENCY,
#elif !defined(IOS)
GL_POINTS,
GL_POINTS,
GL_POINTS,
GL_POINTS,
GL_POINTS,
#else
GL_POINTS,
GL_POINTS,
GL_POINTS,
GL_POINTS,
GL_POINTS,
#endif
};

class OpenGLBuffer;
Expand Down Expand Up @@ -607,12 +588,15 @@ OpenGLContext::OpenGLContext() {

shaderLanguageDesc_.Init(GLSL_1xx);

shaderLanguageDesc_.glslVersionNumber = gl_extensions.GLSLVersion();

snprintf(shaderLanguageDesc_.driverInfo, sizeof(shaderLanguageDesc_.driverInfo),
"%s - GLSL %d", gl_extensions.model, gl_extensions.GLSLVersion());
// Detect shader language features.
if (gl_extensions.IsGLES) {
shaderLanguageDesc_.gles = true;
if (gl_extensions.GLES3) {
shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_3xx;
shaderLanguageDesc_.glslVersionNumber = 300; // GLSL ES 3.0
shaderLanguageDesc_.fragColor0 = "fragColor0";
shaderLanguageDesc_.texture = "texture";
shaderLanguageDesc_.glslES30 = true;
Expand All @@ -623,7 +607,6 @@ OpenGLContext::OpenGLContext() {
shaderLanguageDesc_.attribute = "in";
} else {
shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_1xx;
shaderLanguageDesc_.glslVersionNumber = 100; // GLSL ES 1.0
if (gl_extensions.EXT_gpu_shader4) {
shaderLanguageDesc_.bitwiseOps = true;
shaderLanguageDesc_.texelFetch = "texelFetch2D";
Expand All @@ -637,7 +620,6 @@ OpenGLContext::OpenGLContext() {
if (gl_extensions.IsCoreContext) {
if (gl_extensions.VersionGEThan(3, 3, 0)) {
shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_3xx;
shaderLanguageDesc_.glslVersionNumber = 330;
shaderLanguageDesc_.fragColor0 = "fragColor0";
shaderLanguageDesc_.texture = "texture";
shaderLanguageDesc_.glslES30 = true;
Expand All @@ -649,14 +631,12 @@ OpenGLContext::OpenGLContext() {
} else if (gl_extensions.VersionGEThan(3, 0, 0)) {
// Hm, I think this is wrong. This should be outside "if (gl_extensions.IsCoreContext)".
shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_1xx;
shaderLanguageDesc_.glslVersionNumber = 130;
shaderLanguageDesc_.fragColor0 = "fragColor0";
shaderLanguageDesc_.bitwiseOps = true;
shaderLanguageDesc_.texelFetch = "texelFetch";
} else {
// This too...
shaderLanguageDesc_.shaderLanguage = ShaderLanguage::GLSL_1xx;
shaderLanguageDesc_.glslVersionNumber = 110;
if (gl_extensions.EXT_gpu_shader4) {
shaderLanguageDesc_.bitwiseOps = true;
shaderLanguageDesc_.texelFetch = "texelFetch2D";
Expand Down
1 change: 1 addition & 0 deletions Common/GPU/Shader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ void ShaderLanguageDesc::Init(ShaderLanguage lang) {
switch (lang) {
case GLSL_1xx:
// Just used in the shader test, and as a basis for the others in DetectShaderLanguage.
// The real OpenGL initialization happens in thin3d_gl.cpp.
glslVersionNumber = 110;
attribute = "attribute";
varying_vs = "varying";
Expand Down
1 change: 1 addition & 0 deletions Common/GPU/Shader.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ struct ShaderLanguageDesc {
bool bitwiseOps = false;
bool forceMatrix4x4 = false;
bool coefsFromBuffers = false;
char driverInfo[128]; // Really only GL uses this.
};

enum class UniformType : int8_t {
Expand Down
2 changes: 2 additions & 0 deletions Common/GPU/ShaderWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,8 @@ void ShaderWriter::Preamble(const char **gl_extensions, size_t num_gl_extensions
for (size_t i = 0; i < num_gl_extensions; i++) {
F("%s\n", gl_extensions[i]);
}
// Print some system info - useful to gather information directly from screenshots.
F("// %s\n", lang_.driverInfo);
switch (stage_) {
case ShaderStage::Fragment:
C("#define DISCARD discard\n");
Expand Down
5 changes: 4 additions & 1 deletion Common/GPU/Vulkan/VulkanRenderManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,6 @@ void VulkanRenderManager::BeginFrame(bool enableProfiling) {

int curFrame = vulkan_->GetCurFrame();
FrameData &frameData = frameData_[curFrame];
frameData.profilingEnabled_ = enableProfiling;

// Make sure the very last command buffer from the frame before the previous has been fully executed.
if (useThread_) {
Expand All @@ -447,9 +446,12 @@ void VulkanRenderManager::BeginFrame(bool enableProfiling) {
}

VLOG("PUSH: Fencing %d", curFrame);

vkWaitForFences(device, 1, &frameData.fence, true, UINT64_MAX);
vkResetFences(device, 1, &frameData.fence);

// Can't set this until after the fence.
frameData.profilingEnabled_ = enableProfiling;
frameData.readbackFenceUsed = false;

uint64_t queryResults[MAX_TIMESTAMP_QUERIES];
Expand Down Expand Up @@ -502,6 +504,7 @@ void VulkanRenderManager::BeginFrame(bool enableProfiling) {
if (frameData.profilingEnabled_) {
// For various reasons, we need to always use an init cmd buffer in this case to perform the vkCmdResetQueryPool,
// unless we want to limit ourselves to only measure the main cmd buffer.
// Later versions of Vulkan have support for clearing queries on the CPU timeline, but we don't want to rely on that.
// Reserve the first two queries for initCmd.
frameData.profile.timestampDescriptions.push_back("initCmd Begin");
frameData.profile.timestampDescriptions.push_back("initCmd");
Expand Down
12 changes: 11 additions & 1 deletion GPU/Common/FragmentShaderGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -409,11 +409,21 @@ bool GenerateFragmentShader(const FShaderID &id, char *buffer, const ShaderLangu
WRITE(p, "%s vec4 fragColor0;\n", qualifierColor0);
}
}
}

bool hasPackUnorm4x8 = false;
if (compat.shaderLanguage == GLSL_VULKAN) {
hasPackUnorm4x8 = true;
} else if (ShaderLanguageIsOpenGL(compat.shaderLanguage)) {
if (compat.gles) {
hasPackUnorm4x8 = compat.glslVersionNumber >= 310;
} else {
hasPackUnorm4x8 = compat.glslVersionNumber >= 400;
}
}

// Provide implementations of packUnorm4x8 and unpackUnorm4x8 if not available.
if (colorWriteMask && (compat.shaderLanguage == HLSL_D3D11 || (compat.shaderLanguage == GLSL_3xx && (!compat.gles && compat.glslVersionNumber < 400)))) {
if (colorWriteMask && !hasPackUnorm4x8) {
WRITE(p, "uint packUnorm4x8(vec4 v) {\n");
WRITE(p, " v = clamp(v, 0.0, 1.0);\n");
WRITE(p, " uvec4 u = uvec4(255.0 * v);\n");
Expand Down

0 comments on commit 29b2f2c

Please sign in to comment.