Use new QTextureFileData::getDataView method

Change-Id: Ib675bfaa3fd818ef3e372bc2affd87e0d9d8f480
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
This commit is contained in:
Jonas Karlsson 2020-12-22 13:52:50 +01:00
parent 1cd696cf9e
commit dfb36c91b4
4 changed files with 16 additions and 22 deletions

View File

@ -68,14 +68,14 @@ Atlas::~Atlas()
{ {
} }
Texture *Atlas::create(const QByteArray &data, int dataLength, int dataOffset, const QSize &size) Texture *Atlas::create(QByteArrayView data, const QSize &size)
{ {
// Align reservation to 16x16, >= any compressed block size // Align reservation to 16x16, >= any compressed block size
QSize paddedSize(((size.width() + 15) / 16) * 16, ((size.height() + 15) / 16) * 16); QSize paddedSize(((size.width() + 15) / 16) * 16, ((size.height() + 15) / 16) * 16);
// No need to lock, as manager already locked it. // No need to lock, as manager already locked it.
QRect rect = m_allocator.allocate(paddedSize); QRect rect = m_allocator.allocate(paddedSize);
if (rect.width() > 0 && rect.height() > 0) { if (rect.width() > 0 && rect.height() > 0) {
Texture *t = new Texture(this, rect, data, dataLength, dataOffset, size); Texture *t = new Texture(this, rect, data, size);
m_pending_uploads << t; m_pending_uploads << t;
return t; return t;
} }
@ -109,8 +109,8 @@ void Atlas::enqueueTextureUpload(QSGRhiAtlasTexture::TextureBase *t, QRhiResourc
const QRect &r = texture->atlasSubRect(); const QRect &r = texture->atlasSubRect();
const char *rawData = texture->data().constData() + texture->dataOffset(); QRhiTextureSubresourceUploadDescription subresDesc(texture->data().constData(),
QRhiTextureSubresourceUploadDescription subresDesc(rawData, texture->sizeInBytes()); texture->sizeInBytes());
subresDesc.setSourceSize(texture->textureSize()); subresDesc.setSourceSize(texture->textureSize());
subresDesc.setDestinationTopLeft(r.topLeft()); subresDesc.setDestinationTopLeft(r.topLeft());
@ -121,14 +121,10 @@ void Atlas::enqueueTextureUpload(QSGRhiAtlasTexture::TextureBase *t, QRhiResourc
t->textureSize().width(), t->textureSize().height(), m_format); t->textureSize().width(), t->textureSize().height(), m_format);
} }
Texture::Texture(Atlas *atlas, const QRect &textureRect, const QByteArray &data, int dataLength, Texture::Texture(Atlas *atlas, const QRect &textureRect, QByteArrayView data, const QSize &size)
int dataOffset, const QSize &size)
: QSGRhiAtlasTexture::TextureBase(atlas, textureRect), : QSGRhiAtlasTexture::TextureBase(atlas, textureRect),
m_nonatlas_texture(nullptr), m_nonatlas_texture(nullptr),
m_data(data), m_data(data.toByteArray())
m_size(size),
m_dataLength(dataLength),
m_dataOffset(dataOffset)
{ {
float w = atlas->size().width(); float w = atlas->size().width();
float h = atlas->size().height(); float h = atlas->size().height();
@ -163,8 +159,6 @@ QSGTexture *Texture::removedFromAtlas(QRhiResourceUpdateBatch *) const
texData.setData(m_data); texData.setData(m_data);
texData.setSize(m_size); texData.setSize(m_size);
texData.setGLInternalFormat(static_cast<Atlas*>(m_atlas)->format()); texData.setGLInternalFormat(static_cast<Atlas*>(m_atlas)->format());
texData.setDataLength(m_dataLength);
texData.setDataOffset(m_dataOffset);
m_nonatlas_texture = new QSGCompressedTexture(texData); m_nonatlas_texture = new QSGCompressedTexture(texData);
m_nonatlas_texture->setMipmapFiltering(mipmapFiltering()); m_nonatlas_texture->setMipmapFiltering(mipmapFiltering());
m_nonatlas_texture->setFiltering(filtering()); m_nonatlas_texture->setFiltering(filtering());

View File

@ -75,7 +75,7 @@ public:
void enqueueTextureUpload(QSGRhiAtlasTexture::TextureBase *t, void enqueueTextureUpload(QSGRhiAtlasTexture::TextureBase *t,
QRhiResourceUpdateBatch *rcub) override; QRhiResourceUpdateBatch *rcub) override;
Texture *create(const QByteArray &data, int dataLength, int dataOffset, const QSize &size); Texture *create(QByteArrayView data, const QSize &size);
uint format() const { return m_format; } uint format() const { return m_format; }
@ -87,7 +87,7 @@ class Texture : public QSGRhiAtlasTexture::TextureBase
{ {
Q_OBJECT Q_OBJECT
public: public:
Texture(Atlas *atlas, const QRect &textureRect, const QByteArray &data, int dataLength, int dataOffset, const QSize &size); Texture(Atlas *atlas, const QRect &textureRect, QByteArrayView data, const QSize &size);
~Texture(); ~Texture();
QSize textureSize() const override { return m_size; } QSize textureSize() const override { return m_size; }
@ -99,16 +99,13 @@ public:
QSGTexture *removedFromAtlas(QRhiResourceUpdateBatch *) const override; QSGTexture *removedFromAtlas(QRhiResourceUpdateBatch *) const override;
const QByteArray &data() const { return m_data; } const QByteArray &data() const { return m_data; }
int sizeInBytes() const { return m_dataLength; } int sizeInBytes() const { return m_data.length(); }
int dataOffset() const { return m_dataOffset; }
private: private:
QRectF m_texture_coords_rect; QRectF m_texture_coords_rect;
mutable QSGTexture *m_nonatlas_texture; mutable QSGTexture *m_nonatlas_texture;
QByteArray m_data; QByteArray m_data;
QSize m_size; QSize m_size;
int m_dataLength;
int m_dataOffset;
}; };
} }

View File

@ -397,8 +397,11 @@ void QSGCompressedTexture::commitTextureOperations(QRhi *rhi, QRhiResourceUpdate
} }
// only upload mip level 0 since we never do mipmapping for compressed textures (for now?) // only upload mip level 0 since we never do mipmapping for compressed textures (for now?)
resourceUpdates->uploadTexture(m_texture, QRhiTextureUploadEntry(0, 0, resourceUpdates->uploadTexture(
{ m_textureData.data().constData() + m_textureData.dataOffset(), m_textureData.dataLength() })); m_texture,
QRhiTextureUploadEntry(0, 0,
QRhiTextureSubresourceUploadDescription(
m_textureData.getDataView().toByteArray())));
m_textureData = QTextureFileData(); // Release this memory, not needed anymore m_textureData = QTextureFileData(); // Release this memory, not needed anymore
} }
@ -454,7 +457,7 @@ QSGTexture *QSGCompressedTextureFactory::createTexture(QQuickWindow *window) con
int QSGCompressedTextureFactory::textureByteCount() const int QSGCompressedTextureFactory::textureByteCount() const
{ {
return qMax(0, m_textureData.data().size() - m_textureData.dataOffset()); return m_textureData.getDataView().size();
} }
QSize QSGCompressedTextureFactory::textureSize() const QSize QSGCompressedTextureFactory::textureSize() const

View File

@ -140,7 +140,7 @@ QSGTexture *Manager::create(const QSGCompressedTextureFactory *factory)
i = m_atlases.insert(format, newAtlas); i = m_atlases.insert(format, newAtlas);
} }
const QTextureFileData *cmpData = factory->textureData(); const QTextureFileData *cmpData = factory->textureData();
t = i.value()->create(cmpData->data(), cmpData->dataLength(), cmpData->dataOffset(), size); t = i.value()->create(cmpData->getDataView(), size);
} }
return t; return t;