aboutsummaryrefslogtreecommitdiff
path: root/glfw-3.2.1/tests/sharing.c
diff options
context:
space:
mode:
authorAndreas Grois <andi@grois.info>2018-03-09 21:36:10 +0100
committerAndreas Grois <andi@grois.info>2018-03-09 21:36:10 +0100
commit3b734f0d6b9e28c1f2c4ae54e3f46e573e02f4a5 (patch)
tree444542870666e41594e7b493f625ade81d64f885 /glfw-3.2.1/tests/sharing.c
Initial Commit
Diffstat (limited to 'glfw-3.2.1/tests/sharing.c')
-rw-r--r--glfw-3.2.1/tests/sharing.c186
1 files changed, 186 insertions, 0 deletions
diff --git a/glfw-3.2.1/tests/sharing.c b/glfw-3.2.1/tests/sharing.c
new file mode 100644
index 0000000..a7f1a31
--- /dev/null
+++ b/glfw-3.2.1/tests/sharing.c
@@ -0,0 +1,186 @@
+//========================================================================
+// Context sharing test program
+// Copyright (c) Camilla Berglund <elmindreda@glfw.org>
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software.
+//
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications, and to alter it and redistribute it
+// freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would
+// be appreciated but is not required.
+//
+// 2. Altered source versions must be plainly marked as such, and must not
+// be misrepresented as being the original software.
+//
+// 3. This notice may not be removed or altered from any source
+// distribution.
+//
+//========================================================================
+//
+// This program is used to test sharing of objects between contexts
+//
+//========================================================================
+
+#include <glad/glad.h>
+#include <GLFW/glfw3.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define WIDTH 400
+#define HEIGHT 400
+#define OFFSET 50
+
+static GLFWwindow* windows[2];
+
+static void error_callback(int error, const char* description)
+{
+ fprintf(stderr, "Error: %s\n", description);
+}
+
+static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
+{
+ if (action == GLFW_PRESS && key == GLFW_KEY_ESCAPE)
+ glfwSetWindowShouldClose(window, GLFW_TRUE);
+}
+
+static GLFWwindow* open_window(const char* title, GLFWwindow* share, int posX, int posY)
+{
+ GLFWwindow* window;
+
+ glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
+ window = glfwCreateWindow(WIDTH, HEIGHT, title, NULL, share);
+ if (!window)
+ return NULL;
+
+ glfwMakeContextCurrent(window);
+ gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
+ glfwSwapInterval(1);
+ glfwSetWindowPos(window, posX, posY);
+ glfwShowWindow(window);
+
+ glfwSetKeyCallback(window, key_callback);
+
+ return window;
+}
+
+static GLuint create_texture(void)
+{
+ int x, y;
+ char pixels[256 * 256];
+ GLuint texture;
+
+ glGenTextures(1, &texture);
+ glBindTexture(GL_TEXTURE_2D, texture);
+
+ for (y = 0; y < 256; y++)
+ {
+ for (x = 0; x < 256; x++)
+ pixels[y * 256 + x] = rand() % 256;
+ }
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 256, 256, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, pixels);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ return texture;
+}
+
+static void draw_quad(GLuint texture)
+{
+ int width, height;
+ glfwGetFramebufferSize(glfwGetCurrentContext(), &width, &height);
+
+ glViewport(0, 0, width, height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(0.f, 1.f, 0.f, 1.f, 0.f, 1.f);
+
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, texture);
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+ glBegin(GL_QUADS);
+
+ glTexCoord2f(0.f, 0.f);
+ glVertex2f(0.f, 0.f);
+
+ glTexCoord2f(1.f, 0.f);
+ glVertex2f(1.f, 0.f);
+
+ glTexCoord2f(1.f, 1.f);
+ glVertex2f(1.f, 1.f);
+
+ glTexCoord2f(0.f, 1.f);
+ glVertex2f(0.f, 1.f);
+
+ glEnd();
+}
+
+int main(int argc, char** argv)
+{
+ int x, y, width;
+ GLuint texture;
+
+ glfwSetErrorCallback(error_callback);
+
+ if (!glfwInit())
+ exit(EXIT_FAILURE);
+
+ windows[0] = open_window("First", NULL, OFFSET, OFFSET);
+ if (!windows[0])
+ {
+ glfwTerminate();
+ exit(EXIT_FAILURE);
+ }
+
+ // This is the one and only time we create a texture
+ // It is created inside the first context, created above
+ // It will then be shared with the second context, created below
+ texture = create_texture();
+
+ glfwGetWindowPos(windows[0], &x, &y);
+ glfwGetWindowSize(windows[0], &width, NULL);
+
+ // Put the second window to the right of the first one
+ windows[1] = open_window("Second", windows[0], x + width + OFFSET, y);
+ if (!windows[1])
+ {
+ glfwTerminate();
+ exit(EXIT_FAILURE);
+ }
+
+ // Set drawing color for both contexts
+ glfwMakeContextCurrent(windows[0]);
+ glColor3f(0.6f, 0.f, 0.6f);
+ glfwMakeContextCurrent(windows[1]);
+ glColor3f(0.6f, 0.6f, 0.f);
+
+ glfwMakeContextCurrent(windows[0]);
+
+ while (!glfwWindowShouldClose(windows[0]) &&
+ !glfwWindowShouldClose(windows[1]))
+ {
+ glfwMakeContextCurrent(windows[0]);
+ draw_quad(texture);
+
+ glfwMakeContextCurrent(windows[1]);
+ draw_quad(texture);
+
+ glfwSwapBuffers(windows[0]);
+ glfwSwapBuffers(windows[1]);
+
+ glfwWaitEvents();
+ }
+
+ glfwTerminate();
+ exit(EXIT_SUCCESS);
+}
+