mirror of
https://github.com/NoelFB/blah.git
synced 2024-11-29 17:08:56 +08:00
cleaned up the opengl implementation
This commit is contained in:
parent
a9087d10bf
commit
e70d7a11a0
|
@ -29,6 +29,7 @@ namespace Blah
|
|||
bool valid = false;
|
||||
GraphicsInfo info;
|
||||
|
||||
virtual ~GraphicsDevice() = default;
|
||||
virtual void startup() = 0;
|
||||
virtual void update() = 0;
|
||||
virtual void shutdown() = 0;
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
#include <blah/graphics/graphics.h>
|
||||
#include <blah/internal/graphics.h>
|
||||
|
||||
#ifdef BLAH_USE_OPENGL
|
||||
|
||||
#include <blah/internal/platform.h>
|
||||
#include <blah/graphics/texture.h>
|
||||
#include <blah/graphics/framebuffer.h>
|
||||
#include <blah/graphics/mesh.h>
|
||||
#include <blah/graphics/shader.h>
|
||||
#include <blah/graphics/material.h>
|
||||
|
||||
#ifdef BLAH_USE_OPENGL
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stddef.h>
|
||||
|
@ -19,6 +19,7 @@
|
|||
#define APIENTRY
|
||||
#endif
|
||||
|
||||
// OpenGL Value Types
|
||||
typedef ptrdiff_t GLintptr;
|
||||
typedef ptrdiff_t GLsizeiptr;
|
||||
typedef unsigned int GLenum;
|
||||
|
@ -38,6 +39,7 @@ typedef double GLdouble; /* double precision float */
|
|||
typedef double GLclampd; /* double precision float in [0,1] */
|
||||
typedef char GLchar;
|
||||
|
||||
// OpenGL Constants
|
||||
#define GL_DONT_CARE 0x1100
|
||||
#define GL_ZERO 0x0000
|
||||
#define GL_ONE 0x0001
|
||||
|
@ -226,6 +228,113 @@ typedef char GLchar;
|
|||
#define GL_DEBUG_OUTPUT 0x92E0
|
||||
#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242
|
||||
|
||||
// OpenGL Functions
|
||||
#define GL_FUNCTIONS \
|
||||
GL_FUNC(DebugMessageCallback, void, DEBUGPROC callback, const void* userParam) \
|
||||
GL_FUNC(GetString, const GLubyte*, GLenum name) \
|
||||
GL_FUNC(Flush, void, void) \
|
||||
GL_FUNC(Enable, void, GLenum mode) \
|
||||
GL_FUNC(Disable, void, GLenum mode) \
|
||||
GL_FUNC(Clear, void, GLenum mask) \
|
||||
GL_FUNC(ClearColor, void, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) \
|
||||
GL_FUNC(ClearDepth, void, GLdouble depth) \
|
||||
GL_FUNC(ClearStencil, void, GLint stencil) \
|
||||
GL_FUNC(DepthMask, void, GLboolean enabled) \
|
||||
GL_FUNC(DepthFunc, void, GLenum func) \
|
||||
GL_FUNC(Viewport, void, GLint x, GLint y, GLint width, GLint height) \
|
||||
GL_FUNC(Scissor, void, GLint x, GLint y, GLint width, GLint height) \
|
||||
GL_FUNC(CullFace, void, GLenum mode) \
|
||||
GL_FUNC(BlendEquation, void, GLenum eq) \
|
||||
GL_FUNC(BlendEquationSeparate, void, GLenum modeRGB, GLenum modeAlpha) \
|
||||
GL_FUNC(BlendFunc, void, GLenum sfactor, GLenum dfactor) \
|
||||
GL_FUNC(BlendFuncSeparate, void, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) \
|
||||
GL_FUNC(BlendColor, void, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) \
|
||||
GL_FUNC(ColorMask, void, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) \
|
||||
GL_FUNC(GetIntegerv, void, GLenum name, GLint* data) \
|
||||
GL_FUNC(GenTextures, void, GLint n, void* textures) \
|
||||
GL_FUNC(GenRenderbuffers, void, GLint n, void* textures) \
|
||||
GL_FUNC(GenFramebuffers, void, GLint n, void* textures) \
|
||||
GL_FUNC(ActiveTexture, void, GLuint id) \
|
||||
GL_FUNC(BindTexture, void, GLenum target, GLuint id) \
|
||||
GL_FUNC(BindRenderbuffer, void, GLenum target, GLuint id) \
|
||||
GL_FUNC(BindFramebuffer, void, GLenum target, GLuint id) \
|
||||
GL_FUNC(TexImage2D, void, GLenum target, GLint level, GLenum internalFormat, GLint width, GLint height, GLint border, GLenum format, GLenum type, void* data) \
|
||||
GL_FUNC(FramebufferRenderbuffer, void, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) \
|
||||
GL_FUNC(FramebufferTexture2D, void, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) \
|
||||
GL_FUNC(TexParameteri, void, GLenum target, GLenum name, GLint param) \
|
||||
GL_FUNC(RenderbufferStorage, void, GLenum target, GLenum internalformat, GLint width, GLint height) \
|
||||
GL_FUNC(GetTexImage, void, GLenum target, GLint level, GLenum format, GLenum type, void* data) \
|
||||
GL_FUNC(DrawElements, void, GLenum mode, GLint count, GLenum type, void* indices) \
|
||||
GL_FUNC(DrawElementsInstanced, void, GLenum mode, GLint count, GLenum type, void* indices, GLint amount) \
|
||||
GL_FUNC(DeleteTextures, void, GLint n, GLuint* textures) \
|
||||
GL_FUNC(DeleteRenderbuffers, void, GLint n, GLuint* renderbuffers) \
|
||||
GL_FUNC(DeleteFramebuffers, void, GLint n, GLuint* textures) \
|
||||
GL_FUNC(GenVertexArrays, void, GLint n, GLuint* arrays) \
|
||||
GL_FUNC(BindVertexArray, void, GLuint id) \
|
||||
GL_FUNC(GenBuffers, void, GLint n, GLuint* arrays) \
|
||||
GL_FUNC(BindBuffer, void, GLenum target, GLuint buffer) \
|
||||
GL_FUNC(BufferData, void, GLenum target, GLsizeiptr size, const void* data, GLenum usage) \
|
||||
GL_FUNC(BufferSubData, void, GLenum target, GLintptr offset, GLsizeiptr size, const void* data) \
|
||||
GL_FUNC(DeleteBuffers, void, GLint n, GLuint* buffers) \
|
||||
GL_FUNC(DeleteVertexArrays, void, GLint n, GLuint* arrays) \
|
||||
GL_FUNC(EnableVertexAttribArray, void, GLuint location) \
|
||||
GL_FUNC(DisableVertexAttribArray, void, GLuint location) \
|
||||
GL_FUNC(VertexAttribPointer, void, GLuint index, GLint size, GLenum type, GLboolean normalized, GLint stride, const void* pointer) \
|
||||
GL_FUNC(VertexAttribDivisor, void, GLuint index, GLuint divisor) \
|
||||
GL_FUNC(CreateShader, GLuint, GLenum type) \
|
||||
GL_FUNC(AttachShader, void, GLuint program, GLuint shader) \
|
||||
GL_FUNC(DetachShader, void, GLuint program, GLuint shader) \
|
||||
GL_FUNC(DeleteShader, void, GLuint shader) \
|
||||
GL_FUNC(ShaderSource, void, GLuint shader, GLsizei count, const GLchar** string, const GLint* length) \
|
||||
GL_FUNC(CompileShader, void, GLuint shader) \
|
||||
GL_FUNC(GetShaderiv, void, GLuint shader, GLenum pname, GLint* result) \
|
||||
GL_FUNC(GetShaderInfoLog, void, GLuint shader, GLint maxLength, GLsizei* length, GLchar* infoLog) \
|
||||
GL_FUNC(CreateProgram, GLuint, ) \
|
||||
GL_FUNC(DeleteProgram, void, GLuint program) \
|
||||
GL_FUNC(LinkProgram, void, GLuint program) \
|
||||
GL_FUNC(GetProgramiv, void, GLuint program, GLenum pname, GLint* result) \
|
||||
GL_FUNC(GetProgramInfoLog, void, GLuint program, GLint maxLength, GLsizei* length, GLchar* infoLog) \
|
||||
GL_FUNC(GetActiveUniform, void, GLuint program, GLuint index, GLint bufSize, GLsizei* length, GLint* size, GLenum* type, GLchar* name) \
|
||||
GL_FUNC(GetActiveAttrib, void, GLuint program, GLuint index, GLint bufSize, GLsizei* length, GLint* size, GLenum* type, GLchar* name) \
|
||||
GL_FUNC(UseProgram, void, GLuint program) \
|
||||
GL_FUNC(GetUniformLocation, GLint, GLuint program, const GLchar* name) \
|
||||
GL_FUNC(GetAttribLocation, GLint, GLuint program, const GLchar* name) \
|
||||
GL_FUNC(Uniform1f, void, GLint location, GLfloat v0) \
|
||||
GL_FUNC(Uniform2f, void, GLint location, GLfloat v0, GLfloat v1) \
|
||||
GL_FUNC(Uniform3f, void, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) \
|
||||
GL_FUNC(Uniform4f, void, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) \
|
||||
GL_FUNC(Uniform1fv, void, GLint location, GLint count, const GLfloat* value) \
|
||||
GL_FUNC(Uniform2fv, void, GLint location, GLint count, const GLfloat* value) \
|
||||
GL_FUNC(Uniform3fv, void, GLint location, GLint count, const GLfloat* value) \
|
||||
GL_FUNC(Uniform4fv, void, GLint location, GLint count, const GLfloat* value) \
|
||||
GL_FUNC(Uniform1i, void, GLint location, GLint v0) \
|
||||
GL_FUNC(Uniform2i, void, GLint location, GLint v0, GLint v1) \
|
||||
GL_FUNC(Uniform3i, void, GLint location, GLint v0, GLint v1, GLint v2) \
|
||||
GL_FUNC(Uniform4i, void, GLint location, GLint v0, GLint v1, GLint v2, GLint v3) \
|
||||
GL_FUNC(Uniform1iv, void, GLint location, GLint count, const GLint* value) \
|
||||
GL_FUNC(Uniform2iv, void, GLint location, GLint count, const GLint* value) \
|
||||
GL_FUNC(Uniform3iv, void, GLint location, GLint count, const GLint* value) \
|
||||
GL_FUNC(Uniform4iv, void, GLint location, GLint count, const GLint* value) \
|
||||
GL_FUNC(Uniform1ui, void, GLint location, GLuint v0) \
|
||||
GL_FUNC(Uniform2ui, void, GLint location, GLuint v0, GLuint v1) \
|
||||
GL_FUNC(Uniform3ui, void, GLint location, GLuint v0, GLuint v1, GLuint v2) \
|
||||
GL_FUNC(Uniform4ui, void, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) \
|
||||
GL_FUNC(Uniform1uiv, void, GLint location, GLint count, const GLint* value) \
|
||||
GL_FUNC(Uniform2uiv, void, GLint location, GLint count, const GLint* value) \
|
||||
GL_FUNC(Uniform3uiv, void, GLint location, GLint count, const GLint* value) \
|
||||
GL_FUNC(Uniform4uiv, void, GLint location, GLint count, const GLint* value) \
|
||||
GL_FUNC(UniformMatrix2fv, void, GLint location, GLint count, GLboolean transpose, const GLfloat* value) \
|
||||
GL_FUNC(UniformMatrix3fv, void, GLint location, GLint count, GLboolean transpose, const GLfloat* value) \
|
||||
GL_FUNC(UniformMatrix4fv, void, GLint location, GLint count, GLboolean transpose, const GLfloat* value) \
|
||||
GL_FUNC(UniformMatrix2x3fv, void, GLint location, GLint count, GLboolean transpose, const GLfloat* value) \
|
||||
GL_FUNC(UniformMatrix3x2fv, void, GLint location, GLint count, GLboolean transpose, const GLfloat* value) \
|
||||
GL_FUNC(UniformMatrix2x4fv, void, GLint location, GLint count, GLboolean transpose, const GLfloat* value) \
|
||||
GL_FUNC(UniformMatrix4x2fv, void, GLint location, GLint count, GLboolean transpose, const GLfloat* value) \
|
||||
GL_FUNC(UniformMatrix3x4fv, void, GLint location, GLint count, GLboolean transpose, const GLfloat* value) \
|
||||
GL_FUNC(UniformMatrix4x3fv, void, GLint location, GLint count, GLboolean transpose, const GLfloat* value) \
|
||||
GL_FUNC(PixelStorei, void, GLenum pname, GLint param)
|
||||
|
||||
// Debug Function Delegate
|
||||
typedef void (APIENTRY* DEBUGPROC)(GLenum source,
|
||||
GLenum type,
|
||||
GLuint id,
|
||||
|
@ -234,136 +343,54 @@ typedef void (APIENTRY *DEBUGPROC)(GLenum source,
|
|||
const GLchar* message,
|
||||
const void* userParam);
|
||||
|
||||
#define GL_FUNC(name, ret, ...) \
|
||||
typedef ret (*name ## Func) (__VA_ARGS__); \
|
||||
name ## Func name
|
||||
|
||||
#define GL_BIND(name) gl.name = (GL::name ## Func)(Internal::Platform::gl_get_func("gl" #name));
|
||||
|
||||
namespace Blah
|
||||
{
|
||||
namespace OpenGL
|
||||
{
|
||||
// GL function pointers
|
||||
struct GL
|
||||
{
|
||||
GL_FUNC(DebugMessageCallback, void, DEBUGPROC callback, const void* userParam);
|
||||
GL_FUNC(GetString, const GLubyte*, GLenum name);
|
||||
GL_FUNC(Flush, void, void);
|
||||
GL_FUNC(Enable, void, GLenum mode);
|
||||
GL_FUNC(Disable, void, GLenum mode);
|
||||
GL_FUNC(Clear, void, GLenum mask);
|
||||
GL_FUNC(ClearColor, void, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
|
||||
GL_FUNC(ClearDepth, void, GLdouble depth);
|
||||
GL_FUNC(ClearStencil, void, GLint stencil);
|
||||
GL_FUNC(DepthMask, void, GLboolean enabled);
|
||||
GL_FUNC(DepthFunc, void, GLenum func);
|
||||
GL_FUNC(Viewport, void, GLint x, GLint y, GLint width, GLint height);
|
||||
GL_FUNC(Scissor, void, GLint x, GLint y, GLint width, GLint height);
|
||||
GL_FUNC(CullFace, void, GLenum mode);
|
||||
GL_FUNC(BlendEquation, void, GLenum eq);
|
||||
GL_FUNC(BlendEquationSeparate, void, GLenum modeRGB, GLenum modeAlpha);
|
||||
GL_FUNC(BlendFunc, void, GLenum sfactor, GLenum dfactor);
|
||||
GL_FUNC(BlendFuncSeparate, void, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
|
||||
GL_FUNC(BlendColor, void, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
|
||||
GL_FUNC(ColorMask, void, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
|
||||
GL_FUNC(GetIntegerv, void, GLenum name, GLint* data);
|
||||
GL_FUNC(GenTextures, void, GLint n, void* textures);
|
||||
GL_FUNC(GenRenderbuffers, void, GLint n, void* textures);
|
||||
GL_FUNC(GenFramebuffers, void, GLint n, void* textures);
|
||||
GL_FUNC(ActiveTexture, void, GLuint id);
|
||||
GL_FUNC(BindTexture, void, GLenum target, GLuint id);
|
||||
GL_FUNC(BindRenderbuffer, void, GLenum target, GLuint id);
|
||||
GL_FUNC(BindFramebuffer, void, GLenum target, GLuint id);
|
||||
GL_FUNC(TexImage2D, void, GLenum target, GLint level, GLenum internalFormat, GLint width, GLint height, GLint border, GLenum format, GLenum type, void* data);
|
||||
GL_FUNC(FramebufferRenderbuffer, void, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
|
||||
GL_FUNC(FramebufferTexture2D, void, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
|
||||
GL_FUNC(TexParameteri, void, GLenum target, GLenum name, GLint param);
|
||||
GL_FUNC(RenderbufferStorage, void, GLenum target, GLenum internalformat, GLint width, GLint height);
|
||||
GL_FUNC(GetTexImage, void, GLenum target, GLint level, GLenum format, GLenum type, void* data);
|
||||
GL_FUNC(DrawElements, void, GLenum mode, GLint count, GLenum type, void* indices);
|
||||
GL_FUNC(DrawElementsInstanced, void, GLenum mode, GLint count, GLenum type, void* indices, GLint amount);
|
||||
GL_FUNC(DeleteTextures, void, GLint n, GLuint* textures);
|
||||
GL_FUNC(DeleteRenderbuffers, void, GLint n, GLuint* renderbuffers);
|
||||
GL_FUNC(DeleteFramebuffers, void, GLint n, GLuint* textures);
|
||||
GL_FUNC(GenVertexArrays, void, GLint n, GLuint* arrays);
|
||||
GL_FUNC(BindVertexArray, void, GLuint id);
|
||||
GL_FUNC(GenBuffers, void, GLint n, GLuint* arrays);
|
||||
GL_FUNC(BindBuffer, void, GLenum target, GLuint buffer);
|
||||
GL_FUNC(BufferData, void, GLenum target, GLsizeiptr size, const void* data, GLenum usage);
|
||||
GL_FUNC(BufferSubData, void, GLenum target, GLintptr offset, GLsizeiptr size, const void* data);
|
||||
GL_FUNC(DeleteBuffers, void, GLint n, GLuint* buffers);
|
||||
GL_FUNC(DeleteVertexArrays, void, GLint n, GLuint* arrays);
|
||||
GL_FUNC(EnableVertexAttribArray, void, GLuint location);
|
||||
GL_FUNC(DisableVertexAttribArray, void, GLuint location);
|
||||
GL_FUNC(VertexAttribPointer, void, GLuint index, GLint size, GLenum type, GLboolean normalized, GLint stride, const void* pointer);
|
||||
GL_FUNC(VertexAttribDivisor, void, GLuint index, GLuint divisor);
|
||||
GL_FUNC(CreateShader, GLuint, GLenum type);
|
||||
GL_FUNC(AttachShader, void, GLuint program, GLuint shader);
|
||||
GL_FUNC(DetachShader, void, GLuint program, GLuint shader);
|
||||
GL_FUNC(DeleteShader, void, GLuint shader);
|
||||
GL_FUNC(ShaderSource, void, GLuint shader, GLsizei count, const GLchar** string, const GLint* length);
|
||||
GL_FUNC(CompileShader, void, GLuint shader);
|
||||
GL_FUNC(GetShaderiv, void, GLuint shader, GLenum pname, GLint* result);
|
||||
GL_FUNC(GetShaderInfoLog, void, GLuint shader, GLint maxLength, GLsizei* length, GLchar* infoLog);
|
||||
GL_FUNC(CreateProgram, GLuint, );
|
||||
GL_FUNC(DeleteProgram, void, GLuint program);
|
||||
GL_FUNC(LinkProgram, void, GLuint program);
|
||||
GL_FUNC(GetProgramiv, void, GLuint program, GLenum pname, GLint* result);
|
||||
GL_FUNC(GetProgramInfoLog, void, GLuint program, GLint maxLength, GLsizei* length, GLchar* infoLog);
|
||||
GL_FUNC(GetActiveUniform, void, GLuint program, GLuint index, GLint bufSize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
|
||||
GL_FUNC(GetActiveAttrib, void, GLuint program, GLuint index, GLint bufSize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
|
||||
GL_FUNC(UseProgram, void, GLuint program);
|
||||
GL_FUNC(GetUniformLocation, GLint, GLuint program, const GLchar* name);
|
||||
GL_FUNC(GetAttribLocation, GLint, GLuint program, const GLchar* name);
|
||||
GL_FUNC(Uniform1f, void, GLint location, GLfloat v0);
|
||||
GL_FUNC(Uniform2f, void, GLint location, GLfloat v0, GLfloat v1);
|
||||
GL_FUNC(Uniform3f, void, GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
|
||||
GL_FUNC(Uniform4f, void, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
|
||||
GL_FUNC(Uniform1fv, void, GLint location, GLint count, const GLfloat* value);
|
||||
GL_FUNC(Uniform2fv, void, GLint location, GLint count, const GLfloat* value);
|
||||
GL_FUNC(Uniform3fv, void, GLint location, GLint count, const GLfloat* value);
|
||||
GL_FUNC(Uniform4fv, void, GLint location, GLint count, const GLfloat* value);
|
||||
GL_FUNC(Uniform1i, void, GLint location, GLint v0);
|
||||
GL_FUNC(Uniform2i, void, GLint location, GLint v0, GLint v1);
|
||||
GL_FUNC(Uniform3i, void, GLint location, GLint v0, GLint v1, GLint v2);
|
||||
GL_FUNC(Uniform4i, void, GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
|
||||
GL_FUNC(Uniform1iv, void, GLint location, GLint count, const GLint* value);
|
||||
GL_FUNC(Uniform2iv, void, GLint location, GLint count, const GLint* value);
|
||||
GL_FUNC(Uniform3iv, void, GLint location, GLint count, const GLint* value);
|
||||
GL_FUNC(Uniform4iv, void, GLint location, GLint count, const GLint* value);
|
||||
GL_FUNC(Uniform1ui, void, GLint location, GLuint v0);
|
||||
GL_FUNC(Uniform2ui, void, GLint location, GLuint v0, GLuint v1);
|
||||
GL_FUNC(Uniform3ui, void, GLint location, GLuint v0, GLuint v1, GLuint v2);
|
||||
GL_FUNC(Uniform4ui, void, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
|
||||
GL_FUNC(Uniform1uiv, void, GLint location, GLint count, const GLint* value);
|
||||
GL_FUNC(Uniform2uiv, void, GLint location, GLint count, const GLint* value);
|
||||
GL_FUNC(Uniform3uiv, void, GLint location, GLint count, const GLint* value);
|
||||
GL_FUNC(Uniform4uiv, void, GLint location, GLint count, const GLint* value);
|
||||
GL_FUNC(UniformMatrix2fv, void, GLint location, GLint count, GLboolean transpose, const GLfloat* value);
|
||||
GL_FUNC(UniformMatrix3fv, void, GLint location, GLint count, GLboolean transpose, const GLfloat* value);
|
||||
GL_FUNC(UniformMatrix4fv, void, GLint location, GLint count, GLboolean transpose, const GLfloat* value);
|
||||
GL_FUNC(UniformMatrix2x3fv, void, GLint location, GLint count, GLboolean transpose, const GLfloat* value);
|
||||
GL_FUNC(UniformMatrix3x2fv, void, GLint location, GLint count, GLboolean transpose, const GLfloat* value);
|
||||
GL_FUNC(UniformMatrix2x4fv, void, GLint location, GLint count, GLboolean transpose, const GLfloat* value);
|
||||
GL_FUNC(UniformMatrix4x2fv, void, GLint location, GLint count, GLboolean transpose, const GLfloat* value);
|
||||
GL_FUNC(UniformMatrix3x4fv, void, GLint location, GLint count, GLboolean transpose, const GLfloat* value);
|
||||
GL_FUNC(UniformMatrix4x3fv, void, GLint location, GLint count, GLboolean transpose, const GLfloat* value);
|
||||
GL_FUNC(PixelStorei, void, GLenum pname, GLint param);
|
||||
#define GL_FUNC(name, ret, ...) typedef ret (*name ## Func) (__VA_ARGS__); name ## Func name;
|
||||
GL_FUNCTIONS
|
||||
#undef GL_FUNC
|
||||
};
|
||||
|
||||
// static state
|
||||
// static function pointers
|
||||
// TODO:
|
||||
// this should probably be part of the Device implementation ...
|
||||
void* context;
|
||||
// this should move into the Device, as on windows it's not guaranteed that these function
|
||||
// pointers are the same between contexts. this doesn't matter right now since we only create
|
||||
// a single context, but will potentially need to change.
|
||||
// reference: https://wiki.libsdl.org/SDL_GL_GetProcAddress
|
||||
GL gl;
|
||||
GLint maxColorAttachments;
|
||||
GLint maxElementIndices;
|
||||
GLint maxElementVertices;
|
||||
GLint maxRenderBufferSize;
|
||||
GLint maxSamples;
|
||||
GLint maxTextureImageUnits;
|
||||
GLint maxTextureSize;
|
||||
|
||||
class Device : public Internal::GraphicsDevice
|
||||
{
|
||||
public:
|
||||
void* context = nullptr;
|
||||
|
||||
GLint max_color_attachments = 0;
|
||||
GLint max_element_indices = 0;
|
||||
GLint max_element_vertices = 0;
|
||||
GLint max_renderbuffer_size = 0;
|
||||
GLint max_samples = 0;
|
||||
GLint max_texture_image_units = 0;
|
||||
GLint max_texture_size = 0;
|
||||
|
||||
inline virtual void startup() override;
|
||||
inline virtual void shutdown() override;
|
||||
inline virtual void update() override {}
|
||||
inline virtual void before_render() override {}
|
||||
inline virtual void after_render() override {}
|
||||
|
||||
inline virtual TextureRef create_texture(int width, int height, TextureFilter filter, TextureWrap wrap_x, TextureWrap wrap_y, TextureFormat format) override;
|
||||
inline virtual FrameBufferRef create_framebuffer(int width, int height, const TextureFormat* attachments, int attachmentCount) override;
|
||||
inline virtual ShaderRef create_shader(const ShaderData* data) override;
|
||||
inline virtual MeshRef create_mesh() override;
|
||||
inline virtual void render(RenderCall* call) override;
|
||||
inline virtual void clear(const FrameBufferRef& target, uint32_t rgba) override;
|
||||
};
|
||||
|
||||
// debug callback
|
||||
void APIENTRY gl_message_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam)
|
||||
{
|
||||
// these are basically never useful
|
||||
|
@ -403,6 +430,7 @@ namespace Blah
|
|||
Log::print("GL (%s) %s", typeName, message);
|
||||
}
|
||||
|
||||
// assign attributes
|
||||
GLuint gl_mesh_assign_attributes(GLuint buffer, GLenum buffer_type, const VertexAttribute* vertex_attributes, int vertex_attribute_count, int stride, GLint divisor)
|
||||
{
|
||||
// bind
|
||||
|
@ -459,6 +487,7 @@ namespace Blah
|
|||
return stride;
|
||||
}
|
||||
|
||||
// convert blend op enum
|
||||
GLenum gl_get_blend_func(BlendOp operation)
|
||||
{
|
||||
switch (operation)
|
||||
|
@ -472,6 +501,7 @@ namespace Blah
|
|||
return GL_FUNC_ADD;
|
||||
}
|
||||
|
||||
// convert blend factor enum
|
||||
GLenum gl_get_blend_factor(BlendFactor factor)
|
||||
{
|
||||
switch (factor)
|
||||
|
@ -517,7 +547,7 @@ namespace Blah
|
|||
public:
|
||||
bool framebuffer_parent;
|
||||
|
||||
OpenGL_Texture(int width, int height, TextureFilter filter, TextureWrap wrap_x, TextureWrap wrap_y, TextureFormat format)
|
||||
OpenGL_Texture(Device* device, int width, int height, TextureFilter filter, TextureWrap wrap_x, TextureWrap wrap_y, TextureFormat format)
|
||||
{
|
||||
m_id = 0;
|
||||
m_width = width;
|
||||
|
@ -531,9 +561,9 @@ namespace Blah
|
|||
m_gl_format = GL_RED;
|
||||
m_gl_type = GL_UNSIGNED_BYTE;
|
||||
|
||||
if (width > maxTextureSize || height > maxTextureSize)
|
||||
if (width > device->max_texture_size || height > device->max_texture_size)
|
||||
{
|
||||
Log::error("Exceeded Max Texture Size of %i", maxTextureSize);
|
||||
Log::error("Exceeded Max Texture Size of %i", device->max_texture_size);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -689,7 +719,7 @@ namespace Blah
|
|||
|
||||
public:
|
||||
|
||||
OpenGL_FrameBuffer(int width, int height, const TextureFormat* attachments, int attachmentCount)
|
||||
OpenGL_FrameBuffer(Device* device, int width, int height, const TextureFormat* attachments, int attachmentCount)
|
||||
{
|
||||
gl.GenFramebuffers(1, &m_id);
|
||||
m_width = width;
|
||||
|
@ -776,7 +806,7 @@ namespace Blah
|
|||
public:
|
||||
GLint uniforms_loc[BLAH_UNIFORMS] = { 0 };
|
||||
|
||||
OpenGL_Shader(const ShaderData* data)
|
||||
OpenGL_Shader(Device* device, const ShaderData* data)
|
||||
{
|
||||
m_id = 0;
|
||||
|
||||
|
@ -936,6 +966,7 @@ namespace Blah
|
|||
|
||||
~OpenGL_Shader()
|
||||
{
|
||||
if (m_id > 0)
|
||||
gl.DeleteProgram(m_id);
|
||||
m_id = 0;
|
||||
}
|
||||
|
@ -972,6 +1003,7 @@ namespace Blah
|
|||
|
||||
virtual void dispose() override
|
||||
{
|
||||
if (m_id > 0)
|
||||
gl.DeleteProgram(m_id);
|
||||
m_id = 0;
|
||||
}
|
||||
|
@ -996,7 +1028,7 @@ namespace Blah
|
|||
|
||||
public:
|
||||
|
||||
OpenGL_Mesh()
|
||||
OpenGL_Mesh(Device* device)
|
||||
{
|
||||
m_id = 0;
|
||||
m_index_buffer = 0;
|
||||
|
@ -1142,9 +1174,7 @@ namespace Blah
|
|||
}
|
||||
};
|
||||
|
||||
class Device : public Internal::GraphicsDevice
|
||||
{
|
||||
virtual void startup() override
|
||||
void Device::startup()
|
||||
{
|
||||
valid = true;
|
||||
|
||||
|
@ -1159,109 +1189,9 @@ namespace Blah
|
|||
Internal::Platform::gl_context_make_current(context);
|
||||
|
||||
// bind opengl functions
|
||||
GL_BIND(DebugMessageCallback);
|
||||
GL_BIND(GetString);
|
||||
GL_BIND(Flush);
|
||||
GL_BIND(Enable);
|
||||
GL_BIND(Disable);
|
||||
GL_BIND(Clear);
|
||||
GL_BIND(ClearColor);
|
||||
GL_BIND(ClearDepth);
|
||||
GL_BIND(ClearStencil);
|
||||
GL_BIND(DepthMask);
|
||||
GL_BIND(DepthFunc);
|
||||
GL_BIND(Viewport);
|
||||
GL_BIND(Scissor);
|
||||
GL_BIND(CullFace);
|
||||
GL_BIND(BlendEquation);
|
||||
GL_BIND(BlendEquationSeparate);
|
||||
GL_BIND(BlendFunc);
|
||||
GL_BIND(BlendFuncSeparate);
|
||||
GL_BIND(BlendColor);
|
||||
GL_BIND(ColorMask);
|
||||
GL_BIND(GetIntegerv);
|
||||
GL_BIND(GenTextures);
|
||||
GL_BIND(GenRenderbuffers);
|
||||
GL_BIND(GenFramebuffers);
|
||||
GL_BIND(ActiveTexture);
|
||||
GL_BIND(BindTexture);
|
||||
GL_BIND(BindRenderbuffer);
|
||||
GL_BIND(BindFramebuffer);
|
||||
GL_BIND(TexImage2D);
|
||||
GL_BIND(FramebufferRenderbuffer);
|
||||
GL_BIND(FramebufferTexture2D);
|
||||
GL_BIND(TexParameteri);
|
||||
GL_BIND(RenderbufferStorage);
|
||||
GL_BIND(GetTexImage);
|
||||
GL_BIND(DrawElements);
|
||||
GL_BIND(DrawElementsInstanced);
|
||||
GL_BIND(DeleteTextures);
|
||||
GL_BIND(DeleteRenderbuffers);
|
||||
GL_BIND(DeleteFramebuffers);
|
||||
GL_BIND(GenVertexArrays);
|
||||
GL_BIND(BindVertexArray);
|
||||
GL_BIND(GenBuffers);
|
||||
GL_BIND(BindBuffer);
|
||||
GL_BIND(BufferData);
|
||||
GL_BIND(BufferSubData);
|
||||
GL_BIND(DeleteBuffers);
|
||||
GL_BIND(DeleteVertexArrays);
|
||||
GL_BIND(EnableVertexAttribArray);
|
||||
GL_BIND(DisableVertexAttribArray);
|
||||
GL_BIND(VertexAttribPointer);
|
||||
GL_BIND(VertexAttribDivisor);
|
||||
GL_BIND(CreateShader);
|
||||
GL_BIND(AttachShader);
|
||||
GL_BIND(DetachShader);
|
||||
GL_BIND(DeleteShader);
|
||||
GL_BIND(ShaderSource);
|
||||
GL_BIND(CompileShader);
|
||||
GL_BIND(GetShaderiv);
|
||||
GL_BIND(GetShaderInfoLog);
|
||||
GL_BIND(CreateProgram);
|
||||
GL_BIND(DeleteProgram);
|
||||
GL_BIND(LinkProgram);
|
||||
GL_BIND(GetProgramiv);
|
||||
GL_BIND(GetProgramInfoLog);
|
||||
GL_BIND(GetActiveUniform);
|
||||
GL_BIND(GetActiveAttrib);
|
||||
GL_BIND(UseProgram);
|
||||
GL_BIND(GetUniformLocation);
|
||||
GL_BIND(GetAttribLocation);
|
||||
GL_BIND(Uniform1f);
|
||||
GL_BIND(Uniform2f);
|
||||
GL_BIND(Uniform3f);
|
||||
GL_BIND(Uniform4f);
|
||||
GL_BIND(Uniform1fv);
|
||||
GL_BIND(Uniform2fv);
|
||||
GL_BIND(Uniform3fv);
|
||||
GL_BIND(Uniform4fv);
|
||||
GL_BIND(Uniform1i);
|
||||
GL_BIND(Uniform2i);
|
||||
GL_BIND(Uniform3i);
|
||||
GL_BIND(Uniform4i);
|
||||
GL_BIND(Uniform1iv);
|
||||
GL_BIND(Uniform2iv);
|
||||
GL_BIND(Uniform3iv);
|
||||
GL_BIND(Uniform4iv);
|
||||
GL_BIND(Uniform1ui);
|
||||
GL_BIND(Uniform2ui);
|
||||
GL_BIND(Uniform3ui);
|
||||
GL_BIND(Uniform4ui);
|
||||
GL_BIND(Uniform1uiv);
|
||||
GL_BIND(Uniform2uiv);
|
||||
GL_BIND(Uniform3uiv);
|
||||
GL_BIND(Uniform4uiv);
|
||||
GL_BIND(UniformMatrix2fv);
|
||||
GL_BIND(UniformMatrix3fv);
|
||||
GL_BIND(UniformMatrix4fv);
|
||||
GL_BIND(UniformMatrix2x3fv);
|
||||
GL_BIND(UniformMatrix3x2fv);
|
||||
GL_BIND(UniformMatrix2x4fv);
|
||||
GL_BIND(UniformMatrix4x2fv);
|
||||
GL_BIND(UniformMatrix3x4fv);
|
||||
GL_BIND(UniformMatrix4x3fv);
|
||||
GL_BIND(PixelStorei);
|
||||
#define GL_FUNC(name, ...) gl.name = (GL::name ## Func)(Internal::Platform::gl_get_func("gl" #name));
|
||||
GL_FUNCTIONS
|
||||
#undef GL_FUNC
|
||||
|
||||
// bind debug message callback
|
||||
if (gl.DebugMessageCallback != nullptr)
|
||||
|
@ -1272,13 +1202,13 @@ namespace Blah
|
|||
}
|
||||
|
||||
// get opengl info
|
||||
gl.GetIntegerv(0x8CDF, &maxColorAttachments);
|
||||
gl.GetIntegerv(0x80E9, &maxElementIndices);
|
||||
gl.GetIntegerv(0x80E8, &maxElementVertices);
|
||||
gl.GetIntegerv(0x84E8, &maxRenderBufferSize);
|
||||
gl.GetIntegerv(0x8D57, &maxSamples);
|
||||
gl.GetIntegerv(0x8872, &maxTextureImageUnits);
|
||||
gl.GetIntegerv(0x0D33, &maxTextureSize);
|
||||
gl.GetIntegerv(0x8CDF, &max_color_attachments);
|
||||
gl.GetIntegerv(0x80E9, &max_element_indices);
|
||||
gl.GetIntegerv(0x80E8, &max_element_vertices);
|
||||
gl.GetIntegerv(0x84E8, &max_renderbuffer_size);
|
||||
gl.GetIntegerv(0x8D57, &max_samples);
|
||||
gl.GetIntegerv(0x8872, &max_texture_image_units);
|
||||
gl.GetIntegerv(0x0D33, &max_texture_size);
|
||||
|
||||
// log
|
||||
Log::print("OpenGL %s, %s",
|
||||
|
@ -1293,40 +1223,36 @@ namespace Blah
|
|||
info.api = GfxAPI::OpenGL;
|
||||
info.instancing = true;
|
||||
info.origin_bottom_left = true;
|
||||
info.max_texture_size = maxTextureSize;
|
||||
info.max_texture_size = max_texture_size;
|
||||
}
|
||||
|
||||
virtual void shutdown() override
|
||||
void Device::shutdown()
|
||||
{
|
||||
Internal::Platform::gl_context_destroy(context);
|
||||
context = nullptr;
|
||||
}
|
||||
|
||||
virtual void update() override {}
|
||||
virtual void before_render() override {}
|
||||
virtual void after_render() override {}
|
||||
|
||||
virtual TextureRef create_texture(int width, int height, TextureFilter filter, TextureWrap wrap_x, TextureWrap wrap_y, TextureFormat format) override
|
||||
TextureRef Device::create_texture(int width, int height, TextureFilter filter, TextureWrap wrap_x, TextureWrap wrap_y, TextureFormat format)
|
||||
{
|
||||
return TextureRef(new OpenGL_Texture(width, height, filter, wrap_x, wrap_y, format));
|
||||
return TextureRef(new OpenGL_Texture(this, width, height, filter, wrap_x, wrap_y, format));
|
||||
}
|
||||
|
||||
virtual FrameBufferRef create_framebuffer(int width, int height, const TextureFormat* attachments, int attachmentCount) override
|
||||
FrameBufferRef Device::create_framebuffer(int width, int height, const TextureFormat* attachments, int attachmentCount)
|
||||
{
|
||||
return FrameBufferRef(new OpenGL_FrameBuffer(width, height, attachments, attachmentCount));
|
||||
return FrameBufferRef(new OpenGL_FrameBuffer(this, width, height, attachments, attachmentCount));
|
||||
}
|
||||
|
||||
virtual ShaderRef create_shader(const ShaderData* data) override
|
||||
ShaderRef Device::create_shader(const ShaderData* data)
|
||||
{
|
||||
return ShaderRef(new OpenGL_Shader(data));
|
||||
return ShaderRef(new OpenGL_Shader(this, data));
|
||||
}
|
||||
|
||||
virtual MeshRef create_mesh() override
|
||||
MeshRef Device::create_mesh()
|
||||
{
|
||||
return MeshRef(new OpenGL_Mesh());
|
||||
return MeshRef(new OpenGL_Mesh(this));
|
||||
}
|
||||
|
||||
virtual void render(RenderCall* call) override
|
||||
void Device::render(RenderCall* call)
|
||||
{
|
||||
// Bind the Target
|
||||
Point size;
|
||||
|
@ -1338,15 +1264,19 @@ namespace Blah
|
|||
}
|
||||
else
|
||||
{
|
||||
gl.BindFramebuffer(GL_FRAMEBUFFER, ((OpenGL_FrameBuffer*)call->target.get())->gl_id());
|
||||
auto framebuffer = (OpenGL_FrameBuffer*)call->target.get();
|
||||
gl.BindFramebuffer(GL_FRAMEBUFFER, framebuffer->gl_id());
|
||||
size.x = call->target->width();
|
||||
size.y = call->target->height();
|
||||
}
|
||||
|
||||
auto shader_ref = call->material->shader();
|
||||
auto shader = (OpenGL_Shader*)shader_ref.get();
|
||||
auto mesh = (OpenGL_Mesh*)call->mesh.get();
|
||||
|
||||
// Use the Shader
|
||||
// TODO: I don't love how material values are assigned or set here
|
||||
{
|
||||
OpenGL_Shader* shader = (OpenGL_Shader*)(call->material->shader().get());
|
||||
gl.UseProgram(shader->gl_id());
|
||||
|
||||
// upload uniform values
|
||||
|
@ -1539,7 +1469,7 @@ namespace Blah
|
|||
|
||||
// Draw the Mesh
|
||||
{
|
||||
gl.BindVertexArray(((OpenGL_Mesh*)call->mesh.get())->gl_id());
|
||||
gl.BindVertexArray(mesh->gl_id());
|
||||
|
||||
if (call->instance_count > 0)
|
||||
{
|
||||
|
@ -1563,7 +1493,7 @@ namespace Blah
|
|||
}
|
||||
}
|
||||
|
||||
virtual void clear(const FrameBufferRef& target, uint32_t rgba) override
|
||||
void Device::clear(const FrameBufferRef& target, uint32_t rgba)
|
||||
{
|
||||
if (!target || !target->is_valid())
|
||||
{
|
||||
|
@ -1585,7 +1515,6 @@ namespace Blah
|
|||
gl.ClearColor(r / 255.0f, g / 255.0f, b / 255.0f, a / 255.0f);
|
||||
gl.Clear(GL_COLOR_BUFFER_BIT);
|
||||
}
|
||||
};
|
||||
|
||||
bool supported()
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue
Block a user