diff --git a/contrib/sdk/samples/Mesa/demos/Makefile b/contrib/sdk/samples/Mesa/demos/Makefile new file mode 100644 index 0000000000..ae2ca59453 --- /dev/null +++ b/contrib/sdk/samples/Mesa/demos/Makefile @@ -0,0 +1,57 @@ + +FASM= fasm.exe +CC = kos32-gcc +AR = kos32-ar +LD = kos32-ld +CPP= kos32-g++ +STRIP = kos32-strip + +CFLAGS = -U_Win32 -U_WIN32 -U__MINGW32__ -c -O2 -fno-ident -fomit-frame-pointer + +ARFLAG = crs + +SDK_DIR:= $(abspath ../../..) +LIB_DIR:= $(SDK_DIR)/lib + +DEFINES = -D__unix__ -DMESA_EGL_NO_X11_HEADERS + +INCLUDES= -I. -I$(SDK_DIR)/sources/newlib/libc/include -I$(SDK_DIR)/sources/Mesa/include -I$(SDK_DIR)/sources/eglut + +LIBS_EGL:= -leglut -legl.dll +LIBS_OSM:= -losmesa.dll +LIBS:= -lGL.dll -lpixlib.dll -lgcc -lc.dll -lapp + +LIBPATH:= -L$(LIB_DIR) -L/home/autobuild/tools/win32/mingw32/lib + +LDFLAGS = -static -nostdlib --stack 0x200000 -T$(SDK_DIR)/sources/newlib/app.lds --image-base 0 + +SOURCES = gears.c \ + eglgears.c \ + osgears.c + +OBJECTS = $(patsubst %.asm, %.o, $(patsubst %.c, %.o, $(SOURCES))) + + +# targets + +all: demos + +demos: eglgears osgears + +eglgears: gears.o eglgears.o Makefile + $(LD) $(LDFLAGS) $(LIBPATH) -o $@ gears.o eglgears.o $(LIBS_EGL) $(LIBS) + kos32-objcopy $@ -O binary + +osgears: gears.o osgears.o Makefile + $(LD) $(LDFLAGS) $(LIBPATH) -o $@ gears.o osgears.o $(LIBS_OSM) $(LIBS) + kos32-objcopy $@ -O binary + +%.o : %.c Makefile + $(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -o $@ $< + +clean: + -rm -f *.o + + + + diff --git a/contrib/sdk/samples/Mesa/demos/eglgears.c b/contrib/sdk/samples/Mesa/demos/eglgears.c new file mode 100644 index 0000000000..a60d1ecb9f --- /dev/null +++ b/contrib/sdk/samples/Mesa/demos/eglgears.c @@ -0,0 +1,89 @@ +/* + * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * This is a port of the infamous "glxgears" demo to straight EGL + * Port by Dane Rushton 10 July 2005 + * + * No command line options. + * Program runs for 5 seconds then exits, outputing framerate to console + */ + +#include +#include +#include +#include + +#ifndef GLAPIENTRY +#define GLAPIENTRY +#endif + +#include +#include +#include "eglut.h" + +void init(void); +void reshape(int width, int height); +void draw(void); +void keyboard(unsigned char key); + +extern GLfloat angle; + +void idle(void) +{ + static uint32_t t0; + uint32_t t, dt; + + t = get_tick_count(); + + dt = t - t0; + t0 = t; + + angle += 70.0 * dt / 100; /* 70 degrees per second */ + if (angle > 3600.0) + angle -= 3600.0; + + eglutPostRedisplay(); +} + +int main(int argc, char *argv[]) +{ + eglutInitWindowSize(384, 384); + eglutInitAPIMask(EGLUT_OPENGL_BIT); + eglutInit(argc, argv); + + eglutCreateWindow("eglgears"); + + eglutIdleFunc(idle); + eglutReshapeFunc(reshape); + eglutDisplayFunc(draw); + eglutKeyboardFunc(keyboard); + + glClearColor( 0, 0, 0, 1); + + init(); + glDrawBuffer(GL_BACK); + + eglutMainLoop(); + + return 0; +} + diff --git a/contrib/sdk/samples/Mesa/gears.c b/contrib/sdk/samples/Mesa/demos/gears.c similarity index 69% rename from contrib/sdk/samples/Mesa/gears.c rename to contrib/sdk/samples/Mesa/demos/gears.c index ad37800e37..2159450b95 100644 --- a/contrib/sdk/samples/Mesa/gears.c +++ b/contrib/sdk/samples/Mesa/demos/gears.c @@ -1,19 +1,53 @@ +/* + * Copyright (C) 1999-2001 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * This is a port of the infamous "glxgears" demo to straight EGL + * Port by Dane Rushton 10 July 2005 + * + * No command line options. + * Program runs for 5 seconds then exits, outputing framerate to console + */ + #include -#include -#include -#include -#include "GL/osmesa.h" -#include "GL/glu.h" +#include +#include +#include +#include "eglut.h" -#define XK_Left 176 -#define XK_Right 179 -#define XK_Up 178 -#define XK_Down 177 - -extern GLfloat view_rotx, view_roty, view_rotz; -GLint gear1, gear2, gear3; -extern GLfloat angle; +static GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0; +static GLint gear1, gear2, gear3; +GLfloat angle = 0.0; +/* + * + * Draw a gear wheel. You'll probably want to call this function when + * building a display list since we do a lot of trig here. + * + * Input: inner_radius - radius of hole at center + * outer_radius - radius at center of teeth + * width - width of gear + * teeth - number of teeth + * tooth_depth - depth of tooth + */ static void gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width, GLint teeth, GLfloat tooth_depth) { @@ -140,7 +174,8 @@ static void gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width, glEnd(); } -void Draw(void) + +void draw(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -172,24 +207,22 @@ void Draw(void) /* new window size or exposure */ -void Reshape(int width, int height) +void reshape(int width, int height) { + GLfloat h = (GLfloat) height / (GLfloat) width; + glViewport(0, 0, (GLint) width, (GLint) height); - GLfloat h = (GLfloat) height / (GLfloat) width; - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0); - + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0, 0.0, -40.0); } - -void Init(void) +void init(void) { static GLfloat pos[4] = { 5.0, 5.0, 10.0, 0.0 }; static GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 }; @@ -224,30 +257,19 @@ void Init(void) glEnable(GL_NORMALIZE); } -void Key(unsigned char code, int x, int y) +void keyboard(unsigned char key) { - int i; - (void) x; (void) y; - - if (code == XK_Left) { + if (key == EGLUT_KEY_LEFT) { view_roty += 5.0; } - else if (code == XK_Right) { + else if (key == EGLUT_KEY_RIGHT) { view_roty -= 5.0; } - else if (code == XK_Up) { + else if (key == EGLUT_KEY_UP) { view_rotx += 5.0; } - else if (code == XK_Down) { + else if (key == EGLUT_KEY_DOWN) { view_rotx -= 5.0; } -}; - -void Idle(void) -{ - angle += 70.0 * 0.05; /* 70 degrees per second */ - if (angle > 3600.0) - angle -= 3600.0; } - diff --git a/contrib/sdk/samples/Mesa/demos/osgears.c b/contrib/sdk/samples/Mesa/demos/osgears.c new file mode 100644 index 0000000000..a8c19b4335 --- /dev/null +++ b/contrib/sdk/samples/Mesa/demos/osgears.c @@ -0,0 +1,167 @@ +/* + * Demo of off-screen Mesa rendering + * + * See Mesa/include/GL/osmesa.h for documentation of the OSMesa functions. + * + * If you want to render BIG images you'll probably have to increase + * MAX_WIDTH and MAX_Height in src/config.h. + * + * This program is in the public domain. + * + * Brian Paul + * + * PPM output provided by Joerg Schmalzl. + * ASCII PPM output added by Brian Paul. + * + * Usage: osdemo [filename] + */ + + +#include +#include +#include +#include +#include +#include +#define GL_GLEXT_PROTOTYPES +#include "GL/osmesa.h" +#include +#include "eglut.h" +#include + +void init(void); +void reshape(int width, int height); +void draw(void); +void keyboard(unsigned char key); + +extern GLfloat angle; + +static void idle(void) +{ + static uint32_t t0; + uint32_t t, dt; + + t = get_tick_count(); + + dt = t - t0; + t0 = t; + + angle += 70.0 * dt / 100; /* 70 degrees per second */ + if (angle > 3600.0) + angle -= 3600.0; +} + +static int time_now(void) +{ + struct timeval tv; + struct timezone tz; + (void) gettimeofday(&tv, &tz); + return tv.tv_sec * 1000 + tv.tv_usec / 1000; +} + +int main(int argc, char *argv[]) +{ + int Width = 384; + int Height = 384; + + OSMesaContext ctx; + void *buffer; + char *filename = NULL; + int ev; + int repeat=1; + + /* Create an RGBA-mode context */ + /* specify Z, stencil, accum sizes */ + + ctx = OSMesaCreateContextExt( OSMESA_BGRA, 16, 0, 0, NULL ); + if (!ctx) { + printf("OSMesaCreateContext failed!\n"); + return 0; + } + + /* Allocate the image buffer */ + buffer = malloc( Width * Height * 4 * sizeof(GLubyte) ); + if (!buffer) { + printf("Alloc image buffer failed!\n"); + return 0; + } + + /* Bind the buffer to the context and make it current */ + if (!OSMesaMakeCurrent( ctx, buffer, GL_UNSIGNED_BYTE, Width, Height )) { + printf("OSMesaMakeCurrent failed!\n"); + return 0; + } + + { + int z, s, a; + glGetIntegerv(GL_DEPTH_BITS, &z); + glGetIntegerv(GL_STENCIL_BITS, &s); + glGetIntegerv(GL_ACCUM_RED_BITS, &a); + printf("Depth=%d Stencil=%d Accum=%d\n", z, s, a); + } + + reshape(Width, Height); + + glClearColor( 0, 0, 0, 1); + + init(); + draw(); + + DrawWindow(10, 10, Width+TYPE_3_BORDER_WIDTH*2, Height+TYPE_3_BORDER_WIDTH+get_skin_height(), + "OpenGL Engine Demo", 0x000000, 0x74); + Blit(buffer, TYPE_3_BORDER_WIDTH, get_skin_height(), 0, 0, Width, Height, Width,Height,Width*4); + + int start = time_now(); + int frames = 0; + + while(repeat) + { + int now = time_now(); + oskey_t key; + + ev = check_os_event(); + switch(ev) + { + case 1: + DrawWindow(0,0,0,0, NULL, 0x000000,0x74); + break; + + case 2: + key = get_key(); + keyboard(key.code); + break; + + case 3: + if(get_os_button()==1) + repeat=0; + continue; + }; + + if (now - start >= 5000) + { + double elapsed = (double) (now - start) / 1000.0; + + printf("%d frames in %3.1f seconds = %6.3f FPS\n", + frames, elapsed, frames / elapsed); + fflush(stdout); + + start = now; + frames = 0; + } + + idle(); + draw(); + glFlush(); + Blit(buffer, TYPE_3_BORDER_WIDTH, get_skin_height(), 0, 0, Width, Height, Width,Height,Width*4); + frames++; + }; + + /* free the image buffer */ + free( buffer ); + + /* destroy the context */ + OSMesaDestroyContext( ctx ); + + return 0; +} + diff --git a/contrib/sdk/samples/Mesa/osdemo.c b/contrib/sdk/samples/Mesa/osdemo.c deleted file mode 100644 index 896c9c257a..0000000000 --- a/contrib/sdk/samples/Mesa/osdemo.c +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Demo of off-screen Mesa rendering - * - * See Mesa/include/GL/osmesa.h for documentation of the OSMesa functions. - * - * If you want to render BIG images you'll probably have to increase - * MAX_WIDTH and MAX_Height in src/config.h. - * - * This program is in the public domain. - * - * Brian Paul - * - * PPM output provided by Joerg Schmalzl. - * ASCII PPM output added by Brian Paul. - * - * Usage: osdemo [filename] - */ - - -#include -#include -#include -#include -#include -#define GL_GLEXT_PROTOTYPES -#include "GL/osmesa.h" -#include -#include "GL/glu.h" -#include "shaderutil.h" -#include - -int _CRT_MT=0; - -static int Width = 500; -static int Height = 400; - -int check_events(); - -GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0; -GLfloat angle = 0.0; - -GLboolean animate = GL_TRUE; /* Animation */ -GLfloat eyesep = 5.0; /* Eye separation. */ -GLfloat fix_point = 40.0; /* Fixation point distance. */ -GLfloat left, right, asp; /* Stereo frustum params. */ - -void Init( void ); -void Reshape( int width, int height ); -void Draw( void ); -void Idle(); -void Key(unsigned char key, int x, int y); - - -inline void Blit(void *bitmap, int dst_x, int dst_y, - int src_x, int src_y, int w, int h, - int src_w, int src_h, int stride) -{ - volatile struct blit_call bc; - - bc.dstx = dst_x; - bc.dsty = dst_y; - bc.w = w; - bc.h = h; - bc.srcx = src_x; - bc.srcy = src_y; - bc.srcw = src_w; - bc.srch = src_h; - bc.stride = stride; - bc.bitmap = bitmap; - - __asm__ __volatile__( - "int $0x40" - ::"a"(73),"b"(0),"c"(&bc.dstx)); - -}; - - -static inline uint32_t wait_os_event(int time) -{ - uint32_t val; - __asm__ __volatile__( - "int $0x40" - :"=a"(val) - :"a"(23),"b"(time)); - return val; -}; - - -int main(int argc, char *argv[]) -{ - OSMesaContext ctx; - void *buffer; - char *filename = NULL; - int ev; - int repeat=1; - - /* Create an RGBA-mode context */ - /* specify Z, stencil, accum sizes */ - - ctx = OSMesaCreateContextExt( OSMESA_RGBA, 16, 0, 0, NULL ); - if (!ctx) { - printf("OSMesaCreateContext failed!\n"); - return 0; - } - - /* Allocate the image buffer */ - buffer = malloc( Width * Height * 4 * sizeof(GLubyte) ); - if (!buffer) { - printf("Alloc image buffer failed!\n"); - return 0; - } - - // __asm__ __volatile__("int3"); - - /* Bind the buffer to the context and make it current */ - if (!OSMesaMakeCurrent( ctx, buffer, GL_UNSIGNED_BYTE, Width, Height )) { - printf("OSMesaMakeCurrent failed!\n"); - return 0; - } - - { - int z, s, a; - glGetIntegerv(GL_DEPTH_BITS, &z); - glGetIntegerv(GL_STENCIL_BITS, &s); - glGetIntegerv(GL_ACCUM_RED_BITS, &a); - printf("Depth=%d Stencil=%d Accum=%d\n", z, s, a); - } - - Reshape(Width, Height); - Init(); - Draw(); - - printf("all done\n"); - - DrawWindow(10, 10, Width+9, Height+26, "OpenGL Engine Demo", 0x000000, 0x74); - Blit(buffer, 5, 22, 0, 0, Width, Height, Width,Height,Width*4); - - while(repeat) - { - oskey_t key; - - ev = wait_os_event(1); - switch(ev) - { - case 1: - DrawWindow(10, 10, Width+9, Width+26, NULL, 0x000000,0x74); - Blit(buffer, 5, 22, 0, 0, Width, Height, Width,Height,Width*4); - continue; - - case 2: - key = get_key(); - Key(key.code, 0, 0); - Draw(); - Blit(buffer, 5, 22, 0, 0, Width, Height, Width,Height,Width*4); - continue; - - case 3: - if(get_os_button()==1) - repeat=0; - continue; - }; - Idle(); - Draw(); - Blit(buffer, 5, 22, 0, 0, Width, Height, Width,Height,Width*4); - }; - - /* free the image buffer */ - free( buffer ); - - /* destroy the context */ - OSMesaDestroyContext( ctx ); - - return 0; -} - -int atexit(void (*func)(void)) -{ - return 0; -}; -