Use the lea instruction to reduce number of "inc"s
[ipdf/code.git] / src / graphicsbuffer.h
index d74d344..3dbb6fb 100644 (file)
@@ -2,14 +2,13 @@
 #define _GRAPHICSBUFFER_H
 
 #include <SDL.h>
-#define GL_GLEXT_PROTOTYPES
-#include <SDL_opengl.h>
+#include "gl_core44.h"
 
 
 namespace IPDF
 {
-       /*
-        * The "Screen" class handles managing the OS window (using SDL2).
+       /**
+        * Implementation of an OpenGL buffer, with some extra cleverness.
         */
        class GraphicsBuffer
        {
@@ -21,6 +20,7 @@ namespace IPDF
                        BufferTypePixelPack,            // Pixel Pack buffer
                        BufferTypePixelUnpack,
                        BufferTypeUniform,              // Uniform/Constant buffer
+                       BufferTypeTexture,              // I was hoping to avoid this one.
                        BufferTypeDrawIndirect,
                };
                
@@ -53,15 +53,26 @@ namespace IPDF
 
                void Resize(size_t length);
                const size_t GetSize() const { return m_buffer_size; }
+
+               void Invalidate();
+
+               // WARNING: The buffer handle can change for (almost) no reason.
+               // If you do _anything_ to the buffer, you'll need to call this
+               // again to see if we've recreated it in a vain attempt to outsmart
+               // the driver.
+               GLuint GetHandle() const { return m_buffer_handle; }
                
-               void Bind();
+               void Bind() const;
        private:
+               bool RecreateBuffer(const void *data = nullptr);
                GLuint m_buffer_handle;
                BufferType m_buffer_type;
                BufferUsage m_buffer_usage;
                void *m_map_pointer;
                size_t m_buffer_size;
                bool m_invalidated;
+               bool m_buffer_shape_dirty;
+               bool m_faking_map;
        };
 
 }

UCC git Repository :: git.ucc.asn.au