mirror of
https://github.com/love2d/love.git
synced 2026-08-15 15:51:12 +02:00
Always use explicitly typed buffers, even in internal code
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 &)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user