X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Fgraphicsbuffer.h;h=4053f9079ab67e0b1b89b7ad5504671241fbdf6b;hp=d74d344ac6563bae3da9773fe41ebea3dc964f2f;hb=398e6b2732decd57cdb57deb3f91d3ff08669e8b;hpb=bdda0103bf26d215d41093316ca0e15cd67fec1d diff --git a/src/graphicsbuffer.h b/src/graphicsbuffer.h index d74d344..4053f90 100644 --- a/src/graphicsbuffer.h +++ b/src/graphicsbuffer.h @@ -1,15 +1,14 @@ #ifndef _GRAPHICSBUFFER_H #define _GRAPHICSBUFFER_H -#include -#define GL_GLEXT_PROTOTYPES -#include +#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 @@ -40,6 +40,7 @@ namespace IPDF GraphicsBuffer(); ~GraphicsBuffer(); + void SetName(const char *name); void SetType(BufferType bufType); void SetUsage(BufferUsage bufUsage); @@ -53,15 +54,28 @@ 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; + void BindRange(size_t start, size_t size) 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; + const char *m_name; }; }