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 \