Рендеринг с нулевой копией с QT FBO и Dmabuf Eglimage-Общий контекст.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Рендеринг с нулевой копией с QT FBO и Dmabuf Eglimage-Общий контекст.

Сообщение Anonymous »

Предыдущий пост: как достичь рендеринга с нулевой копией от QT QPainter в DMABUF с использованием общих контекстов EGL? Egldisplay < /li>
[*] Свяжите eggrimage с текстурой < /li>
Создать внутреннюю FBO (Blitfbo), прикрепленную к текстуре < /li>
QT qopenglframebufferobject (QFBO) для ui -renering < /li>



Core::resourceSlot Core::createSlot(DmaBufferPtr&& bufPtr) {
if (nullptr == bufPtr) {
fprintf(stderr, "[Core] Invalid DmaBuffer\n");
return {};
}
if (eglDisplay_ == EGL_NO_DISPLAY) {
fprintf(stderr, "[Core] No valid EGL display\n");
return {};
}
resourceSlot slot;
cpuFull(bufPtr);
slot.dmabufPtr = std::move(bufPtr);

// Create EGLIamge
makeEGLCurrent();
EGLint attrs[] = {
EGL_WIDTH, static_cast(slot.dmabufPtr->width()),
EGL_HEIGHT, static_cast(slot.dmabufPtr->height()),
EGL_DMA_BUF_PLANE0_FD_EXT, slot.dmabufPtr->fd(),
EGL_DMA_BUF_PLANE0_OFFSET_EXT, static_cast(slot.dmabufPtr->offset()),
EGL_DMA_BUF_PLANE0_PITCH_EXT, static_cast(slot.dmabufPtr->pitch()),
EGL_LINUX_DRM_FOURCC_EXT, static_cast(slot.dmabufPtr->format()),
EGL_NONE
};

slot.eglImage = eglCreateImageKHR(
eglDisplay_,
EGL_NO_CONTEXT,
EGL_LINUX_DMA_BUF_EXT,
nullptr,
attrs
);

if (slot.eglImage == EGL_NO_IMAGE_KHR) {
fprintf(stderr, "[Core] Failed to create EGLImage: 0x%X\n", eglGetError());
return {};
}

// Create a texture and attach EGLImage
glGenTextures(1, &slot.textureId);
glBindTexture(GL_TEXTURE_2D, slot.textureId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, slot.eglImage);
auto glError = glGetError();
glBindTexture(GL_TEXTURE_2D, 0);
if (glError != GL_NO_ERROR) {
fprintf(stderr, "[Core] OpenGL error after EGLImage bind: 0x%X\n", glError);
return {};
}

// Create EGL FBO and attach a texture
glGenFramebuffers(1, &slot.blitFbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, slot.blitFbo);
glFramebufferTexture2D( GL_DRAW_FRAMEBUFFER,
GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D,
slot.textureId, 0);

// Bind to the target dmabuf texture
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) {
fprintf(stderr, "[Core] Framebuffer incomplete: 0x%X\n", status);
return {};
}
printGlError("blitfbo create.");
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
doneEGLCurrent();

// Create Qt FBO
makeQCurrent();
slot.qfbo = std::make_shared(slot.dmabufPtr->width(), slot.dmabufPtr->height());
doneQCurrent();

fprintf(stdout, "[Core] Resource slot created successfully\n");
return slot;
}
< /code>
Проблема: < /p>

Чтобы создать эггирацию из dmabuf, требуется действительный Egldisplay. Egldisplay /eglcontext Для создания eGlimage. < /Li>
После создания eGlimage может быть связано только с текстурой в одном и том же EglContext. < /Li>
Однако QT QopenglFrameBufferObject должен быть создан в контексте, и QT не поддерживает Importcres в IT-IT-IT-INTAMPURECTRAS. Результат, текстура, связанная с eGlimage и QT FBO, не может быть связана, предотвращая перенос с нулевой копией от QT рендеринга в DMABUF. < /li>
< /ol>
Ключевая задача: < /p>

может совместно соблюдать . Рендеринг FBO напрямую записывает в текстуру, поддерживаемую DMABUF. Текстуры в qfbo
В качестве запасного>

Подробнее здесь: https://stackoverflow.com/questions/797 ... text-issue
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»