aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2020-04-04 13:36:47 +0200
committerDavid Robillard <d@drobilla.net>2020-04-04 13:36:47 +0200
commit20fd80c8f20d0d6bda660bd9a273e0c4a78cb9ac (patch)
treef144e9498a0337bef0d20c9004b024e26a9d2b32 /examples
parent11800b6179458eb962cd1862e4053efd7f28c2f4 (diff)
Shader Demo: Support both GL 3 and 4
Diffstat (limited to 'examples')
-rw-r--r--examples/pugl_shader_demo.c (renamed from examples/pugl_gl3_demo.c)43
1 files changed, 33 insertions, 10 deletions
diff --git a/examples/pugl_gl3_demo.c b/examples/pugl_shader_demo.c
index 7b2a49f..ac5fe84 100644
--- a/examples/pugl_gl3_demo.c
+++ b/examples/pugl_shader_demo.c
@@ -15,7 +15,7 @@
*/
/**
- @file pugl_gl3_demo.c An example of drawing with OpenGL 3.
+ @file pugl_shader_demo.c An example of drawing with OpenGL 3/4.
This is an example of using OpenGL for pixel-perfect 2D drawing. It uses
pixel coordinates for positions and sizes so that things work roughly like a
@@ -71,6 +71,8 @@ typedef struct
GLuint instanceVbo;
GLuint ibo;
unsigned framesDrawn;
+ int glMajorVersion;
+ int glMinorVersion;
int quit;
} PuglTestApp;
@@ -204,6 +206,8 @@ loadShader(const char* const path)
static int
parseOptions(PuglTestApp* app, int argc, char** argv)
{
+ char* endptr = NULL;
+
// Parse command line options
app->numRects = 1024;
app->opts = puglParseTestOptions(&argc, &argv);
@@ -212,11 +216,24 @@ parseOptions(PuglTestApp* app, int argc, char** argv)
}
// Parse number of rectangles argument, if given
- if (argc == 1) {
- char* endptr = NULL;
-
+ if (argc >= 1) {
app->numRects = (size_t)strtol(argv[0], &endptr, 10);
if (endptr != argv[0] + strlen(argv[0])) {
+ logError("Invalid number of rectangles: %s\n", argv[0]);
+ return 1;
+ }
+ }
+
+ // Parse OpenGL major version argument, if given
+ if (argc >= 2) {
+ app->glMajorVersion = (int)strtol(argv[1], &endptr, 10);
+ if (endptr != argv[1] + strlen(argv[1])) {
+ logError("Invalid GL major version: %s\n", argv[1]);
+ return 1;
+ } else if (app->glMajorVersion == 4) {
+ app->glMinorVersion = 2;
+ } else if (app->glMajorVersion != 3) {
+ logError("Unsupported GL major version %d\n", app->glMajorVersion);
return 1;
}
}
@@ -241,8 +258,8 @@ setupPugl(PuglTestApp* app, const PuglRect frame)
puglSetBackend(app->view, puglGlBackend());
puglSetViewHint(app->view, PUGL_USE_COMPAT_PROFILE, PUGL_FALSE);
puglSetViewHint(app->view, PUGL_USE_DEBUG_CONTEXT, app->opts.errorChecking);
- puglSetViewHint(app->view, PUGL_CONTEXT_VERSION_MAJOR, 3);
- puglSetViewHint(app->view, PUGL_CONTEXT_VERSION_MINOR, 3);
+ puglSetViewHint(app->view, PUGL_CONTEXT_VERSION_MAJOR, app->glMajorVersion);
+ puglSetViewHint(app->view, PUGL_CONTEXT_VERSION_MINOR, app->glMinorVersion);
puglSetViewHint(app->view, PUGL_RESIZABLE, app->opts.resizable);
puglSetViewHint(app->view, PUGL_SAMPLES, app->opts.samples);
puglSetViewHint(app->view, PUGL_DOUBLE_BUFFER, app->opts.doubleBuffer);
@@ -261,8 +278,12 @@ setupGl(PuglTestApp* app)
return PUGL_FAILURE;
}
+ const char* const headerFile = (app->glMajorVersion == 3
+ ? "shaders/header_330.glsl"
+ : "shaders/header_420.glsl");
+
// Load shader sources
- char* const headerSource = loadShader("shaders/header_330.glsl");
+ char* const headerSource = loadShader(headerFile);
char* const vertexSource = loadShader("shaders/rect.vert");
char* const fragmentSource = loadShader("shaders/rect.frag");
if (!vertexSource || !fragmentSource) {
@@ -362,14 +383,16 @@ teardownGl(PuglTestApp* app)
int
main(int argc, char** argv)
{
- PuglTestApp app;
- memset(&app, 0, sizeof(app));
+ PuglTestApp app = {0};
+
+ app.glMajorVersion = 3;
+ app.glMinorVersion = 3;
const PuglRect frame = {0, 0, defaultWidth, defaultHeight};
// Parse command line options
if (parseOptions(&app, argc, argv)) {
- puglPrintTestUsage("pugl_gl3_demo", "[NUM_RECTS]");
+ puglPrintTestUsage("pugl_shader_demo", "[NUM_RECTS] [GL_MAJOR]");
return 1;
}