Always use explicitly typed buffers, even in internal code

This commit is contained in:
Alex Szpakowski
2020-02-23 16:30:55 -04:00
parent 2828761060
commit 1ddfcd4cc8
12 changed files with 88 additions and 45 deletions
+62 -6
View File
@@ -28,7 +28,7 @@ namespace graphics
love::Type Buffer::type("GraphicsBuffer", &Object::type);
Buffer::Buffer(const Settings &settings, const void */*data*/, size_t size)
Buffer::Buffer(Graphics *gfx, const Settings &settings, const std::vector<DataDeclaration> &bufferformat, size_t size, size_t arraylength)
: arrayLength(0)
, arrayStride(0)
, size(size)
@@ -36,11 +36,6 @@ Buffer::Buffer(const Settings &settings, const void */*data*/, size_t size)
, usage(settings.usage)
, mapFlags(settings.mapFlags)
, mapped(false)
{
}
Buffer::Buffer(Graphics *gfx, const Settings &settings, const std::vector<DataDeclaration> &bufferformat, const void *data, size_t size, size_t arraylength)
: Buffer(settings, data, size)
{
if (size == 0 && arraylength == 0)
throw love::Exception("Size or array length must be specified.");
@@ -128,5 +123,66 @@ int Buffer::getDataMemberIndex(const std::string &name) const
return -1;
}
std::vector<Buffer::DataDeclaration> Buffer::getCommonFormatDeclaration(CommonFormat format)
{
switch (format)
{
case CommonFormat::NONE:
return {};
case CommonFormat::XYf:
return {
{"VertexPosition", DATAFORMAT_FLOAT_VEC2}
};
case CommonFormat::XYZf:
return {
{"VertexPosition", DATAFORMAT_FLOAT_VEC3}
};
case CommonFormat::RGBAub:
return {
{"VertexColor", DATAFORMAT_UNORM8_VEC4}
};
case CommonFormat::STf_RGBAub:
return {
{"VertexTexCoord", DATAFORMAT_FLOAT_VEC2},
{"VertexColor", DATAFORMAT_UNORM8_VEC4},
};
case CommonFormat::STPf_RGBAub:
return {
{"VertexTexCoord", DATAFORMAT_FLOAT_VEC3},
{"VertexColor", DATAFORMAT_UNORM8_VEC4},
};
case CommonFormat::XYf_STf:
return {
{"VertexPosition", DATAFORMAT_FLOAT_VEC2},
{"VertexTexCoord", DATAFORMAT_FLOAT_VEC2},
};
case CommonFormat::XYf_STPf:
return {
{"VertexPosition", DATAFORMAT_FLOAT_VEC2},
{"VertexTexCoord", DATAFORMAT_FLOAT_VEC3},
};
case CommonFormat::XYf_STf_RGBAub:
return {
{"VertexPosition", DATAFORMAT_FLOAT_VEC2},
{"VertexTexCoord", DATAFORMAT_FLOAT_VEC2},
{"VertexColor", DATAFORMAT_UNORM8_VEC4},
};
case CommonFormat::XYf_STus_RGBAub:
return {
{"VertexPosition", DATAFORMAT_FLOAT_VEC2},
{"VertexTexCoord", DATAFORMAT_UNORM16_VEC2},
{"VertexColor", DATAFORMAT_UNORM8_VEC4},
};
case CommonFormat::XYf_STPf_RGBAub:
return {
{"VertexPosition", DATAFORMAT_FLOAT_VEC2},
{"VertexTexCoord", DATAFORMAT_FLOAT_VEC2},
{"VertexColor", DATAFORMAT_UNORM8_VEC4},
};
}
return {};
}
} // graphics
} // love
+3 -2
View File
@@ -103,8 +103,7 @@ public:
{}
};
Buffer(const Settings &settings, const void *data, size_t size);
Buffer(Graphics *gfx, const Settings &settings, const std::vector<DataDeclaration> &format, const void *data, size_t size, size_t arraylength);
Buffer(Graphics *gfx, const Settings &settings, const std::vector<DataDeclaration> &format, size_t size, size_t arraylength);
virtual ~Buffer();
size_t getSize() const { return size; }
@@ -154,6 +153,8 @@ public:
**/
virtual void copyTo(size_t offset, size_t size, Buffer *other, size_t otheroffset) = 0;
static std::vector<DataDeclaration> getCommonFormatDeclaration(CommonFormat format);
class Mapper
{
public:
+1 -1
View File
@@ -265,7 +265,7 @@ Shader *Graphics::newShader(const std::string &vertex, const std::string &pixel)
Buffer *Graphics::newBuffer(const Buffer::Settings &settings, DataFormat format, const void *data, size_t size, size_t arraylength)
{
std::vector<Buffer::DataDeclaration> dataformat = {{"", format, 0}};
return newBuffer(settings, format, data, size, arraylength);
return newBuffer(settings, dataformat, data, size, arraylength);
}
Mesh *Graphics::newMesh(const std::vector<Vertex> &vertices, PrimitiveType drawmode, BufferUsage usage)
-1
View File
@@ -439,7 +439,6 @@ public:
ShaderStage *newShaderStage(ShaderStage::StageType stage, const std::string &source);
Shader *newShader(const std::string &vertex, const std::string &pixel);
virtual Buffer *newBuffer(const Buffer::Settings &settings, const void *data, size_t size) = 0;
virtual Buffer *newBuffer(const Buffer::Settings &settings, const std::vector<Buffer::DataDeclaration> &format, const void *data, size_t size, size_t arraylength) = 0;
virtual Buffer *newBuffer(const Buffer::Settings &settings, DataFormat format, const void *data, size_t size, size_t arraylength);
+7 -4
View File
@@ -344,15 +344,16 @@ void Mesh::setVertexMap(const std::vector<uint32> &map)
size_t maxval = getVertexCount();
IndexDataType datatype = getIndexDataTypeFromMax(maxval);
DataFormat dataformat = getIndexDataFormat(datatype);
// Calculate the size in bytes of the index buffer data.
size_t size = map.size() * getIndexDataSize(datatype);
if (indexBuffer.get() == nullptr || size > indexBuffer->getSize())
if (indexBuffer.get() == nullptr || size > indexBuffer->getSize() || indexBuffer->getDataMember(0).decl.format != dataformat)
{
auto gfx = Module::getInstance<graphics::Graphics>(Module::M_GRAPHICS);
Buffer::Settings settings(Buffer::TYPEFLAG_INDEX, Buffer::MAP_READ, vertexBuffer->getUsage());
indexBuffer.set(gfx->newBuffer(settings, nullptr, size), Acquire::NORETAIN);
indexBuffer.set(gfx->newBuffer(settings, dataformat, nullptr, size, 0), Acquire::NORETAIN);
}
useIndexBuffer = true;
@@ -380,11 +381,13 @@ void Mesh::setVertexMap(const std::vector<uint32> &map)
void Mesh::setVertexMap(IndexDataType datatype, const void *data, size_t datasize)
{
if (indexBuffer.get() == nullptr || datasize > indexBuffer->getSize())
DataFormat dataformat = getIndexDataFormat(datatype);
if (indexBuffer.get() == nullptr || datasize > indexBuffer->getSize() || indexBuffer->getDataMember(0).decl.format != dataformat)
{
auto gfx = Module::getInstance<graphics::Graphics>(Module::M_GRAPHICS);
Buffer::Settings settings(Buffer::TYPEFLAG_INDEX, Buffer::MAP_READ, vertexBuffer->getUsage());
indexBuffer.set(gfx->newBuffer(settings, nullptr, datasize), Acquire::NORETAIN);
indexBuffer.set(gfx->newBuffer(settings, dataformat, nullptr, datasize, 0), Acquire::NORETAIN);
}
indexCount = datasize / getIndexDataSize(datatype);
+2 -1
View File
@@ -192,7 +192,8 @@ void ParticleSystem::createBuffers(size_t size)
size_t bytes = sizeof(Vertex) * size * 4;
Buffer::Settings settings(Buffer::TYPEFLAG_VERTEX, 0, BUFFERUSAGE_STREAM);
buffer = gfx->newBuffer(settings, nullptr, bytes);
auto decl = Buffer::getCommonFormatDeclaration(CommonFormat::XYf_STf_RGBAub);
buffer = gfx->newBuffer(settings, decl, nullptr, bytes, 0);
}
catch (std::bad_alloc &)
{
+4 -2
View File
@@ -65,7 +65,8 @@ SpriteBatch::SpriteBatch(Graphics *gfx, Texture *texture, int size, BufferUsage
size_t vertex_size = vertex_stride * 4 * size;
Buffer::Settings settings(Buffer::TYPEFLAG_VERTEX, Buffer::MAP_EXPLICIT_RANGE_MODIFY, usage);
array_buf = gfx->newBuffer(settings, nullptr, vertex_size);
auto decl = Buffer::getCommonFormatDeclaration(vertex_format);
array_buf = gfx->newBuffer(settings, decl, nullptr, vertex_size, 0);
}
SpriteBatch::~SpriteBatch()
@@ -220,7 +221,8 @@ void SpriteBatch::setBufferSize(int newsize)
{
auto gfx = Module::getInstance<graphics::Graphics>(Module::M_GRAPHICS);
Buffer::Settings settings(array_buf->getTypeFlags(), array_buf->getMapFlags(), array_buf->getUsage());
new_array_buf = gfx->newBuffer(settings, nullptr, vertex_size);
auto decl = Buffer::getCommonFormatDeclaration(vertex_format);
new_array_buf = gfx->newBuffer(settings, decl, nullptr, vertex_size, 0);
// Copy as much of the old data into the new GLBuffer as can fit.
size_t copy_size = vertex_stride * 4 * new_next;
+2 -1
View File
@@ -62,7 +62,8 @@ void Text::uploadVertices(const std::vector<Font::GlyphVertex> &vertices, size_t
auto gfx = Module::getInstance<Graphics>(Module::M_GRAPHICS);
Buffer::Settings settings(Buffer::TYPEFLAG_VERTEX, 0, BUFFERUSAGE_DYNAMIC);
Buffer *new_buffer = gfx->newBuffer(settings, nullptr, newsize);
auto decl = Buffer::getCommonFormatDeclaration(Font::vertexFormat);
Buffer *new_buffer = gfx->newBuffer(settings, decl, nullptr, newsize, 0);
if (vertex_buffer != nullptr)
vertex_buffer->copyTo(0, vertex_buffer->getSize(), new_buffer, 0);
+7 -18
View File
@@ -35,25 +35,8 @@ namespace graphics
namespace opengl
{
Buffer::Buffer(const Settings &settings, const void *data, size_t size)
: love::graphics::Buffer(settings, data, size)
{
initialize(data);
}
Buffer::Buffer(love::graphics::Graphics *gfx, const Settings &settings, const std::vector<DataDeclaration> &format, const void *data, size_t size, size_t arraylength)
: love::graphics::Buffer(gfx, settings, format, data, size, arraylength)
{
initialize(data);
}
Buffer::~Buffer()
{
unloadVolatile();
delete[] memoryMap;
}
void Buffer::initialize(const void *data)
: love::graphics::Buffer(gfx, settings, format, size, arraylength)
{
if (typeFlags & TYPEFLAG_VERTEX)
mapType = BUFFERTYPE_VERTEX;
@@ -81,6 +64,12 @@ void Buffer::initialize(const void *data)
}
}
Buffer::~Buffer()
{
unloadVolatile();
delete[] memoryMap;
}
bool Buffer::loadVolatile()
{
return load(true);
-3
View File
@@ -42,7 +42,6 @@ class Buffer final : public love::graphics::Buffer, public Volatile
{
public:
Buffer(const Settings &settings, const void *data, size_t size);
Buffer(love::graphics::Graphics *gfx, const Settings &settings, const std::vector<DataDeclaration> &format, const void *data, size_t size, size_t arraylength);
virtual ~Buffer();
@@ -60,8 +59,6 @@ public:
private:
void initialize(const void *data);
bool load(bool restore);
void unmapStatic(size_t offset, size_t size);
-5
View File
@@ -145,11 +145,6 @@ love::graphics::Shader *Graphics::newShaderInternal(love::graphics::ShaderStage
return new Shader(vertex, pixel);
}
love::graphics::Buffer *Graphics::newBuffer(const Buffer::Settings &settings, const void *data, size_t size)
{
return new Buffer(settings, data, size);
}
love::graphics::Buffer *Graphics::newBuffer(const Buffer::Settings &settings, const std::vector<Buffer::DataDeclaration> &format, const void *data, size_t size, size_t arraylength)
{
return new Buffer(this, settings, format, data, size, arraylength);
-1
View File
@@ -60,7 +60,6 @@ public:
const char *getName() const override;
love::graphics::Texture *newTexture(const Texture::Settings &settings, const Texture::Slices *data = nullptr) override;
love::graphics::Buffer *newBuffer(const Buffer::Settings &settings, const void *data, size_t size) override;
love::graphics::Buffer *newBuffer(const Buffer::Settings &settings, const std::vector<Buffer::DataDeclaration> &format, const void *data, size_t size, size_t arraylength) override;
void setViewportSize(int width, int height, int pixelwidth, int pixelheight) override;