Предыдущий пост: как достичь рендеринга с нулевой копией от 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
Рендеринг с нулевой копией с QT FBO и Dmabuf Eglimage-Общий контекст. ⇐ C++
Программы на C++. Форум разработчиков
1758234167
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
В качестве запасного>
Подробнее здесь: [url]https://stackoverflow.com/questions/79768971/zero-copy-rendering-with-qt-fbo-and-dmabuf-eglimage-shared-context-issue[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия