GPU: Add base functionality for GL streaming buffers

This commit is contained in:
Connor McLaughlin
2019-11-02 22:21:56 +10:00
parent c52c0608ae
commit 407fee9ec3
8 changed files with 189 additions and 59 deletions

View File

@ -40,6 +40,7 @@
<ClInclude Include="cd_image.h" />
<ClInclude Include="fifo_queue.h" />
<ClInclude Include="gl_program.h" />
<ClInclude Include="gl_stream_buffer.h" />
<ClInclude Include="gl_texture.h" />
<ClInclude Include="heap_array.h" />
<ClInclude Include="jit_code_buffer.h" />
@ -53,6 +54,7 @@
<ClCompile Include="cd_image_bin.cpp" />
<ClCompile Include="cd_image_cue.cpp" />
<ClCompile Include="gl_program.cpp" />
<ClCompile Include="gl_stream_buffer.cpp" />
<ClCompile Include="gl_texture.cpp" />
<ClCompile Include="jit_code_buffer.cpp" />
<ClCompile Include="state_wrapper.cpp" />

View File

@ -12,6 +12,7 @@
<ClInclude Include="audio_stream.h" />
<ClInclude Include="cd_xa.h" />
<ClInclude Include="heap_array.h" />
<ClInclude Include="gl_stream_buffer.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="jit_code_buffer.cpp" />
@ -23,6 +24,7 @@
<ClCompile Include="cd_xa.cpp" />
<ClCompile Include="cd_image_cue.cpp" />
<ClCompile Include="cd_image_bin.cpp" />
<ClCompile Include="gl_stream_buffer.cpp" />
</ItemGroup>
<ItemGroup>
<Natvis Include="bitfield.natvis" />

View File

@ -0,0 +1,53 @@
#include "gl_stream_buffer.h"
namespace GL {
StreamBuffer::StreamBuffer(GLenum target, GLuint buffer_id, u32 size)
: m_target(target), m_buffer_id(buffer_id), m_size(size), m_cpu_buffer(size)
{
}
StreamBuffer::~StreamBuffer()
{
glDeleteBuffers(1, &m_buffer_id);
}
void StreamBuffer::Bind()
{
glBindBuffer(m_target, m_buffer_id);
}
StreamBuffer::MappingResult StreamBuffer::Map(u32 alignment, u32 min_size)
{
return MappingResult{static_cast<void*>(m_cpu_buffer.data()), 0, m_size / alignment};
}
void StreamBuffer::Unmap(u32 used_size)
{
if (used_size == 0)
return;
glBindBuffer(m_target, m_buffer_id);
glBufferSubData(m_target, 0, used_size, m_cpu_buffer.data());
}
std::unique_ptr<StreamBuffer> StreamBuffer::Create(GLenum target, u32 size)
{
glGetError();
GLuint buffer_id;
glGenBuffers(1, &buffer_id);
glBindBuffer(target, buffer_id);
glBufferData(target, size, nullptr, GL_STREAM_DRAW);
GLenum err = glGetError();
if (err != GL_NO_ERROR)
{
glDeleteBuffers(1, &buffer_id);
return {};
}
return std::unique_ptr<StreamBuffer>(new StreamBuffer(target, buffer_id, size));
}
} // namespace GL

View File

@ -0,0 +1,42 @@
#pragma once
#include "types.h"
#include <glad.h>
#include <memory>
#include <tuple>
#include <vector>
namespace GL {
// TODO: Persistent mapping-based implementation
class StreamBuffer
{
public:
~StreamBuffer();
ALWAYS_INLINE GLuint GetGLBufferId() const { return m_buffer_id; }
ALWAYS_INLINE GLenum GetGLTarget() const { return m_target; }
ALWAYS_INLINE u32 GetSize() const { return m_size; }
void Bind();
struct MappingResult
{
void* pointer;
u32 index_aligned; // offset / alignment, suitable for base vertex
u32 space_aligned; // remaining space / alignment
};
MappingResult Map(u32 alignment, u32 min_size);
void Unmap(u32 used_size);
static std::unique_ptr<StreamBuffer> Create(GLenum target, u32 size);
private:
StreamBuffer(GLenum target, GLuint buffer_id, u32 size);
GLenum m_target;
GLuint m_buffer_id;
u32 m_size;
std::vector<u8> m_cpu_buffer;
};
} // namespace GL