Jason McKesson avatar Jason McKesson committed fa18131

Test for glload's C API.

Comments (0)

Files changed (5)

 
 
+local prelims =
+{
+	[[lua $<dir>MakeAllExts.lua -spec=gl $<dir>allgl.txt]],
+	[[lua $<dir>MakeAllExts.lua -spec=wgl $<dir>allwgl.txt]],
+	[[lua $<dir>MakeAllExts.lua -spec=glX $<dir>allglx.txt]],
+}
+
 local tests =
 {
 	[[lua $<dir>LoadGen.lua -spec=gl -version=3.3 -profile=core -style=pointer_cpp -stdext=extfiles/gl_ubiquitous.txt $<dir>test/ptr_cpp/test]],
+	[[lua $<dir>LoadGen.lua -spec=gl -version=4.3 -profile=compatibility -style=glload -extfile=$<dir>allgl.txt $<dir>test/glload_c/test]],
+	[[lua $<dir>LoadGen.lua -spec=gl -version=4.3 -profile=compatibility -style=glload -extfile=$<dir>allgl.txt $<dir>test/glload_cpp/test]],
 }
 
 local platTests =
 	wgl =
 	{
 		[[lua $<dir>LoadGen.lua -spec=wgl -style=pointer_cpp -stdext=extfiles/wgl_common.txt $<dir>test/ptr_cpp/test]],
+		[[lua $<dir>LoadGen.lua -spec=wgl -style=glload -extfile=$<dir>allwgl.txt $<dir>test/glload_c/test]],
+		[[lua $<dir>LoadGen.lua -spec=wgl -style=glload -extfile=$<dir>allwgl.txt $<dir>test/glload_cpp/test]],
 	},
 	
 	glX =
 	assert(platTests[arg[1]], "Invalid platform " .. arg[1])
 end
 
+ExecTests(prelims)
 ExecTests(tests)
 if(arg[1]) then
 	ExecTests(platTests[arg[1]])

modules/Specs.lua

 --Loads the appropriate Lua .spec file.
 function gl_spec.LoadSpec() return LoadSpec.LoadLuaSpec(util.GetSpecFilePath() .. "glspec.lua", gl_spec) end
 function wgl_spec.LoadSpec() return LoadSpec.LoadLuaSpec(util.GetSpecFilePath() .. "wglspec.lua", wgl_spec) end
-function glx_spec.LoadSpec() return LoadSpec.LoadLuaSpec(util.GetSpecFilePath() .. "glxspec.lua", glX_spec) end
+function glx_spec.LoadSpec() return LoadSpec.LoadLuaSpec(util.GetSpecFilePath() .. "glxspec.lua", glx_spec) end
 
 --Name for displaying.
 function gl_spec.DisplayName() return "OpenGL" end
 		repeat
 			table.insert(creates, 1, currPath)
 			currPath = currPath:match("(.*[/\\])[^/\\]*$")
-			print(currPath)
 			if(currPath) then
 				currPath = currPath:match("^(.+)[/\\]$")
-				print(currPath)
 				mode, err = lfs.attributes(currPath, "mode")
 			end
 		until(mode or currPath == nil)
 		
 		for _, newDir in ipairs(creates) do
-			print(newDir)
 			assert(lfs.mkdir(newDir))
 		end
 	end

test/glload_c/test.cpp

+#include <string>
+#include <exception>
+#include <stdexcept>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "glload/gl_all.h"
+#include "glload/gl_load.h"
+#include "glload/wgl_all.h"
+#include "glload/wgl_load.h"
+#include <GL/freeglut.h>
+
+GLuint positionBufferObject;
+GLuint program;
+GLuint vao;
+
+GLuint BuildShader(GLenum eShaderType, const std::string &shaderText)
+{
+	GLuint shader = glCreateShader(eShaderType);
+	const char *strFileData = shaderText.c_str();
+	glShaderSource(shader, 1, &strFileData, NULL);
+
+	glCompileShader(shader);
+
+	GLint status;
+	glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
+	if (status == GL_FALSE)
+	{
+		GLint infoLogLength;
+		glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength);
+
+		GLchar *strInfoLog = new GLchar[infoLogLength + 1];
+		glGetShaderInfoLog(shader, infoLogLength, NULL, strInfoLog);
+
+		const char *strShaderType = NULL;
+		switch(eShaderType)
+		{
+		case GL_VERTEX_SHADER: strShaderType = "vertex"; break;
+//		case GL_GEOMETRY_SHADER: strShaderType = "geometry"; break;
+		case GL_FRAGMENT_SHADER: strShaderType = "fragment"; break;
+		}
+
+		fprintf(stderr, "Compile failure in %s shader:\n%s\n", strShaderType, strInfoLog);
+		delete[] strInfoLog;
+
+		throw std::runtime_error("Compile failure in shader.");
+	}
+
+	return shader;
+}
+
+
+void init()
+{
+	glGenVertexArrays(1, &vao);
+	glBindVertexArray(vao);
+
+	const float vertexPositions[] = {
+		0.75f, 0.75f, 0.0f, 1.0f,
+		0.75f, -0.75f, 0.0f, 1.0f,
+		-0.75f, -0.75f, 0.0f, 1.0f,
+	};
+
+	glGenBuffers(1, &positionBufferObject);
+	glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
+	glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);
+	glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+	const std::string vertexShader(
+		"#version 330\n"
+		"layout(location = 0) in vec4 position;\n"
+		"void main()\n"
+		"{\n"
+		"   gl_Position = position;\n"
+		"}\n"
+		);
+
+	const std::string fragmentShader(
+		"#version 330\n"
+		"out vec4 outputColor;\n"
+		"void main()\n"
+		"{\n"
+		"   outputColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);\n"
+		"}\n"
+		);
+
+	GLuint vertShader = BuildShader(GL_VERTEX_SHADER, vertexShader);
+	GLuint fragShader = BuildShader(GL_FRAGMENT_SHADER, fragmentShader);
+
+	program = glCreateProgram();
+	glAttachShader(program, vertShader);
+	glAttachShader(program, fragShader);	
+	glLinkProgram(program);
+
+	GLint status;
+	glGetProgramiv (program, GL_LINK_STATUS, &status);
+	if (status == GL_FALSE)
+	{
+		GLint infoLogLength;
+		glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLogLength);
+
+		GLchar *strInfoLog = new GLchar[infoLogLength + 1];
+		glGetProgramInfoLog(program, infoLogLength, NULL, strInfoLog);
+		fprintf(stderr, "Linker failure: %s\n", strInfoLog);
+		delete[] strInfoLog;
+
+		throw std::runtime_error("Shader could not be linked.");
+	}
+}
+
+//Called to update the display.
+//You should call glutSwapBuffers after all of your rendering to display what you rendered.
+//If you need continuous updates of the screen, call glutPostRedisplay() at the end of the function.
+void display()
+{
+	glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
+	glClear(GL_COLOR_BUFFER_BIT);
+
+	glUseProgram(program);
+
+	glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
+	glEnableVertexAttribArray(0);
+	glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
+
+	glDrawArrays(GL_TRIANGLES, 0, 3);
+
+	glDisableVertexAttribArray(0);
+	glUseProgram(0);
+
+	glutSwapBuffers();
+}
+
+//Called whenever the window is resized. The new window size is given, in pixels.
+//This is an opportunity to call GL_Viewport or GL_Scissor to keep up with the change in size.
+void reshape (int w, int h)
+{
+	glViewport(0, 0, (GLsizei) w, (GLsizei) h);
+}
+
+//Called whenever a key on the keyboard was pressed.
+//The key is given by the ''key'' parameter, which is in ASCII.
+//It's often a good idea to have the escape key (ASCII value 27) call glutLeaveMainLoop() to 
+//exit the program.
+void keyboard(unsigned char key, int x, int y)
+{
+	switch (key)
+	{
+	case 27:
+		glutLeaveMainLoop();
+		break;
+	}
+}
+
+
+int main(int argc, char** argv)
+{
+	glutInit(&argc, argv);
+
+	int width = 500;
+	int height = 500;
+	unsigned int displayMode = GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH | GLUT_STENCIL;
+
+	glutInitDisplayMode(displayMode);
+	glutInitContextVersion (3, 3);
+	glutInitContextProfile(GLUT_CORE_PROFILE);
+	glutInitWindowSize (width, height); 
+	glutInitWindowPosition (300, 200);
+	glutCreateWindow (argv[0]);
+
+	glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION);
+
+	int didLoad = ogl_LoadFunctions();
+	printf("OpenGL: %i\n", didLoad);
+
+	init();
+
+	HDC hdc = wglGetCurrentDC();
+	didLoad = wgl_LoadFunctions(hdc);
+	printf("WGL: %i\n", didLoad);
+
+	glutDisplayFunc(display); 
+	glutReshapeFunc(reshape);
+	glutKeyboardFunc(keyboard);
+	glutMainLoop();
+	return 0;
+}

test/premake4.lua

 	configurations {"Debug", "Release"}
 	defines {"_CRT_SECURE_NO_WARNINGS", "_SCL_SECURE_NO_WARNINGS"}
 
-local testDirs = {"ptr_cpp"}
+local tests =
+{
+	{name = "ptr_cpp"},
+	{name = "glload_c", include = "include"},
+}
 
 local oldDir = os.getcwd()
-for _, testDir in ipairs(testDirs) do
-	os.chdir(path.getabsolute(testDir))
+for _, test in ipairs(tests) do
+	os.chdir(path.getabsolute(test.name))
 	
-	project(testDir .. "_test")
+	project(test.name .. "_test")
 		kind "ConsoleApp"
 		language "c++"
 		objdir("obj")
 		files {"**.hpp"}
 		files {"**.h"}
 		
+		if(test.include) then
+			includedirs(test.include)
+		end
+		
 		UseLibs {"freeglut"}
 		
 		configuration "windows"
 			defines "NDEBUG"
 			flags {"OptimizeSpeed", "NoFramePointer", "ExtraWarnings", "NoEditAndContinue"};
 	
-	os.chdir(testDir)
+	os.chdir(oldDir)
 end
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.