106 void *logicalAddr, QSize size, GLenum vivFormatToken,
107 std::shared_ptr<
void> parentKeepAlive)
109 qCDebug(qLVivante) <<
"Importing texture from Vivante phys-mem buffer";
110 QOpenGLContext *glContext = context.glContext();
111 QOpenGLFunctions functions(glContext);
112 const auto &vivFunctions = QVivanteGLFunctions::instance();
114 rhi.makeThreadLocalNativeContextCurrent();
117 functions.glGenTextures(1, &texture);
119 auto releaseTexture = qScopeGuard([&] {
120 functions.glDeleteTextures(1, &texture);
123 functions.glActiveTexture(GL_TEXTURE0);
124 functions.glBindTexture(GL_TEXTURE_2D, texture);
130 const GLuint physical = physicalAddress;
131 vivFunctions.glTexDirectVIVMap(GL_TEXTURE_2D, size.width(), size.height(), vivFormatToken,
132 &logicalAddr, &physical);
133 if (
const GLenum error = functions.glGetError(); error != GL_NO_ERROR) {
134 qCWarning(qLVivante) <<
"glTexDirectVIVMap failed with GL error" << Qt::hex << error
135 <<
"for format token" << vivFormatToken << Qt::dec <<
"size" << size;
136 functions.glBindTexture(GL_TEXTURE_2D, 0);
137 return q23::unexpected{ FailureSeverity::recoverable };
140 vivFunctions.glTexDirectInvalidateVIV(GL_TEXTURE_2D);
141 if (
const GLenum error = functions.glGetError(); error != GL_NO_ERROR) {
142 qCWarning(qLVivante) <<
"glTexDirectInvalidateVIV failed with GL error" << Qt::hex
144 functions.glBindTexture(GL_TEXTURE_2D, 0);
145 return q23::unexpected{ FailureSeverity::recoverable };
148 functions.glBindTexture(GL_TEXTURE_2D, 0);
149 releaseTexture.dismiss();
151 return std::make_unique<VivanteTextureHandles>(rhi, glContext, texture,
152 std::move(parentKeepAlive));