opengl: Add GLTexture::update() overload that takes a region
This ensures a couple of things: - avoid pointlessly binding and unbinding the texture - if the image format needs to be changed, it will be done only once
This commit is contained in:
parent
bfff8ac52a
commit
46e452127e
3 changed files with 16 additions and 16 deletions
|
@ -147,6 +147,11 @@ void GLTexture::setSize(const QSize &size)
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLTexture::update(const QImage &image, const QPoint &offset, const QRect &src)
|
void GLTexture::update(const QImage &image, const QPoint &offset, const QRect &src)
|
||||||
|
{
|
||||||
|
update(image, src.isEmpty() ? image.rect() : src, offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GLTexture::update(const QImage &image, const QRegion ®ion, const QPoint &offset)
|
||||||
{
|
{
|
||||||
if (image.isNull() || isNull()) {
|
if (image.isNull() || isNull()) {
|
||||||
return;
|
return;
|
||||||
|
@ -188,25 +193,22 @@ void GLTexture::update(const QImage &image, const QPoint &offset, const QRect &s
|
||||||
im.convertTo(uploadFormat);
|
im.convertTo(uploadFormat);
|
||||||
}
|
}
|
||||||
|
|
||||||
QRect rect = src;
|
|
||||||
if (rect.isEmpty()) {
|
|
||||||
rect = im.rect();
|
|
||||||
}
|
|
||||||
|
|
||||||
Q_ASSERT(im.depth() % 8 == 0);
|
|
||||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, im.bytesPerLine() / (im.depth() / 8));
|
|
||||||
glPixelStorei(GL_UNPACK_SKIP_PIXELS, rect.x());
|
|
||||||
glPixelStorei(GL_UNPACK_SKIP_ROWS, rect.y());
|
|
||||||
|
|
||||||
bind();
|
bind();
|
||||||
|
|
||||||
glTexSubImage2D(d->m_target, 0, offset.x(), offset.y(), rect.width(), rect.height(), glFormat, type, im.constBits());
|
for (const QRect &rect : region) {
|
||||||
|
Q_ASSERT(im.depth() % 8 == 0);
|
||||||
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, im.bytesPerLine() / (im.depth() / 8));
|
||||||
|
glPixelStorei(GL_UNPACK_SKIP_PIXELS, rect.x());
|
||||||
|
glPixelStorei(GL_UNPACK_SKIP_ROWS, rect.y());
|
||||||
|
|
||||||
unbind();
|
glTexSubImage2D(d->m_target, 0, offset.x() + rect.x(), offset.y() + rect.y(), rect.width(), rect.height(), glFormat, type, im.constBits());
|
||||||
|
}
|
||||||
|
|
||||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
||||||
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
|
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
|
||||||
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
|
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
|
||||||
|
|
||||||
|
unbind();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLTexture::bind()
|
void GLTexture::bind()
|
||||||
|
|
|
@ -85,6 +85,7 @@ public:
|
||||||
QMatrix4x4 matrix(TextureCoordinateType type) const;
|
QMatrix4x4 matrix(TextureCoordinateType type) const;
|
||||||
|
|
||||||
void update(const QImage &image, const QPoint &offset = QPoint(0, 0), const QRect &src = QRect());
|
void update(const QImage &image, const QPoint &offset = QPoint(0, 0), const QRect &src = QRect());
|
||||||
|
void update(const QImage &image, const QRegion ®ion, const QPoint &offset = QPoint());
|
||||||
void bind();
|
void bind();
|
||||||
void unbind();
|
void unbind();
|
||||||
void render(const QSizeF &size);
|
void render(const QSizeF &size);
|
||||||
|
|
|
@ -108,10 +108,7 @@ void BasicEGLSurfaceTextureWayland::updateShmTexture(GraphicsBuffer *buffer, con
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const QRegion simplifiedDamage = simplifyDamage(region);
|
m_texture.planes[0]->update(*view.image(), simplifyDamage(region));
|
||||||
for (const QRect &rect : simplifiedDamage) {
|
|
||||||
m_texture.planes[0]->update(*view.image(), rect.topLeft(), rect);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BasicEGLSurfaceTextureWayland::loadDmabufTexture(GraphicsBuffer *buffer)
|
bool BasicEGLSurfaceTextureWayland::loadDmabufTexture(GraphicsBuffer *buffer)
|
||||||
|
|
Loading…
Reference in a new issue