diff --git a/projects/msvc12/GLideN64.vcxproj b/projects/msvc12/GLideN64.vcxproj index 8ade1789..23b79863 100644 --- a/projects/msvc12/GLideN64.vcxproj +++ b/projects/msvc12/GLideN64.vcxproj @@ -314,6 +314,7 @@ + true true @@ -447,6 +448,7 @@ + diff --git a/projects/msvc12/GLideN64.vcxproj.filters b/projects/msvc12/GLideN64.vcxproj.filters index 8e5ac394..5bc4376b 100644 --- a/projects/msvc12/GLideN64.vcxproj.filters +++ b/projects/msvc12/GLideN64.vcxproj.filters @@ -326,6 +326,9 @@ Source Files\Graphics\OpenGL + + Source Files\Graphics\OpenGL + @@ -616,5 +619,8 @@ Header Files\Graphics\OpenGL + + Header Files\Graphics\OpenGL + \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 30cb8b64..5795786b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -64,6 +64,7 @@ set(GLideN64_SOURCES Graphics/CombinerProgram.cpp Graphics/OpenGLContext/GLFunctions.cpp Graphics/OpenGLContext/opengl_Attributes.cpp + Graphics/OpenGLContext/opengl_BufferedDrawer.cpp Graphics/OpenGLContext/opengl_BufferManipulationObjectFactory.cpp Graphics/OpenGLContext/opengl_CachedFunctions.cpp Graphics/OpenGLContext/opengl_ColorBufferReaderWithBufferStorage.cpp diff --git a/src/Graphics/OpenGLContext/GLFunctions.cpp b/src/Graphics/OpenGLContext/GLFunctions.cpp index 753bb2a7..5f61a59b 100644 --- a/src/Graphics/OpenGLContext/GLFunctions.cpp +++ b/src/Graphics/OpenGLContext/GLFunctions.cpp @@ -95,6 +95,7 @@ PFNGLENABLEVERTEXATTRIBARRAYPROC g_glEnableVertexAttribArray; PFNGLDISABLEVERTEXATTRIBARRAYPROC g_glDisableVertexAttribArray; PFNGLVERTEXATTRIBPOINTERPROC g_glVertexAttribPointer; PFNGLBINDATTRIBLOCATIONPROC g_glBindAttribLocation; +PFNGLVERTEXATTRIB1FPROC g_glVertexAttrib1f; PFNGLVERTEXATTRIB4FPROC g_glVertexAttrib4f; PFNGLVERTEXATTRIB4FVPROC g_glVertexAttrib4fv; @@ -116,6 +117,9 @@ PFNGLFRAMEBUFFERRENDERBUFFERPROC g_glFramebufferRenderbuffer; PFNGLDELETERENDERBUFFERSPROC g_glDeleteRenderbuffers; PFNGLCHECKFRAMEBUFFERSTATUSPROC g_glCheckFramebufferStatus; PFNGLBLITFRAMEBUFFERPROC g_glBlitFramebuffer; +PFNGLGENVERTEXARRAYSPROC g_glGenVertexArrays; +PFNGLBINDVERTEXARRAYPROC g_glBindVertexArray; +PFNGLDELETEVERTEXARRAYSPROC g_glDeleteVertexArrays; PFNGLGENBUFFERSPROC g_glGenBuffers; PFNGLBINDBUFFERPROC g_glBindBuffer; PFNGLBUFFERDATAPROC g_glBufferData; @@ -154,6 +158,7 @@ PFNGLCREATETEXTURESPROC g_glCreateTextures; PFNGLCREATEBUFFERSPROC g_glCreateBuffers; PFNGLCREATEFRAMEBUFFERSPROC g_glCreateFramebuffers; PFNGLNAMEDFRAMEBUFFERTEXTUREPROC g_glNamedFramebufferTexture; +PFNGLDRAWELEMENTSBASEVERTEXPROC g_glDrawElementsBaseVertex; void initGLFunctions() { @@ -221,6 +226,7 @@ void initGLFunctions() GL_GET_PROC_ADR(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray); GL_GET_PROC_ADR(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer); GL_GET_PROC_ADR(PFNGLBINDATTRIBLOCATIONPROC, glBindAttribLocation); + GL_GET_PROC_ADR(PFNGLVERTEXATTRIB1FPROC, glVertexAttrib1f); GL_GET_PROC_ADR(PFNGLVERTEXATTRIB4FPROC, glVertexAttrib4f); GL_GET_PROC_ADR(PFNGLVERTEXATTRIB4FVPROC, glVertexAttrib4fv); @@ -241,6 +247,9 @@ void initGLFunctions() GL_GET_PROC_ADR(PFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers); GL_GET_PROC_ADR(PFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus); GL_GET_PROC_ADR(PFNGLBLITFRAMEBUFFERPROC, glBlitFramebuffer); + GL_GET_PROC_ADR(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays); + GL_GET_PROC_ADR(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray); + GL_GET_PROC_ADR(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays); GL_GET_PROC_ADR(PFNGLGENBUFFERSPROC, glGenBuffers); GL_GET_PROC_ADR(PFNGLBINDBUFFERPROC, glBindBuffer); GL_GET_PROC_ADR(PFNGLBUFFERDATAPROC, glBufferData); @@ -280,6 +289,7 @@ void initGLFunctions() GL_GET_PROC_ADR(PFNGLCREATEBUFFERSPROC, glCreateBuffers); GL_GET_PROC_ADR(PFNGLCREATEFRAMEBUFFERSPROC, glCreateFramebuffers); GL_GET_PROC_ADR(PFNGLNAMEDFRAMEBUFFERTEXTUREPROC, glNamedFramebufferTexture); + GL_GET_PROC_ADR(PFNGLDRAWELEMENTSBASEVERTEXPROC, glDrawElementsBaseVertex); #ifdef EGL if (g_glBufferStorage == nullptr) g_glBufferStorage = (PFNGLBUFFERSTORAGEPROC) eglGetProcAddress("glBufferStorageEXT"); diff --git a/src/Graphics/OpenGLContext/GLFunctions.h b/src/Graphics/OpenGLContext/GLFunctions.h index b1c2b0c7..9ae338be 100644 --- a/src/Graphics/OpenGLContext/GLFunctions.h +++ b/src/Graphics/OpenGLContext/GLFunctions.h @@ -117,6 +117,7 @@ extern PFNGLBLENDCOLORPROC g_glBlendColor; #define glDisableVertexAttribArray g_glDisableVertexAttribArray #define glVertexAttribPointer g_glVertexAttribPointer #define glBindAttribLocation g_glBindAttribLocation +#define glVertexAttrib1f g_glVertexAttrib1f #define glVertexAttrib4f g_glVertexAttrib4f #define glVertexAttrib4fv g_glVertexAttrib4fv @@ -137,6 +138,9 @@ extern PFNGLBLENDCOLORPROC g_glBlendColor; #define glFramebufferRenderbuffer g_glFramebufferRenderbuffer #define glCheckFramebufferStatus g_glCheckFramebufferStatus #define glBlitFramebuffer g_glBlitFramebuffer +#define glGenVertexArrays g_glGenVertexArrays +#define glBindVertexArray g_glBindVertexArray +#define glDeleteVertexArrays g_glDeleteVertexArrays; #define glGenBuffers g_glGenBuffers #define glBindBuffer g_glBindBuffer #define glBufferData g_glBufferData @@ -175,6 +179,7 @@ extern PFNGLBLENDCOLORPROC g_glBlendColor; #define glCreateBuffers g_glCreateBuffers #define glCreateFramebuffers g_glCreateFramebuffers #define glNamedFramebufferTexture g_glNamedFramebufferTexture +#define glDrawElementsBaseVertex g_glDrawElementsBaseVertex extern PFNGLCREATESHADERPROC g_glCreateShader; extern PFNGLCOMPILESHADERPROC g_glCompileShader; @@ -205,6 +210,7 @@ extern PFNGLENABLEVERTEXATTRIBARRAYPROC g_glEnableVertexAttribArray; extern PFNGLDISABLEVERTEXATTRIBARRAYPROC g_glDisableVertexAttribArray; extern PFNGLVERTEXATTRIBPOINTERPROC g_glVertexAttribPointer; extern PFNGLBINDATTRIBLOCATIONPROC g_glBindAttribLocation; +extern PFNGLVERTEXATTRIB1FPROC g_glVertexAttrib1f; extern PFNGLVERTEXATTRIB4FPROC g_glVertexAttrib4f; extern PFNGLVERTEXATTRIB4FVPROC g_glVertexAttrib4fv; @@ -225,6 +231,9 @@ extern PFNGLDELETERENDERBUFFERSPROC g_glDeleteRenderbuffers; extern PFNGLFRAMEBUFFERRENDERBUFFERPROC g_glFramebufferRenderbuffer; extern PFNGLCHECKFRAMEBUFFERSTATUSPROC g_glCheckFramebufferStatus; extern PFNGLBLITFRAMEBUFFERPROC g_glBlitFramebuffer; +extern PFNGLGENVERTEXARRAYSPROC g_glGenVertexArrays; +extern PFNGLBINDVERTEXARRAYPROC g_glBindVertexArray; +extern PFNGLDELETEVERTEXARRAYSPROC g_glDeleteVertexArrays; extern PFNGLGENBUFFERSPROC g_glGenBuffers; extern PFNGLBINDBUFFERPROC g_glBindBuffer; extern PFNGLBUFFERDATAPROC g_glBufferData; @@ -263,6 +272,7 @@ extern PFNGLCREATETEXTURESPROC g_glCreateTextures; extern PFNGLCREATEBUFFERSPROC g_glCreateBuffers; extern PFNGLCREATEFRAMEBUFFERSPROC g_glCreateFramebuffers; extern PFNGLNAMEDFRAMEBUFFERTEXTUREPROC g_glNamedFramebufferTexture; +extern PFNGLDRAWELEMENTSBASEVERTEXPROC g_glDrawElementsBaseVertex; void initGLFunctions(); diff --git a/src/Graphics/OpenGLContext/opengl_BufferedDrawer.cpp b/src/Graphics/OpenGLContext/opengl_BufferedDrawer.cpp new file mode 100644 index 00000000..fa7a2332 --- /dev/null +++ b/src/Graphics/OpenGLContext/opengl_BufferedDrawer.cpp @@ -0,0 +1,210 @@ +#include +#include +#include "GLFunctions.h" +#include "opengl_Attributes.h" +#include "opengl_BufferedDrawer.h" + +using namespace graphics; +using namespace opengl; + +const u32 BufferedDrawer::m_bufMaxSize = 4194304; + +BufferedDrawer::BufferedDrawer(const GLInfo & _glinfo, CachedVertexAttribArray * _cachedAttribArray, CachedBindBuffer * _bindBuffer) +: m_glInfo(_glinfo) +, m_cachedAttribArray(_cachedAttribArray) +, m_bindBuffer(_bindBuffer) +{ + /* Init buffers for rects */ + glGenVertexArrays(1, &m_rectsBuffers.vao); + glBindVertexArray(m_rectsBuffers.vao); + _initBuffer(m_rectsBuffers.vbo, m_bufMaxSize); + m_cachedAttribArray->enableVertexAttribArray(rectAttrib::position, true); + m_cachedAttribArray->enableVertexAttribArray(rectAttrib::texcoord0, true); + m_cachedAttribArray->enableVertexAttribArray(rectAttrib::texcoord1, true); + m_cachedAttribArray->enableVertexAttribArray(rectAttrib::color, false); + glVertexAttribPointer(rectAttrib::position, 4, GL_FLOAT, GL_FALSE, sizeof(RectVertex), (const GLvoid *)(offsetof(RectVertex, x))); + glVertexAttribPointer(rectAttrib::texcoord0, 2, GL_FLOAT, GL_FALSE, sizeof(RectVertex), (const GLvoid *)(offsetof(RectVertex, s0))); + glVertexAttribPointer(rectAttrib::texcoord1, 2, GL_FLOAT, GL_FALSE, sizeof(RectVertex), (const GLvoid *)(offsetof(RectVertex, s1))); + + /* Init buffers for triangles */ + glGenVertexArrays(1, &m_trisBuffers.vao); + glBindVertexArray(m_trisBuffers.vao); + _initBuffer(m_trisBuffers.vbo, m_bufMaxSize); + _initBuffer(m_trisBuffers.ebo, m_bufMaxSize); + m_cachedAttribArray->enableVertexAttribArray(triangleAttrib::position, true); + m_cachedAttribArray->enableVertexAttribArray(triangleAttrib::color, true); + m_cachedAttribArray->enableVertexAttribArray(triangleAttrib::texcoord, true); + m_cachedAttribArray->enableVertexAttribArray(triangleAttrib::modify, true); + m_cachedAttribArray->enableVertexAttribArray(triangleAttrib::numlights, false); + glVertexAttribPointer(triangleAttrib::position, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *)(offsetof(Vertex, x))); + glVertexAttribPointer(triangleAttrib::color, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *)(offsetof(Vertex, r))); + glVertexAttribPointer(triangleAttrib::texcoord, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *)(offsetof(Vertex, s))); + //glVertexAttribPointer(SC_NUMLIGHTS, 1, GL_BYTE, GL_FALSE, sizeof(Vertex), (const GLvoid *)(offsetof(Vertex, HWLight))); + glVertexAttribPointer(triangleAttrib::modify, 4, GL_BYTE, GL_TRUE, sizeof(Vertex), (const GLvoid *)(offsetof(Vertex, modify))); +} + +void BufferedDrawer::_initBuffer(Buffer & _buffer, GLuint _bufSize) +{ + _buffer.size = _bufSize; + glGenBuffers(1, &_buffer.handle); + m_bindBuffer->bind(Parameter(_buffer.type), ObjectHandle(_buffer.handle)); + if (m_glInfo.bufferStorage) { + glBufferStorage(_buffer.type, _bufSize, nullptr, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); + _buffer.data = (GLubyte*)glMapBufferRange(_buffer.type, 0, _bufSize, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); + } else { + glBufferData(_buffer.type, _bufSize, nullptr, GL_DYNAMIC_DRAW); + } +} + +BufferedDrawer::~BufferedDrawer() +{ + m_bindBuffer->bind(Parameter(GL_ARRAY_BUFFER), ObjectHandle()); + m_bindBuffer->bind(Parameter(GL_ELEMENT_ARRAY_BUFFER), ObjectHandle()); + GLuint buffers[3] = { m_rectsBuffers.vbo.handle, m_trisBuffers.vbo.handle, m_trisBuffers.ebo.handle }; + glDeleteBuffers(3, buffers); + glBindVertexArray(0); + GLuint arrays[2] = { m_rectsBuffers.vao, m_trisBuffers.vao }; + glDeleteVertexArrays(2, arrays); +} + +void BufferedDrawer::_updateBuffer(Buffer & _buffer, u32 _dataSize, const void * _data) +{ + if (_buffer.offset + _dataSize > _buffer.size) { + _buffer.offset = 0; + _buffer.pos = 0; + } + + if (m_glInfo.bufferStorage) { + memcpy(&_buffer.data[_buffer.offset], _data, _dataSize); + } + else { + m_bindBuffer->bind(Parameter(GL_ARRAY_BUFFER), ObjectHandle(_buffer.handle)); + void* buffer_pointer = glMapBufferRange(GL_ARRAY_BUFFER, _buffer.offset, _dataSize, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT); + memcpy(buffer_pointer, _data, _dataSize); + glUnmapBuffer(GL_ARRAY_BUFFER); + } +} + +void BufferedDrawer::_updateRectBuffer(const graphics::Context::DrawRectParameters & _params) +{ + const BuffersType type = BuffersType::rects; + if (m_type != type) { + glBindVertexArray(m_rectsBuffers.vao); + m_type = type; + } + + Buffer & buffer = m_rectsBuffers.vbo; + const size_t dataSize = _params.verticesCount * sizeof(RectVertex); + const u32 crc = CRC_Calculate(0xFFFFFFFF, _params.vertices, dataSize); + + auto iter = m_rectBufferOffsets.find(crc); + if (iter != m_rectBufferOffsets.end()) { + buffer.pos = iter->second; + return; + } + + _updateBuffer(buffer, dataSize, _params.vertices); + if (buffer.pos == 0) + m_rectBufferOffsets.clear(); + + buffer.offset += dataSize; + buffer.pos = buffer.offset / sizeof(RectVertex); + m_rectBufferOffsets[crc] = buffer.pos; +} + + +void BufferedDrawer::drawRects(const graphics::Context::DrawRectParameters & _params) +{ + _updateRectBuffer(_params); + + glVertexAttrib4fv(rectAttrib::color, _params.rectColor.data()); + + glDrawArrays(GLenum(_params.mode), m_rectsBuffers.vbo.pos - _params.verticesCount, _params.verticesCount); +} + +void BufferedDrawer::_convertFromSPVertex(bool _flatColors, u32 _count, const SPVertex * _data) +{ + for (u32 i = 0; i < _count; ++i) { + const SPVertex & src = _data[i]; + Vertex & dst = m_vertices[i]; + dst.x = src.x; + dst.y = src.y; + dst.z = src.z; + dst.w = src.w; + if (_flatColors) { + dst.r = src.flat_r; + dst.g = src.flat_g; + dst.b = src.flat_b; + dst.a = src.flat_a; + } else { + dst.r = src.r; + dst.g = src.g; + dst.b = src.b; + dst.a = src.a; + } + dst.s = src.s; + dst.t = src.t; + dst.modify = src.modify; + } +} + +void BufferedDrawer::_updateTrianglesBuffers(const graphics::Context::DrawTriangleParameters & _params) +{ + const BuffersType type = BuffersType::triangles; + + if (m_type != type) { + glBindVertexArray(m_trisBuffers.vao); + m_type = type; + } + + _convertFromSPVertex(_params.flatColors, _params.verticesCount, _params.vertices); + const GLsizeiptr vboDataSize = _params.verticesCount * sizeof(Vertex); + Buffer & vboBuffer = m_trisBuffers.vbo; + _updateBuffer(vboBuffer, vboDataSize, m_vertices); + vboBuffer.offset += vboDataSize; + vboBuffer.pos += _params.verticesCount; + + if (_params.elements == nullptr) + return; + + const GLsizeiptr eboDataSize = sizeof(GLubyte) * _params.elementsCount; + Buffer & eboBuffer = m_trisBuffers.ebo; + _updateBuffer(eboBuffer, eboDataSize, _params.elements); + eboBuffer.offset += eboDataSize; + eboBuffer.pos += _params.elementsCount; +} + +void BufferedDrawer::drawTriangles(const graphics::Context::DrawTriangleParameters & _params) +{ + _updateTrianglesBuffers(_params); + + if (config.generalEmulation.enableHWLighting != 0) + glVertexAttrib1f(triangleAttrib::numlights, GLfloat(_params.vertices[0].HWLight)); + + if (_params.elements == nullptr) { + glDrawArrays(GLenum(_params.mode), m_trisBuffers.vbo.pos - _params.verticesCount, _params.verticesCount); + return; + } + + glDrawElementsBaseVertex(GLenum(_params.mode), _params.elementsCount, GL_UNSIGNED_BYTE, + (char*)nullptr + m_trisBuffers.ebo.pos - _params.elementsCount, m_trisBuffers.vbo.pos - _params.verticesCount); +} + +void BufferedDrawer::drawLine(f32 _width, SPVertex * _vertices) +{ + const BuffersType type = BuffersType::triangles; + + if (m_type != type) { + glBindVertexArray(m_trisBuffers.vao); + m_type = type; + } + + _convertFromSPVertex(false, 2, _vertices); + const GLsizeiptr vboDataSize = 2 * sizeof(Vertex); + Buffer & vboBuffer = m_trisBuffers.vbo; + _updateBuffer(vboBuffer, vboDataSize, m_vertices); + vboBuffer.offset += vboDataSize; + vboBuffer.pos += 2; + + glDrawArrays(GL_LINES, m_trisBuffers.vbo.pos - 2, 2); +} diff --git a/src/Graphics/OpenGLContext/opengl_BufferedDrawer.h b/src/Graphics/OpenGLContext/opengl_BufferedDrawer.h new file mode 100644 index 00000000..41856a8c --- /dev/null +++ b/src/Graphics/OpenGLContext/opengl_BufferedDrawer.h @@ -0,0 +1,102 @@ +#pragma once +#include +#include "opengl_GLInfo.h" +#include "opengl_GraphicsDrawer.h" +#include "opengl_CachedFunctions.h" + +namespace opengl { + + class BufferedDrawer : public GraphicsDrawer + { + public: + BufferedDrawer(const GLInfo & _glinfo, CachedVertexAttribArray * _cachedAttribArray, + CachedBindBuffer * _bindBuffer); + ~BufferedDrawer(); + + void drawTriangles(const graphics::Context::DrawTriangleParameters & _params) override; + + void drawRects(const graphics::Context::DrawRectParameters & _params) override; + + void drawLine(f32 _width, SPVertex * _vertices) override; + + private: + void _updateRectBuffer(const graphics::Context::DrawRectParameters & _params); + void _updateTrianglesBuffers(const graphics::Context::DrawTriangleParameters & _params); + + enum class BuffersType { + none, + rects, + triangles + }; + + struct Buffer { + Buffer(GLenum _type) : type(_type) {} + + GLenum type; + GLuint handle = 0; + GLintptr offset = 0; + GLint pos = 0; + GLuint size = 0; + GLubyte * data = nullptr; + }; + + struct RectBuffers { + GLuint vao = 0; + Buffer vbo = Buffer(GL_ARRAY_BUFFER); + }; + + struct TrisBuffers { + GLuint vao = 0; + Buffer vbo = Buffer(GL_ARRAY_BUFFER); + Buffer ebo = Buffer(GL_ELEMENT_ARRAY_BUFFER); + }; + + struct Vertex + { + f32 x, y, z, w; + f32 r, g, b, a; + f32 s, t; + u32 modify; + }; + + void _initBuffer(Buffer & _buffer, GLuint _bufSize); + void _updateBuffer(Buffer & _buffer, u32 _dataSize, const void * _data); + void _convertFromSPVertex(bool _flatColors, u32 _count, const SPVertex * _data); + + const GLInfo & m_glInfo; + CachedVertexAttribArray * m_cachedAttribArray; + CachedBindBuffer * m_bindBuffer; + + RectBuffers m_rectsBuffers; + TrisBuffers m_trisBuffers; + BuffersType m_type = BuffersType::none; + + Vertex m_vertices[VERTBUFF_SIZE]; + + typedef std::unordered_map BufferOffsets; + BufferOffsets m_rectBufferOffsets; + + /* + GLuint m_vao; + + + enum { + TRI_VBO = 0, + RECT_VBO, + IBO, + BO_COUNT + }; + GLuint m_bufObj[BO_COUNT]; + GLenum m_bufType[BO_COUNT]; + char* m_bufData[BO_COUNT]; + u32 m_bufOffset[BO_COUNT]; + u32 m_bufFormatSize[BO_COUNT]; + u32 m_bufMaxSize; + GLbitfield m_bufAccess; + GLbitfield m_bufMapAccess; + */ + + static const u32 m_bufMaxSize; + }; + +} diff --git a/src/Graphics/OpenGLContext/opengl_ContextImpl.cpp b/src/Graphics/OpenGLContext/opengl_ContextImpl.cpp index 73f95b73..1a2ab237 100644 --- a/src/Graphics/OpenGLContext/opengl_ContextImpl.cpp +++ b/src/Graphics/OpenGLContext/opengl_ContextImpl.cpp @@ -2,6 +2,7 @@ #include #include #include "opengl_ContextImpl.h" +#include "opengl_BufferedDrawer.h" #include "opengl_UnbufferedDrawer.h" #include "opengl_DummyTextDrawer.h" #include "opengl_ColorBufferReaderWithPixelBuffer.h" @@ -58,7 +59,10 @@ void ContextImpl::init() } { - m_graphicsDrawer.reset(new UnbufferedDrawer(m_glInfo, m_cachedFunctions->getCachedVertexAttribArray())); + if ((m_glInfo.isGLESX && (m_glInfo.bufferStorage && m_glInfo.majorVersion * 10 + m_glInfo.minorVersion > 32)) || !m_glInfo.isGLESX) + m_graphicsDrawer.reset(new BufferedDrawer(m_glInfo, m_cachedFunctions->getCachedVertexAttribArray(), m_cachedFunctions->getCachedBindBuffer())); + else + m_graphicsDrawer.reset(new UnbufferedDrawer(m_glInfo, m_cachedFunctions->getCachedVertexAttribArray())); m_textDrawer.reset(new DummyTextDrawer); } @@ -72,7 +76,6 @@ void ContextImpl::init() void ContextImpl::destroy() { - m_cachedFunctions.reset(); m_createTexture.reset(); m_init2DTexture.reset(); m_set2DTextureParameters.reset(); @@ -81,9 +84,10 @@ void ContextImpl::destroy() m_createRenderbuffer.reset(); m_initRenderbuffer.reset(); m_addFramebufferRenderTarget.reset(); - - + m_graphicsDrawer.reset(); m_combinerProgramBuilder.reset(); + + m_cachedFunctions.reset(); } void ContextImpl::enable(graphics::EnableParam _parameter, bool _enable) diff --git a/src/mupen64plus-video-gliden64.mk b/src/mupen64plus-video-gliden64.mk index a948a0ed..e09d83ae 100644 --- a/src/mupen64plus-video-gliden64.mk +++ b/src/mupen64plus-video-gliden64.mk @@ -84,6 +84,7 @@ MY_LOCAL_SRC_FILES := \ $(SRCDIR)/Graphics/CombinerProgram.cpp \ $(SRCDIR)/Graphics/OpenGLContext/GLFunctions.cpp \ $(SRCDIR)/Graphics/OpenGLContext/opengl_Attributes.cpp \ + $(SRCDIR)/Graphics/OpenGLContext/opengl_BufferedDrawer.cpp \ $(SRCDIR)/Graphics/OpenGLContext/opengl_BufferManipulationObjectFactory.cpp \ $(SRCDIR)/Graphics/OpenGLContext/opengl_CachedFunctions.cpp \ $(SRCDIR)/Graphics/OpenGLContext/opengl_ColorBufferReaderWithBufferStorage.cpp \