Skip to content

Commit 92cba47

Browse files
committed
OpenGL 3.3 Core profile; OpenGL debug and GLSL validation modes.
1 parent 3f326e9 commit 92cba47

4 files changed

Lines changed: 194 additions & 28 deletions

File tree

src/gl1.h

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33

44
#define PROFILE_COMPAT 0
55
#define PROFILE_ES2 1
6+
#define PROFILE_CORE33 2
67

78
#define PROFILE_MIN PROFILE_COMPAT
8-
#define PROFILE_MAX PROFILE_ES2
9+
#define PROFILE_MAX PROFILE_CORE33
910

1011
#if defined(__WIN32__)
1112

@@ -22,6 +23,8 @@ inline bool initGlExt(void)
2223
// GLES2 did not work on windows
2324
#define DEFAULT_PROFILE PROFILE_COMPAT
2425

26+
#define GLDEBUG_APIENTRY __attribute__((stdcall))
27+
2528
#else
2629

2730
#define GL_GLEXT_PROTOTYPES
@@ -36,7 +39,12 @@ inline bool initGlExt(void)
3639

3740
#define DEFAULT_PROFILE PROFILE_ES2
3841

39-
#endif
42+
#define GLDEBUG_APIENTRY APIENTRY
43+
44+
#endif // __WIN32__
45+
46+
#define ENABLE_GLDEBUG 0
47+
#define ENABLE_glslangValidator 0
4048

4149
extern int g_opengl_profile;
4250

@@ -72,16 +80,27 @@ inline void glDeleteBuffers1(GLsizei n, const GLuint * buffers)
7280
#include <cassert>
7381
#include <cstdio>
7482

83+
#define checkGL_case(a) case a: fprintf(stderr, "gl err %s (0x%x)\n", #a, a); break
84+
7585
inline void checkGL()
7686
{
7787
GLenum err = glGetError();
7888
//assert(err == GL_NO_ERROR);
7989
if (err != GL_NO_ERROR)
8090
{
81-
fprintf(stderr, "gl err %d\n", err);
91+
switch (err)
92+
{
93+
checkGL_case(GL_INVALID_OPERATION);
94+
checkGL_case(GL_INVALID_ENUM);
95+
checkGL_case(GL_INVALID_VALUE);
96+
default: fprintf(stderr, "gl err %u (0x%x)\n", err, err); break;
97+
}
8298
fflush(stderr);
8399
}
84100
}
101+
102+
#undef checkGL_case
103+
85104
#else
86105
inline void checkGL() { }
87106
#endif

src/main.cpp

Lines changed: 104 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -811,18 +811,14 @@ int my_main (int argc, char** argv)
811811
}
812812
}
813813
} // end of message processing
814-
815814
float deltaT = getdeltaT(); // čas mezi snímky v sekundách
816-
817815
#if FREE_CAMERA
818816
float cameraDeltaT = deltaT;
819817
#endif
820-
821-
#if TESTING_SLOWDOWN
822-
if (bslowdown)
823-
deltaT *= 0.01;
824-
#endif
825-
818+
#if TESTING_SLOWDOWN
819+
if (bslowdown)
820+
deltaT *= 0.01;
821+
#endif
826822
{
827823
static float fps_time = 0.f;
828824
static float fps_frames = 0.f;
@@ -954,12 +950,96 @@ int main (int argc, char** argv)
954950
return ret;
955951
}
956952

953+
#if ENABLE_GLDEBUG
954+
void GLDEBUG_APIENTRY GLDebugMessageCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei /*length*/, const GLchar *msg, const void */*data*/)
955+
{
956+
std::string _source;
957+
std::string _type;
958+
std::string _severity;
959+
switch (source)
960+
{
961+
case GL_DEBUG_SOURCE_API:
962+
_source = "API";
963+
break;
964+
case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
965+
_source = "WINDOW SYSTEM";
966+
break;
967+
case GL_DEBUG_SOURCE_SHADER_COMPILER:
968+
_source = "SHADER COMPILER";
969+
break;
970+
case GL_DEBUG_SOURCE_THIRD_PARTY:
971+
_source = "THIRD PARTY";
972+
break;
973+
case GL_DEBUG_SOURCE_APPLICATION:
974+
_source = "APPLICATION";
975+
break;
976+
case GL_DEBUG_SOURCE_OTHER:
977+
_source = "UNKNOWN";
978+
break;
979+
default:
980+
_source = "UNKNOWN";
981+
break;
982+
}
983+
switch (type)
984+
{
985+
case GL_DEBUG_TYPE_ERROR:
986+
_type = "ERROR";
987+
break;
988+
case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
989+
_type = "DEPRECATED BEHAVIOR";
990+
break;
991+
case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
992+
_type = "UDEFINED BEHAVIOR";
993+
break;
994+
case GL_DEBUG_TYPE_PORTABILITY:
995+
_type = "PORTABILITY";
996+
break;
997+
case GL_DEBUG_TYPE_PERFORMANCE:
998+
_type = "PERFORMANCE";
999+
break;
1000+
case GL_DEBUG_TYPE_OTHER:
1001+
_type = "OTHER";
1002+
break;
1003+
case GL_DEBUG_TYPE_MARKER:
1004+
_type = "MARKER";
1005+
break;
1006+
default:
1007+
_type = "UNKNOWN";
1008+
break;
1009+
}
1010+
switch (severity)
1011+
{
1012+
case GL_DEBUG_SEVERITY_HIGH:
1013+
_severity = "HIGH";
1014+
break;
1015+
case GL_DEBUG_SEVERITY_MEDIUM:
1016+
_severity = "MEDIUM";
1017+
break;
1018+
case GL_DEBUG_SEVERITY_LOW:
1019+
_severity = "LOW";
1020+
break;
1021+
case GL_DEBUG_SEVERITY_NOTIFICATION:
1022+
_severity = "NOTIFICATION";
1023+
break;
1024+
default:
1025+
_severity = "UNKNOWN";
1026+
break;
1027+
}
1028+
1029+
printf("%d: %s=%s (%s): %s\n", id, _severity.c_str(), _type.c_str(), _source.c_str(), msg); fflush(stdout);
1030+
}
1031+
#endif
1032+
9571033
// 0 - success, 1 - error
9581034
int EnableOpenGL(bool fullscreen, bool vsync, int width, int height)
9591035
{
9601036
// Request OpenGL context
9611037
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
9621038

1039+
#if ENABLE_GLDEBUG
1040+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG);
1041+
#endif
1042+
9631043
switch (g_opengl_profile)
9641044
{
9651045
case PROFILE_COMPAT:
@@ -970,6 +1050,11 @@ int EnableOpenGL(bool fullscreen, bool vsync, int width, int height)
9701050
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
9711051
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
9721052
break;
1053+
case PROFILE_CORE33:
1054+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
1055+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
1056+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
1057+
break;
9731058
default:
9741059
return 1;
9751060
}
@@ -1027,6 +1112,17 @@ int EnableOpenGL(bool fullscreen, bool vsync, int width, int height)
10271112
int actualWidth, actualHeight;
10281113
SDL_GetWindowSize(gameWindow, &actualWidth, &actualHeight);
10291114

1115+
#if ENABLE_GLDEBUG
1116+
glEnable(GL_DEBUG_OUTPUT);
1117+
glDebugMessageCallback(GLDebugMessageCallback, 0);
1118+
#endif
1119+
1120+
if (PROFILE_CORE33)
1121+
{
1122+
GLuint vao;
1123+
glGenVertexArrays(1, &vao);
1124+
glBindVertexArray(vao);
1125+
}
10301126
glViewport(0, 0, actualWidth, actualHeight); checkGL();
10311127
return 0;
10321128
}

src/settingsdialog.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,8 @@ SettingsDialog::SettingsDialog(
102102

103103
std::vector<std::string> renderers;
104104
renderers.push_back("OpenGL Compat. profile");
105-
//renderers.push_back("OpenGL Core profile");
106105
renderers.push_back("OpenGL ES 2");
106+
renderers.push_back("OpenGL 3.3 Core profile");
107107

108108
m_rendererComboIndex = m_items.size();
109109
m_items.push_back(GuiItem(GuiItem::COMBO, m_horLay.getCellPS(3, 3), m_verLay.getCellPS(4, 1), renderers, renderer, 20, 6));

src/shadermng.cpp

Lines changed: 67 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,27 @@
33
#include <vector>
44
#include <cstdio>
55
#include <string>
6+
#include <regex>
67

78
#define STR_SWCASE(prefix, ec, id) case ec::id: return prefix #id
89

10+
inline const char* strShaderId(ShaderId a)
11+
{
12+
switch (a)
13+
{
14+
STR_SWCASE("", ShaderId, Color);
15+
STR_SWCASE("", ShaderId, Tex);
16+
STR_SWCASE("", ShaderId, ColorTex);
17+
STR_SWCASE("", ShaderId, LightTex);
18+
STR_SWCASE("", ShaderId, LightTexSunk);
19+
STR_SWCASE("", ShaderId, Car);
20+
STR_SWCASE("", ShaderId, CarTop);
21+
STR_SWCASE("", ShaderId, GlassTint);
22+
STR_SWCASE("", ShaderId, GlassReflection);
23+
default: assert(false && "unexpected id"); return nullptr;
24+
}
25+
}
26+
927
inline const char* strShaderAttrib(int a)
1028
{
1129
switch ((ShaderAttrib)a)
@@ -70,8 +88,25 @@ ShaderMng::ShaderMng() : ints()
7088
currentShader = ShaderId::None;
7189
}
7290

73-
static GLuint loadShader(GLenum type, const char *shaderSrc)
91+
static GLuint loadShader(GLenum type, const char *shaderSrc, const char* shaderName = nullptr)
7492
{
93+
(void)shaderName;
94+
#if ENABLE_glslangValidator
95+
if (shaderName)
96+
{
97+
std::string tmpName = std::string("tmp") + shaderName + (type == GL_VERTEX_SHADER ? ".vert" : ".frag");
98+
FILE* fout = fopen(tmpName.c_str(), "w");
99+
if (fout)
100+
{
101+
fprintf(fout, "%s", shaderSrc);
102+
fclose(fout);
103+
std::string validationCmd = std::string("glslangValidator ") + tmpName;
104+
system(validationCmd.c_str());
105+
}
106+
}
107+
#endif
108+
109+
//printf("%s======\n%s\n", (type == GL_VERTEX_SHADER ? "VS" : "FS"), shaderSrc); fflush(stdout);
75110
GLuint shader;
76111
GLint compiled;
77112
// Create the shader object
@@ -86,7 +121,7 @@ static GLuint loadShader(GLenum type, const char *shaderSrc)
86121
glCompileShader(shader);
87122
// Check the compile status
88123
glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
89-
if(!compiled)
124+
if(compiled == GL_FALSE)
90125
{
91126
GLint infoLen = 0;
92127
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
@@ -102,6 +137,32 @@ static GLuint loadShader(GLenum type, const char *shaderSrc)
102137
return shader;
103138
}
104139

140+
static void adaptShader(std::string& vs, std::string& fs, int opengl_profile)
141+
{
142+
static const std::string version120line = "#version 120";
143+
static const std::string version330line = "#version 330 core";
144+
switch (opengl_profile)
145+
{
146+
case PROFILE_COMPAT:
147+
vs = version120line+vs;
148+
fs = version120line+fs;
149+
break;
150+
case PROFILE_ES2:
151+
fs = "precision mediump float;"+fs;
152+
break;
153+
case PROFILE_CORE33:
154+
vs = version330line+vs;
155+
fs = version330line+"\nout vec4 fragColor;"+fs;
156+
vs = std::regex_replace(vs, std::regex("attribute"), "in");
157+
vs = std::regex_replace(vs, std::regex("varying"), "out");
158+
fs = std::regex_replace(fs, std::regex("varying"), "in");
159+
fs = std::regex_replace(fs, std::regex("texture2D"), "texture");
160+
fs = std::regex_replace(fs, std::regex("textureCube"), "texture");
161+
fs = std::regex_replace(fs, std::regex("gl_FragColor"), "fragColor");
162+
break;
163+
}
164+
}
165+
105166
void ShaderMng::init()
106167
{
107168
#if 0 // test stringify completeness
@@ -165,24 +226,14 @@ TEST_STR_EC_COMPLETE(ShaderUniTex);
165226

166227
if (!vs.empty() && !fs.empty())
167228
{
168-
169-
if (g_opengl_profile == PROFILE_ES2)
170-
{
171-
fs = "precision mediump float;"+fs;
172-
}
173-
else
174-
{
175-
static const char* version120line = "#version 120";
176-
vs = version120line+vs;
177-
fs = version120line+fs;
178-
}
229+
adaptShader(vs, fs, g_opengl_profile);
179230
GLuint programObject = glCreateProgram();
180231
for (int i = 0; i != (GLuint)ShaderAttrib::Count; ++i)
181232
{
182233
glBindAttribLocation(programObject, i, strShaderAttrib(i));
183234
}
184-
GLuint vId = loadShader(GL_VERTEX_SHADER, vs.c_str());
185-
GLuint fId = loadShader(GL_FRAGMENT_SHADER, fs.c_str());
235+
GLuint vId = loadShader(GL_VERTEX_SHADER, vs.c_str(), strShaderId(id));
236+
GLuint fId = loadShader(GL_FRAGMENT_SHADER, fs.c_str(), strShaderId(id));
186237

187238
if (programObject != 0)
188239
{
@@ -194,7 +245,7 @@ TEST_STR_EC_COMPLETE(ShaderUniTex);
194245
// Check the link status
195246
GLint linked;
196247
glGetProgramiv(programObject, GL_LINK_STATUS, &linked);
197-
if(!linked)
248+
if(linked == GL_FALSE)
198249
{
199250
GLint infoLen = 0;
200251
glGetProgramiv(programObject, GL_INFO_LOG_LENGTH, &infoLen);

0 commit comments

Comments
 (0)