# HG changeset patch # User John Tsiombikas # Date 1437690480 -10800 # Node ID f85a5919520684d747692b7d508d1e1909de4e45 # Parent 8ab44b19895e21b575a45a1b5eefd2d26e1ae96d foo diff -r 8ab44b19895e -r f85a59195206 .hgignore --- a/.hgignore Mon Jul 20 07:08:25 2015 +0300 +++ b/.hgignore Fri Jul 24 01:28:00 2015 +0300 @@ -1,3 +1,7 @@ \.o$ \.d$ \.swp$ +\.a$ +\.so\. +\.so$ +test/test$ diff -r 8ab44b19895e -r f85a59195206 Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Makefile Fri Jul 24 01:28:00 2015 +0300 @@ -0,0 +1,62 @@ +ccsrc = $(wildcard src/*.cc) \ + $(wildcard gmath/*.cc) +csrc = $(wildcard src/*.c) \ + $(wildcard gmath/*.c) +obj = $(ccsrc:.cc=.o) $(csrc:.c=.o) +dep = $(obj:.o=.d) + +name = graphene3d +somajor = 0 +sominor = 1 + +sys = $(shell uname -s) + +ifeq ($(sys), Darwin) + libgl = -framework OpenGL -lGLEW + + shared = -dynamiclib + solib = lib$(name).dylib +else + libgl = -lGL -lGLU -lGLEW + + ldname = lib$(name).so + soname = $(ldname).$(somajor) + solib = $(soname).$(sominor) + + shared = -shared -Wl,-soname=$(soname) + pic = -fPIC +endif + +inc = -Ilib +opt = +dbg = -g + +CFLAGS = -pedantic -Wall $(opt) $(dbg) $(pic) $(inc) +CXXFLAGS = $(CFLAGS) +LDFLAGS = $(libgl) + +.PHONY: shared +shared: $(solib) + +$(solib): $(obj) + $(CXX) -o $@ $(shared) $(obj) $(LDFLAGS) + [ -n "$(soname)" ] && \ + rm -f $(soname) $(ldname) && \ + ln -s $(solib) $(soname) && \ + ln -s $(soname) $(ldname) || true + +-include $(dep) + +%.d: %.c + @$(CPP) $(CFLAGS) $< -MM -MT $(@:.d=.o) >$@ + +%.d: %.cc + @$(CPP) $(CXXFLAGS) $< -MM -MT $(@:.d=.o) >$@ + +.PHONY: clean +clean: + rm -f $(obj) $(solib) + +.PHONY: cleandep +cleandep: + rm -f $(dep) diff -r 8ab44b19895e -r f85a59195206 src/opengl.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/opengl.cc Fri Jul 24 01:28:00 2015 +0300 @@ -0,0 +1,79 @@ +#include +#include +#include +#include "opengl.h" + +namespace gph { + +GLCaps glcaps; + +static void fill_glcaps(); +static void print_glcaps(GLCaps *caps); + +bool init_opengl() +{ + glewInit(); + fill_glcaps(); + return true; +} + +static void fill_glcaps() +{ + memset(&glcaps, 0, sizeof glcaps); + + glcaps.version = strdup((const char*)glGetString(GL_VERSION)); + glcaps.renderer = strdup((const char*)glGetString(GL_RENDERER)); + glcaps.vendor = strdup((const char*)glGetString(GL_VENDOR)); + + glcaps.sdr = GLEW_ARB_shading_language_100; + if(glcaps.sdr) { + glcaps.sdr_ver = strdup((const char*)glGetString(GL_SHADING_LANGUAGE_VERSION)); + } + + glcaps.fbo = GLEW_ARB_framebuffer_object || GLEW_EXT_framebuffer_object; + glcaps.tex_float = GLEW_ARB_texture_float; + glcaps.npow2_tex = GLEW_ARB_texture_non_power_of_two; + glcaps.fsaa = GLEW_ARB_multisample; + + glGetIntegerv(GL_MAX_TEXTURE_UNITS, &glcaps.max_tex_units); + if(glcaps.fbo) { + glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &glcaps.max_mrt); + } + if(glcaps.fsaa) { + glGetIntegerv(GL_MAX_SAMPLES, &glcaps.max_samples); + } else { + glcaps.max_samples = 1; + } + if(GLEW_EXT_texture_filter_anisotropic) { + glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &glcaps.max_aniso); + } else { + glcaps.max_aniso = 1.0f; + } + + print_glcaps(&glcaps); +} + +static void print_glcaps(GLCaps *caps) +{ + printf("OpenGL %s - %s - %s\n", caps->version, caps->vendor, caps->renderer); + + printf("--- capabilities ---\n"); + printf(" GLSL shaders: %s\n", caps->sdr ? "yes" : "no"); + if(caps->sdr) { + printf(" GLSL version: %s\n", caps->sdr_ver); + } + printf("framebuffer objects: %s\n", caps->fbo ? "yes" : "no"); + if(caps->fbo) { + printf(" max render targets: %d\n", caps->max_mrt); + } + printf(" antialiasing: %s\n", caps->fsaa ? "yes" : "no"); + if(caps->fsaa) { + printf(" max samples: %d\n", caps->max_samples); + } + printf(" float textures: %s\n", caps->tex_float ? "yes" : "no"); + printf(" non-pow2 textures: %s\n", caps->npow2_tex ? "yes" : "no"); + printf(" texture units: %d\n", caps->max_tex_units); + printf("--------------------\n"); +} + +} // namespace gph diff -r 8ab44b19895e -r f85a59195206 src/opengl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/opengl.h Fri Jul 24 01:28:00 2015 +0300 @@ -0,0 +1,27 @@ +#ifndef GPH_OPENGL_H_ +#define GPH_OPENGL_H_ + +#include + +namespace gph { + +extern struct GLCaps { + char *version, *renderer, *vendor; + int max_tex_units; + int max_tex_size; + int max_samples; + float max_aniso; + int max_mrt; + bool sdr; + char *sdr_ver; + bool fbo; + bool tex_float; + bool npow2_tex; + bool fsaa; +} glcaps; + +bool init_opengl(); + +} // namespace gph + +#endif /* GPH_OPENGL_H_ */ diff -r 8ab44b19895e -r f85a59195206 test/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/Makefile Fri Jul 24 01:28:00 2015 +0300 @@ -0,0 +1,21 @@ +src = $(wildcard src/*.cc) +obj = $(src:.cc=.o) +bin = test + +gphroot = .. + +CXXFLAGS = -pedantic -Wall -g -I$(gphroot)/src +LDFLAGS = -L$(gphroot) -Wl,-rpath=$(gphroot) -lgraphene3d $(libgl) + +ifeq ($(shell uname -s), Darwin) + libgl = -framework OpenGL -framework GLUT -lGLEW +else + libgl = -lGL -lGLU -lglut -lGLEW +endif + +$(bin): $(obj) + $(CXX) -o $@ $(obj) $(LDFLAGS) + +.PHONY: clean +clean: + rm -f $(obj) $(bin) diff -r 8ab44b19895e -r f85a59195206 test/src/main.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/src/main.cc Fri Jul 24 01:28:00 2015 +0300 @@ -0,0 +1,59 @@ +#include +#include +#include "opengl.h" +#include + +void display(); +void reshape(int x, int y); +void keydown(unsigned char key, int x, int y); +void mouse(int bn, int st, int x, int y); +void motion(int x, int y); + +int main(int argc, char **argv) +{ + glutInit(&argc, argv); + glutInitWindowSize(1280, 800); + glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); + glutCreateWindow("graphene3d test"); + + glutDisplayFunc(display); + glutReshapeFunc(reshape); + glutKeyboardFunc(keydown); + glutMouseFunc(mouse); + glutMotionFunc(motion); + + if(!gph::init_opengl()) { + return 1; + } + + glutMainLoop(); + return 0; +} + +void display() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glutSwapBuffers(); +} + +void reshape(int x, int y) +{ + glViewport(0, 0, x, y); +} + +void keydown(unsigned char key, int x, int y) +{ + switch(key) { + case 27: + exit(0); + } +} + +void mouse(int bn, int st, int x, int y) +{ +} + +void motion(int x, int y) +{ +}