From 365b116c57a632017f155b0d9884a24a7bbc0fa6 Mon Sep 17 00:00:00 2001 From: Sergey Lipskiy Date: Sun, 25 Dec 2016 00:36:27 +0700 Subject: [PATCH] Start Graphics content implementation. First step: init , destroy , createTexture, deleteTexture --- projects/msvc12/GLideN64.vcxproj | 8 + projects/msvc12/GLideN64.vcxproj.filters | 36 ++++ src/Graphics/Context.cpp | 34 ++++ src/Graphics/Context.h | 27 +++ src/Graphics/ContextImpl.h | 16 ++ src/Graphics/ObjectName.h | 16 ++ src/Graphics/OpenGLContext/GLFunctions.cpp | 174 ++++++++++++++++++ src/Graphics/OpenGLContext/GLFunctions.h | 96 ++++++++++ .../OpenGLContext/OpenGLContextImpl.cpp | 36 ++++ .../OpenGLContext/OpenGLContextImpl.h | 17 ++ src/OpenGL.cpp | 3 + src/Textures.cpp | 14 +- src/Textures.h | 4 +- 13 files changed, 471 insertions(+), 10 deletions(-) create mode 100644 src/Graphics/Context.cpp create mode 100644 src/Graphics/Context.h create mode 100644 src/Graphics/ContextImpl.h create mode 100644 src/Graphics/ObjectName.h create mode 100644 src/Graphics/OpenGLContext/GLFunctions.cpp create mode 100644 src/Graphics/OpenGLContext/GLFunctions.h create mode 100644 src/Graphics/OpenGLContext/OpenGLContextImpl.cpp create mode 100644 src/Graphics/OpenGLContext/OpenGLContextImpl.h diff --git a/projects/msvc12/GLideN64.vcxproj b/projects/msvc12/GLideN64.vcxproj index 2429cce6..db93ea42 100644 --- a/projects/msvc12/GLideN64.vcxproj +++ b/projects/msvc12/GLideN64.vcxproj @@ -301,6 +301,9 @@ true true + + + @@ -421,6 +424,11 @@ true true + + + + + diff --git a/projects/msvc12/GLideN64.vcxproj.filters b/projects/msvc12/GLideN64.vcxproj.filters index bccb7779..3e5869e3 100644 --- a/projects/msvc12/GLideN64.vcxproj.filters +++ b/projects/msvc12/GLideN64.vcxproj.filters @@ -57,6 +57,18 @@ {699714e2-bd52-4b7d-a5d5-4e514651293f} + + {ed46d297-e09c-4187-870c-1f03bc54905f} + + + {abdc978d-26cb-4c32-9b72-4c92b05f9e24} + + + {ac45d108-eb77-4831-b7aa-5efa9e48d4ec} + + + {207de069-1088-4913-84f5-3cf0804928dc} + @@ -266,6 +278,15 @@ Source Files\uCodes + + Source Files\Graphics + + + Source Files\Graphics\OpenGL + + + Source Files\Graphics\OpenGL + @@ -475,5 +496,20 @@ Header Files\uCodes + + Header Files\Graphics + + + Header Files\Graphics + + + Header Files\Graphics\OpenGL + + + Header Files\Graphics\OpenGL + + + Header Files\Graphics + \ No newline at end of file diff --git a/src/Graphics/Context.cpp b/src/Graphics/Context.cpp new file mode 100644 index 00000000..d2a9cdfe --- /dev/null +++ b/src/Graphics/Context.cpp @@ -0,0 +1,34 @@ +#include "Context.h" +#include "OpenGLContext/OpenGLContextImpl.h" + +using namespace graphics; + +Context gfxContext; + +Context::Context() : m_impl(nullptr) {} + +Context::~Context() { + m_impl.reset(nullptr); +} + +void Context::init() +{ + m_impl.reset(new opengl::OpenGLContextImpl); + m_impl->init(); +} + +void Context::destroy() +{ + m_impl->destroy(); + m_impl.reset(nullptr); +} + +ObjectName Context::createTexture() const +{ + return m_impl->createTexture(); +} + +void Context::deleteTexture(ObjectName _name) const +{ + return m_impl->deleteTexture(_name); +} diff --git a/src/Graphics/Context.h b/src/Graphics/Context.h new file mode 100644 index 00000000..c33ffcd3 --- /dev/null +++ b/src/Graphics/Context.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include "ObjectName.h" + +namespace graphics { + + class ContextImpl; + + class Context + { + public: + Context(); + ~Context(); + void init(); + void destroy(); + + ObjectName createTexture() const; + void deleteTexture(ObjectName _name) const; + + private: + std::unique_ptr m_impl; + }; + +} + +extern graphics::Context gfxContext; diff --git a/src/Graphics/ContextImpl.h b/src/Graphics/ContextImpl.h new file mode 100644 index 00000000..f8e0e812 --- /dev/null +++ b/src/Graphics/ContextImpl.h @@ -0,0 +1,16 @@ +#pragma once +#include "ObjectName.h" + +namespace graphics { + + class ContextImpl + { + public: + virtual ~ContextImpl() {} + virtual void init() = 0; + virtual void destroy() = 0; + virtual ObjectName createTexture() const = 0; + virtual void deleteTexture(ObjectName _name) const = 0; + }; + +} diff --git a/src/Graphics/ObjectName.h b/src/Graphics/ObjectName.h new file mode 100644 index 00000000..4b77e1c3 --- /dev/null +++ b/src/Graphics/ObjectName.h @@ -0,0 +1,16 @@ +#pragma once +#include + +namespace graphics { + + class ObjectName + { + public: + explicit ObjectName(u32 _name) : m_name(_name) {} + explicit operator u32() const { return m_name; } + + private: + u32 m_name; + }; + +} diff --git a/src/Graphics/OpenGLContext/GLFunctions.cpp b/src/Graphics/OpenGLContext/GLFunctions.cpp new file mode 100644 index 00000000..050c2fde --- /dev/null +++ b/src/Graphics/OpenGLContext/GLFunctions.cpp @@ -0,0 +1,174 @@ +#include "GLFunctions.h" + +#ifdef OS_WINDOWS +#define glGetProcAddress wglGetProcAddress +#else +#define glGetProcAddress glXGetProcAddress +#endif + +// GLSL functions +PFNGLCREATESHADERPROC glCreateShader; +PFNGLCOMPILESHADERPROC glCompileShader; +PFNGLSHADERSOURCEPROC glShaderSource; +PFNGLCREATEPROGRAMPROC glCreateProgram; +PFNGLATTACHSHADERPROC glAttachShader; +PFNGLLINKPROGRAMPROC glLinkProgram; +PFNGLUSEPROGRAMPROC glUseProgram; +PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation; +PFNGLUNIFORM1IPROC glUniform1i; +PFNGLUNIFORM1FPROC glUniform1f; +PFNGLUNIFORM2FPROC glUniform2f; +PFNGLUNIFORM2IPROC glUniform2i; +PFNGLUNIFORM4IPROC glUniform4i; +PFNGLUNIFORM4FPROC glUniform4f; +PFNGLUNIFORM3FVPROC glUniform3fv; +PFNGLUNIFORM4FVPROC glUniform4fv; +PFNGLDETACHSHADERPROC glDetachShader; +PFNGLDELETESHADERPROC glDeleteShader; +PFNGLDELETEPROGRAMPROC glDeleteProgram; +PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog; +PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog; +PFNGLGETSHADERIVPROC glGetShaderiv; +PFNGLGETPROGRAMIVPROC glGetProgramiv; + +PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray; +PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray; +PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer; +PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation; +PFNGLVERTEXATTRIB4FPROC glVertexAttrib4f; +PFNGLVERTEXATTRIB4FVPROC glVertexAttrib4fv; + +// multitexture functions +PFNGLACTIVETEXTUREPROC glActiveTexture; +PFNGLDEPTHRANGEFPROC glDepthRangef; +PFNGLCLEARDEPTHFPROC glClearDepthf; +PFNGLBLENDCOLORPROC glBlendColor; + +PFNGLDRAWBUFFERSPROC glDrawBuffers; +PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer; +PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; +PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; +PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D; +PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample; +PFNGLTEXSTORAGE2DMULTISAMPLEPROC glTexStorage2DMultisample; +PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers; +PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer; +PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage; +PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer; +PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers; +PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; +PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer; +PFNGLGENBUFFERSPROC glGenBuffers; +PFNGLBINDBUFFERPROC glBindBuffer; +PFNGLBUFFERDATAPROC glBufferData; +PFNGLMAPBUFFERPROC glMapBuffer; +PFNGLMAPBUFFERRANGEPROC glMapBufferRange; +PFNGLUNMAPBUFFERPROC glUnmapBuffer; +PFNGLDELETEBUFFERSPROC glDeleteBuffers; +PFNGLBINDIMAGETEXTUREPROC glBindImageTexture; +PFNGLMEMORYBARRIERPROC glMemoryBarrier; +PFNGLGETSTRINGIPROC glGetStringi; +PFNGLINVALIDATEFRAMEBUFFERPROC glInvalidateFramebuffer; +PFNGLBUFFERSTORAGEPROC glBufferStorage; +PFNGLFENCESYNCPROC glFenceSync; +PFNGLCLIENTWAITSYNCPROC glClientWaitSync; +PFNGLDELETESYNCPROC glDeleteSync; + +PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex; +PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding; +PFNGLGETACTIVEUNIFORMBLOCKIVPROC glGetActiveUniformBlockiv; +PFNGLGETUNIFORMINDICESPROC glGetUniformIndices; +PFNGLGETACTIVEUNIFORMSIVPROC glGetActiveUniformsiv; +PFNGLBINDBUFFERBASEPROC glBindBufferBase; +PFNGLBUFFERSUBDATAPROC glBufferSubData; + +PFNGLGETPROGRAMBINARYPROC glGetProgramBinary; +PFNGLPROGRAMBINARYPROC glProgramBinary; +PFNGLPROGRAMPARAMETERIPROC glProgramParameteri; + +PFNGLTEXSTORAGE2DPROC glTexStorage2D; + +#define GL_GET_PROC_ADR(proc_type, proc_name) proc_name = (proc_type) glGetProcAddress(#proc_name) + +void initGLFunctions() +{ + GL_GET_PROC_ADR(PFNGLCREATESHADERPROC, glCreateShader); + GL_GET_PROC_ADR(PFNGLCOMPILESHADERPROC, glCompileShader); + GL_GET_PROC_ADR(PFNGLSHADERSOURCEPROC, glShaderSource); + GL_GET_PROC_ADR(PFNGLCREATEPROGRAMPROC, glCreateProgram); + GL_GET_PROC_ADR(PFNGLATTACHSHADERPROC, glAttachShader); + GL_GET_PROC_ADR(PFNGLLINKPROGRAMPROC, glLinkProgram); + GL_GET_PROC_ADR(PFNGLUSEPROGRAMPROC, glUseProgram); + GL_GET_PROC_ADR(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation); + GL_GET_PROC_ADR(PFNGLUNIFORM1IPROC, glUniform1i); + GL_GET_PROC_ADR(PFNGLUNIFORM1FPROC, glUniform1f); + GL_GET_PROC_ADR(PFNGLUNIFORM2FPROC, glUniform2f); + GL_GET_PROC_ADR(PFNGLUNIFORM2IPROC, glUniform2i); + GL_GET_PROC_ADR(PFNGLUNIFORM4IPROC, glUniform4i); + GL_GET_PROC_ADR(PFNGLUNIFORM4FPROC, glUniform4f); + GL_GET_PROC_ADR(PFNGLUNIFORM3FVPROC, glUniform3fv); + GL_GET_PROC_ADR(PFNGLUNIFORM4FVPROC, glUniform4fv); + GL_GET_PROC_ADR(PFNGLDETACHSHADERPROC, glDetachShader); + GL_GET_PROC_ADR(PFNGLDELETESHADERPROC, glDeleteShader); + GL_GET_PROC_ADR(PFNGLDELETEPROGRAMPROC, glDeleteProgram); + GL_GET_PROC_ADR(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog); + GL_GET_PROC_ADR(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog); + GL_GET_PROC_ADR(PFNGLGETSHADERIVPROC, glGetShaderiv); + GL_GET_PROC_ADR(PFNGLGETPROGRAMIVPROC, glGetProgramiv); + + GL_GET_PROC_ADR(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray); + GL_GET_PROC_ADR(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray); + GL_GET_PROC_ADR(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer); + GL_GET_PROC_ADR(PFNGLBINDATTRIBLOCATIONPROC, glBindAttribLocation); + GL_GET_PROC_ADR(PFNGLVERTEXATTRIB4FPROC, glVertexAttrib4f); + GL_GET_PROC_ADR(PFNGLVERTEXATTRIB4FVPROC, glVertexAttrib4fv); + + GL_GET_PROC_ADR(PFNGLACTIVETEXTUREPROC, glActiveTexture); + GL_GET_PROC_ADR(PFNGLDEPTHRANGEFPROC, glDepthRangef); + GL_GET_PROC_ADR(PFNGLCLEARDEPTHFPROC, glClearDepthf); + GL_GET_PROC_ADR(PFNGLBLENDCOLORPROC, glBlendColor); + + GL_GET_PROC_ADR(PFNGLDRAWBUFFERSPROC, glDrawBuffers); + GL_GET_PROC_ADR(PFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer); + GL_GET_PROC_ADR(PFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers); + GL_GET_PROC_ADR(PFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers); + GL_GET_PROC_ADR(PFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D); + GL_GET_PROC_ADR(PFNGLTEXIMAGE2DMULTISAMPLEPROC, glTexImage2DMultisample); + GL_GET_PROC_ADR(PFNGLTEXSTORAGE2DMULTISAMPLEPROC, glTexStorage2DMultisample); + GL_GET_PROC_ADR(PFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers); + GL_GET_PROC_ADR(PFNGLBINDRENDERBUFFERPROC, glBindRenderbuffer); + GL_GET_PROC_ADR(PFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage); + GL_GET_PROC_ADR(PFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer); + GL_GET_PROC_ADR(PFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers); + GL_GET_PROC_ADR(PFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus); + GL_GET_PROC_ADR(PFNGLBLITFRAMEBUFFERPROC, glBlitFramebuffer); + GL_GET_PROC_ADR(PFNGLGENBUFFERSPROC, glGenBuffers); + GL_GET_PROC_ADR(PFNGLBINDBUFFERPROC, glBindBuffer); + GL_GET_PROC_ADR(PFNGLBUFFERDATAPROC, glBufferData); + GL_GET_PROC_ADR(PFNGLMAPBUFFERPROC, glMapBuffer); + GL_GET_PROC_ADR(PFNGLMAPBUFFERRANGEPROC, glMapBufferRange); + GL_GET_PROC_ADR(PFNGLUNMAPBUFFERPROC, glUnmapBuffer); + GL_GET_PROC_ADR(PFNGLDELETEBUFFERSPROC, glDeleteBuffers); + GL_GET_PROC_ADR(PFNGLBINDIMAGETEXTUREPROC, glBindImageTexture); + GL_GET_PROC_ADR(PFNGLMEMORYBARRIERPROC, glMemoryBarrier); + GL_GET_PROC_ADR(PFNGLGETSTRINGIPROC, glGetStringi); + GL_GET_PROC_ADR(PFNGLINVALIDATEFRAMEBUFFERPROC, glInvalidateFramebuffer); + GL_GET_PROC_ADR(PFNGLBUFFERSTORAGEPROC, glBufferStorage); + GL_GET_PROC_ADR(PFNGLFENCESYNCPROC, glFenceSync); + GL_GET_PROC_ADR(PFNGLCLIENTWAITSYNCPROC, glClientWaitSync); + GL_GET_PROC_ADR(PFNGLDELETESYNCPROC, glDeleteSync); + + GL_GET_PROC_ADR(PFNGLGETUNIFORMBLOCKINDEXPROC, glGetUniformBlockIndex); + GL_GET_PROC_ADR(PFNGLUNIFORMBLOCKBINDINGPROC, glUniformBlockBinding); + GL_GET_PROC_ADR(PFNGLGETACTIVEUNIFORMBLOCKIVPROC, glGetActiveUniformBlockiv); + GL_GET_PROC_ADR(PFNGLGETUNIFORMINDICESPROC, glGetUniformIndices); + GL_GET_PROC_ADR(PFNGLGETACTIVEUNIFORMSIVPROC, glGetActiveUniformsiv); + GL_GET_PROC_ADR(PFNGLBINDBUFFERBASEPROC, glBindBufferBase); + GL_GET_PROC_ADR(PFNGLBUFFERSUBDATAPROC, glBufferSubData); + + GL_GET_PROC_ADR(PFNGLGETPROGRAMBINARYPROC, glGetProgramBinary); + GL_GET_PROC_ADR(PFNGLPROGRAMBINARYPROC, glProgramBinary); + GL_GET_PROC_ADR(PFNGLPROGRAMPARAMETERIPROC, glProgramParameteri); + + GL_GET_PROC_ADR(PFNGLTEXSTORAGE2DPROC, glTexStorage2D); +} diff --git a/src/Graphics/OpenGLContext/GLFunctions.h b/src/Graphics/OpenGLContext/GLFunctions.h new file mode 100644 index 00000000..028e5162 --- /dev/null +++ b/src/Graphics/OpenGLContext/GLFunctions.h @@ -0,0 +1,96 @@ +#ifndef GLFUNCTIONS_H +#define GLFUNCTIONS_H + +#ifdef OS_WINDOWS +#include +#else +#include >winlnxdefs.h> +#endif + +#include +#include + +extern PFNGLCREATESHADERPROC glCreateShader; +extern PFNGLCOMPILESHADERPROC glCompileShader; +extern PFNGLSHADERSOURCEPROC glShaderSource; +extern PFNGLCREATEPROGRAMPROC glCreateProgram; +extern PFNGLATTACHSHADERPROC glAttachShader; +extern PFNGLLINKPROGRAMPROC glLinkProgram; +extern PFNGLUSEPROGRAMPROC glUseProgram; +extern PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation; +extern PFNGLUNIFORM1IPROC glUniform1i; +extern PFNGLUNIFORM1FPROC glUniform1f; +extern PFNGLUNIFORM2FPROC glUniform2f; +extern PFNGLUNIFORM2IPROC glUniform2i; +extern PFNGLUNIFORM4IPROC glUniform4i; + +extern PFNGLUNIFORM4FPROC glUniform4f; +extern PFNGLUNIFORM3FVPROC glUniform3fv; +extern PFNGLUNIFORM4FVPROC glUniform4fv; +extern PFNGLDETACHSHADERPROC glDetachShader; +extern PFNGLDELETESHADERPROC glDeleteShader; +extern PFNGLDELETEPROGRAMPROC glDeleteProgram; +extern PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog; +extern PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog; +extern PFNGLGETSHADERIVPROC glGetShaderiv; +extern PFNGLGETPROGRAMIVPROC glGetProgramiv; + +extern PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray; +extern PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray; +extern PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer; +extern PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation; +extern PFNGLVERTEXATTRIB4FPROC glVertexAttrib4f; +extern PFNGLVERTEXATTRIB4FVPROC glVertexAttrib4fv; + +extern PFNGLACTIVETEXTUREPROC glActiveTexture; +extern PFNGLDEPTHRANGEFPROC glDepthRangef; +extern PFNGLCLEARDEPTHFPROC glClearDepthf; +extern PFNGLBLENDCOLORPROC glBlendColor; + +extern PFNGLDRAWBUFFERSPROC glDrawBuffers; +extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; +extern PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer; +extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; +extern PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D; +extern PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample; +extern PFNGLTEXSTORAGE2DMULTISAMPLEPROC glTexStorage2DMultisample; +extern PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers; +extern PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer; +extern PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage; +extern PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers; +extern PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer; +extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; +extern PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer; +extern PFNGLGENBUFFERSPROC glGenBuffers; +extern PFNGLBINDBUFFERPROC glBindBuffer; +extern PFNGLBUFFERDATAPROC glBufferData; +extern PFNGLMAPBUFFERPROC glMapBuffer; +extern PFNGLMAPBUFFERRANGEPROC glMapBufferRange; +extern PFNGLUNMAPBUFFERPROC glUnmapBuffer; +extern PFNGLDELETEBUFFERSPROC glDeleteBuffers; +extern PFNGLBINDIMAGETEXTUREPROC glBindImageTexture; +extern PFNGLMEMORYBARRIERPROC glMemoryBarrier; +extern PFNGLGETSTRINGIPROC glGetStringi; +extern PFNGLINVALIDATEFRAMEBUFFERPROC glInvalidateFramebuffer; +extern PFNGLBUFFERSTORAGEPROC glBufferStorage; +extern PFNGLFENCESYNCPROC glFenceSync; +extern PFNGLCLIENTWAITSYNCPROC glClientWaitSync; +extern PFNGLDELETESYNCPROC glDeleteSync; + +extern PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex; +extern PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding; +extern PFNGLGETACTIVEUNIFORMBLOCKIVPROC glGetActiveUniformBlockiv; +extern PFNGLGETUNIFORMINDICESPROC glGetUniformIndices; +extern PFNGLGETACTIVEUNIFORMSIVPROC glGetActiveUniformsiv; +extern PFNGLBINDBUFFERBASEPROC glBindBufferBase; +extern PFNGLBUFFERSUBDATAPROC glBufferSubData; + +extern PFNGLGETPROGRAMBINARYPROC glGetProgramBinary; +extern PFNGLPROGRAMBINARYPROC glProgramBinary; +extern PFNGLPROGRAMPARAMETERIPROC glProgramParameteri; + +extern PFNGLTEXSTORAGE2DPROC glTexStorage2D; + +void initGLFunctions(); + +#endif // GLFUNCTIONS_H diff --git a/src/Graphics/OpenGLContext/OpenGLContextImpl.cpp b/src/Graphics/OpenGLContext/OpenGLContextImpl.cpp new file mode 100644 index 00000000..8bf50411 --- /dev/null +++ b/src/Graphics/OpenGLContext/OpenGLContextImpl.cpp @@ -0,0 +1,36 @@ +#include "OpenGLContextImpl.h" +#include "GLFunctions.h" + +using namespace opengl; + +OpenGLContextImpl::OpenGLContextImpl() +{ +} + + +OpenGLContextImpl::~OpenGLContextImpl() +{ +} + +void OpenGLContextImpl::init() +{ + initGLFunctions(); +} + +void OpenGLContextImpl::destroy() +{ + +} + +graphics::ObjectName OpenGLContextImpl::createTexture() const +{ + GLuint glName; + glGenTextures(1, &glName); + return graphics::ObjectName(static_cast(glName)); +} + +void OpenGLContextImpl::deleteTexture(graphics::ObjectName _name) const +{ + u32 glName(_name); + glDeleteTextures(1, &glName); +} diff --git a/src/Graphics/OpenGLContext/OpenGLContextImpl.h b/src/Graphics/OpenGLContext/OpenGLContextImpl.h new file mode 100644 index 00000000..c479cd52 --- /dev/null +++ b/src/Graphics/OpenGLContext/OpenGLContextImpl.h @@ -0,0 +1,17 @@ +#pragma once +#include + +namespace opengl { + + class OpenGLContextImpl : public graphics::ContextImpl + { + public: + OpenGLContextImpl(); + virtual ~OpenGLContextImpl(); + void init() override; + void destroy() override; + graphics::ObjectName createTexture() const override; + void deleteTexture(graphics::ObjectName _name) const override; + }; + +} diff --git a/src/OpenGL.cpp b/src/OpenGL.cpp index fbe847c8..558c6e4a 100644 --- a/src/OpenGL.cpp +++ b/src/OpenGL.cpp @@ -27,6 +27,7 @@ #include "SoftwareRender.h" #include "FBOTextureFormats.h" #include "TextureFilterHandler.h" +#include "Graphics/Context.h" using namespace std; @@ -157,6 +158,7 @@ void OGLVideo::start() { _start(); // TODO: process initialization error initGLFunctions(); + gfxContext.init(); m_render._initData(); m_buffersSwapCount = 0; } @@ -164,6 +166,7 @@ void OGLVideo::start() void OGLVideo::stop() { m_render._destroyData(); + gfxContext.destroy(); _stop(); } diff --git a/src/Textures.cpp b/src/Textures.cpp index ae20a5a8..633e1adf 100644 --- a/src/Textures.cpp +++ b/src/Textures.cpp @@ -17,6 +17,7 @@ #include "Keys.h" #include "GLideNHQ/Ext_TxFilter.h" #include "TextureFilterHandler.h" +#include "Graphics/Context.h" using namespace std; @@ -555,9 +556,7 @@ CachedTexture * TextureCache::_addTexture(u32 _crc32) if (m_curUnpackAlignment == 0) glGetIntegerv(GL_UNPACK_ALIGNMENT, &m_curUnpackAlignment); _checkCacheSize(); - GLuint glName; - glGenTextures(1, &glName); - m_textures.emplace_front(glName); + m_textures.emplace_front(gfxContext.createTexture()); Textures::iterator new_iter = m_textures.begin(); new_iter->crc = _crc32; m_lruTextureLocations.insert(std::pair(_crc32, new_iter)); @@ -569,17 +568,16 @@ void TextureCache::removeFrameBufferTexture(CachedTexture * _pTexture) FBTextures::const_iterator iter = m_fbTextures.find(_pTexture->glName); assert(iter != m_fbTextures.cend()); m_cachedBytes -= iter->second.textureBytes; - glDeleteTextures( 1, &iter->second.glName ); + gfxContext.deleteTexture(graphics::ObjectName(iter->second.glName)); m_fbTextures.erase(iter); } CachedTexture * TextureCache::addFrameBufferTexture() { _checkCacheSize(); - GLuint glName; - glGenTextures(1, &glName); - m_fbTextures.emplace(glName, glName); - return &m_fbTextures.at(glName); + u32 texName(gfxContext.createTexture()); + m_fbTextures.emplace(texName, texName); + return &m_fbTextures.at(texName); } struct TileSizes diff --git a/src/Textures.h b/src/Textures.h index 36af8faa..6550afc8 100644 --- a/src/Textures.h +++ b/src/Textures.h @@ -15,9 +15,9 @@ typedef u32 (*GetTexelFunc)( u64 *src, u16 x, u16 i, u8 palette ); struct CachedTexture { - CachedTexture(GLuint _glName) : glName(_glName), max_level(0), frameBufferTexture(fbNone), bHDTexture(false) {} + CachedTexture(u32 _glName) : glName(_glName), max_level(0), frameBufferTexture(fbNone), bHDTexture(false) {} - GLuint glName; + u32 glName; u32 crc; // float fulS, fulT; // WORD ulS, ulT, lrS, lrT;