git.ucc.asn.au
/
ipdf
/
code.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
My eyes, they burn! Also runs faster, slightly less buggy.
[ipdf/code.git]
/
src
/
graphicsbuffer.cpp
diff --git
a/src/graphicsbuffer.cpp
b/src/graphicsbuffer.cpp
index
37d9b12
..
02a8f7c
100644
(file)
--- a/
src/graphicsbuffer.cpp
+++ b/
src/graphicsbuffer.cpp
@@
-36,7
+36,7
@@
static GLenum BufferUsageToGLUsage(GraphicsBuffer::BufferUsage buffer_usage)
usage = GL_STREAM_COPY;
break;
default:
usage = GL_STREAM_COPY;
break;
default:
- SDL_assert(false && "Unknown buffer usage type.");
+ SDL_assert(false && "Unknown buffer usage type.");
//WTF?
usage = GL_DYNAMIC_DRAW;
}
return usage;
usage = GL_DYNAMIC_DRAW;
}
return usage;
@@
-56,6
+56,8
@@
static GLenum BufferTypeToGLType(GraphicsBuffer::BufferType buffer_type)
return GL_PIXEL_UNPACK_BUFFER;
case GraphicsBuffer::BufferTypeUniform:
return GL_UNIFORM_BUFFER;
return GL_PIXEL_UNPACK_BUFFER;
case GraphicsBuffer::BufferTypeUniform:
return GL_UNIFORM_BUFFER;
+ case GraphicsBuffer::BufferTypeTexture:
+ return GL_TEXTURE_BUFFER;
case GraphicsBuffer::BufferTypeDrawIndirect:
return GL_DRAW_INDIRECT_BUFFER;
default:
case GraphicsBuffer::BufferTypeDrawIndirect:
return GL_DRAW_INDIRECT_BUFFER;
default:
@@
-66,11
+68,13
@@
static GLenum BufferTypeToGLType(GraphicsBuffer::BufferType buffer_type)
GraphicsBuffer::GraphicsBuffer()
{
m_invalidated = true;
GraphicsBuffer::GraphicsBuffer()
{
m_invalidated = true;
- m_map_pointer =
nullptr
;
+ m_map_pointer =
NULL
;
m_buffer_size = 0;
m_buffer_shape_dirty = true;
m_buffer_handle = 0;
m_buffer_usage = BufferUsageDynamicDraw;
m_buffer_size = 0;
m_buffer_shape_dirty = true;
m_buffer_handle = 0;
m_buffer_usage = BufferUsageDynamicDraw;
+ m_faking_map = false;
+ m_name = "Unnamed Buffer";
SetUsage(BufferUsageStaticDraw);
}
SetUsage(BufferUsageStaticDraw);
}
@@
-88,6
+92,11
@@
void GraphicsBuffer::SetType(GraphicsBuffer::BufferType bufType)
m_buffer_type = bufType;
}
m_buffer_type = bufType;
}
+void GraphicsBuffer::SetName(const char *name)
+{
+ m_name = name;
+}
+
void GraphicsBuffer::SetUsage(GraphicsBuffer::BufferUsage bufUsage)
{
if (bufUsage != m_buffer_usage)
void GraphicsBuffer::SetUsage(GraphicsBuffer::BufferUsage bufUsage)
{
if (bufUsage != m_buffer_usage)
@@
-103,28
+112,32
@@
void GraphicsBuffer::Invalidate()
if (!m_buffer_shape_dirty)
{
// Orphan the block of memory we're pointing to.
if (!m_buffer_shape_dirty)
{
// Orphan the block of memory we're pointing to.
- Upload(m_buffer_size,
nullptr
);
+ Upload(m_buffer_size,
NULL
);
}
// Apparently not supported.
//glInvalidateBufferData(m_buffer_handle);
}
}
// Apparently not supported.
//glInvalidateBufferData(m_buffer_handle);
}
-
void GraphicsBuffer::RecreateBuffer(
)
+
bool GraphicsBuffer::RecreateBuffer(const void *data
)
{
// If the buffer is not dirty, don't recreate it.
{
// If the buffer is not dirty, don't recreate it.
- if (!m_buffer_shape_dirty) return;
+ if (!m_buffer_shape_dirty) return
false
;
// If the buffer is mapped, don't recreate it.
// If the buffer is mapped, don't recreate it.
- if (
m_map_pointer) return
;
+ if (
!m_faking_map && m_map_pointer) return false
;
// If the buffer has data in it we need, don't recreate it.
// If the buffer has data in it we need, don't recreate it.
- if (!m_invalidated) return;
+ if (!m_invalidated) return
false
;
if (m_buffer_handle)
{
glDeleteBuffers(1, &m_buffer_handle);
}
if (m_buffer_handle)
{
glDeleteBuffers(1, &m_buffer_handle);
}
- glGenBuffers(1, &m_buffer_handle);
- m_buffer_shape_dirty = false;
if (m_buffer_size)
if (m_buffer_size)
- Upload(m_buffer_size, nullptr);
+ {
+ glGenBuffers(1, &m_buffer_handle);
+ glObjectLabel(GL_BUFFER, m_buffer_handle, -1, m_name);
+ m_buffer_shape_dirty = false;
+ Upload(m_buffer_size, data);
+ }
+ return true;
}
void* GraphicsBuffer::Map(bool read, bool write, bool invalidate)
}
void* GraphicsBuffer::Map(bool read, bool write, bool invalidate)
@@
-145,6
+158,18
@@
void* GraphicsBuffer::Map(bool read, bool write, bool invalidate)
if (m_map_pointer)
Warn("Tried to map already mapped buffer!");
if (m_map_pointer)
Warn("Tried to map already mapped buffer!");
+ // Intel really doesn't seem to like this.
+ if (!m_buffer_size)
+ return (m_map_pointer = 0);
+
+
+ if (!read && m_buffer_usage == BufferUsage::BufferUsageStaticDraw)
+ {
+ m_map_pointer = malloc(m_buffer_size);
+ m_faking_map = true;
+ return m_map_pointer;
+ }
+
RecreateBuffer();
Bind();
RecreateBuffer();
Bind();
@@
-162,6
+187,13
@@
void* GraphicsBuffer::MapRange(int offset, int length, bool read, bool write, bo
if (m_map_pointer)
Warn("Tried to map already mapped buffer!");
if (m_map_pointer)
Warn("Tried to map already mapped buffer!");
+ // This sometimes makes Intel corrupt memory?
+ if (!length) return (m_map_pointer = 0);
+
+ if ((size_t)(length + offset) > m_buffer_size)
+ Fatal("Tried to map outside of range!");
+
+
RecreateBuffer();
Bind();
RecreateBuffer();
Bind();
@@
-174,9
+206,23
@@
void GraphicsBuffer::UnMap()
{
GLenum target = BufferTypeToGLType(m_buffer_type);
{
GLenum target = BufferTypeToGLType(m_buffer_type);
+ // If we're not mapped, unmapping is a no-op.
+ if (!m_map_pointer)
+ return;
+
+ if (m_faking_map)
+ {
+ Upload(m_buffer_size, m_map_pointer);
+ free(m_map_pointer);
+ m_map_pointer = NULL;
+ m_invalidated = false;
+ m_faking_map = false;
+ return;
+ }
+
Bind();
glUnmapBuffer(target);
Bind();
glUnmapBuffer(target);
- m_map_pointer =
nullptr
;
+ m_map_pointer =
NULL
;
m_invalidated = false;
}
m_invalidated = false;
}
@@
-187,13
+233,14
@@
void GraphicsBuffer::Upload(size_t length, const void* data)
GLenum usage = BufferUsageToGLUsage(m_buffer_usage);
m_invalidated = true;
GLenum usage = BufferUsageToGLUsage(m_buffer_usage);
m_invalidated = true;
- RecreateBuffer();
-
- Bind();
- glBufferData(target, length, data, usage);
- if (data != nullptr)
- m_invalidated = false;
m_buffer_size = length;
m_buffer_size = length;
+ if (!RecreateBuffer(data))
+ {
+ Bind();
+ glBufferData(target, length+1, data, usage);
+ }
+ if (data != NULL)
+ m_invalidated = false;
}
void GraphicsBuffer::UploadRange(size_t length, intptr_t offset, const void* data)
}
void GraphicsBuffer::UploadRange(size_t length, intptr_t offset, const void* data)
@@
-209,23
+256,33
@@
void GraphicsBuffer::UploadRange(size_t length, intptr_t offset, const void* dat
void GraphicsBuffer::Resize(size_t length)
{
void GraphicsBuffer::Resize(size_t length)
{
+ if (!m_buffer_size)
+ {
+ m_invalidated = true;
+ m_buffer_size = length;
+ return;
+ }
if (m_invalidated)
{
m_buffer_size = length;
if (m_invalidated)
{
m_buffer_size = length;
- RecreateBuffer();
+ m_buffer_shape_dirty = true;
}
else
{
}
else
{
+ size_t oldsize = m_buffer_size;
+ glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, -1, "Resizing buffer.");
+ glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0, NULL, GL_TRUE);
// Create a new buffer and copy the old data into it.
UnMap();
GLuint old_buffer = m_buffer_handle;
glGenBuffers(1, &m_buffer_handle);
// Create a new buffer and copy the old data into it.
UnMap();
GLuint old_buffer = m_buffer_handle;
glGenBuffers(1, &m_buffer_handle);
- Upload(length,
nullptr
);
+ Upload(length,
NULL
);
glBindBuffer(GL_COPY_READ_BUFFER, old_buffer);
glBindBuffer(GL_COPY_WRITE_BUFFER, m_buffer_handle);
glBindBuffer(GL_COPY_READ_BUFFER, old_buffer);
glBindBuffer(GL_COPY_WRITE_BUFFER, m_buffer_handle);
- glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0,
m_buffer_
size);
+ glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0,
old
size);
glDeleteBuffers(1, &old_buffer);
m_buffer_size = length;
glDeleteBuffers(1, &old_buffer);
m_buffer_size = length;
+ glPopDebugGroup();
}
}
}
}
@@
-237,3
+294,7
@@
void GraphicsBuffer::Bind() const
glBindBuffer(BufferTypeToGLType(m_buffer_type), m_buffer_handle);
}
glBindBuffer(BufferTypeToGLType(m_buffer_type), m_buffer_handle);
}
+void GraphicsBuffer::BindRange(size_t start, size_t size) const
+{
+ glBindBufferRange(BufferTypeToGLType(m_buffer_type), 0, m_buffer_handle, start, size);
+}
UCC
git Repository :: git.ucc.asn.au