d6fb44e158
This sample shows the use of modern OpenGL (3.2). Closes #16910.
305 lines
14 KiB
C
305 lines
14 KiB
C
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: oglpfuncs.h
|
|
// Purpose: Types, constants, and pointers to OpenGL functions
|
|
// Author: Manuel Martin
|
|
// Created: 2015/11/16
|
|
// Copyright: (c) 2015 Manuel Martin
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef OGLPFUNCS_H
|
|
#define OGLPFUNCS_H
|
|
|
|
/* What is this file for?
|
|
You would expect the OS to provide constants and functions used in OpenGL.
|
|
That was so up to OGL version 1.1; you just needed to include 'gl.h'. But for
|
|
newer versions things are not so simple. Constants and function prototypes (well,
|
|
typedefs for their pointers) are included in 'glext.h', a file provided by the
|
|
OpenGL Registry, and 'glcorearb.h' (also from OGL, only Core Profile definitions).
|
|
The functions "live" in the graphics card driver, and they are used through their
|
|
pointers.
|
|
The reason of this file is to retrieve those pointers, and also to define the
|
|
types, constants, and functions used in this sample, so as to avoid the inclusion
|
|
of glext.h, which is a very big file.
|
|
|
|
In the OpenGL Registry we can find also glxext.h and wglext.h (MSW/UXs versions).
|
|
These files are used for "extensions", or functions provided by GPU vendors instead
|
|
of the OpenGL Consortium. This sample doesn't use them.
|
|
|
|
OK, there are some good libraries to do this job (GLEW, GL3W, etc). Why do we
|
|
reinvent the wheel? Just because for this sample we need a small subset, and not
|
|
all of thousands of lines of code that those libraries consist of.
|
|
*/
|
|
|
|
/*
|
|
** Copyright (c) 2013-2015 The Khronos Group Inc.
|
|
**
|
|
** Permission is hereby granted, free of charge, to any person obtaining a
|
|
** copy of this software and/or associated documentation files (the
|
|
** "Materials"), to deal in the Materials without restriction, including
|
|
** without limitation the rights to use, copy, modify, merge, publish,
|
|
** distribute, sublicense, and/or sell copies of the Materials, and to
|
|
** permit persons to whom the Materials are 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 Materials.
|
|
**
|
|
** THE MATERIALS ARE 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 THE AUTHORS OR COPYRIGHT HOLDERS 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
|
|
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
|
*/
|
|
|
|
#if defined(__gl_h_) || defined(__GL_H__) || defined(_GL_H) || defined(__X_GL_H)
|
|
#error gl.h included before oglpfuncs.h
|
|
#endif
|
|
|
|
// Apple defines everything on his own
|
|
#ifdef __APPLE__
|
|
// Suppress warnings when including gl3.h
|
|
#define GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED
|
|
#include <OpenGL/gl3.h> // For Core Profile
|
|
#else
|
|
// The rest of the world needs the rest of this file
|
|
|
|
// Avoid gl.h definitions, may clash with our own definitions
|
|
#define __gl_h_
|
|
#define __GL_H__
|
|
#define _GL_H
|
|
#define __X_GL_H
|
|
|
|
// APIENTRY and GLAPI definitions
|
|
#if defined(_WIN32) || defined(__WIN32__)
|
|
// MS Windows needs APIENTRY.
|
|
#ifndef APIENTRY
|
|
#define APIENTRY __stdcall
|
|
#endif
|
|
|
|
#ifndef GLAPI
|
|
#if defined(_MSC_VER) //VC++
|
|
#define GLAPI __declspec(dllimport)
|
|
#else
|
|
#define GLAPI extern
|
|
#endif
|
|
#endif
|
|
#endif // _WIN32 / __WIN32__
|
|
|
|
// Other platforms are simpler
|
|
#ifndef APIENTRY
|
|
#define APIENTRY
|
|
#endif
|
|
#ifndef GLAPI
|
|
#define GLAPI extern
|
|
#endif
|
|
|
|
// For ptrdiff_t
|
|
#include <stddef.h>
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
// GL types
|
|
typedef void GLvoid;
|
|
typedef unsigned char GLubyte;
|
|
typedef char GLchar;
|
|
typedef unsigned char GLboolean;
|
|
typedef unsigned short GLushort;
|
|
typedef int GLint;
|
|
typedef int GLsizei;
|
|
typedef unsigned int GLenum;
|
|
typedef unsigned int GLuint;
|
|
typedef unsigned int GLbitfield;
|
|
typedef float GLfloat;
|
|
typedef ptrdiff_t GLsizeiptr;
|
|
typedef ptrdiff_t GLintptr;
|
|
|
|
// Constants
|
|
#define GL_ARRAY_BUFFER 0x8892
|
|
#define GL_BLEND 0x0BE2
|
|
#define GL_CLAMP_TO_EDGE 0x812F
|
|
#define GL_COLOR_BUFFER_BIT 0x00004000
|
|
#define GL_COMPILE_STATUS 0x8B81
|
|
#define GL_DEPTH_BUFFER_BIT 0x00000100
|
|
#define GL_DEPTH_TEST 0x0B71
|
|
#define GL_ELEMENT_ARRAY_BUFFER 0x8893
|
|
#define GL_FALSE 0
|
|
#define GL_FIRST_VERTEX_CONVENTION 0x8E4D
|
|
#define GL_FLOAT 0x1406
|
|
#define GL_FRAGMENT_SHADER 0x8B30
|
|
#define GL_INFO_LOG_LENGTH 0x8B84
|
|
#define GL_LEQUAL 0x0203
|
|
#define GL_LINK_STATUS 0x8B82
|
|
#define GL_LINEAR 0x2601
|
|
#define GL_NO_ERROR 0
|
|
#define GL_ONE_MINUS_SRC_ALPHA 0x0303
|
|
#define GL_RENDERER 0x1F01
|
|
#define GL_RGBA 0x1908
|
|
#define GL_SRC_ALPHA 0x0302
|
|
#define GL_STATIC_DRAW 0x88E4
|
|
#define GL_TEXTURE0 0x84C0
|
|
#define GL_TEXTURE_2D 0x0DE1
|
|
#define GL_TEXTURE_BASE_LEVEL 0x813C
|
|
#define GL_TEXTURE_MAX_LEVEL 0x813D
|
|
#define GL_TEXTURE_MAG_FILTER 0x2800
|
|
#define GL_TEXTURE_MIN_FILTER 0x2801
|
|
#define GL_TEXTURE_WRAP_S 0x2802
|
|
#define GL_TEXTURE_WRAP_T 0x2803
|
|
#define GL_TRIANGLE_STRIP 0x0005
|
|
#define GL_UNSIGNED_BYTE 0x1401
|
|
#define GL_UNSIGNED_SHORT 0x1403
|
|
#define GL_VENDOR 0x1F00
|
|
#define GL_VERSION 0x1F02
|
|
#define GL_VERTEX_SHADER 0x8B31
|
|
|
|
// This functions exist since OpenGL 1.1, and they don't need typedefs nor pointers.
|
|
// Trying to retrieve their pointers with wglGetProcAddress() will fail.
|
|
GLAPI void APIENTRY glBindTexture (GLenum target, GLuint texture);
|
|
GLAPI void APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor);
|
|
GLAPI void APIENTRY glClear (GLbitfield mask);
|
|
GLAPI void APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
|
|
GLAPI void APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
|
|
GLAPI void APIENTRY glDepthFunc (GLenum func);
|
|
GLAPI void APIENTRY glDisable (GLenum cap);
|
|
GLAPI void APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count);
|
|
GLAPI void APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices);
|
|
GLAPI void APIENTRY glEnable (GLenum cap);
|
|
GLAPI void APIENTRY glFinish (void);
|
|
GLAPI void APIENTRY glFlush (void);
|
|
GLAPI void APIENTRY glGenTextures (GLsizei n, GLuint *textures);
|
|
GLAPI GLenum APIENTRY glGetError (void);
|
|
GLAPI const GLubyte* APIENTRY glGetString (GLenum name);
|
|
GLAPI void APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
|
|
GLAPI void APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
|
|
GLAPI void APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
|
|
|
|
// Typedefs for functions for OpenGL > 1.1
|
|
typedef void (APIENTRY* PFNGLACTIVETEXTUREPROC) (GLenum texture);
|
|
typedef void (APIENTRY* PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
|
|
typedef void (APIENTRY* PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name);
|
|
typedef void (APIENTRY* PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
|
|
typedef void (APIENTRY* PFNGLBINDVERTEXARRAYPROC) (GLuint array);
|
|
typedef void (APIENTRY* PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
|
|
typedef void (APIENTRY* PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
|
|
typedef void (APIENTRY* PFNGLCOMPILESHADERPROC) (GLuint shader);
|
|
typedef GLuint (APIENTRY* PFNGLCREATEPROGRAMPROC) (void);
|
|
typedef GLuint (APIENTRY* PFNGLCREATESHADERPROC) (GLenum type);
|
|
typedef void (APIENTRY* PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers);
|
|
typedef void (APIENTRY* PFNGLDELETEPROGRAMPROC) (GLuint program);
|
|
typedef void (APIENTRY* PFNGLDELETESHADERPROC) (GLuint shader);
|
|
typedef void (APIENTRY* PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays);
|
|
typedef void (APIENTRY* PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);
|
|
typedef void (APIENTRY* PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);
|
|
typedef void (APIENTRY* PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
|
|
typedef void (APIENTRY* PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
|
|
typedef void (APIENTRY* PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays);
|
|
typedef void (APIENTRY* PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
|
|
typedef void (APIENTRY* PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params);
|
|
typedef void (APIENTRY* PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);
|
|
typedef void (APIENTRY* PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
|
|
typedef GLint (APIENTRY* PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name);
|
|
typedef void (APIENTRY* PFNGLLINKPROGRAMPROC) (GLuint program);
|
|
typedef void (APIENTRY* PFNGLPROVOKINGVERTEXPROC) (GLenum mode);
|
|
typedef void (APIENTRY* PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
|
|
typedef void (APIENTRY* PFNGLUNIFORM1IPROC) (GLint location, GLint v0);
|
|
typedef void (APIENTRY* PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value);
|
|
typedef void (APIENTRY* PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value);
|
|
typedef void (APIENTRY* PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
|
|
typedef void (APIENTRY* PFNGLUSEPROGRAMPROC) (GLuint program);
|
|
typedef void (APIENTRY* PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
|
|
|
|
// Pointers to functions
|
|
// NOTE:
|
|
// For each glFunction we use a pointer name which is not the name of the function.
|
|
// This is needed in some Linux [old] drivers, which define also these function
|
|
// names, leading to a crash because of function vs pointer use.
|
|
|
|
#define glActiveTexture my_glActiveTexture
|
|
#define glAttachShader my_glAttachShader
|
|
#define glBindAttribLocation my_glBindAttribLocation
|
|
#define glBindBuffer my_glBindBuffer
|
|
#define glBindVertexArray my_glBindVertexArray
|
|
#define glBufferData my_glBufferData
|
|
#define glBufferSubData my_glBufferSubData
|
|
#define glCompileShader my_glCompileShader
|
|
#define glCreateProgram my_glCreateProgram
|
|
#define glCreateShader my_glCreateShader
|
|
#define glDeleteBuffers my_glDeleteBuffers
|
|
#define glDeleteProgram my_glDeleteProgram
|
|
#define glDeleteShader my_glDeleteShader
|
|
#define glDeleteVertexArrays my_glDeleteVertexArrays
|
|
#define glDetachShader my_glDetachShader
|
|
#define glDisableVertexAttribArray my_glDisableVertexAttribArray
|
|
#define glEnableVertexAttribArray my_glEnableVertexAttribArray
|
|
#define glGenBuffers my_glGenBuffers
|
|
#define glGenVertexArrays my_glGenVertexArrays
|
|
#define glGetProgramInfoLog my_glGetProgramInfoLog
|
|
#define glGetProgramiv my_glGetProgramiv
|
|
#define glGetShaderInfoLog my_glGetShaderInfoLog
|
|
#define glGetShaderiv my_glGetShaderiv
|
|
#define glGetUniformLocation my_glGetUniformLocation
|
|
#define glLinkProgram my_glLinkProgram
|
|
#define glProvokingVertex my_glProvokingVertex
|
|
#define glShaderSource my_glShaderSource
|
|
#define glUniform1i my_glUniform1i
|
|
#define glUniform3fv my_glUniform3fv
|
|
#define glUniform4fv my_glUniform4fv
|
|
#define glUniformMatrix4fv my_glUniformMatrix4fv
|
|
#define glUseProgram my_glUseProgram
|
|
#define glVertexAttribPointer my_glVertexAttribPointer
|
|
|
|
// NOTE:
|
|
// Windows uses different pointers for different OGLcontexts.
|
|
// If multi-context was used, these pointers must be used inside some
|
|
// structure, something like activeOGLcontext->my_glTheFunction
|
|
|
|
extern PFNGLACTIVETEXTUREPROC my_glActiveTexture;
|
|
extern PFNGLATTACHSHADERPROC my_glAttachShader;
|
|
extern PFNGLBINDATTRIBLOCATIONPROC my_glBindAttribLocation;
|
|
extern PFNGLBINDBUFFERPROC my_glBindBuffer;
|
|
extern PFNGLBINDVERTEXARRAYPROC my_glBindVertexArray;
|
|
extern PFNGLBUFFERDATAPROC my_glBufferData;
|
|
extern PFNGLBUFFERSUBDATAPROC my_glBufferSubData;
|
|
extern PFNGLCOMPILESHADERPROC my_glCompileShader;
|
|
extern PFNGLCREATEPROGRAMPROC my_glCreateProgram;
|
|
extern PFNGLCREATESHADERPROC my_glCreateShader;
|
|
extern PFNGLDELETEBUFFERSPROC my_glDeleteBuffers;
|
|
extern PFNGLDELETEPROGRAMPROC my_glDeleteProgram;
|
|
extern PFNGLDELETESHADERPROC my_glDeleteShader;
|
|
extern PFNGLDELETEVERTEXARRAYSPROC my_glDeleteVertexArrays;
|
|
extern PFNGLDETACHSHADERPROC my_glDetachShader;
|
|
extern PFNGLDISABLEVERTEXATTRIBARRAYPROC my_glDisableVertexAttribArray;
|
|
extern PFNGLENABLEVERTEXATTRIBARRAYPROC my_glEnableVertexAttribArray;
|
|
extern PFNGLGENBUFFERSPROC my_glGenBuffers;
|
|
extern PFNGLGENVERTEXARRAYSPROC my_glGenVertexArrays;
|
|
extern PFNGLGETPROGRAMINFOLOGPROC my_glGetProgramInfoLog;
|
|
extern PFNGLGETPROGRAMIVPROC my_glGetProgramiv;
|
|
extern PFNGLGETSHADERINFOLOGPROC my_glGetShaderInfoLog;
|
|
extern PFNGLGETSHADERIVPROC my_glGetShaderiv;
|
|
extern PFNGLGETUNIFORMLOCATIONPROC my_glGetUniformLocation;
|
|
extern PFNGLLINKPROGRAMPROC my_glLinkProgram;
|
|
extern PFNGLPROVOKINGVERTEXPROC my_glProvokingVertex;
|
|
extern PFNGLSHADERSOURCEPROC my_glShaderSource;
|
|
extern PFNGLUNIFORM1IPROC my_glUniform1i;
|
|
extern PFNGLUNIFORM3FVPROC my_glUniform3fv;
|
|
extern PFNGLUNIFORM4FVPROC my_glUniform4fv;
|
|
extern PFNGLUNIFORMMATRIX4FVPROC my_glUniformMatrix4fv;
|
|
extern PFNGLUSEPROGRAMPROC my_glUseProgram;
|
|
extern PFNGLVERTEXATTRIBPOINTERPROC my_glVertexAttribPointer;
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // __APPLE__ and rest
|
|
|
|
// This is the function to use in oglstuff.cpp
|
|
bool MyInitGLPointers();
|
|
|
|
#endif // OGLPFUNCS_H
|