CS Lab machines have met their nemesis
[ipdf/code.git] / src / graphicsbuffer.h
index 15e5b42..fd89771 100644 (file)
@@ -1,15 +1,14 @@
 #ifndef _GRAPHICSBUFFER_H
 #define _GRAPHICSBUFFER_H
 
-#include <SDL.h>
-#define GL_GLEXT_PROTOTYPES
-#include <SDL_opengl.h>
+#include "SDL.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,7 +20,8 @@ namespace IPDF
                        BufferTypePixelPack,            // Pixel Pack buffer
                        BufferTypePixelUnpack,
                        BufferTypeUniform,              // Uniform/Constant buffer
-                       BufferTypeDrawIndirect,
+                       BufferTypeTexture,              // I was hoping to avoid this one.
+                       BufferTypeDrawIndirect
                };
                
                enum BufferUsage
@@ -52,15 +52,27 @@ namespace IPDF
                void UploadRange(size_t length, intptr_t offset, const void *data);
 
                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 = NULL);
                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